You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/10/27 21:17:33 UTC

svn commit: r468504 - in /incubator/openjpa/trunk/openjpa-kernel: ./ src/main/java/org/apache/openjpa/ee/ src/main/java/org/apache/openjpa/util/ src/test/java/org/apache/openjpa/ee/ src/test/java/org/apache/openjpa/util/

Author: awhite
Date: Fri Oct 27 12:17:32 2006
New Revision: 468504

URL: http://svn.apache.org/viewvc?view=rev&rev=468504
Log:
Move build logic for adding an interface to WASManagedRuntime's inner class to
WASManagedRuntime itself.  Move caching in WASManagedRuntime to 
endConfiguration() callback to avoid threading issues.


Added:
    incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/
    incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestWASManagedRuntime.java
Removed:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WASTransformer.java
    incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/util/
Modified:
    incubator/openjpa/trunk/openjpa-kernel/pom.xml
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java

Modified: incubator/openjpa/trunk/openjpa-kernel/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/pom.xml?view=diff&rev=468504&r1=468503&r2=468504
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/pom.xml (original)
+++ incubator/openjpa/trunk/openjpa-kernel/pom.xml Fri Oct 27 12:17:32 2006
@@ -109,7 +109,7 @@
 						<configuration>
 							<tasks>
 								<java
-									classname="org.apache.openjpa.util.WASTransformer" classpathref="maven.runtime.classpath" />
+									classname="org.apache.openjpa.ee.WASManagedRuntime" classpathref="maven.runtime.classpath" />
 							</tasks>
 						</configuration>
 						<goals>

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java?view=diff&rev=468504&r1=468503&r2=468504
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java Fri Oct 27 12:17:32 2006
@@ -63,9 +63,9 @@
         "com.inprise.visitransact.jta.TransactionManagerImpl."
             + "getTransactionManagerImpl", // borland
     };
-    private static final ManagedRuntime WLS;
-    private static final ManagedRuntime SUNONE;
-    private static final ManagedRuntime WAS;
+    private static final WLSManagedRuntime WLS;
+    private static final SunOneManagedRuntime SUNONE;
+    private static final WASManagedRuntime WAS;
 
     private static Localizer _loc = Localizer.forPackage
         (AutomaticManagedRuntime.class);
@@ -76,24 +76,22 @@
             mr = new WLSManagedRuntime();
         } catch (Throwable t) {
         }
-        WLS = mr;
+        WLS = (WLSManagedRuntime) mr;
 
         mr = null;
         try {
             mr = new SunOneManagedRuntime();
         } catch (Throwable t) {
         }
-        SUNONE = mr;
+        SUNONE = (SunOneManagedRuntime) mr;
 
         mr = null;
         try {
             mr = new WASManagedRuntime();
         }
         catch(Throwable t) {
-
         }
-        WAS= mr;
-
+        WAS= (WASManagedRuntime) mr;
     }
 
     private Configuration _conf = null;
