Make JavaVM>>#loadClassesIn: to work with .jar files as well. development
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sat, 19 Oct 2013 17:38:22 +0100
branchdevelopment
changeset 2875 d8458cc3aabe
parent 2874 e62187297585
child 2876 7bcde178eee7
Make JavaVM>>#loadClassesIn: to work with .jar files as well.
JavaVM.st
--- a/JavaVM.st	Fri Oct 18 16:55:19 2013 +0100
+++ b/JavaVM.st	Sat Oct 19 17:38:22 2013 +0100
@@ -2685,20 +2685,20 @@
 !
 
 loadClassesIn: directory
-"load all classes (.class files, strictly speaking) found in given directory.
-The argument is string containing the name of the directory.
-
-Returns a set of loaded classes."
-
-^ self loadClassesIn: directory matching: '*'.
+    "Load all classes (.class files, strictly speaking) found in given directory or .jar file.
+
+    Returns a set of loaded classes."
+
+    ^ self loadClassesIn: directory matching: '*'.
 
     "Modified: / 11-06-2011 / 13:35:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Created: / 21-10-2011 / 12:40:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified (comment): / 19-10-2013 / 17:32:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 loadClassesIn: directory matching: pattern
-    "load all classes (.class files, strictly speaking) found in given directory.
-     The arguments are a string containing the name of the directory
+    "Load all classes (.class files, strictly speaking) found in given directory or .jar file.
+     The arguments are a string containing the name of the directory or .jar file
      and a class name pattern. Only classes matching the pattern are loaded.
      class names are matched using String>>matches:.
      ALL CLASSES ARE INSTALLED!!
@@ -2709,19 +2709,36 @@
     loadedClasses := Set new.
     Java addToClassPath: dir pathName.
     JavaClassReader classLoaderQuerySignal answer: SystemClassLoader do:[
-
-    dir
-        recursiveDirectoryContentsAsFilenamesDo: [
-            :filename |
-            (filename isRegularFile and: [ filename suffix = #class ]) ifTrue: [
-                dirString := dir pathName.
-                className := filename withoutSuffix pathName.
-                className := className subString: dirString size + 2 to: className size.
-                className := className copyReplaceAll: (Filename separator) with: $..
-                (className matches: pattern) ifTrue: [
-                    (self classNamed: className) isNil ifTrue:[
-                        loadedClasses add: (self classForName:className).
-                    ].
+        dir isDirectory ifTrue:[
+            dir recursiveDirectoryContentsAsFilenamesDo: [
+                :filename |
+                (filename isRegularFile and: [ filename suffix = #class ]) ifTrue: [
+                    dirString := dir pathName.
+                    className := filename withoutSuffix pathName.
+                    className := className subString: dirString size + 2 to: className size.
+                    className := className copyReplaceAll: (Filename separator) with: $..
+                    (className matches: pattern) ifTrue: [
+                        (self classNamed: className) isNil ifTrue:[
+                            loadedClasses add: (self classForName:className).
+                        ].
+                    ]
+                ]
+            ].
+        ] ifFalse:[
+            | zar |
+
+            zar := ZipArchive oldFileNamed: dir pathName.
+            zar entries do:[:entry|
+            (entry endsWith:'.class') ifTrue:[
+                | nm |
+
+                nm := entry copyTo: entry size - 6.
+                className := nm copyReplaceAll: (Filename separator) with: $.. 
+                    (className matches: pattern) ifTrue: [
+                        (self classNamed: className) isNil ifTrue:[
+                            loadedClasses add: (self classForName:className).
+                        ].
+                    ]
                 ]
             ]
         ].
@@ -2729,7 +2746,7 @@
     ^ loadedClasses.
 
     "Modified: / 21-10-2011 / 12:52:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 30-10-2011 / 14:02:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 19-10-2013 / 17:32:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaVM class methodsFor:'class loading/unloading'!