javaclass 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +208 -23
- data/Readme.txt +56 -19
- data/examples/generate_class_lists.rb +61 -0
- data/history.txt +13 -19
- data/lib/javaclass/classfile/access_flags.rb +52 -0
- data/lib/javaclass/classfile/class_magic.rb +29 -0
- data/lib/javaclass/classfile/class_version.rb +67 -0
- data/lib/javaclass/classfile/constant_pool.rb +91 -0
- data/lib/javaclass/classfile/constants/base.rb +33 -0
- data/lib/javaclass/classfile/constants/double_reference.rb +99 -0
- data/lib/javaclass/classfile/constants/single_reference.rb +65 -0
- data/lib/javaclass/classfile/constants/value.rb +116 -0
- data/lib/javaclass/classfile/java_class_header.rb +102 -0
- data/lib/javaclass/classfile/references.rb +43 -0
- data/lib/javaclass/classlist/class_entry.rb +89 -0
- data/lib/javaclass/classlist/jar_searcher.rb +69 -0
- data/lib/javaclass/classlist/list.rb +126 -0
- data/lib/javaclass/classlist/package_entry.rb +87 -0
- data/lib/javaclass/classpath/classpaths.txt +2 -0
- data/lib/javaclass/classpath/composite_classpath.rb +99 -0
- data/lib/javaclass/classpath/folder_classpath.rb +83 -0
- data/lib/javaclass/classpath/jar_classpath.rb +100 -0
- data/lib/javaclass/classpath/java_home_classpath.rb +40 -0
- data/lib/javaclass/classpath/port_ClassPathEntry.java +202 -0
- data/lib/javaclass/classpath/port_ClassPathEntryFactory.java +311 -0
- data/lib/javaclass/classpath/port_DirectoryRepository.java +24 -0
- data/lib/javaclass/java_name.rb +90 -0
- data/lib/javaclass/metric/ccd.rb +68 -0
- data/lib/javaclass/metric/class_usage.rb +41 -0
- data/lib/javaclass/metric/metrics.txt +15 -0
- data/lib/javaclass.rb +44 -11
- data/test/data/ShortClientData$1-4000Wert.class +0 -0
- data/test/data/{AccessFlagsTestAbstract.class → access_flags/AccessFlagsTestAbstract.class} +0 -0
- data/test/data/{AccessFlagsTestAbstract.java → access_flags/AccessFlagsTestAbstract.java} +0 -0
- data/test/data/{AccessFlagsTestFinal.class → access_flags/AccessFlagsTestFinal.class} +0 -0
- data/test/data/{AccessFlagsTestFinal.java → access_flags/AccessFlagsTestFinal.java} +0 -0
- data/test/data/{AccessFlagsTestInterface.class → access_flags/AccessFlagsTestInterface.class} +0 -0
- data/test/data/{AccessFlagsTestInterface.java → access_flags/AccessFlagsTestInterface.java} +0 -0
- data/test/data/{AccessFlagsTestPackage.class → access_flags/AccessFlagsTestPackage.class} +0 -0
- data/test/data/{AccessFlagsTestPackage.java → access_flags/AccessFlagsTestPackage.java} +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic$Inner.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic$InnerInterface.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic$StaticInner.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic.java +11 -0
- data/test/data/access_flags/AccessFlagsTestPublic_javap.txt +29 -0
- data/test/data/{makeAccessFlagsTest.bat → access_flags/make.bat} +0 -0
- data/test/data/{ClassVersionTest.java → class_version/ClassVersionTest.java} +0 -0
- data/test/data/{ClassVersionTest10.class → class_version/ClassVersionTest10.class} +0 -0
- data/test/data/{ClassVersionTest11.class → class_version/ClassVersionTest11.class} +0 -0
- data/test/data/{ClassVersionTest12.class → class_version/ClassVersionTest12.class} +0 -0
- data/test/data/{ClassVersionTest13.class → class_version/ClassVersionTest13.class} +0 -0
- data/test/data/{ClassVersionTest14.class → class_version/ClassVersionTest14.class} +0 -0
- data/test/data/{ClassVersionTest15.class → class_version/ClassVersionTest15.class} +0 -0
- data/test/data/{ClassVersionTest16.class → class_version/ClassVersionTest16.class} +0 -0
- data/test/data/{makeClassVersionTest.bat → class_version/make.bat} +0 -0
- data/test/data/{ConstantPoolTest.class → constant_pool/ConstantPoolTest.class} +0 -0
- data/test/data/{ConstantPoolTest.java → constant_pool/ConstantPoolTest.java} +0 -0
- data/test/data/{makeConstantPoolTest.bat → constant_pool/make.bat} +0 -0
- data/test/data/folder_classpath/JarClasspathTestFolder/ClassVersionTest10.class +0 -0
- data/test/data/folder_classpath/JarClasspathTestFolder/package/ClassVersionTest11.class +0 -0
- data/test/data/jar_classpath/JarClasspathTest.jar +0 -0
- data/test/data/jar_classpath/JarClasspathTest.zip +0 -0
- data/test/data/jar_classpath/JarClasspathTestManifest.jar +0 -0
- data/test/data/jar_classpath/JarClasspathTestMultiManifest.jar +0 -0
- data/test/data/jar_classpath/make.bat +24 -0
- data/test/data/jar_searcher/JarClassListTest.jar +0 -0
- data/test/data/jar_searcher/PublicClass.java +12 -0
- data/test/data/jar_searcher/PublicInterface.java +5 -0
- data/test/data/jar_searcher/make.bat +13 -0
- data/test/data/java_home_classpath/jdk/jre/lib/rt.jar +0 -0
- data/test/data/java_home_classpath/jre/lib/rt.jar +0 -0
- data/test/data/java_home_classpath/jre-ext/lib/ext/ext.jar +0 -0
- data/test/data/java_home_classpath/jre-ext/lib/rt.jar +0 -0
- data/test/data/java_home_classpath/make.bat +13 -0
- data/test/data/references/ReferencesTest.class +0 -0
- data/test/data/references/ReferencesTest.java +12 -0
- data/test/data/references/make.bat +5 -0
- data/test/setup.rb +6 -5
- data/test/test_access_flags.rb +59 -44
- data/test/test_base.rb +20 -15
- data/test/test_class_entry.rb +198 -0
- data/test/test_class_version.rb +48 -46
- data/test/test_composite_classpath.rb +68 -0
- data/test/test_constant_pool.rb +49 -41
- data/test/test_folder_classpath.rb +45 -0
- data/test/test_jar_classpath.rb +57 -0
- data/test/test_jar_searcher.rb +93 -0
- data/test/test_java_class_header.rb +34 -22
- data/test/test_java_home_classpath.rb +50 -0
- data/test/test_java_name.rb +110 -0
- data/test/test_javaclass.rb +22 -0
- data/test/test_list.rb +123 -0
- data/test/test_package_entry.rb +91 -0
- data/test/test_references.rb +38 -20
- data/test/test_string_ux.rb +99 -2
- data/test/ts_all_tests.rb +42 -21
- metadata +171 -50
- data/lib/javaclass/access_flags.rb +0 -44
- data/lib/javaclass/class_magic.rb +0 -27
- data/lib/javaclass/class_version.rb +0 -65
- data/lib/javaclass/constant_pool.rb +0 -85
- data/lib/javaclass/constants/base.rb +0 -31
- data/lib/javaclass/constants/double_reference.rb +0 -81
- data/lib/javaclass/constants/single_reference.rb +0 -58
- data/lib/javaclass/constants/value.rb +0 -114
- data/lib/javaclass/java_class_header.rb +0 -88
- data/lib/javaclass/references.rb +0 -31
- data/test/data/AccessFlagsTestPublic$InnerClass.class +0 -0
- data/test/data/AccessFlagsTestPublic.class +0 -0
- data/test/data/AccessFlagsTestPublic.java +0 -7
@@ -0,0 +1,202 @@
|
|
1
|
+
package at.kugel.tool.classes;
|
2
|
+
|
3
|
+
// Kugel's "Java Code & Tools Library", Copyright (c) 1999-2004, Theossos Comp Group
|
4
|
+
import java.io.File;
|
5
|
+
import java.lang.reflect.Modifier;
|
6
|
+
import java.util.zip.ZipEntry;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* An entry of a class in the classpath. This contains the reference to the fully qualified name and where to find it.
|
10
|
+
* @author Kugel, <i>Theossos Comp Group</i>
|
11
|
+
* @version 1.00 - 13.03.2004
|
12
|
+
* @since JDK1.2
|
13
|
+
*/
|
14
|
+
public final class ClassPathEntry implements Comparable<ClassPathEntry>
|
15
|
+
{
|
16
|
+
|
17
|
+
public static final String CLASS_EXTENSION = ".class";
|
18
|
+
|
19
|
+
/** Value to be set by factory if we want to check for public or all classes. */
|
20
|
+
static boolean checkForPublic = true;
|
21
|
+
|
22
|
+
public final String className;
|
23
|
+
public final String packageName;
|
24
|
+
public final File origin;
|
25
|
+
public final boolean isInner;
|
26
|
+
/** Ternary value. 0 = not checked, 1 = yes, -1 = no. */
|
27
|
+
public final int isPublic;
|
28
|
+
|
29
|
+
private boolean duplicated;
|
30
|
+
|
31
|
+
public ClassPathEntry(String pClassName, String pPackageName, File pOrigin)
|
32
|
+
{
|
33
|
+
className = pClassName;
|
34
|
+
packageName = pPackageName.intern();
|
35
|
+
origin = pOrigin;
|
36
|
+
isInner = (pClassName.indexOf('$') > -1);
|
37
|
+
|
38
|
+
int ip = 0;
|
39
|
+
if (checkForPublic)
|
40
|
+
{
|
41
|
+
try
|
42
|
+
{
|
43
|
+
// classloader does NOT resolve classes, i.e. no static thingies are run...
|
44
|
+
if ((ClassLoader.getSystemClassLoader().loadClass(toString()).getModifiers() & Modifier.PUBLIC) > 0)
|
45
|
+
{
|
46
|
+
ip = 1;
|
47
|
+
}
|
48
|
+
else
|
49
|
+
{
|
50
|
+
ip = -1;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
catch (final ClassNotFoundException ex)
|
54
|
+
{
|
55
|
+
ip = 0;
|
56
|
+
}
|
57
|
+
catch (final LinkageError ex)
|
58
|
+
{
|
59
|
+
// ex.printStackTrace();
|
60
|
+
// may be NoClassDefFoundError or ClassFormatError (if references to other),
|
61
|
+
// or SecurityEx
|
62
|
+
ip = 0;
|
63
|
+
System.err.println("WARNING: could not load " + toString() + " (" + ex.toString() + ")");
|
64
|
+
}
|
65
|
+
}
|
66
|
+
isPublic = ip;
|
67
|
+
|
68
|
+
// System.out.println("found " + packageName + "." + className + " in " + pOrigin);
|
69
|
+
}
|
70
|
+
|
71
|
+
@Override
|
72
|
+
public boolean equals(Object obj)
|
73
|
+
{
|
74
|
+
if (!(obj instanceof ClassPathEntry))
|
75
|
+
{
|
76
|
+
return false;
|
77
|
+
}
|
78
|
+
|
79
|
+
final ClassPathEntry ce = (ClassPathEntry) obj;
|
80
|
+
return ce.className.equals(className) && ce.packageName.equals(packageName);
|
81
|
+
}
|
82
|
+
|
83
|
+
@Override
|
84
|
+
public int hashCode()
|
85
|
+
{
|
86
|
+
return className.hashCode() ^ packageName.hashCode();
|
87
|
+
}
|
88
|
+
|
89
|
+
@Override
|
90
|
+
public final String toString()
|
91
|
+
{
|
92
|
+
if (packageName.length() == 0)
|
93
|
+
{
|
94
|
+
return className;
|
95
|
+
}
|
96
|
+
return packageName + '.' + className;
|
97
|
+
}
|
98
|
+
|
99
|
+
public int compareTo(ClassPathEntry o)
|
100
|
+
{
|
101
|
+
return toString().compareTo(o.toString());
|
102
|
+
}
|
103
|
+
|
104
|
+
// --- static ---
|
105
|
+
|
106
|
+
private static ClassPathEntry create(String pClass, String pPackage, File pOrigin)
|
107
|
+
{
|
108
|
+
return new ClassPathEntry(pClass, pPackage, pOrigin);
|
109
|
+
}
|
110
|
+
|
111
|
+
static ClassPathEntry createFromClassFile(File pClassPathBase, File pClassInFileSystem)
|
112
|
+
{
|
113
|
+
final String baseDirectory = pClassPathBase.getPath();
|
114
|
+
final String fullName = pClassInFileSystem.getPath().substring(baseDirectory.length());
|
115
|
+
|
116
|
+
// get the path
|
117
|
+
String path;
|
118
|
+
final int i = fullName.lastIndexOf(File.separatorChar);
|
119
|
+
if (i > -1)
|
120
|
+
{
|
121
|
+
path = fullName.substring(0, i).replace(File.separatorChar, '.');
|
122
|
+
}
|
123
|
+
else
|
124
|
+
{
|
125
|
+
path = "";
|
126
|
+
}
|
127
|
+
|
128
|
+
// get the name
|
129
|
+
String name;
|
130
|
+
if (i > -1)
|
131
|
+
{
|
132
|
+
name = fullName.substring(i + 1);
|
133
|
+
}
|
134
|
+
else
|
135
|
+
{
|
136
|
+
throw new IllegalArgumentException("no classname in entry: " + fullName);
|
137
|
+
}
|
138
|
+
|
139
|
+
if (name.endsWith(CLASS_EXTENSION))
|
140
|
+
{
|
141
|
+
name = name.substring(0, name.length() - 6);
|
142
|
+
}
|
143
|
+
else
|
144
|
+
{
|
145
|
+
throw new IllegalArgumentException("no classs file: " + fullName);
|
146
|
+
}
|
147
|
+
|
148
|
+
return create(name, path, pClassInFileSystem);
|
149
|
+
}
|
150
|
+
|
151
|
+
static ClassPathEntry createFromZipEntry(File pZipFile, ZipEntry pClassInZip)
|
152
|
+
{
|
153
|
+
final char ZIP_PATH_CHAR = '/';
|
154
|
+
|
155
|
+
final String fullName = pClassInZip.getName();
|
156
|
+
|
157
|
+
// get the path
|
158
|
+
String path;
|
159
|
+
final int i = fullName.lastIndexOf(ZIP_PATH_CHAR);
|
160
|
+
if (i > -1)
|
161
|
+
{
|
162
|
+
path = fullName.substring(0, i).replace(ZIP_PATH_CHAR, '.');
|
163
|
+
}
|
164
|
+
else
|
165
|
+
{
|
166
|
+
path = "";
|
167
|
+
}
|
168
|
+
|
169
|
+
// get the name
|
170
|
+
String name;
|
171
|
+
if (i > -1)
|
172
|
+
{
|
173
|
+
name = fullName.substring(i + 1);
|
174
|
+
}
|
175
|
+
else
|
176
|
+
{
|
177
|
+
name = fullName;
|
178
|
+
}
|
179
|
+
|
180
|
+
if (name.endsWith(CLASS_EXTENSION))
|
181
|
+
{
|
182
|
+
name = name.substring(0, name.length() - 6);
|
183
|
+
}
|
184
|
+
else
|
185
|
+
{
|
186
|
+
throw new IllegalArgumentException("no class file: " + fullName);
|
187
|
+
}
|
188
|
+
|
189
|
+
return create(name, path, pZipFile);
|
190
|
+
}
|
191
|
+
|
192
|
+
public boolean isDuplicated()
|
193
|
+
{
|
194
|
+
return duplicated;
|
195
|
+
}
|
196
|
+
|
197
|
+
public void setDuplicated(boolean b)
|
198
|
+
{
|
199
|
+
duplicated = b;
|
200
|
+
}
|
201
|
+
|
202
|
+
}
|
@@ -0,0 +1,311 @@
|
|
1
|
+
package at.kugel.tool.classes;
|
2
|
+
|
3
|
+
// Kugel's "Java Code & Tools Library", Copyright (c) 1999-2004, Theossos Comp Group
|
4
|
+
import java.io.File;
|
5
|
+
import java.io.IOException;
|
6
|
+
import java.security.InvalidParameterException;
|
7
|
+
import java.util.Enumeration;
|
8
|
+
import java.util.List;
|
9
|
+
import java.util.StringTokenizer;
|
10
|
+
import java.util.Vector;
|
11
|
+
import java.util.zip.ZipEntry;
|
12
|
+
import java.util.zip.ZipFile;
|
13
|
+
|
14
|
+
import at.kugel.util.io.WildcardSearch;
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Factory to get the CPEs (Class Path Entries) from a system path, given path or archive.
|
18
|
+
* @author Kugel, <i>Theossos Comp Group</i>
|
19
|
+
* @version 1.00 - 13.03.2004
|
20
|
+
*/
|
21
|
+
public final class ClassPathEntryFactory
|
22
|
+
{
|
23
|
+
|
24
|
+
/**
|
25
|
+
* 0 = no output, 1 = system path, 2 = archives and directories, 3 = statistics, 5 = duplicates.
|
26
|
+
*/
|
27
|
+
private final int debugLevel = 3;
|
28
|
+
|
29
|
+
private static final String CLASS_EXTENSION = ClassPathEntry.CLASS_EXTENSION;
|
30
|
+
private boolean dropInnerClasses = true;
|
31
|
+
private boolean dropPackageClasses = true;
|
32
|
+
|
33
|
+
private long numberEntries;
|
34
|
+
private long numberDuplicatedEntries;
|
35
|
+
|
36
|
+
private void resetStatistics()
|
37
|
+
{
|
38
|
+
numberEntries = 0;
|
39
|
+
numberDuplicatedEntries = 0;
|
40
|
+
}
|
41
|
+
|
42
|
+
private void printStatistics()
|
43
|
+
{
|
44
|
+
if (dropPackageClasses)
|
45
|
+
{
|
46
|
+
|
47
|
+
System.out.println(" Found " + numberEntries + " new and " + numberDuplicatedEntries + " duplicated public classes");
|
48
|
+
|
49
|
+
}
|
50
|
+
else
|
51
|
+
{
|
52
|
+
|
53
|
+
System.out.println(" Found " + numberEntries + " new and " + numberDuplicatedEntries + " duplicated classes");
|
54
|
+
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
private void addEntryToList(final ClassPathEntry cpe, List<ClassPathEntry> pClassList2Add)
|
59
|
+
{
|
60
|
+
if (dropInnerClasses && cpe.isInner)
|
61
|
+
{
|
62
|
+
return;
|
63
|
+
}
|
64
|
+
if (dropPackageClasses && cpe.isPublic == -1)
|
65
|
+
{
|
66
|
+
return;
|
67
|
+
}
|
68
|
+
|
69
|
+
if (!pClassList2Add.contains(cpe))
|
70
|
+
{
|
71
|
+
numberEntries++;
|
72
|
+
pClassList2Add.add(cpe);
|
73
|
+
|
74
|
+
}
|
75
|
+
else
|
76
|
+
{
|
77
|
+
|
78
|
+
numberDuplicatedEntries++;
|
79
|
+
|
80
|
+
if (debugLevel >= 5)
|
81
|
+
{
|
82
|
+
final int i = pClassList2Add.indexOf(cpe);
|
83
|
+
final ClassPathEntry duplicated = pClassList2Add.get(i);
|
84
|
+
duplicated.setDuplicated(true);
|
85
|
+
System.out.println(" Duplicate class: " + cpe + " in " + duplicated.origin + " and " + cpe.origin);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
public void readAllClassesFromDirectory(File pClassPathBase, List<ClassPathEntry> pClassList2Add)
|
91
|
+
{
|
92
|
+
if (debugLevel >= 2)
|
93
|
+
{
|
94
|
+
System.out.println(" * Reading classes from directory " + pClassPathBase);
|
95
|
+
resetStatistics();
|
96
|
+
}
|
97
|
+
|
98
|
+
final Vector<File> foundElements = new Vector<File>();
|
99
|
+
|
100
|
+
WildcardSearch.getFiles(pClassPathBase.getPath() + File.separatorChar + "*" + CLASS_EXTENSION, true, foundElements);
|
101
|
+
for (final File file : foundElements)
|
102
|
+
{
|
103
|
+
final ClassPathEntry cpe = ClassPathEntry.createFromClassFile(pClassPathBase, file);
|
104
|
+
|
105
|
+
addEntryToList(cpe, pClassList2Add);
|
106
|
+
}
|
107
|
+
|
108
|
+
foundElements.removeAllElements();
|
109
|
+
|
110
|
+
if (debugLevel >= 3)
|
111
|
+
{
|
112
|
+
printStatistics();
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
public void readAllClassesFromZip(File pZipFile, List<ClassPathEntry> pClassList2Add) throws IOException
|
117
|
+
{
|
118
|
+
if (debugLevel >= 2)
|
119
|
+
{
|
120
|
+
System.out.println(" * Reading classes from archive " + pZipFile);
|
121
|
+
resetStatistics();
|
122
|
+
}
|
123
|
+
|
124
|
+
final ZipFile zf = new ZipFile(pZipFile);
|
125
|
+
for (final Enumeration<? extends ZipEntry> en = zf.entries(); en.hasMoreElements();)
|
126
|
+
{
|
127
|
+
final ZipEntry entry = en.nextElement();
|
128
|
+
|
129
|
+
if (entry.getName().endsWith(CLASS_EXTENSION))
|
130
|
+
{
|
131
|
+
final ClassPathEntry cpe = ClassPathEntry.createFromZipEntry(pZipFile, entry);
|
132
|
+
addEntryToList(cpe, pClassList2Add);
|
133
|
+
}
|
134
|
+
|
135
|
+
}
|
136
|
+
|
137
|
+
if (debugLevel >= 3)
|
138
|
+
{
|
139
|
+
printStatistics();
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
public void readAllZipsFromDirectory(File pClassPathBase, List<ClassPathEntry> pClassList2Add) throws IOException
|
144
|
+
{
|
145
|
+
if (debugLevel >= 2)
|
146
|
+
{
|
147
|
+
System.out.println(" * Reading jars from directory " + pClassPathBase);
|
148
|
+
resetStatistics();
|
149
|
+
}
|
150
|
+
|
151
|
+
final Vector<File> foundElements = new Vector<File>();
|
152
|
+
|
153
|
+
WildcardSearch.getFiles(pClassPathBase.getPath() + File.separatorChar + "*.jar", true, foundElements);
|
154
|
+
for (final File entry : foundElements)
|
155
|
+
{
|
156
|
+
readAllClassesFromZip(entry, pClassList2Add);
|
157
|
+
}
|
158
|
+
foundElements.removeAllElements();
|
159
|
+
|
160
|
+
WildcardSearch.getFiles(pClassPathBase.getPath() + File.separatorChar + "*.zip", true, foundElements);
|
161
|
+
for (final File entry : foundElements)
|
162
|
+
{
|
163
|
+
readAllClassesFromZip(entry, pClassList2Add);
|
164
|
+
}
|
165
|
+
foundElements.removeAllElements();
|
166
|
+
}
|
167
|
+
|
168
|
+
public void readAllFromClassPath(String pPath, List<ClassPathEntry> pClassList2Add) throws IOException
|
169
|
+
{
|
170
|
+
final StringTokenizer pathTokenizer = new StringTokenizer(pPath, File.pathSeparator);
|
171
|
+
while (pathTokenizer.hasMoreTokens())
|
172
|
+
{
|
173
|
+
final String path = pathTokenizer.nextToken();
|
174
|
+
|
175
|
+
if (path.endsWith(".zip") || path.endsWith(".jar"))
|
176
|
+
{
|
177
|
+
final File zipFile = new File(path);
|
178
|
+
if (zipFile.exists() && zipFile.isFile() && zipFile.canRead())
|
179
|
+
{
|
180
|
+
readAllClassesFromZip(zipFile, pClassList2Add);
|
181
|
+
}
|
182
|
+
else
|
183
|
+
{
|
184
|
+
if (debugLevel >= 2)
|
185
|
+
{
|
186
|
+
System.out.println("WARNING: archive " + path + " from classpath not found");
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
}
|
191
|
+
else
|
192
|
+
{
|
193
|
+
|
194
|
+
final File directoryFile = new File(path);
|
195
|
+
if (directoryFile.exists() && directoryFile.isDirectory())
|
196
|
+
{
|
197
|
+
readAllClassesFromDirectory(directoryFile, pClassList2Add);
|
198
|
+
}
|
199
|
+
else
|
200
|
+
{
|
201
|
+
if (debugLevel >= 2)
|
202
|
+
{
|
203
|
+
System.out.println("WARNING: directory " + path + " from classpath not found");
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
}
|
208
|
+
}
|
209
|
+
}
|
210
|
+
|
211
|
+
private void readAllFromSystemClassPath(String name, List<ClassPathEntry> pClassList2Add) throws IOException
|
212
|
+
{
|
213
|
+
final String p = System.getProperty(name);
|
214
|
+
|
215
|
+
if (debugLevel >= 1)
|
216
|
+
{
|
217
|
+
System.out.println("Working on path " + name + " (" + p + ")");
|
218
|
+
}
|
219
|
+
|
220
|
+
if (p != null && p.length() > 0)
|
221
|
+
{
|
222
|
+
if (name.endsWith(".dirs"))
|
223
|
+
{
|
224
|
+
readAllZipsFromDirectory(new File(p), pClassList2Add);
|
225
|
+
|
226
|
+
}
|
227
|
+
else if (name.endsWith(".path"))
|
228
|
+
{
|
229
|
+
readAllFromClassPath(p, pClassList2Add);
|
230
|
+
|
231
|
+
}
|
232
|
+
else
|
233
|
+
{
|
234
|
+
throw new InvalidParameterException("no path or directory system property given");
|
235
|
+
}
|
236
|
+
}
|
237
|
+
}
|
238
|
+
|
239
|
+
public void readAllFromSystemClassPaths(List<ClassPathEntry> pClassList2Add) throws IOException
|
240
|
+
{
|
241
|
+
readAllFromSystemClassPath("sun.boot.class.path", pClassList2Add);
|
242
|
+
readAllFromSystemClassPath("java.endorsed.dirs", pClassList2Add);
|
243
|
+
readAllFromSystemClassPath("java.ext.dirs", pClassList2Add);
|
244
|
+
readAllFromSystemClassPath("java.class.path", pClassList2Add);
|
245
|
+
}
|
246
|
+
|
247
|
+
public void readAllFromUserClassPaths(String p, List<ClassPathEntry> pClassList2Add) throws IOException
|
248
|
+
{
|
249
|
+
if (debugLevel >= 1)
|
250
|
+
{
|
251
|
+
System.out.println("Working on user input (" + p + ")");
|
252
|
+
}
|
253
|
+
|
254
|
+
final File userFile = new File(p);
|
255
|
+
if (p.indexOf(File.pathSeparator) > -1)
|
256
|
+
{
|
257
|
+
// this is a pathlist
|
258
|
+
readAllFromClassPath(p, pClassList2Add);
|
259
|
+
|
260
|
+
}
|
261
|
+
else if (userFile.isDirectory())
|
262
|
+
{
|
263
|
+
// may be a WEB-INF clone - read all zips and jars
|
264
|
+
readAllZipsFromDirectory(userFile, pClassList2Add);
|
265
|
+
// but also may be a single class list
|
266
|
+
readAllClassesFromDirectory(userFile, pClassList2Add);
|
267
|
+
|
268
|
+
}
|
269
|
+
else
|
270
|
+
{
|
271
|
+
// must be a file - a zip
|
272
|
+
readAllClassesFromZip(userFile, pClassList2Add);
|
273
|
+
}
|
274
|
+
|
275
|
+
}
|
276
|
+
|
277
|
+
public boolean isDropInnerClasses()
|
278
|
+
{
|
279
|
+
return dropInnerClasses;
|
280
|
+
}
|
281
|
+
|
282
|
+
public void setDropInnerClasses(boolean b)
|
283
|
+
{
|
284
|
+
dropInnerClasses = b;
|
285
|
+
}
|
286
|
+
|
287
|
+
public boolean isDropPackageClasses()
|
288
|
+
{
|
289
|
+
return dropPackageClasses;
|
290
|
+
}
|
291
|
+
|
292
|
+
public void setDropPackageClasses(boolean b)
|
293
|
+
{
|
294
|
+
dropPackageClasses = b;
|
295
|
+
}
|
296
|
+
|
297
|
+
// /** Just for testing. */
|
298
|
+
// public static void main(String[] args) throws IOException
|
299
|
+
// {
|
300
|
+
// final ClassPathEntryFactory fac = new ClassPathEntryFactory();
|
301
|
+
// final List<ClassPathEntry> list = new ArrayList<ClassPathEntry>();
|
302
|
+
//
|
303
|
+
// System.out.println("*** reading ***");
|
304
|
+
// fac.readAllFromSystemClassPaths(list);
|
305
|
+
// System.out.println("*** sorting ***");
|
306
|
+
// Collections.sort(list);
|
307
|
+
//
|
308
|
+
// System.out.println("found " + list.size() + " classes.");
|
309
|
+
// }
|
310
|
+
|
311
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
/**
|
2
|
+
* Abstraction of a place where to find the physical class files for a given full class name. This must also configure
|
3
|
+
* the <code>org.apache.bcel.Repository</code> to use the right repository for BCEL automatic class loading, i.e. for
|
4
|
+
* interfaces.
|
5
|
+
*/
|
6
|
+
|
7
|
+
|
8
|
+
public List<String> getAllClassNames(boolean skipInnerClasses)
|
9
|
+
{
|
10
|
+
final List<String> result = new ArrayList<String>();
|
11
|
+
|
12
|
+
for (final String name : filesInRepository.keySet())
|
13
|
+
{
|
14
|
+
if (skipInnerClasses && name.indexOf('$') != -1)
|
15
|
+
{
|
16
|
+
continue;
|
17
|
+
}
|
18
|
+
result.add(name);
|
19
|
+
}
|
20
|
+
|
21
|
+
Collections.sort(result);
|
22
|
+
return result;
|
23
|
+
}
|
24
|
+
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module JavaClass
|
2
|
+
|
3
|
+
# Special string with methods to work with Java class or package names.
|
4
|
+
# Author:: Peter Kofler
|
5
|
+
class JavaName < String
|
6
|
+
|
7
|
+
# Return the package name of a classname or the superpackage of a package. Return an empty String if default package.
|
8
|
+
attr_reader :package
|
9
|
+
|
10
|
+
# Return the simple name of this class or package.
|
11
|
+
attr_reader :simple_name
|
12
|
+
# Full normalized class name of this class.
|
13
|
+
attr_reader :full_name
|
14
|
+
|
15
|
+
def initialize(string)
|
16
|
+
super string
|
17
|
+
@full_name = string.gsub(/\/|\\/,'.').sub(/\.(class|java|".*|<.*)?$/, '')
|
18
|
+
|
19
|
+
matches = @full_name.scan(/^(.+)\.([A-Z][^.]*)$/)[0]
|
20
|
+
if matches
|
21
|
+
@package = matches[0].to_javaname
|
22
|
+
@simple_name = matches[1].to_javaname
|
23
|
+
elsif @full_name =~ /^[A-Z][^.]*$/
|
24
|
+
# simple name
|
25
|
+
@package = ''
|
26
|
+
@simple_name = self
|
27
|
+
else
|
28
|
+
# only package
|
29
|
+
@package = self
|
30
|
+
@simple_name = ''
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Return +true+ if this class is in same or in a subpackage of the given Java _packages_ or
|
35
|
+
# if this package is same or a subpackage (with .).
|
36
|
+
def same_or_subpackage_of?(packages)
|
37
|
+
packages.find {|pkg| @package == pkg } != nil || subpackage_of?(packages)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Return +true+ if this class is in a subpackage of the given Java _packages_ .
|
41
|
+
def subpackage_of?(packages)
|
42
|
+
packages.find {|pkg| @package =~ /^#{Regexp.escape(pkg)}\./ } != nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_javaname
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
# Return the full classname of this class, e.g. <code>java.lang.Object</code>.
|
50
|
+
def to_classname
|
51
|
+
@full_name.to_javaname
|
52
|
+
end
|
53
|
+
|
54
|
+
# Return the VM name of this class, e.g. <code>java/lang/Object</code>.
|
55
|
+
def to_jvmname
|
56
|
+
(@full_name.gsub(/\./, '/')).to_javaname
|
57
|
+
end
|
58
|
+
|
59
|
+
# Return the Java source file name of this class, e.g. <code>java/lang/Object.java</code>.
|
60
|
+
def to_java_file
|
61
|
+
(to_jvmname + '.java').to_javaname
|
62
|
+
end
|
63
|
+
|
64
|
+
# Return the Java class file name of this class, e.g. <code>java/lang/Object.class</code>.
|
65
|
+
def to_class_file
|
66
|
+
(to_jvmname + '.class').to_javaname
|
67
|
+
end
|
68
|
+
|
69
|
+
# Split the simple name at the camel case boundary _pos_ and return two parts. _pos_ may
|
70
|
+
# be < 0 for counting backwards.
|
71
|
+
def split_simple_name(pos)
|
72
|
+
parts = @simple_name.scan(/([A-Z][^A-Z]+)/).flatten
|
73
|
+
pos = parts.size + pos +1 if pos < 0
|
74
|
+
return ['', @simple_name] if pos <= 0
|
75
|
+
return [@simple_name, ''] if pos >= parts.size
|
76
|
+
[parts[0...pos].join, parts[pos..-1].join]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
class String
|
83
|
+
|
84
|
+
# Convert a Java classname or Java class filename to JavaClass::JavaName instance.
|
85
|
+
# If it's a pathname then it must be relative to the classpath.
|
86
|
+
def to_javaname
|
87
|
+
JavaClass::JavaName.new(self)
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# add the lib to the load path
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__), 'lib')
|
3
|
+
|
4
|
+
# TODO cleanup this code fragment and make a proper class
|
5
|
+
|
6
|
+
require 'javaclass'
|
7
|
+
include JavaClass
|
8
|
+
|
9
|
+
def process_class(name, already=[], intend=0)
|
10
|
+
file_name = 'C:\JavaDev\classes\\' + name.gsub(/\./,'\\') + '.class'
|
11
|
+
return if !FileTest.exist? file_name
|
12
|
+
# p file_name
|
13
|
+
clazz = JavaClass.parse(file_name)
|
14
|
+
# p clazz
|
15
|
+
puts " "*intend + clazz.this_class
|
16
|
+
|
17
|
+
imported = clazz.references.used_classes.collect { |c| c.to_s }.sort
|
18
|
+
new_used = imported - already
|
19
|
+
already << new_used
|
20
|
+
already.flatten!
|
21
|
+
new_used.find_all { |c| c =~ /at\/spardat\// }.each do |c|
|
22
|
+
process_class(c, already, intend+1)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def process_package(folder, already=[], intend=0)
|
27
|
+
file_name = 'C:\JavaDev\classes\\' + folder.gsub(/\./,'\\')
|
28
|
+
cwd = Dir.getwd
|
29
|
+
Dir.chdir file_name
|
30
|
+
files = Dir['*']
|
31
|
+
files.each do |c|
|
32
|
+
if c =~ /\.class$/
|
33
|
+
process_class(folder + '.' + c[/^[^.]+/], already, intend)
|
34
|
+
elsif FileTest.directory? c
|
35
|
+
puts " "*intend+ '-----'
|
36
|
+
process_package(folder + '.' + c, already, intend)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
Dir.chdir cwd
|
40
|
+
end
|
41
|
+
|
42
|
+
# total = []
|
43
|
+
# #process_class('at/spardat/krimiaps/service/client/service/impl/ClientSmeSearchServiceImpl', total)
|
44
|
+
# #process_class('at/spardat/krimiaps/service/client/service/impl/ClientPrivateSearchServiceImpl', total)
|
45
|
+
#
|
46
|
+
# # --- common
|
47
|
+
# #process_package('at.spardat.krimicee.common', total) #
|
48
|
+
# #process_package('at.spardat.krimiaps.common', total) # -> 79 ok
|
49
|
+
# #process_package('at.spardat.common', total) # 146, in sich, koennte nach common
|
50
|
+
# #process_package('at.spardat.integrator', total) #
|
51
|
+
# # DatabaseAwareComponent -> ganze DB
|
52
|
+
# #process_package('at.spardat.krimicee.util', total)
|
53
|
+
# # ItoTestApsSchema -> ganze DB
|
54
|
+
# # process_package('at.spardat.krimicee.lib', total)
|
55
|
+
# # KrimiLock -> ganze DB
|
56
|
+
#
|
57
|
+
# #process_package('at.spardat.krimicee.dom', total)
|
58
|
+
# #process_package('at.spardat.krimicee.db', total)
|
59
|
+
# # KrimiLoanService, PrintHelper ->
|
60
|
+
# #process_package('at.spardat.krimicee.dao', total)
|
61
|
+
# #process_package('at.spardat.krimicee.dao', total)
|
62
|
+
# #process_package('at.spardat.krimicee.entity', total)
|
63
|
+
# #process_package('at.spardat.krimicee.entity', total)
|
64
|
+
# #process_package('at.spardat.krimicee.eo', total)
|
65
|
+
# #process_package('at.spardat.krimicee.sql', total)
|
66
|
+
# #process_package('at.spardat.krimicee.model', total) # 1647
|
67
|
+
#
|
68
|
+
# puts total.size
|