@@ -121,7 +119,9 @@
 
         if (WAS != null) {
             try {
-                ((Configurable)WAS).setConfiguration(_conf);
+                WAS.setConfiguration(_conf);
+                WAS.startConfiguration();
+                WAS.endConfiguration();
                 tm = WAS.getTransactionManager();
             } catch (Throwable t) {
                 errors.add(t);

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java?view=diff&rev=468504&r1=468503&r2=468504
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java Fri Oct 27 12:17:32 2006
@@ -15,6 +15,7 @@
  */
 package org.apache.openjpa.ee;
 
+import java.io.IOException;
 import java.lang.reflect.Method;
 
 import javax.naming.Context;
@@ -34,10 +35,11 @@
 import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.lib.conf.Configurable;
 import org.apache.openjpa.lib.conf.Configuration;
-import org.apache.openjpa.lib.log.Log;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.util.InvalidStateException;
 import org.apache.openjpa.util.NoTransactionException;
+import serp.bytecode.BCClass;
+import serp.bytecode.Project;
 
 /**
  * {@link ManagedRuntime} implementation that allows synchronization with a
@@ -59,60 +61,11 @@
     private static Localizer _loc =
         Localizer.forPackage(WASManagedRuntime.class);
 
-    protected Object _extendedTransaction = null;
-
-    protected Method _getGlobalId = null;
-
-    protected Method _getLocalId = null;
-
-    protected Method _registerSync = null;
-
-    OpenJPAConfiguration _conf = null;
-
-    Log _log = null;
-
-    /**
-     * Lookup the extendedTransaction object from JNDI.
-     *
-     * @throws NamingException
-     */
-    private void getExtendedTransaction() throws NamingException {
-
-        if (_extendedTransaction == null) {
-            Context ctx = new InitialContext();
-            try {
-                _extendedTransaction =
-                    ctx.lookup("java:comp/websphere/ExtendedJTATransaction");
-
-            } finally {
-                ctx.close();
-            }
-        }
-    }
-
-    /**
-     * Caches the WebSphere proprietary methods for ExtendedJTATransaction.
-     */
-    private void getWebSphereMethods() throws Exception {
-        ClassLoader loader =
-            _conf.getClassResolverInstance().getClassLoader(getClass(), null);
-
-        Class extendedJTATransaction =
-            Class.forName(
-                "com.ibm.websphere.jtaextensions.ExtendedJTATransaction", true,
-                loader);
-
-        _registerSync =
-            extendedJTATransaction.getMethod(
-                "registerSynchronizationCallbackForCurrentTran",
-                new Class[] { Class.forName(
-                    "com.ibm.websphere.jtaextensions.SynchronizationCallback",
-                    true, loader) });
-
-        _getGlobalId = extendedJTATransaction.getMethod("getGlobalId", null);
-
-        _getLocalId = extendedJTATransaction.getMethod("getLocalId", null);
-    }
+    private Object _extendedTransaction = null;
+    private Method _getGlobalId = null;
+    private Method _getLocalId = null;
+    private Method _registerSync = null;
+    private OpenJPAConfiguration _conf = null;
 
     /**
      * Gets an extendedJTATransaction from JNDI and creates a transaction
@@ -120,7 +73,6 @@
      */
     public javax.transaction.TransactionManager getTransactionManager()
         throws Exception {
-        getExtendedTransaction();
         return new WASTransaction();
     }
 
@@ -142,24 +94,14 @@
 
         public int getStatus() throws SystemException {
             int rval = Status.STATUS_UNKNOWN;
-
             try {
                 if (getId() != null) {
                     rval = Status.STATUS_ACTIVE;
                 } else {
-
-                    if (_log != null && _log.isErrorEnabled()) {
-                        _log.error(_loc.get("was-no-transaction"));
-                    }
-
                     throw new NoTransactionException(_loc
                         .get("was-no-transaction"));
                 }
             } catch (Exception e) {
-
-                if (_log != null && _log.isErrorEnabled()) {
-                    _log.error(_loc.get("was-no-transaction"), e);
-                }
                 throw new NoTransactionException(_loc.get("was-no-transaction"))
                     .setCause(e);
             }
@@ -183,27 +125,15 @@
          */
         public void registerSynchronization(Synchronization arg0)
             throws IllegalStateException, RollbackException, SystemException {
-
             if (_extendedTransaction != null) {
                 try {
-                    if (_registerSync == null) {
-                        getWebSphereMethods();
-                    }
                     _registerSync.invoke(_extendedTransaction,
                         new Object[] { new WASSynchronization(arg0) });
                 } catch (Exception e) {
-                    if (_log != null && _log.isErrorEnabled()) {
-                        _log.error(_loc.get("was-reflection-exception"), e);
-                    }
-
                     throw new InvalidStateException(_loc
                         .get("was-reflection-exception")).setCause(e);
                 }
             } else {
-                if (_log != null && _log.isErrorEnabled()) {
-                    _log.error(_loc.get("was-lookup-error"));
-                }
-
                 throw new InvalidStateException(_loc.get("was-lookup-error"));
             }
         }
@@ -220,9 +150,7 @@
          */
         private Object getId() throws Exception {
             Object rval;
-
             rval = getGlobalId();
-
             if (rval == null) {
                 rval = getLocalId();
             }
@@ -232,9 +160,6 @@
                  * If there's no globalId or localId we're running outside of a
                  * transaction and need to throw an error.
                  */
-                if (_log != null && _log.isErrorEnabled()) {
-                    _log.error(_loc.get("was-no-transaction"));
-                }
                 throw new NoTransactionException(_loc
                     .get("was-no-transaction"));
             }
@@ -249,23 +174,13 @@
          *         occurs. byte[] id if a global transaction is active.
          */
         private byte[] getGlobalId() {
-
             byte[] rval = null;
-
             try {
-                if(_getGlobalId == null) {
-                    getWebSphereMethods();
-                }
                 rval = (byte[]) _getGlobalId.invoke(_extendedTransaction, null);
             } catch (Exception e) {
-                if (_log != null && _log.isErrorEnabled()) {
-                    _log.error(_loc.get("was-reflection-exception"), e);
-                }
-
                 throw new InvalidStateException(_loc
                     .get("was-reflection-exception")).setCause(e);
             }
-
             return rval;
         }
 
@@ -278,16 +193,9 @@
          */
         private Integer getLocalId() {
             Integer rval;
-
             try {
-                if(_getLocalId == null)  {
-                    getWebSphereMethods();
-                }
                 rval = (Integer) _getLocalId.invoke(_extendedTransaction, null);
             } catch (Exception e) {
-                if (_log != null && _log.isErrorEnabled()) {
-                    _log.error(_loc.get("was-reflection-exception"), e);
-                }
                 throw new InvalidStateException(_loc
                     .get("was-reflection-exception")).setCause(e);
             }
@@ -402,6 +310,7 @@
      * @see org.apache.openjpa.util.WASTransformer
      */
     static class WASSynchronization {
+
         Synchronization _sync = null;
 
         WASSynchronization(Synchronization sync) {
@@ -440,14 +349,41 @@
      */
     public void setConfiguration(Configuration conf) {
         _conf = (OpenJPAConfiguration) conf;
-        _log = _conf.getLog(OpenJPAConfiguration.LOG_RUNTIME);
     }
 
     /**
      * EndConfiguration stub.
      */
     public void endConfiguration() {
-        // Nothing to do
+        try {
+            Context ctx = new InitialContext();
+            try {
+                _extendedTransaction =
+                    ctx.lookup("java:comp/websphere/ExtendedJTATransaction");
+            } finally {
+                ctx.close();
+            }
+
+            ClassLoader loader = _conf.getClassResolverInstance()
+                .getClassLoader(getClass(), null);
+
+            Class extendedJTATransaction = Class.forName(
+                "com.ibm.websphere.jtaextensions.ExtendedJTATransaction", true,
+                loader);
+
+            _registerSync = extendedJTATransaction.getMethod(
+                "registerSynchronizationCallbackForCurrentTran",
+                new Class[] { Class.forName(
+                    "com.ibm.websphere.jtaextensions.SynchronizationCallback",
+                    true, loader) });
+            _getGlobalId = extendedJTATransaction.
+                getMethod("getGlobalId", null);
+            _getLocalId = extendedJTATransaction.
+                getMethod("getLocalId", null);
+        } catch (Exception e) {
+            throw new InvalidStateException(_loc
+                .get("was-reflection-exception"), e).setFatal(true);
+        }
     }
 
     /**
@@ -455,5 +391,25 @@
      */
     public void startConfiguration() {
         // Nothing to do
+    }
+
+    /**
+     * Class that will be modified
+     */
+    static final String CLASS =
+        "org.apache.openjpa.ee.WASManagedRuntime$WASSynchronization";
+
+    /**
+     * Interface which will be added
+     */
+    static final String INTERFACE =
+        "com.ibm.websphere.jtaextensions.SynchronizationCallback";
+
+    public static void main(String[] args) 
+        throws IOException {
+        Project project = new Project();
+        BCClass bcClass = project.loadClass(CLASS);
+        bcClass.declareInterface(INTERFACE);
+        bcClass.write();
     }
 }

Added: incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestWASManagedRuntime.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestWASManagedRuntime.java?view=auto&rev=468504
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestWASManagedRuntime.java (added)
+++ incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestWASManagedRuntime.java Fri Oct 27 12:17:32 2006
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.ee;
+
+import junit.framework.TestCase;
+
+import serp.util.Strings;
+
+/**
+ * Test class for build transformation performed by WASManagedRuntime.
+ *
+ */
+public class TestWASManagedRuntime extends TestCase {
+
+    /**
+     * This test will verify that the WASManagedRuntime$WASSynchronization
+     * class was properly modified by the maven build process (reference
+     * the top level pom.xml).  This testcase will not execute properly
+     * within Eclipse since the Eclipse target directory (probably) hasn't
+     * been modified via the maven build.
+     *
+     * @throws ClassNotFoundException
+     * @author Michael Dick
+     */
+    public void testInterfaceAdded() throws ClassNotFoundException {
+
+        String msg = null;
+
+        try {
+            Class.forName(WASManagedRuntime.CLASS);
+            fail("expected an exception to be thrown");
+        } catch (NoClassDefFoundError e) {
+            msg = e.getMessage();
+        }
+        String interfaceName = Strings.
+            getClassName(WASManagedRuntime.INTERFACE);
+        assertTrue("message should have contained "
+            + interfaceName + ", but was '" + msg + "'",
+            msg.contains(interfaceName));
+    }
+}