src/JavaRelease.st
author vranyj1
Sat, 10 Dec 2011 12:30:17 +0000
branchjk_new_structure
changeset 1259 e3089381b731
parent 1251 14f94a33376d
child 1356 0dd28400803e
permissions -rw-r--r--
Java, JavaRelease: added dumpConfigOn:

"
 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$'

! !