You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2012/10/09 16:23:36 UTC

svn commit: r1396043 - in /openjpa/trunk/openjpa-kernel/src: main/java/org/apache/openjpa/kernel/ main/resources/org/apache/openjpa/kernel/ test/java/org/apache/openjpa/ee/

Author: curtisr7
Date: Tue Oct  9 14:23:36 2012
New Revision: 1396043

URL: http://svn.apache.org/viewvc?rev=1396043&view=rev
Log:
OPENJPA-2234: Avoid NPE when the ManagedRuntime returns a null TransactionManager.

Added:
    openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestNullTransactionManagerFromRuntime.java   (with props)
Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
    openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java?rev=1396043&r1=1396042&r2=1396043&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java Tue Oct  9 14:23:36 2012
@@ -65,6 +65,7 @@ import org.apache.openjpa.lib.util.concu
 import org.apache.openjpa.meta.MetaDataModes;
 import org.apache.openjpa.meta.MetaDataRepository;
 import org.apache.openjpa.util.GeneralException;
+import org.apache.openjpa.util.InternalException;
 import org.apache.openjpa.util.InvalidStateException;
 import org.apache.openjpa.util.OpenJPAException;
 import org.apache.openjpa.util.UserException;
@@ -722,6 +723,9 @@ public abstract class AbstractBrokerFact
         try {
             ManagedRuntime mr = broker.getManagedRuntime();
             TransactionManager tm = mr.getTransactionManager();
+            if (tm == null) {
+                throw new InternalException(_loc.get("null-transactionmanager", mr));
+            }
             trans = tm.getTransaction();
             if (trans != null
                 && (trans.getStatus() == Status.STATUS_NO_TRANSACTION

Modified: openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties?rev=1396043&r1=1396042&r2=1396043&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties (original)
+++ openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties Tue Oct  9 14:23:36 2012
@@ -456,4 +456,4 @@ writebehind-cfg-err: Missing required Wr
 bad-lock-scope: This lock manager does not recognize lock scope "{0}".
 detach-none-exclusive: Configured AutoDetach option "{0}" is incorrect because \
     NONE option can not be specified with any other option other than CLOSE. 
-
+null-transactionmanager: Received a null javax.transaction.TransactionManager from the openjpa.ManagedRuntime "{0}".

Added: openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestNullTransactionManagerFromRuntime.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestNullTransactionManagerFromRuntime.java?rev=1396043&view=auto
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestNullTransactionManagerFromRuntime.java (added)
+++ openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestNullTransactionManagerFromRuntime.java Tue Oct  9 14:23:36 2012
@@ -0,0 +1,309 @@
+/*
+ * 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.ee;
+
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.List;
+
+import javax.transaction.TransactionManager;
+
+import junit.framework.TestCase;
+
+import org.apache.openjpa.conf.OpenJPAConfiguration;
+import org.apache.openjpa.conf.OpenJPAConfigurationImpl;
+import org.apache.openjpa.kernel.AbstractBrokerFactory;
+import org.apache.openjpa.kernel.BrokerImpl;
+import org.apache.openjpa.kernel.DelegatingStoreManager;
+import org.apache.openjpa.kernel.FetchConfiguration;
+import org.apache.openjpa.kernel.FetchConfigurationImpl;
+import org.apache.openjpa.kernel.OpenJPAStateManager;
+import org.apache.openjpa.kernel.PCState;
+import org.apache.openjpa.kernel.Seq;
+import org.apache.openjpa.kernel.StoreContext;
+import org.apache.openjpa.kernel.StoreManager;
+import org.apache.openjpa.kernel.StoreQuery;
+import org.apache.openjpa.lib.rop.ResultObjectProvider;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.FieldMetaData;
+
+public class TestNullTransactionManagerFromRuntime extends TestCase {
+    public void test() {
+        OpenJPAConfiguration conf = new OpenJPAConfigurationImpl();
+        conf.setMetaDataFactory("org.apache.openjpa.meta.NoneMetaDataFactory");
+        conf.setManagedRuntime(new ManagedRuntimeNullTransactionManager());
+        MangagedRuntimeTestBrokerFactory fact = new MangagedRuntimeTestBrokerFactory(conf);
+        BrokerImpl b = new BrokerImpl();
+        try {
+            b.initialize(fact, new ManagedRuntimeNoopDelegatingStoreManager(null), true, 0, false);
+            fail("Calling syncWithManagedTransaction should have thrown an exception.");
+        } catch (RuntimeException re) {
+            // expected
+        }
+    }
+
+    class ManagedRuntimeNullTransactionManager extends AbstractManagedRuntime {
+        @Override
+        public Throwable getRollbackCause() throws Exception {
+
+            return null;
+        }
+
+        @Override
+        public TransactionManager getTransactionManager() throws Exception {
+
+            return null;
+        }
+
+        @Override
+        public void setRollbackOnly(Throwable cause) throws Exception {
+
+        }
+    }
+
+    class MangagedRuntimeTestBrokerFactory extends AbstractBrokerFactory {
+        public MangagedRuntimeTestBrokerFactory(OpenJPAConfiguration conf) {
+            super(conf);
+        }
+
+        @Override
+        protected StoreManager newStoreManager() {
+
+            return null;
+        }
+    }
+
+    class ManagedRuntimeNoopDelegatingStoreManager extends DelegatingStoreManager {
+        public ManagedRuntimeNoopDelegatingStoreManager(StoreManager store) {
+            super(store);
+        }
+
+        @Override
+        public StoreManager getDelegate() {
+
+            return super.getDelegate();
+        }
+
+        @Override
+        public StoreManager getInnermostDelegate() {
+
+            return super.getInnermostDelegate();
+        }
+
+        @Override
+        public int hashCode() {
+
+            return super.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object other) {
+
+            return super.equals(other);
+        }
+
+        @Override
+        public void setContext(StoreContext ctx) {
+        }
+
+        @Override
+        public void beginOptimistic() {
+
+            super.beginOptimistic();
+        }
+
+        @Override
+        public void rollbackOptimistic() {
+
+            super.rollbackOptimistic();
+        }
+
+        @Override
+        public void begin() {
+
+            super.begin();
+        }
+
+        @Override
+        public void commit() {
+
+            super.commit();
+        }
+
+        @Override
+        public void rollback() {
+
+            super.rollback();
+        }
+
+        @Override
+        public boolean exists(OpenJPAStateManager sm, Object context) {
+
+            return super.exists(sm, context);
+        }
+
+        @Override
+        public boolean syncVersion(OpenJPAStateManager sm, Object context) {
+
+            return super.syncVersion(sm, context);
+        }
+
+        @Override
+        public boolean initialize(OpenJPAStateManager sm, PCState state, FetchConfiguration fetch, Object context) {
+
+            return super.initialize(sm, state, fetch, context);
+        }
+
+        @Override
+        public boolean load(OpenJPAStateManager sm, BitSet fields, FetchConfiguration fetch, int lockLevel,
+            Object context) {
+
+            return super.load(sm, fields, fetch, lockLevel, context);
+        }
+
+        @Override
+        public Collection<Object> loadAll(Collection<OpenJPAStateManager> sms, PCState state, int load,
+            FetchConfiguration fetch, Object context) {
+
+            return super.loadAll(sms, state, load, fetch, context);
+        }
+
+        @Override
+        public void beforeStateChange(OpenJPAStateManager sm, PCState fromState, PCState toState) {
+
+            super.beforeStateChange(sm, fromState, toState);
+        }
+
+        @Override
+        public Collection<Exception> flush(Collection<OpenJPAStateManager> sms) {
+
+            return super.flush(sms);
+        }
+
+        @Override
+        public boolean assignObjectId(OpenJPAStateManager sm, boolean preFlush) {
+
+            return super.assignObjectId(sm, preFlush);
+        }
+
+        @Override
+        public boolean assignField(OpenJPAStateManager sm, int field, boolean preFlush) {
+
+            return super.assignField(sm, field, preFlush);
+        }
+
+        @Override
+        public Class<?> getManagedType(Object oid) {
+
+            return super.getManagedType(oid);
+        }
+
+        @Override
+        public Class<?> getDataStoreIdType(ClassMetaData meta) {
+
+            return super.getDataStoreIdType(meta);
+        }
+
+        @Override
+        public Object copyDataStoreId(Object oid, ClassMetaData meta) {
+
+            return super.copyDataStoreId(oid, meta);
+        }
+
+        @Override
+        public Object newDataStoreId(Object oidVal, ClassMetaData meta) {
+
+            return super.newDataStoreId(oidVal, meta);
+        }
+
+        @Override
+        public Object getClientConnection() {
+
+            return super.getClientConnection();
+        }
+
+        @Override
+        public void retainConnection() {
+
+            super.retainConnection();
+        }
+
+        @Override
+        public void releaseConnection() {
+
+            super.releaseConnection();
+        }
+
+        @Override
+        public ResultObjectProvider executeExtent(ClassMetaData meta, boolean subclasses, FetchConfiguration fetch) {
+
+            return super.executeExtent(meta, subclasses, fetch);
+        }
+
+        @Override
+        public StoreQuery newQuery(String language) {
+
+            return super.newQuery(language);
+        }
+
+        @Override
+        public FetchConfiguration newFetchConfiguration() {
+
+            return new FetchConfigurationImpl();
+        }
+
+        @Override
+        public void close() {
+
+            super.close();
+        }
+
+        @Override
+        public int compareVersion(OpenJPAStateManager state, Object v1, Object v2) {
+
+            return super.compareVersion(state, v1, v2);
+        }
+
+        @Override
+        public Seq getDataStoreIdSequence(ClassMetaData forClass) {
+
+            return super.getDataStoreIdSequence(forClass);
+        }
+
+        @Override
+        public Seq getValueSequence(FieldMetaData fmd) {
+
+            return super.getValueSequence(fmd);
+        }
+
+        @Override
+        public boolean cancelAll() {
+
+            return super.cancelAll();
+        }
+
+        @Override
+        public boolean isCached(List<Object> oids, BitSet edata) {
+
+            return super.isCached(oids, edata);
+        }
+
+    }
+
+}

Propchange: openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestNullTransactionManagerFromRuntime.java
------------------------------------------------------------------------------
    svn:eol-style = native