# HG changeset patch # User Jan Vrany # Date 1382200702 -3600 # Node ID d8458cc3aabea833f9c508292e1ac489a965c0e8 # Parent e6218729758577a0fee024175422307c9a2babfe Make JavaVM>>#loadClassesIn: to work with .jar files as well. diff -r e62187297585 -r d8458cc3aabe 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 " "Created: / 21-10-2011 / 12:40:34 / Marcel Hlopko " + "Modified (comment): / 19-10-2013 / 17:32:59 / Jan Vrany " ! 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 " - "Modified: / 30-10-2011 / 14:02:31 / Jan Vrany " + "Modified (comment): / 19-10-2013 / 17:32:32 / Jan Vrany " ! ! !JavaVM class methodsFor:'class loading/unloading'!