Author: curtisr7
Date: Mon Jul 19 21:02:36 2010
New Revision: 965633

URL: http://svn.apache.org/viewvc?rev=965633&view=rev
Log:
OPENJPA-1734: Add support for the DynamicEnhancer on IBM jvm.

Added:
    
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVendors.java
   (with props)
Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
    openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java?rev=965633&r1=965632&r2=965633&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
 Mon Jul 19 21:02:36 2010
@@ -38,6 +38,8 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
 import org.apache.openjpa.lib.log.Log;
+import org.apache.openjpa.lib.util.J2DoPrivHelper;
+import org.apache.openjpa.lib.util.JavaVendors;
 import org.apache.openjpa.lib.util.JavaVersions;
 import org.apache.openjpa.lib.util.Localizer;
 
@@ -54,7 +56,9 @@ public class InstrumentationFactory {
     private static final String _name = InstrumentationFactory.class.getName();
     private static final Localizer _loc = Localizer.forPackage(
         InstrumentationFactory.class);
-    
+    private static final String IBM_VM_CLASS = 
"com.ibm.tools.attach.VirtualMachine";
+    private static final String SUN_VM_CLASS = 
"com.sun.tools.attach.VirtualMachine";
+
     /**
      * This method is not synchronized because when the agent is loaded from
      * getInstrumentation() that method will cause agentmain(..) to be called.
@@ -80,7 +84,11 @@ public class InstrumentationFactory {
      * Exceptions are encountered.
      */
     public static synchronized Instrumentation getInstrumentation(final Log 
log) {
-        if (_inst != null || !_dynamicallyInstall)
+        if (log.isTraceEnabled() == true) {
+            log.trace(InstrumentationFactory.class.getName() + 
"getInstrumentation() _disabled:" + " _inst:" + _inst
+                + "_dynamicallyInstall:" + _dynamicallyInstall);
+        }
+        if ( _inst != null || !_dynamicallyInstall)
             return _inst;
 
         // dynamic loading of the agent is only available in JDK 1.6+
@@ -100,14 +108,19 @@ public class InstrumentationFactory {
                 } catch (Throwable t) {
                     return null;
                 }
-                
-                // If we can't find the tools.jar, we can't load the agent.
-                File toolsJar = findToolsJar(log);
-                if (toolsJar == null) {
-                    return null;
+                boolean ibm = JavaVendors.isIBM();
+                File toolsJar = null;
+                // When running on IBM, the attach api classes are packaged in 
vm.jar which is a part
+                // of the default vm classpath.
+                if (ibm == false) {
+                    // If we can't find the tools.jar and we're not on IBM we 
can't load the agent. 
+                    toolsJar = findToolsJar(log);
+                    if (toolsJar == null) {
+                        return null;
+                    }
                 }
 
-                Class<?> vmClass = loadVMClass(toolsJar, log);
+                Class<?> vmClass = loadVMClass(toolsJar, log, ibm);
                 if (vmClass == null) {
                     return null;
                 }
@@ -305,19 +318,25 @@ public class InstrumentationFactory {
     }
 
     /**
-     * This private method will create a new classloader and attempt to load 
the
-     * com.sun.tools.attach.VirtualMachine class from the provided toolsJar
-     * file.
+     * If <b>ibm</b> is false, this private method will create a new 
URLClassLoader and attempt to load the
+     * com.sun.tools.attach.VirtualMachine class from the provided toolsJar 
file. 
+     * 
+     * <p>
+     * If <b>ibm</b> is true, this private method will ignore the toolsJar 
parameter and load the 
+     * com.ibm.tools.attach.VirtualMachine class. 
      * 
-     * @return com.sun.tools.attach.VirtualMachine class <br>
+     * 
+     * @return The AttachAPI VirtualMachine class <br>
      *         or null if something unexpected happened.
      */
-    private static Class<?> loadVMClass(File toolsJar, Log log) {
+    private static Class<?> loadVMClass(File toolsJar, Log log, boolean ibm) {
         try {
-            URLClassLoader loader =
-                new URLClassLoader(new URL[] { toolsJar.toURI().toURL() },
-                    Thread.currentThread().getContextClassLoader());
-            return loader.loadClass("com.sun.tools.attach.VirtualMachine");
+            ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
+            String cls = (ibm == true) ? IBM_VM_CLASS : SUN_VM_CLASS;
+            if (ibm == false) {
+                loader = new URLClassLoader(new URL[] { 
toolsJar.toURI().toURL() }, loader);
+            }
+            return loader.loadClass(cls);
         } catch (Exception e) {
             if (log.isTraceEnabled()) {
                 log.trace(_name

Added: 
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVendors.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVendors.java?rev=965633&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVendors.java
 (added)
+++ 
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVendors.java
 Mon Jul 19 21:02:36 2010
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.lib.util;
+
+import java.security.AccessController;
+
+/**
+ * Utilities for dealing with different Java vendors.
+ * 
+ */
+public class JavaVendors {
+
+    static public final int VENDOR;
+
+    static public final int OTHER = 0;
+    static public final int SUN = 1;
+    static public final int IBM = 2;
+
+    static {
+        String vendor = 
AccessController.doPrivileged(J2DoPrivHelper.getPropertyAction("java.vendor"));
+
+        if (vendor.toUpperCase().contains("SUN MICROSYSTEMS")) {
+            VENDOR = SUN;
+        } else if (vendor.toUpperCase().contains("IBM")) {
+            VENDOR = IBM;
+        } else {
+            VENDOR = OTHER;
+        }
+    }
+
+    /**
+     * This static worker method returns <b>true</b> if the current 
implementation is IBM.
+     */
+    public static boolean isIBM() {
+        return VENDOR == IBM;
+    }
+
+    /**
+     * This static worker method returns <b>true</b> if the current 
implementation is Sun.
+     */
+    public static boolean isSun() {
+        return VENDOR == SUN;
+    }
+}

Propchange: 
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVendors.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml?rev=965633&r1=965632&r2=965633&view=diff
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml (original)
+++ openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml Mon Jul 19 
21:02:36 2010
@@ -386,7 +386,7 @@ java -javaagent:/home/dev/openjpa/lib/op
        </title>          
        <para>
                If a javaagent is not provided via the command line and 
-               OpenJPA is running on the Sun 1.6 SDK (not the JRE), OpenJPA
+               OpenJPA is running on the Sun 1.6 SDK or IBM 1.6 JDK (SR8+), 
OpenJPA
                will attempt to dynamically load the Enhancer that was 
                mentioned in the previous section. This support is 
                provided as an ease of use feature and it is not recommended
@@ -396,12 +396,6 @@ java -javaagent:/home/dev/openjpa/lib/op
        <itemizedlist>
                <listitem>
                        <para>
-                               As stated previously, this is only supported on
-                               the Sun 1.6 SDK.                        
-                       </para>
-               </listitem>
-               <listitem>
-                       <para>
                                The dynamic runtime enhancer is plugged into 
                                the JVM during creation of the 
                                EntityManagerFactory. Any Entity classes that 


Reply via email to