javaclass 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/Rakefile +208 -23
  2. data/Readme.txt +56 -19
  3. data/examples/generate_class_lists.rb +61 -0
  4. data/history.txt +13 -19
  5. data/lib/javaclass/classfile/access_flags.rb +52 -0
  6. data/lib/javaclass/classfile/class_magic.rb +29 -0
  7. data/lib/javaclass/classfile/class_version.rb +67 -0
  8. data/lib/javaclass/classfile/constant_pool.rb +91 -0
  9. data/lib/javaclass/classfile/constants/base.rb +33 -0
  10. data/lib/javaclass/classfile/constants/double_reference.rb +99 -0
  11. data/lib/javaclass/classfile/constants/single_reference.rb +65 -0
  12. data/lib/javaclass/classfile/constants/value.rb +116 -0
  13. data/lib/javaclass/classfile/java_class_header.rb +102 -0
  14. data/lib/javaclass/classfile/references.rb +43 -0
  15. data/lib/javaclass/classlist/class_entry.rb +89 -0
  16. data/lib/javaclass/classlist/jar_searcher.rb +69 -0
  17. data/lib/javaclass/classlist/list.rb +126 -0
  18. data/lib/javaclass/classlist/package_entry.rb +87 -0
  19. data/lib/javaclass/classpath/classpaths.txt +2 -0
  20. data/lib/javaclass/classpath/composite_classpath.rb +99 -0
  21. data/lib/javaclass/classpath/folder_classpath.rb +83 -0
  22. data/lib/javaclass/classpath/jar_classpath.rb +100 -0
  23. data/lib/javaclass/classpath/java_home_classpath.rb +40 -0
  24. data/lib/javaclass/classpath/port_ClassPathEntry.java +202 -0
  25. data/lib/javaclass/classpath/port_ClassPathEntryFactory.java +311 -0
  26. data/lib/javaclass/classpath/port_DirectoryRepository.java +24 -0
  27. data/lib/javaclass/java_name.rb +90 -0
  28. data/lib/javaclass/metric/ccd.rb +68 -0
  29. data/lib/javaclass/metric/class_usage.rb +41 -0
  30. data/lib/javaclass/metric/metrics.txt +15 -0
  31. data/lib/javaclass.rb +44 -11
  32. data/test/data/ShortClientData$1-4000Wert.class +0 -0
  33. data/test/data/{AccessFlagsTestAbstract.class → access_flags/AccessFlagsTestAbstract.class} +0 -0
  34. data/test/data/{AccessFlagsTestAbstract.java → access_flags/AccessFlagsTestAbstract.java} +0 -0
  35. data/test/data/{AccessFlagsTestFinal.class → access_flags/AccessFlagsTestFinal.class} +0 -0
  36. data/test/data/{AccessFlagsTestFinal.java → access_flags/AccessFlagsTestFinal.java} +0 -0
  37. data/test/data/{AccessFlagsTestInterface.class → access_flags/AccessFlagsTestInterface.class} +0 -0
  38. data/test/data/{AccessFlagsTestInterface.java → access_flags/AccessFlagsTestInterface.java} +0 -0
  39. data/test/data/{AccessFlagsTestPackage.class → access_flags/AccessFlagsTestPackage.class} +0 -0
  40. data/test/data/{AccessFlagsTestPackage.java → access_flags/AccessFlagsTestPackage.java} +0 -0
  41. data/test/data/access_flags/AccessFlagsTestPublic$Inner.class +0 -0
  42. data/test/data/access_flags/AccessFlagsTestPublic$InnerInterface.class +0 -0
  43. data/test/data/access_flags/AccessFlagsTestPublic$StaticInner.class +0 -0
  44. data/test/data/access_flags/AccessFlagsTestPublic.class +0 -0
  45. data/test/data/access_flags/AccessFlagsTestPublic.java +11 -0
  46. data/test/data/access_flags/AccessFlagsTestPublic_javap.txt +29 -0
  47. data/test/data/{makeAccessFlagsTest.bat → access_flags/make.bat} +0 -0
  48. data/test/data/{ClassVersionTest.java → class_version/ClassVersionTest.java} +0 -0
  49. data/test/data/{ClassVersionTest10.class → class_version/ClassVersionTest10.class} +0 -0
  50. data/test/data/{ClassVersionTest11.class → class_version/ClassVersionTest11.class} +0 -0
  51. data/test/data/{ClassVersionTest12.class → class_version/ClassVersionTest12.class} +0 -0
  52. data/test/data/{ClassVersionTest13.class → class_version/ClassVersionTest13.class} +0 -0
  53. data/test/data/{ClassVersionTest14.class → class_version/ClassVersionTest14.class} +0 -0
  54. data/test/data/{ClassVersionTest15.class → class_version/ClassVersionTest15.class} +0 -0
  55. data/test/data/{ClassVersionTest16.class → class_version/ClassVersionTest16.class} +0 -0
  56. data/test/data/{makeClassVersionTest.bat → class_version/make.bat} +0 -0
  57. data/test/data/{ConstantPoolTest.class → constant_pool/ConstantPoolTest.class} +0 -0
  58. data/test/data/{ConstantPoolTest.java → constant_pool/ConstantPoolTest.java} +0 -0
  59. data/test/data/{makeConstantPoolTest.bat → constant_pool/make.bat} +0 -0
  60. data/test/data/folder_classpath/JarClasspathTestFolder/ClassVersionTest10.class +0 -0
  61. data/test/data/folder_classpath/JarClasspathTestFolder/package/ClassVersionTest11.class +0 -0
  62. data/test/data/jar_classpath/JarClasspathTest.jar +0 -0
  63. data/test/data/jar_classpath/JarClasspathTest.zip +0 -0
  64. data/test/data/jar_classpath/JarClasspathTestManifest.jar +0 -0
  65. data/test/data/jar_classpath/JarClasspathTestMultiManifest.jar +0 -0
  66. data/test/data/jar_classpath/make.bat +24 -0
  67. data/test/data/jar_searcher/JarClassListTest.jar +0 -0
  68. data/test/data/jar_searcher/PublicClass.java +12 -0
  69. data/test/data/jar_searcher/PublicInterface.java +5 -0
  70. data/test/data/jar_searcher/make.bat +13 -0
  71. data/test/data/java_home_classpath/jdk/jre/lib/rt.jar +0 -0
  72. data/test/data/java_home_classpath/jre/lib/rt.jar +0 -0
  73. data/test/data/java_home_classpath/jre-ext/lib/ext/ext.jar +0 -0
  74. data/test/data/java_home_classpath/jre-ext/lib/rt.jar +0 -0
  75. data/test/data/java_home_classpath/make.bat +13 -0
  76. data/test/data/references/ReferencesTest.class +0 -0
  77. data/test/data/references/ReferencesTest.java +12 -0
  78. data/test/data/references/make.bat +5 -0
  79. data/test/setup.rb +6 -5
  80. data/test/test_access_flags.rb +59 -44
  81. data/test/test_base.rb +20 -15
  82. data/test/test_class_entry.rb +198 -0
  83. data/test/test_class_version.rb +48 -46
  84. data/test/test_composite_classpath.rb +68 -0
  85. data/test/test_constant_pool.rb +49 -41
  86. data/test/test_folder_classpath.rb +45 -0
  87. data/test/test_jar_classpath.rb +57 -0
  88. data/test/test_jar_searcher.rb +93 -0
  89. data/test/test_java_class_header.rb +34 -22
  90. data/test/test_java_home_classpath.rb +50 -0
  91. data/test/test_java_name.rb +110 -0
  92. data/test/test_javaclass.rb +22 -0
  93. data/test/test_list.rb +123 -0
  94. data/test/test_package_entry.rb +91 -0
  95. data/test/test_references.rb +38 -20
  96. data/test/test_string_ux.rb +99 -2
  97. data/test/ts_all_tests.rb +42 -21
  98. metadata +171 -50
  99. data/lib/javaclass/access_flags.rb +0 -44
  100. data/lib/javaclass/class_magic.rb +0 -27
  101. data/lib/javaclass/class_version.rb +0 -65
  102. data/lib/javaclass/constant_pool.rb +0 -85
  103. data/lib/javaclass/constants/base.rb +0 -31
  104. data/lib/javaclass/constants/double_reference.rb +0 -81
  105. data/lib/javaclass/constants/single_reference.rb +0 -58
  106. data/lib/javaclass/constants/value.rb +0 -114
  107. data/lib/javaclass/java_class_header.rb +0 -88
  108. data/lib/javaclass/references.rb +0 -31
  109. data/test/data/AccessFlagsTestPublic$InnerClass.class +0 -0
  110. data/test/data/AccessFlagsTestPublic.class +0 -0
  111. 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