JavaRelease.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sun, 16 Dec 2012 21:04:02 +0100
branchdirectory_structure_refactoring
changeset 1899 800c0f76adce
parent 1818 2e5ed72e7dfd
child 1864 60a8dc26c8c6
permissions -rw-r--r--
Closing branch directory_structure_refactoring

"
 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 class instanceVariableNames:'instance'

"
 No other class instance variables are inherited by this class.
"
!

JavaRelease subclass:#Custom
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	privateIn:JavaRelease
!

JavaRelease subclass:#OpenJDK6
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	privateIn:JavaRelease
!

JavaRelease::OpenJDK6 subclass:#OpenJDK7
	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'!

custom
    ^Custom instance

    "Created: / 26-07-2012 / 23:37:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

openJDK6
    ^ OpenJDK6 instance

    "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>"
    "Modified: / 27-07-2012 / 00:22:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

openJDK7
    ^ OpenJDK7 instance.

    "Created: / 26-07-2012 / 23:51:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

sunJDK122
    ^ SunJDK122 instance

    "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>"
    "Modified: / 27-07-2012 / 00:22:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

sunJDK6
    ^ SunJDK6 instance

    "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>"
    "Modified: / 27-07-2012 / 00:22:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease class methodsFor:'accessing'!

all
    ^(self allSubclasses 
                reject: [:rel | rel isAbstract ]
                thenCollect: [:rel | rel instance ])
                asSortedCollection: [:a :b | a priority > b priority ]


    "
        JavaRelease all
    "

    "Created: / 27-07-2012 / 00:10:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

any
    | releases |

    releases := self available.
    releases isEmptyOrNil ifTrue:[ ^ nil ].
    ^ releases first initialize


    "
        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>"
    "Modified: / 26-07-2012 / 23:42:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

available
    | releases |
    releases := self all select: [:rel | rel isAvailable ].
    releases isEmpty 
        ifTrue: [ self error: 'No Java release found'. ^nil ].
    ^releases

    "
        JavaRelease available
    "

    "Created: / 26-07-2012 / 23:41:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease class methodsFor:'instance creation-private'!

instance
    instance isNil ifTrue:[
        instance := self new initialize
    ].
    ^instance

    "Created: / 27-07-2012 / 00:22:13 / Jan Vrany <jan.vrany@fit.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>"
    "Modified (format): / 31-07-2012 / 10:16:25 / jv"
!

bootClassPathOnUNIX
    "Not known..."
    ^#()

    "Created: / 02-11-2011 / 12:33:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-07-2012 / 00:23:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

bootClassPathOnWindows
    "Should be same as on UNIX (computed relative to classPath)"

    ^self bootClassPathOnUNIX

    "Created: / 02-11-2011 / 12:33:22 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 31-07-2012 / 10:16:14 / jv"
