Author: allee8285
Date: Mon Oct 12 01:49:30 2009
New Revision: 824213

URL: http://svn.apache.org/viewvc?rev=824213&view=rev
Log:
OPENJPA-1344 Add checks for needed exception conditions.

Added:
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryLock.java
   (with props)
Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
    
openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java?rev=824213&r1=824212&r2=824213&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
 Mon Oct 12 01:49:30 2009
@@ -495,7 +495,8 @@
 
         lock();
         try {
-            assertActiveTransaction();
+            if (level != MixedLockLevels.LOCK_NONE)
+                assertActiveTransaction();
             if (level == DEFAULT)
                 _state.readLockLevel = _state.ctx.getConfiguration().
                     getReadLockLevelConstant();

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryLock.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryLock.java?rev=824213&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryLock.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryLock.java
 Mon Oct 12 01:49:30 2009
@@ -0,0 +1,139 @@
+/*
+ * 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.persistence.query;
+
+import javax.persistence.EntityManager;
+import javax.persistence.LockModeType;
+import javax.persistence.Query;
+import javax.persistence.TransactionRequiredException;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+
+import org.apache.openjpa.persistence.criteria.CriteriaBuilder;
+import org.apache.openjpa.persistence.query.common.apps.Entity1;
+
+public class TestQueryLock extends BaseQueryTest {
+
+    public TestQueryLock(String test) {
+        super(test);
+    }
+
+    public void setUp() {
+        deleteAll(Entity1.class);
+    }
+
+    public void testJPQLLock() {
+        EntityManager em = currentEntityManager();
+        Query q = em.createQuery("SELECT o FROM Entity1 o " + "WHERE 
o.stringField = 'testSimple'");
+
+        try {
+            q.setLockMode(LockModeType.NONE);
+            assertEquals("Verify NONE after set", LockModeType.NONE, 
q.getLockMode());
+        } catch (Exception e) {
+            fail("Do not expected " + e.getClass().getName());
+        }
+
+        try {
+            q.setLockMode(LockModeType.PESSIMISTIC_READ);
+            fail("Expecting TransactionRequiredException thrown");
+        } catch (TransactionRequiredException tre) {
+            assertEquals("Verify still NONE after set incorrect lock mode", 
LockModeType.NONE, q.getLockMode());
+        } catch (Exception e) {
+            fail("Expecting TransactionRequiredException thrown");
+        }
+
+        startTx(em);
+        try {
+            q.setLockMode(LockModeType.OPTIMISTIC_FORCE_INCREMENT);
+            assertEquals("Verify changed to OPTIMISTIC_FORCE_INCREMENT", 
LockModeType.OPTIMISTIC_FORCE_INCREMENT, q
+                    .getLockMode());
+        } catch (Exception e) {
+            fail("Do not expected " + e.getClass().getName());
+        }
+        endTx(em);
+        endEm(em);
+    }
+
+    public void testCriteriaLock() {
+        EntityManager em = currentEntityManager();
+        CriteriaBuilder cb = getEmf().getQueryBuilder();
+        CriteriaQuery<Entity1> cq = cb.createQuery(Entity1.class);
+        Root<Entity1> customer = cq.from(Entity1.class);
+        Query q = em.createQuery(cq);
+
+        try {            
+            q.setLockMode(LockModeType.NONE);
+            assertEquals("Verify NONE after set", LockModeType.NONE, 
q.getLockMode());
+        } catch (Exception e) {
+            fail("Do not expected " + e.getClass().getName());
+        }
+
+        try {
+            q.setLockMode(LockModeType.PESSIMISTIC_READ);
+            fail("Expecting TransactionRequiredException thrown");
+        } catch (TransactionRequiredException tre) {
+            assertEquals("Verify still NONE after set incorrect lock mode", 
LockModeType.NONE, q.getLockMode());
+        } catch (Exception e) {
+            fail("Expecting TransactionRequiredException thrown");
+        }
+
+        startTx(em);
+        try {
+            q.setLockMode(LockModeType.OPTIMISTIC_FORCE_INCREMENT);
+            assertEquals("Verify changed to OPTIMISTIC_FORCE_INCREMENT", 
LockModeType.OPTIMISTIC_FORCE_INCREMENT, q
+                    .getLockMode());
+        } catch (Exception e) {
+            fail("Do not expected " + e.getClass().getName());
+        }
+        endTx(em);
+        endEm(em);
+    }
+
+    public void testNativeLock() {
+        EntityManager em = currentEntityManager();
+        Query q = em.createNativeQuery("SELECT * FROM Entity1");
+
+        try {
+            q.setLockMode(LockModeType.NONE);
+            fail("Expecting IllegalStateException thrown");
+        } catch (IllegalStateException ise) {
+        } catch (Exception e) {
+            fail("Expecting IllegalStateException thrown");
+        }
+
+        try {
+            q.setLockMode(LockModeType.PESSIMISTIC_READ);
+            fail("Expecting IllegalStateException thrown");
+        } catch (IllegalStateException ise) {
+        } catch (Exception e) {
+            fail("Expecting IllegalStateException thrown");
+        }
+
+        startTx(em);
+        try {
+            q.setLockMode(LockModeType.OPTIMISTIC_FORCE_INCREMENT);
+            fail("Expecting IllegalStateException thrown");
+        } catch (IllegalStateException ise) {
+        } catch (Exception e) {
+            fail("Expecting IllegalStateException thrown");
+        }
+        endTx(em);
+        endEm(em);
+    }
+}

Propchange: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryLock.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java?rev=824213&r1=824212&r2=824213&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
 Mon Oct 12 01:49:30 2009
@@ -29,11 +29,9 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 import java.util.concurrent.locks.ReentrantLock;
 
 import javax.persistence.FlushModeType;
@@ -64,6 +62,7 @@
 import org.apache.openjpa.lib.log.Log;
 import org.apache.openjpa.lib.rop.ResultList;
 import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.persistence.criteria.CriteriaBuilder;
 import org.apache.openjpa.util.ImplHelper;
 import org.apache.openjpa.util.RuntimeExceptionTranslator;
 import org.apache.openjpa.util.UserException;
@@ -373,6 +372,12 @@
                return QueryLanguages.LANG_SQL.equals(getLanguage());
        }
 
+       void assertJPQLOrCriteriaQuery() {
+        if (!(JPQLParser.LANG_JPQL.equals(getLanguage()) || 
CriteriaBuilder.LANG_CRITERIA.equals(getLanguage()))) {
+            throw new 
IllegalStateException(_loc.get("not-jpql-or-criteria-query").getMessage());
+        }
+       }
+
        public OpenJPAQuery<X> closeAll() {
                _query.closeAll();
                return this;
@@ -383,10 +388,12 @@
        }
 
     public LockModeType getLockMode() {
+        assertJPQLOrCriteriaQuery();
         return _fetch.getReadLockMode();
     }
 
     public TypedQuery<X> setLockMode(LockModeType lockMode) {
+        assertJPQLOrCriteriaQuery();
        _fetch.setReadLockMode(lockMode);
        return this;
     }

Modified: 
openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties?rev=824213&r1=824212&r2=824213&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
 (original)
+++ 
openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
 Mon Oct 12 01:49:30 2009
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-access-empty: Found no persistent property in "{0}" 
+access-empty: Found no persistent property in "{0}"
 access-mixed: Class "{0}" annotated fields "{1}" with FIELD access and \
        methods "{2}" with PROPERTY access. As class "{0}" is not using an  \
        explicit access, it is not permitted to mix PROPERTY and FIELD access \
@@ -24,7 +24,7 @@
     or a getter method. It is not possible to determine its access type
 access-unknown: Access style for "{0}" can not be determined.
 access-no-property: No field or getter method for attribute "{1}" can be found 
\
-       in "{0}". 
+       in "{0}".
 close-invoked: You have closed the EntityManager, though the persistence \
     context will remain active until the current transaction commits.
 no-managed-trans: There is no managed transaction in progress to sync this \
@@ -177,7 +177,7 @@
     entity.
 dup-pu: The persistence unit "{0}" was found multiple times in the following \
     resources "{1}", but persistence unit names should be unique. The first \
-    persistence unit matching the provided name in "{2}" is being used.    
+    persistence unit matching the provided name in "{2}" is being used.
 bad-lock-level: Invalid lock mode/level. Valid values are \
     "none"(0), "read"(10), "optimistic"(15), "write"(20), \
     "optimistic-force-increment"(25), \
@@ -198,9 +198,9 @@
 param-missing: {0} is not declared in query "{1}". \
     Declared parameter keys are "{2}".
 param-missing-pos: Parameter position {0} is not declared in query "{1}". \
-       Declared parameter keys are "{2}".  
+       Declared parameter keys are "{2}".
 param-missing-name: Parameter named "{0}" is not declared in query "{1}". \
-       Declared parameter keys are "{2}".  
+       Declared parameter keys are "{2}".
 param-pos-in-criteria: Can not set value for positional parameter {0} \
        because the executable query is created by a Criteria Query. \
        Use only named parameter or parameter expressions to set values \
@@ -222,3 +222,4 @@
 tuple-exceeded-size : Attempt to access TupleElement at illegal index {0}. 
There are only {1} elements available.
 create-emf-error: Failed to create a provider for "{0}".
 invalid-version-attribute: Persistence version attribute value "{0}" is not 
valid.  Using version "{1}" by default.
+not-jpql-or-criteria-query: Query is neither a JPQL SELECT nor a Criteria API 
query.


Reply via email to