src/JavaClassRegistry.st
branchjk_new_structure
changeset 1073 e842ab17fe16
parent 1062 69aac7194016
child 1120 b65e199200a4
equal deleted inserted replaced
1072:d3c2e3aeadc0 1073:e842ab17fe16
   154     "Modified: / 21-10-2011 / 12:39:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
   154     "Modified: / 21-10-2011 / 12:39:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
   155     "Created: / 23-10-2011 / 11:40:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   155     "Created: / 23-10-2011 / 11:40:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   156 !
   156 !
   157 
   157 
   158 classForName: className loader: classLoader ifAbsentPut: block 
   158 classForName: className loader: classLoader ifAbsentPut: block 
   159 
       
   160     "Get class loaded by classLoader from registry. if absent block is evaluated and resulting class in registered in registry, "
   159     "Get class loaded by classLoader from registry. if absent block is evaluated and resulting class in registered in registry, "
   161     
   160     
   162     | classes class |
   161     | class |
   163 
       
   164     self assert: (className includes: $.) not.
   162     self assert: (className includes: $.) not.
   165 
   163      "if class is already registered with the same cl, just return it"
   166     "Classes loaded by primordial classloader are always
   164     class := self classNamed: className loader: classLoader.
   167      used"
   165     class notNil ifTrue: [ ^ class ].
   168 
   166     "if java vm is booted, nil class loader means system class loader, lets check it too"
   169     classLoader notNil ifTrue:[
   167     (vm booted and: [classLoader isNil]) ifTrue: [class := self classNamed: className loader: vm systemClassLoader. class notNil ifTrue: [^class]].
   170         classes := loaders at: nil ifAbsent: nil.
   168      "otherwise evaluate block"
   171         class := classes at: className ifAbsent: nil.
   169     class := block value.
   172         class notNil ifTrue:[
   170     class notNil ifTrue: [
   173             ^class.
   171     self registerClass: class.].
   174         ]
   172     ^ class.
   175     ].
       
   176 
       
   177     "JV@2011-10-30: Another HACK, nil classloader may mean
       
   178      system class loader, so try it first..."    
       
   179     (classLoader isNil and:[vm systemClassLoader notNil]) ifTrue:[        
       
   180         classes := loaders at: vm systemClassLoader ifAbsent: nil.
       
   181         classes notNil ifTrue:[
       
   182             class := classes at: className ifAbsent: nil.
       
   183             class notNil ifTrue:[^class].
       
   184         ]
       
   185     ].
       
   186 
       
   187 
       
   188     "No bootstrap class found, search given classloader"
       
   189     classes := loaders at: classLoader ifAbsent: nil.
       
   190     classes isNil ifTrue:[
       
   191         classes := loaders at: classLoader put: Dictionary new        
       
   192     ].
       
   193     ^classes at: className ifAbsent: [
       
   194         class := block value.
       
   195         class notNil ifTrue:[
       
   196             self registerClass: class.
       
   197         ].
       
   198         class "return it"
       
   199     ]
       
   200 
   173 
   201     "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
   174     "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
   202     "Created: / 23-10-2011 / 11:36:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   175     "Created: / 23-10-2011 / 11:36:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   176     "Modified: / 02-11-2011 / 17:29:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
   203 !
   177 !
   204 
   178 
   205 classNamed: className
   179 classNamed: className
   206 
   180 
   207     "Return a class for given classname loaded by 'current classloader' or 
   181     "Return a class for given classname loaded by 'current classloader' or 
   225 classes
   199 classes
   226 
   200 
   227     ^Iterator on:[:whatToDo|self classesDo: whatToDo]
   201     ^Iterator on:[:whatToDo|self classesDo: whatToDo]
   228 
   202 
   229     "Created: / 23-10-2011 / 20:14:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   203     "Created: / 23-10-2011 / 20:14:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   230 ! !
       
   231 
       
   232 !JavaClassRegistry methodsFor:'accessing-obsolete'!
       
   233 
       
   234 at: className 
       
   235 
       
   236      <resource: #obsolete> 
       
   237 
       
   238     self breakPoint:#jv info: 'Use #classForName:'.
       
   239     self breakPoint:#mh info: 'Use #classForName:'.
       
   240 
       
   241     ^ self classNamed: className
       
   242 
       
   243     "Modified: / 23-10-2011 / 12:23:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   244 !
       
   245 
       
   246 at: classLoader at: className
       
   247 
       
   248     <resource: #obsolete> 
       
   249 
       
   250     self breakPoint:#jv info: 'Use #classForName:loader:'.
       
   251     self breakPoint:#mh info: 'Use #classForName:loader:'.
       
   252 
       
   253     ^self classNamed: className loader: classLoader
       
   254 
       
   255     "Modified: / 23-10-2011 / 12:23:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   256 !
       
   257 
       
   258 at: classLoader at: className ifAbsent: aBlock 
       
   259 
       
   260     <resource: #obsolete>
       
   261 
       
   262     self breakPoint:#mh info: 'Use #classForName:loader:isAbsent:'.
       
   263     self breakPoint:#jv info: 'Use #classForName:loader:isAbsent:'.
       
   264 
       
   265     ^self classForName: className loader: classLoader ifAbsent: aBlock.
       
   266 
       
   267     "Modified: / 21-10-2011 / 12:39:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
       
   268     "Modified: / 23-10-2011 / 11:47:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   269 !
       
   270 
       
   271 at: classLoader at: className ifAbsentPut: aBlock 
       
   272 
       
   273     <resource: #obsolete> 
       
   274 
       
   275     self breakPoint:#jv info: 'Use #classForName:loader:isAbsentPut:'.
       
   276     self breakPoint:#mh info: 'Use #classForName:loader:isAbsentPut:'.
       
   277 
       
   278     ^self classForName: className loader: classLoader ifAbsentPut: aBlock
       
   279 
       
   280     "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
       
   281     "Modified: / 23-10-2011 / 11:41:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   282 ! !
   204 ! !
   283 
   205 
   284 !JavaClassRegistry methodsFor:'class loading'!
   206 !JavaClassRegistry methodsFor:'class loading'!
   285 
   207 
   286 loadFile: aFilename 
   208 loadFile: aFilename 
   388 
   310 
   389 registerClass: aJavaClass
   311 registerClass: aJavaClass
   390     | classes |
   312     | classes |
   391 
   313 
   392     self assert: (aJavaClass name includes: $.) not.
   314     self assert: (aJavaClass name includes: $.) not.
   393 
       
   394 
       
   395     loaders keysAndValuesDo:[:loader :classes|
   315     loaders keysAndValuesDo:[:loader :classes|
   396 
   316 
   397         (classes includesKey: aJavaClass name) ifTrue:[
   317         (classes includesKey: aJavaClass name) ifTrue:[
   398             loader == aJavaClass classLoader ifTrue:[
   318             loader == aJavaClass classLoader ifTrue:[
   399                 (classes at: aJavaClass name) ~~ aJavaClass ifTrue:[
   319                 (classes at: aJavaClass name) ~~ aJavaClass ifTrue:[
   410         classes := loaders at: aJavaClass classLoader put: Dictionary new.
   330         classes := loaders at: aJavaClass classLoader put: Dictionary new.
   411     ].
   331     ].
   412     classes at: aJavaClass name put: aJavaClass.
   332     classes at: aJavaClass name put: aJavaClass.
   413 
   333 
   414     "Created: / 23-10-2011 / 11:53:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   334     "Created: / 23-10-2011 / 11:53:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   335     "Modified: / 02-11-2011 / 18:40:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
   415 ! !
   336 ! !
   416 
   337 
   417 !JavaClassRegistry class methodsFor:'documentation'!
   338 !JavaClassRegistry class methodsFor:'documentation'!
   418 
   339 
   419 version_SVN
   340 version_SVN