"
COPYRIGHT (c) 1996-2011 by Claus Gittinger
New code and modifications done at SWING Research Group [1]:
COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
SWING Research Group, Czech Technical University in Prague
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
[1] Code written at SWING Research Group contains a signature
of one of the above copright owners. For exact set of such code,
see the differences between this version and version stx:libjava
as of 1.9.2010
"
"{ Package: 'stx:libjava' }"
Object subclass:#JavaRelease
instanceVariableNames:'javaHome classPath sourcePath classes bootClassPathClasses
extDirsClasses'
classVariableNames:''
poolDictionaries:''
category:'Languages-Java-Support'
!
JavaRelease subclass:#OpenJDK6
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
privateIn:JavaRelease
!
JavaRelease subclass:#SunJDK122
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
privateIn:JavaRelease
!
JavaRelease::OpenJDK6 subclass:#SunJDK6
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
privateIn:JavaRelease
!
!JavaRelease class methodsFor:'documentation'!
copyright
"
COPYRIGHT (c) 1996-2011 by Claus Gittinger
New code and modifications done at SWING Research Group [1]:
COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
SWING Research Group, Czech Technical University in Prague
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
[1] Code written at SWING Research Group contains a signature
of one of the above copright owners. For exact set of such code,
see the differences between this version and version stx:libjava
as of 1.9.2010
"
! !
!JavaRelease class methodsFor:'instance creation'!
any
| releases |
releases := self allSubclasses
reject: [:rel | rel isAbstract ]
thenCollect: [:rel | rel new ].
releases := releases
asSortedCollection: [:a :b | a priority > b priority ].
releases := releases select: [:rel | rel isAvailable ].
releases isEmpty
ifTrue: [ self error: 'No Java release found'. ^nil ].
^releases first initialize; yourself
"
JavaRelease any"
"Created: / 22-11-2010 / 13:11:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 01-11-2011 / 14:02:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
openJDK6
^ OpenJDK6 new initialize.
"Created: / 27-10-2010 / 21:41:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 05-11-2011 / 18:45:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
sunJDK122
^ SunJDK122 new initialize.
"Created: / 27-10-2010 / 21:41:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 05-11-2011 / 18:45:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
sunJDK6
^ SunJDK6 new initialize.
"Created: / 22-11-2010 / 13:33:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 05-11-2011 / 18:45:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !
!JavaRelease class methodsFor:'queries'!
isAbstract
^self class == JavaRelease
"Created: / 22-11-2010 / 13:33:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease methodsFor:'accessing'!
bootClassPath
"Returns a default value of sun.boot.class.path"
OperatingSystem isUNIXlike ifTrue: [ ^ self bootClassPathOnUNIX ].
OperatingSystem isMSWINDOWSlike ifTrue: [ ^ self bootClassPathOnWindows ].
self error: 'Unsupported platform'.
^ #().
"Created: / 02-11-2011 / 12:19:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
bootClassPathOnUNIX
self subclassResponsibility.
"Created: / 02-11-2011 / 12:33:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
bootClassPathOnWindows
self subclassResponsibility.
"Created: / 02-11-2011 / 12:33:22 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
classPath
"Returns a default class path"
classPath ifNil:[self searchForClassPath].
^classPath
"
JavaRelease openJDK6 classPath
"
"Created: / 27-10-2010 / 19:20:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 27-10-2010 / 21:48:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaExtDirs
"Returns a default value of java.ext.dirs property"
OperatingSystem isUNIXlike ifTrue:[ ^ self javaExtDirsOnUNIX ].
OperatingSystem isMSWINDOWSlike ifTrue:[ ^ self javaExtDirsOnWindows ].
self error:'Unsupported platform'.
^ #()
"
JavaRelease openJDK6 classPath
"
"Modified: / 27-10-2010 / 21:48:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Created: / 31-08-2011 / 19:59:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaExtDirsOnUNIX
^#()
"Created: / 31-08-2011 / 19:59:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaExtDirsOnWindows
^#()
"Created: / 31-08-2011 / 19:59:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHome
"Answer a Java home"
javaHome ifNil:
[javaHome := self searchForJavaHome.
javaHome ifNil:[self error:'No java home found!!']].
^javaHome
"
JavaRelease openJDK6 javaHome
"
"Created: / 27-10-2010 / 18:59:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 30-11-2010 / 11:37:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHomeOrNil
"Answer a Java home"
| home |
home := (javaHome
ifNotNil:[javaHome]
ifNil:[self searchForJavaHome]).
^home
"
JavaRelease openJDK6 javaHome
"
"Created: / 22-11-2010 / 13:17:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHomes
"Answer a set of possible java homes, those directories are searched"
OperatingSystem isUNIXlike ifTrue:[ ^ self javaHomesOnUNIX ].
OperatingSystem isMSWINDOWSlike ifTrue:[ ^ self javaHomesOnWindows ].
self error:'Unsupported platform'.
^ #()
"Modified: / 22-11-2010 / 13:28:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHomesOnUNIX
"raise an error: must be redefined in concrete subclass(es)"
^ self subclassResponsibility
!
javaHomesOnWindows
"raise an error: must be redefined in concrete subclass(es)"
^ self subclassResponsibility
!
jreHome
"Answers the directory where the JRE lives"
| jreHome |
^(jreHome := self javaHome asFilename / 'jre') exists
ifTrue:[jreHome]
ifFalse:[javaHome asFilename].
"Created: / 27-10-2010 / 21:24:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
name
"Answer a human readable name of the Java release such as Sun JDK 1.2.2 or OpenJDK 6"
^self subclassResponsibility
"Created: / 27-10-2010 / 18:53:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
priority
^50
"Created: / 22-11-2010 / 13:34:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
sourcePath
"Returns a paths where sources are located"
sourcePath ifNil:[self searchForSourcePath].
^sourcePath
"
JavaRelease openJDK6 sourcePath
"
"Created: / 27-10-2010 / 19:20:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 30-11-2010 / 11:55:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease methodsFor:'debugging'!
dumpConfigOn: stream
| dumper |
dumper := [:name :value :isfile|
| values |
'%-15s : ' printf:{ name } on: stream.
value isString
ifTrue:[values := { value asString }]
ifFalse:[values := value].
values do:[:v|
stream nextPutAll: v asString.
isfile ifTrue:[
v asFilename exists ifFalse:[
stream nextPutAll:' (not found!!!!!!)'
].
]
] separatedBy:[stream cr; next: 15 + 3 put: Character space].
stream cr.
].
stream nextPutAll: '== Java release config =='; cr.
dumper value: 'name' value: self name value: false.
dumper value: 'java home' value: self javaHome value: true.
dumper value: 'jre home' value: self jreHome asString value: true.
dumper value: 'class path' value: self classPath value: true.
dumper value: 'boot class path' value: self bootClassPath value: true.
dumper value: 'ext dirs' value: self javaExtDirs value: true.
"
Java release dumpConfigOn: Transcript.
"
"Created: / 10-12-2011 / 12:55:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease methodsFor:'initialization'!
initialize
self initializeBootClassPathIndex.
self initializeExtDirsIndex.
self initializeClassIndex.
"Created: / 01-11-2011 / 14:09:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
initializeBootClassPathIndex
bootClassPathClasses := IdentitySet new.
self bootClassPath do: [:file |
| filename |
filename := file pathName.
self assert: (filename endsWith: '.jar').
self assert: (filename asFilename exists).
self selectAllClassNamesIn: filename to: bootClassPathClasses.
].
"Created: / 02-11-2011 / 12:12:50 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
"Modified: / 02-11-2011 / 23:46:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
initializeClassIndex
classes := IdentitySet new.
self jreHome recursiveDirectoryContents do: [
:each |
(each endsWith: '.class') ifTrue: [
classes add: each asSymbol.
self halt.
].
(each endsWith: '.jar') ifTrue: [ self selectAllClassNamesIn: (self jreHome asFilename / each asFilename) to: classes. ]
].
"Created: / 01-11-2011 / 14:09:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
initializeExtDirsIndex
extDirsClasses := IdentitySet new.
self javaExtDirs do: [
:dir |
dir exists ifFalse: [
Logger
log: dir pathName
, ', included in JavaRelease>>javaExtDirs, does not exist'
severity: #info
facility: 'JVM'
] ifTrue: [
dir recursiveDirectoryContents do: [
:filename |
(filename endsWith: '.class') ifTrue: [ extDirsClasses add: filename asSymbol ].
(filename endsWith: '.jar') ifTrue: [
self selectAllClassNamesIn: dir asFilename / filename asFilename to: extDirsClasses
].
]
].
].
"Created: / 02-11-2011 / 12:12:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
selectAllClassNamesIn: jarArchiveName to: anIdentityCollection
| jar classesInJar |
jar := ZipArchive readingFrom: jarArchiveName asFilename readStream.
classesInJar := jar entries select: [:each | each endsWith: '.class'. ].
classesInJar do: [:each |
anIdentityCollection add: (each copyFrom: 1 to: each size - 6) asSymbol
].
"
JavaRelease any."
"Created: / 02-11-2011 / 12:17:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
"Modified (format): / 02-11-2011 / 23:34:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
updateClassIndexFrom: jarArchiveName
| jar classesInJar |
jar := ZipArchive
readingFrom: (self jreHome asFilename / jarArchiveName asFilename)
readStream.
classesInJar := jar entries select: [:each | each endsWith: '.class'. ].
classesInJar do: [:each | classes add: each asSymbol].
"
JavaRelease any."
"Created: / 01-11-2011 / 14:18:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !
!JavaRelease methodsFor:'private'!
searchInternalIndex: anIdentityCollection for: className
| classFileName |
classFileName := (className asSlashedJavaClassName) asSymbol.
^ anIdentityCollection includes: classFileName asSymbol.
"Created: / 02-11-2011 / 12:27:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !
!JavaRelease methodsFor:'queries'!
bootClassPathIncludesClassNamed: className
^ self searchInternalIndex: bootClassPathClasses for: className.
"Created: / 02-11-2011 / 12:11:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
extDirsIncludesClassNamed: className
^self searchInternalIndex: classes for: className.
"Created: / 02-11-2011 / 12:11:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
includesClassNamed: className
self searchInternalIndex: classes for: className.
"Created: / 01-11-2011 / 14:50:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
isAvailable
^self javaHomeOrNil notNil
"
JavaRelease openJDK6 isAvailable
JavaRelease sunJDK6 isAvailable
"
"Created: / 22-11-2010 / 13:15:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease methodsFor:'searching'!
searchForClassPath
| jreHome |
classPath := OrderedCollection new.
jreHome := self jreHome.
"Ensure, that rt.jar is first"
classPath add: (jreHome / 'lib' / 'rt.jar') asString.
self searchForClassPathIn: jreHome / 'lib' .
self searchForClassPathIn: jreHome / 'lib' / 'modules'.
^self classPath
"
Java release searchForClassPath.
Java release classPath.
"
"Created: / 27-10-2010 / 21:15:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
searchForClassPathIn: dir
dir exists ifFalse: [ ^ self ].
dir directoryContentsAsFilenames do: [
:file |
" this is to make sure that rt.jar is always first --v "
(file suffix = 'jar' and: [ file baseName ~= 'rt.jar' ]) ifTrue: [
classPath add: file asString
]
]
"Created: / 27-10-2010 / 21:38:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 02-11-2011 / 17:49:59 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
"Modified (format): / 09-12-2011 / 02:11:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
searchForJavaHome
| h |
h := (OperatingSystem getEnvironment:'JAVA_HOME').
h notNil ifTrue:[
javaHome := h asFilename.
(javaHome / 'jre') exists ifTrue:[
javaHome := javaHome / 'jre'.
].
^javaHome
].
self javaHomes do:
[:home| | homeAsFilename |
homeAsFilename := home asFilename.
homeAsFilename exists ifTrue:
[(self validateJavaHome: homeAsFilename) ifTrue:
[^javaHome := home]]].
^nil
"Created: / 27-10-2010 / 19:03:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 22-11-2010 / 13:18:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 15-03-2011 / 13:29:14 / Jan Kurs <kursjan@fit.cvut.cz>"
"Modified: / 15-03-2011 / 13:47:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
searchForSourcePath
| src_zip |
sourcePath := OrderedCollection new.
src_zip := self javaHome asFilename directory / 'src.zip'.
src_zip exists ifTrue:[sourcePath add: src_zip asString].
"
JavaRelease openJDK6 searchForSourcePath; sourcePath
"
"Created: / 27-10-2010 / 21:15:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 07-08-2011 / 22:40:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease methodsFor:'validating'!
validateJavaHome: home
"Just JRE"
( home asFilename / 'lib' / 'rt.jar' ) exists ifTrue:[^true].
"Full JDK"
( home asFilename / 'jre' / 'lib' / 'rt.jar' ) exists ifTrue:[^true].
^ false
"
JavaRelease basicNew validateJavaHome: '/usr/lib/jvm/java-6-openjdk'
JavaRelease basicNew validateJavaHome: '/tmp'
"
"Created: / 27-10-2010 / 19:14:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 27-10-2010 / 21:47:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease::OpenJDK6 methodsFor:'accessing'!
bootClassPathOnUNIX
| jre |
jre := self jreHome.
^ {
jre / 'lib' / 'resources.jar' .
jre / 'lib' / 'rt.jar' .
jre / 'lib' / 'jsse.jar' .
jre / 'lib' / 'jce.jar' .
jre / 'lib' / 'charsets.jar' .
}
"
JavaRelease openJDK6 bootClassPathOnUNIX
"
"Created: / 02-11-2011 / 12:36:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
"Modified (comment): / 02-11-2011 / 23:39:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
bootClassPathOnWindows
"This should be the same as on UNIX, we'll see..."
^self bootClassPathOnUNIX
"Created: / 02-11-2011 / 12:36:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
"Created: / 02-11-2011 / 23:41:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaExtDirsOnUNIX
^{
self javaHome asFilename / 'lib' / 'ext' .
'/usr/java/packages/lib/ext' asFilename
}
"Created: / 31-08-2011 / 20:01:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaExtDirsOnWindows
^{
self javaHome asFilename / 'lib' / 'ext' .
}
"Created: / 31-08-2011 / 20:02:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHomesOnUNIX
^ #( '/usr/lib/jvm/java-6-openjdk/jre' )
"Modified: / 07-08-2011 / 20:38:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHomesOnWindows
|vsn home heuristics|
self breakPoint:#jv.
heuristics :=
#(
'C:\Program Files (x86)\Java\jdk1.6.0_24\jre'
'C:\Program Files\Java\jdk1.6.0_24\jre'
).
vsn := (OperatingSystem registryEntry
key:'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit')
valueNamed:'CurrentVersion'.
vsn notNil ifTrue:[
home := (OperatingSystem registryEntry
key:'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\',vsn)
valueNamed:'JavaHome'.
home notNil ifTrue:[
^ (Array with:(home,'\jre'))
, heuristics
].
].
^ heuristics
"
self basicNew javaHomesOnWindows
"
"Modified: / 07-08-2011 / 20:38:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified (format): / 19-08-2011 / 00:46:40 / cg"
!
name
"superclass JavaRelease says that I am responsible to implement this method"
^ 'Open JDK 6'
"Modified: / 27-10-2010 / 19:16:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
priority
^80
"/^70
"Created: / 22-11-2010 / 13:35:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 04-02-2011 / 06:59:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease::SunJDK122 methodsFor:'accessing'!
javaHomesOnUNIX
"superclass JavaRelease says that I am responsible to implement this method"
^#(
'/home/jv/Projects/JavaX/jdk1.2.2' "/On Jan Vrany's machine :-)
)
"Created: / 22-11-2010 / 13:26:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHomesOnWindows
^ #()
!
name
"superclass JavaRelease says that I am responsible to implement this method"
^ 'Sun JDK 1.2.2'
"Modified: / 27-10-2010 / 21:42:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
priority
^10
"Created: / 22-11-2010 / 13:34:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease::SunJDK6 methodsFor:'accessing'!
javaHomesOnUNIX
^ #( '/usr/lib/jvm/java-6-sun' )
"Created: / 22-11-2010 / 13:31:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaHomesOnWindows
self breakPoint:#jv.
^ #( 'C:\Program Files (x86)\Java\jdk1.6.0_24'
'C:\Program Files\Java\jdk1.6.0_24'
)
"Created: / 22-11-2010 / 13:30:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
name
^ 'Sun JDK 6'
"Created: / 22-11-2010 / 13:31:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
priority
^75
"Created: / 22-11-2010 / 13:35:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaRelease class methodsFor:'documentation'!
version_SVN
^ '$Id$'
! !