class: JavaRelease cvs_MAIN
authorClaus Gittinger <cg@exept.de>
Wed, 22 Jan 2014 16:59:42 +0100
branchcvs_MAIN
changeset 3348 421c4230014e
parent 3347 6451a6e52db9
child 3349 1d25e9cecbea
class: JavaRelease added:6 methods changed:5 methods added support for OSX jdks; More flexible (redefinable) namings of libraries and pathes, required since Apple uses *comletely* different naming schemes.
JavaRelease.st
--- a/JavaRelease.st	Thu Jan 16 15:31:51 2014 +0100
+++ b/JavaRelease.st	Wed Jan 22 16:59:42 2014 +0100
@@ -63,6 +63,13 @@
 	privateIn:JavaRelease
 !
 
+JavaRelease subclass:#OsxJDK6
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:'JavaVMData'
+	privateIn:JavaRelease
+!
+
 JavaRelease subclass:#SunJDK122
 	instanceVariableNames:''
 	classVariableNames:''
@@ -138,18 +145,26 @@
 
 JDK6
     "Meta-release - return either OpenJDK or OracleJDK"
-    ^self openJDK6 isAvailable 
-        ifTrue:[self openJDK6]
-        ifFalse:[self oracleJDK6].
+
+    self openJDK6 isAvailable ifTrue:[^ self openJDK6].
+    self oracleJDK6 isAvailable ifTrue:[^ self oracleJDK6].
+    self allSubclassesDo:[:rel |
+        (rel isJDK6 and:[ rel isAvailable ]) ifTrue:[^ rel instance ].
+    ].
+    self error:'no JDK6 found'
 
     "Created: / 16-02-2013 / 09:21:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 JDK7
     "Meta-release - return either OpenJDK or OracleJDK"
-    ^self openJDK7 isAvailable 
-        ifTrue:[self openJDK7]
-        ifFalse:[self oracleJDK7].
+
+    self openJDK7 isAvailable ifTrue:[^ self openJDK7].
+    self oracleJDK7 isAvailable ifTrue:[^ self oracleJDK7].
+    self allSubclassesDo:[:rel |
+        (rel isJDK7 and:[ rel isAvailable ]) ifTrue:[^ rel instance ].
+    ].
+    self error:'no JDK7 found'
 
     "
         JavaRelease JDK6
@@ -190,6 +205,10 @@
     ^ OracleJRE7 instance
 !
 
+osxJDK6
+    ^ OsxJDK6 instance
+!
+
 sunJDK122
     ^ SunJDK122 instance
 
@@ -287,6 +306,14 @@
     ^self class == JavaRelease
 
     "Created: / 22-11-2010 / 13:33:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isJDK6
+    ^ false
+!
+
+isJDK7
+    ^ false
 ! !
 
 !JavaRelease methodsFor:'accessing'!