!

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 isNil ifTrue:[
        javaHome := self searchForJavaHome.
    ].
    ^javaHome

    "
        JavaRelease openJDK6 javaHome
    "

    "Created: / 27-10-2010 / 18:59:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 27-07-2012 / 00:24:17 / 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 |

    self javaHome isNil ifTrue:[ ^ nil ].

    ^(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>"
!

selector
    "Returns instance-creation selector to get the receiver.
     See JavaRelease class, protocol instance creation"

    ^self subclassResponsibility

    "Created: / 27-07-2012 / 10:04:29 / 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:'displaying'!

displayString
    ^self name

    "Created: / 27-07-2012 / 00:01:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease methodsFor:'initialization'!

initializeBootClassPathIndex
    bootClassPathClasses := IdentitySet new.
    self bootClassPath do: [:file | 
        | filename |

        filename := file pathName.            
        
        self assert: (file suffix = 'jar').
        self assert: (file 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>"
    "Modified: / 19-07-2012 / 11:02:41 / jv"
!

initializeClassIndex
    | jreHome |

    (jreHome := self jreHome) isNil ifTrue:[ ^ self ].
    classes := IdentitySet new.

    self jreHome recursiveDirectoryContents do: [
        :each | 
        (each endsWith: '.class') ifTrue: [
            classes add: each asSymbol.
        ].
        (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>"
    "Modified: / 27-07-2012 / 13:59:05 / Jan Vrany <jan.vrany@fit.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>"
! !

!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>"
!

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:'queries'!

bootClassPathIncludesClassNamed: className 
    bootClassPathClasses isNil ifTrue:[self initializeBootClassPathIndex].
    ^ self searchInternalIndex: bootClassPathClasses for: className.

    "Created: / 02-11-2011 / 12:11:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 31-07-2012 / 18:00:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

extDirsIncludesClassNamed: className
    "Looks like a bug, shouldn't it look to extDirClasses?"

    classes isNil ifTrue:[self initializeClassIndex].
    ^self searchInternalIndex: classes for: className.

    "Created: / 02-11-2011 / 12:11:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (comment): / 31-07-2012 / 18:00:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

includesClassNamed: className
    classes isNil ifTrue:[self initializeClassIndex].
    ^self searchInternalIndex: classes for: className.

    "Created: / 01-11-2011 / 14:50:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 31-07-2012 / 17:58:53 / Jan Vrany <jan.vrany@fit.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>"
!

isCustom
    ^false

    "Created: / 27-07-2012 / 00:08:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease methodsFor:'searching'!

searchForClassPath

    | jreHome   |
    classPath := OrderedCollection new.
    jreHome := self jreHome.
    jreHome isNil ifTrue:[ ^ #() ].
    "Ensure, that rt.jar is first"
    classPath add: (JavaPathElement newFromRelease:(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: (JavaPathElement newFromRelease: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: / 27-07-2012 / 11:45:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

searchForJavaHome

    | h |

    h := (OperatingSystem getEnvironment:'JAVA_HOME').
    h notNil ifTrue:[
        javaHome := h  asFilename.
        "/Do not trust JAVA_HOME, it might be wrong (on Windows machine due
        "/to a registry mess
        javaHome exists ifTrue:[
            (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>"
    "Modified: / 19-07-2012 / 11:08:04 / jv"
!

searchForSourcePath

    | java_home src_zip |

    sourcePath := OrderedCollection new.
    java_home := self javaHome.
    java_home notNil ifTrue:[
        src_zip := self javaHome asFilename directory / 'src.zip'.
        src_zip exists ifTrue:[sourcePath add: (JavaPathElement newFromRelease:src_zip asString)].
    ].

    "
        JavaRelease openJDK6 searchForSourcePath; sourcePath      
    "

    "Created: / 27-10-2010 / 21:15:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-08-2012 / 16:12:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease methodsFor:'validating'!

validateJavaHome: home

    home isNil ifTrue:[ ^ false ].

    "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: / 10-08-2012 / 16:28:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::Custom 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

"
!

version_SVN
    ^ '$Id::                                                                                                                        $'
! !

!JavaRelease::Custom methodsFor:'accessing'!

bootClassPathOnUNIX
    | jre bcp jar |
    jre := self jreHome.
    bcp := OrderedCollection new.
    bcp add: jre / 'lib' / 'rt.jar'.
    (jar := jre / 'lib' / 'resources.jar') exists ifTrue:[ bcp add: jar ].        
    (jar := jre / 'lib' / 'jsse.jar') exists ifTrue:[ bcp add: jar ].
    (jar := jre / 'lib' / 'jce.jar') exists ifTrue:[ bcp add: jar ].
    (jar := jre / 'lib' / 'charsets.jar') exists ifTrue:[ bcp add: jar ].
    ^bcp.

    "Modified: / 31-07-2012 / 10:18:42 / jv"
!

javaHome

    "Answer a Java home"

    javaHome isNil ifTrue:[
        javaHome := OperatingSystem getEnvironment:'JAVA_HOME'.
    ].
    ^javaHome

    "
        JavaRelease custom javaHome
    "

    "Created: / 26-07-2012 / 23:39:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaHome: aString
     javaHome := aString 

    "
        JavaRelease openJDK6 javaHome
    "

    "Created: / 26-07-2012 / 23:32:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaHomesOnUNIX
    "raise an error: must be redefined in concrete subclass(es)"

    ^ self shouldNotImplement

    "Modified: / 27-07-2012 / 00:02:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaHomesOnWindows
    "raise an error: must be redefined in concrete subclass(es)"

    ^ self shouldNotImplement

    "Modified: / 27-07-2012 / 00:02:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

name
    "superclass JavaRelease says that I am responsible to implement this method"

    ^ 'Custom'

    "Modified: / 27-07-2012 / 00:02:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

priority

    ^1

    "Created: / 26-07-2012 / 23:38:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

selector
    "Returns instance-creation selector to get the receiver.
     See JavaRelease class, protocol instance creation"

    ^#custom

    "Created: / 27-07-2012 / 10:04:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::Custom methodsFor:'initialization'!

initialize
    "Initialize lazily in javaHome:"

    "Created: / 26-07-2012 / 23:40:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::Custom methodsFor:'queries'!

isAvailable
    ^true

    "Created: / 26-07-2012 / 23:35:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

isCustom
    ^true

    "Created: / 27-07-2012 / 00:08:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::Custom methodsFor:'searching'!

searchForJavaHome
    self shouldNotImplement

    "Created: / 26-07-2012 / 23:34:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::OpenJDK6 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

"
!

version_SVN
    ^ '$Id::                                                                                                                        $'
! !

!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>"
!

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>"
!

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>"
!

selector
    "Returns instance-creation selector to get the receiver.
     See JavaRelease class, protocol instance creation"

    ^#openJDK6

    "Created: / 27-07-2012 / 10:05:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::OpenJDK6 methodsFor:'private'!

javaHomeOnWindowsJDKDirectoryPrefix
    ^'jdk1.6'

    "Created: / 19-07-2012 / 11:04:34 / jv"
! !

!JavaRelease::OpenJDK7 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

"
!

version_SVN
    ^ '$Id::                                                                                                                        $'
! !

!JavaRelease::OpenJDK7 methodsFor:'accessing'!

javaHomesOnUNIX
    | arch |

    arch := OperatingSystem getSystemInfo at:#machine.
    arch = 'x86_64' ifTrue:[arch := 'amd64'].

    ^ { '/usr/lib/jvm/java-7-openjdk/jre'  .
        '/usr/lib/jvm/java-7-openjdk-',arch,'/jre' }

    "
    JavaRelease::OpenJDK7 new javaHomesOnUNIX
    "

    "Created: / 11-02-2012 / 17:47:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

name
    ^ 'OpenJDK7 (not yet supported)'

    "Created: / 27-07-2012 / 00:03:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

priority

    ^ super priority - 10
    "/^70

    "Modified: / 04-02-2011 / 06:59:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 11-02-2012 / 17:47:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

selector
    "Returns instance-creation selector to get the receiver.
     See JavaRelease class, protocol instance creation"

    ^#openJDK7

    "Created: / 27-07-2012 / 10:05:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::OpenJDK7 methodsFor:'private'!

javaHomeOnWindowsJDKDirectoryPrefix
    ^'jdk1.7'

    "Created: / 19-07-2012 / 11:05:02 / jv"
! !

!JavaRelease::OpenJDK7 methodsFor:'searching'!

searchForSourcePath

    | java_homes src_zip |

    sourcePath := OrderedCollection new.
    java_homes := OrderedCollection new.
    self javaHome notNil ifTrue:[
        java_homes add: self javaHome
    ].
    "OpenJDK 7 on Linux is in two directories:
        /usr/lib/jvm/java-7-openjdk-amd64  - self javaHome
        /usr/lib/jvm/java-7-openjdk-common

    Search both...
    "
    OperatingSystem isUNIXlike ifTrue:[
        '/usr/lib/jvm/java-7-openjdk-common' asFilename exists ifTrue:[
            java_homes add: '/usr/lib/jvm/java-7-openjdk-common/jre'
        ]
    ].
    

    java_homes do:[ :java_home |
        src_zip := java_home asFilename directory / 'src.zip'.
        src_zip exists ifTrue:[sourcePath add: (JavaPathElement newFromRelease:src_zip asString)].
    ].

    "
        JavaRelease openJDK7 searchForSourcePath; sourcePath      
    "

    "Created: / 03-09-2012 / 18:38:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::SunJDK122 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

"
!

version_SVN
    ^ '$Id::                                                                                                                        $'
! !

!JavaRelease::SunJDK122 methodsFor:'accessing'!

bootClassPathOnUNIX
    | jre |

    jre := self javaHome.
    ^jre notNil ifTrue:[
        Array with: (jre / 'lib' / 'rt.jar')
    ] ifFalse:[
        #()
    ]

    "Created: / 31-07-2012 / 10:20:24 / jv"
!

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-07-2012 / 00:14:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

priority

    ^10

    "Created: / 22-11-2010 / 13:34:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

selector
    "Returns instance-creation selector to get the receiver.
     See JavaRelease class, protocol instance creation"

    ^#sunJDK122

    "Created: / 27-07-2012 / 10:06:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::SunJDK122 methodsFor:'displaying'!

displayString

    ^self isAvailable ifTrue:[
        self name
    ] ifFalse:[
        (self name , ' ' , '(not available)') asText colorizeAllWith: Color gray
    ]

    "Created: / 27-07-2012 / 00:13:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::SunJDK122 methodsFor:'queries'!

isAvailable
    "We don't really support it"

    ^false

    "Created: / 27-07-2012 / 00:04:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease::SunJDK6 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

"
!

version_SVN
    ^ '$Id::                                                                                                                        $'
! !

!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
    |entry vsn home paths |

    entry := (OperatingSystem registryEntry key:'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit').
    entry notNil ifTrue:[
        vsn := entry valueNamed:'CurrentVersion'.
    ].
    vsn notNil ifTrue:[
        entry := (OperatingSystem registryEntry
                    key:'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\',vsn).
        home := entry valueNamed:'JavaHome'.
        home notNil ifTrue:[
            ^ (Array with:(home,'\jre'))
        ].
    ].
    paths := OrderedCollection new.
    #(
        'C:\Program Files\Java'
        'C:\Program Files (x86)\Java' 
    ) do:[:rootpath|
        | root |

        root := rootpath asFilename.
        root exists ifTrue:[
            root directoryContents do:[:dir|
                (dir startsWith:self javaHomeOnWindowsJDKDirectoryPrefix) ifTrue:[
                    | path |    
                    (path := root / dir / 'jre') isDirectory ifTrue:[
                        paths add: path
                    ].
                ].
            ]
        ]
    ].

    ^ paths

    "
     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"
    "Modified: / 19-07-2012 / 11:04:44 / jv"
!

name

    ^ 'Sun JDK 6'

    "Created: / 22-11-2010 / 13:31:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

priority

    "/There is no OpenJDK 6 for Windows yet...
    OperatingSystem isMSWINDOWSlike ifTrue:[
        ^100
    ].
    ^75

    "Created: / 22-11-2010 / 13:35:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 19-07-2012 / 10:57:55 / jv"
!

selector
    "Returns instance-creation selector to get the receiver.
     See JavaRelease class, protocol instance creation"

    ^#sunJDK6

    "Created: / 27-07-2012 / 10:05:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaRelease class methodsFor:'documentation'!

version_SVN

    ^ '$Id$'

! !