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.