@@ -297,16 +324,26 @@
     bootClassPath isNil ifTrue:[
         | jreHome libs |
 
-        jreHome := self jreHome.
-        libs := jreHome / 'lib'.
-        bootClassPath := OrderedCollection new.
-        libs directoryContentsAsFilenames do:[:each|
-            (each pathName endsWith:'.jar') ifTrue:[
-                (each pathName endsWith: 'rt.jar') ifTrue:[
-                    bootClassPath addFirst: each pathName
-                ] ifFalse:[
-                    bootClassPath addLast: each pathName
-                ]
+        jreHome := self jreHome.    
+        jreHome notNil ifTrue:[
+            libs := jreHome / (self libDirInJreHome).
+            bootClassPath := OrderedCollection new.
+            libs exists ifFalse:[
+                self error:'no lib found in jre home directory'
+            ] ifTrue:[
+                libs directoryContentsAsFilenames do:[:each|
+                    |pathName baseName|
+
+                    baseName := each baseName.
+                    (baseName endsWith:'.jar') ifTrue:[
+                        pathName := each pathName.
+                        (baseName endsWith: (self nameOf_rt_dot_jar)) ifTrue:[
+                            bootClassPath addFirst: pathName
+                        ] ifFalse:[
+                            bootClassPath addLast: pathName
+                        ]
+                    ].
+                ].
             ].
         ].
     ].
@@ -314,6 +351,7 @@
 
     "
     Java release bootClassPath
+    Java release jreHome
     "
 
     "Created: / 02-11-2011 / 12:19:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
@@ -436,8 +474,10 @@
 
     "Answer a set of possible java homes, those directories are searched"
 
-
-    OperatingSystem isUNIXlike ifTrue:[ ^ self javaHomesOnUNIX ].
+    OperatingSystem isUNIXlike ifTrue:[ 
+        OperatingSystem isOSXlike ifTrue:[ ^ self javaHomesOnOSX ].
+        ^ self javaHomesOnUNIX 
+    ].
     OperatingSystem isMSWINDOWSlike ifTrue:[ ^ self javaHomesOnWindows ].
     self error:'Unsupported platform'.
     ^ #()
@@ -445,6 +485,11 @@
     "Modified: / 22-11-2010 / 13:28:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+javaHomesOnOSX
+    "/ to be redefined in OSX release classes
+    ^ #()
+!
+
 javaHomesOnUNIX
     "raise an error: must be redefined in concrete subclass(es)"
 
@@ -490,10 +535,6 @@
 
     | jreHome |
 
-    OperatingSystem isOSXlike ifTrue:[
-        ^ '/System/Library/Java/Home' asFilename
-    ].
-
     self javaHome isNil ifTrue:[ ^ nil ].
 
     ^(jreHome := self javaHome asFilename / 'jre') exists
@@ -503,6 +544,14 @@
     "Created: / 27-10-2010 / 21:24:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+libDirInJreHome
+    "Returns the relative path to the lib directory, relative to the jreHome.
+     For all 'normal' systems, this is 'lib';
+     but under max-osx, this is 'Classes' - sigh"
+
+    ^ 'lib'
+!
+
 name
 
     "Answer a human readable name of the Java release such as Sun JDK 1.2.2 or OpenJDK 6"
@@ -512,6 +561,14 @@
     "Created: / 27-10-2010 / 18:53:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+nameOf_rt_dot_jar
+    "Returns the name of the class library.
+     For all 'normal' systems, this is 'rt.jar';
+     but under max-osx, this is 'classes.jar' - sigh"
+
+    ^ 'rt.jar'
+!
+
 priority
 
     ^50
@@ -951,7 +1008,13 @@
 !
 
 version_SVN
-    ^ '$Id: JavaRelease.st,v 1.13 2013-11-24 22:34:10 cg Exp $'
+    ^ '$Id: JavaRelease.st,v 1.14 2014-01-22 15:59:42 cg Exp $'
+! !
+
+!JavaRelease::OpenJDK6 class methodsFor:'queries'!
+
+isJDK6
+    ^ true
 ! !
 
 !JavaRelease::OpenJDK6 methodsFor:'accessing'!
@@ -1014,6 +1077,15 @@
     "Modified: / 16-01-2013 / 19:59:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+jreHome
+    "Answers the directory where the JRE lives"
+
+    OperatingSystem isOSXlike ifTrue:[
+        ^ '/System/Library/Java/JavaVirtualMachines/1.6.0.jdk' asFilename.
+    ].
+    ^ super jreHome
+!
+
 name
     "superclass JavaRelease says that I am responsible to implement this method"
 
@@ -1124,6 +1196,9 @@
     "
         JavaRelease openJDK7 searchForSourcePath; sourcePath
         JavaRelease sunJDK6 searchForSourcePath; sourcePath
+        JavaRelease openJDK6 searchForSourcePath; sourcePath  
+        JavaRelease openJDK6 jdkHome  
+        JavaRelease openJDK6 jreHome  
     "
 
     "Created: / 03-09-2012 / 18:38:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -1177,7 +1252,13 @@
 !
 
 version_SVN
-    ^ '$Id: JavaRelease.st,v 1.13 2013-11-24 22:34:10 cg Exp $'
+    ^ '$Id: JavaRelease.st,v 1.14 2014-01-22 15:59:42 cg Exp $'
+! !
+
+!JavaRelease::OpenJDK7 class methodsFor:'queries'!
+
+isJDK7
+    ^ true
 ! !
 
 !JavaRelease::OpenJDK7 methodsFor:'accessing'!
@@ -1322,7 +1403,7 @@
 !
 
 version_SVN
-    ^ '$Id: JavaRelease.st,v 1.13 2013-11-24 22:34:10 cg Exp $'
+    ^ '$Id: JavaRelease.st,v 1.14 2014-01-22 15:59:42 cg Exp $'
 ! !
 
 !JavaRelease::OracleJDK6 methodsFor:'accessing'!
@@ -1767,6 +1848,226 @@
     ^ aVersionString matches: 'java version "1.7.*' 
 ! !
 
+!JavaRelease::OsxJDK6 class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2014 by Claus Gittinger
+"
+!
+
+documentation
+"
+    JDK6 as installed on a mac, running osx
+"
+! !
+
+!JavaRelease::OsxJDK6 class methodsFor:'queries'!
+
+isJDK6
+    ^ true
+! !
+
+!JavaRelease::OsxJDK6 methodsFor:'accessing'!
+
+javaExtDirsOnUNIX
+
+    ^{
+        self jreHome asFilename / 'Extensions' .
+    }
+!
+
+javaExtDirsOnWindows
+    "/ never exists on windows
+    ^ #()
+!
+
+javaHomesOnOSX
+    ^ {
+        '/System/Library/Java'
+    }
+
+    "
+    JavaRelease::OsxJDK6 new javaHomesOnUNIX
+    "
+!
+
+javaHomesOnWindows
+    "/ never exists on windows
+    ^ #()
+!
+
+javaNativeMethodsImplementation
+    "Returns an object that imolements native methods."
+
+    ^ JavaNativeMethodImpl_OpenJDK6
+
+    "Modified: / 16-01-2013 / 19:59:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+jreHome
+    "Answers the directory where the JRE lives"
+
+    OperatingSystem isOSXlike ifTrue:[
+        ^ '/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents' asFilename.
+    ].
+    ^ super jreHome
+!
+
+libDirInJreHome
+    "Returns the relative path to the lib directory, relative to the jreHome.
+     For all 'normal' systems, this is 'lib';
+     but under max-osx, this is 'Classes' - sigh"
+
+    ^ 'Classes'
+!
+
+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>"
+!
+
+nameOf_rt_dot_jar
+    "Returns the name of the class library.
+     For all 'normal' systems, this is 'rt.jar';
+     but under max-osx, this is 'classes.jar' - sigh"
+
+    ^ 'classes.jar'
+!
+
+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"
+
+    ^#osxJDK6
+! !
+
+!JavaRelease::OsxJDK6 methodsFor:'object conversions'!
+
+as_ST_String: aJavaString
+    "Given a java.lang.String instance, returns a coresponfing
+     Smalltalk String"
+
+    | str  count  offs  start  stop |
+
+    aJavaString isNil ifTrue: [ ^ nil ].
+self halt:'check if the stuf below is ok'.
+    "/ count := aJavaString instVarNamed:'count'.
+
+    count := aJavaString instVarAt: 3+1"lockWord".
+
+    "/ str := aJavaString instVarNamed:'value'
+
+    str := aJavaString instVarAt: 1+1"lockWord".
+    str size == count
+        ifTrue:
+            [ "cos I don't see any reason to do this"
+            "/ ^ str asOneByteString.
+            ^ str ].
+
+    "/ offs := (aJavaString instVarNamed:'offset').
+
+    offs := aJavaString instVarAt: 2+1"lockWord".
+
+    "/ start := offs + 1.
+
+    start := offs + 1.
+
+    "/ stop := start + (aJavaString instVarNamed:'count') - 1.
+
+    stop := start + count - 1.
+
+    "/ ^ ((aJavaString instVarNamed:'value') copyFrom:start to:stop) asString
+
+    ^ (str copyFrom: start to: stop) asOneByteString
+
+    "Created: / 08-08-1997 / 12:02:55 / cg"
+    "Modified: / 04-01-1999 / 23:55:08 / cg"
+    "Modified: / 22-03-2011 / 17:21:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 08-02-2013 / 00:56:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+as_String:aString
+    "Given a Smalltalk string, returns corresponsing instance of
+     java.lang.String"
+
+    "hard-coding internas of java.lang.String here is bad ..."
+
+    |s|
+
+self halt:'check if the stuf below is ok'.
+    s := Java java_lang_String basicNew.
+    s instVarAt:1+1"_lockWord_"  put: aString.
+    s instVarAt:3+1"_lockWord_"  put: aString size.
+    ^ s
+
+    "
+     Java as_String:'hello world'
+    "
+
+    "Created: / 07-08-1997 / 21:15:49 / cg"
+    "Modified: / 08-02-2013 / 00:58:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaRelease::OsxJDK6 methodsFor:'searching'!
+
+searchForSourcePath
+
+    | jdkHome src_zip |
+
+    super searchForSourcePath.
+
+    sourcePath := OrderedCollection new.
+    jdkHome := self jdkHome.
+    jdkHome notNil ifTrue:[
+        src_zip := jdkHome asFilename / 'src.zip'.
+        src_zip exists ifTrue:[sourcePath add: src_zip pathName].
+    ].
+
+    "
+        JavaRelease openJDK7 searchForSourcePath; sourcePath
+        JavaRelease sunJDK6 searchForSourcePath; sourcePath
+        JavaRelease openJDK6 searchForSourcePath; sourcePath  
+        JavaRelease openJDK6 jdkHome  
+        JavaRelease openJDK6 jreHome  
+    "
+
+    "Created: / 03-09-2012 / 18:38:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 23-01-2013 / 12:22:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 06-02-2013 / 12:55:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaRelease::OsxJDK6 methodsFor:'validating'!
+
+validateJavaHome2: home
+    "Bit of a hack, but..."
+    ^OperatingSystem isUNIXlike 
+        and: [(home asString includesString: 'oracle') not
+        and: [(home asString includesString: 'sun') not]]
+
+    "Created: / 12-02-2013 / 02:52:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 11-04-2013 / 14:22:19 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+validateJavaVersionString:aVersionString
+    "Return true if aVersionString (which is what 'java -version' returns)
+     matches what I expect."
+
+    ^ aVersionString matches: 'java version "1.6.*'
+! !
+
 !JavaRelease::SunJDK122 class methodsFor:'documentation'!
 
 copyright
@@ -1794,7 +2095,7 @@
 !
 
 version_SVN
-    ^ '$Id: JavaRelease.st,v 1.13 2013-11-24 22:34:10 cg Exp $'
+    ^ '$Id: JavaRelease.st,v 1.14 2014-01-22 15:59:42 cg Exp $'
 ! !
 
 !JavaRelease::SunJDK122 methodsFor:'accessing'!
@@ -1874,14 +2175,14 @@
 !JavaRelease class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libjava/JavaRelease.st,v 1.13 2013-11-24 22:34:10 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libjava/JavaRelease.st,v 1.14 2014-01-22 15:59:42 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libjava/JavaRelease.st,v 1.13 2013-11-24 22:34:10 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libjava/JavaRelease.st,v 1.14 2014-01-22 15:59:42 cg Exp $'
 !
 
 version_SVN
-    ^ '$Id: JavaRelease.st,v 1.13 2013-11-24 22:34:10 cg Exp $'
+    ^ '$Id: JavaRelease.st,v 1.14 2014-01-22 15:59:42 cg Exp $'
 ! !