Author: ppoddar
Date: Fri Mar 6 07:08:20 2009
New Revision: 750788
URL: http://svn.apache.org/viewvc?rev=750788&view=rev
Log:
OPENJPA-966: Support unwrap() for JPA 2.0
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java
Modified:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.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
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java?rev=750788&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java
Fri Mar 6 07:08:20 2009
@@ -0,0 +1,68 @@
+/*
+ * 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;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.openjpa.kernel.QueryLanguages;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+public class TestUnwrap extends SingleEMFTestCase {
+
+ /**
+ * Tests a query can be unwrapped as an instance of a series of class or
+ * interface.
+ */
+ public void testValidQueryUnwrap() {
+ OpenJPAEntityManager em = emf.createEntityManager();
+ Query query = em.createQuery(QueryLanguages.LANG_SQL,"");
+
+ Class[] validCasts = new Class[] {
+ org.apache.openjpa.persistence.OpenJPAQuery.class,
+ org.apache.openjpa.persistence.OpenJPAQuerySPI.class,
+ org.apache.openjpa.kernel.DelegatingQuery.class,
+ org.apache.openjpa.kernel.Query.class,
+ org.apache.openjpa.kernel.QueryImpl.class
+ };
+ for (Class c : validCasts) {
+ Object unwrapped = query.unwrap(c);
+ assertTrue(c.isInstance(unwrapped));
+ }
+ }
+
+ /**
+ * Tests a EntityManager can be unwrapped as an instance of a series of
+ * class or interface.
+ */
+ public void testValidEntityManagerUnwrap() {
+ EntityManager em = emf.createEntityManager();
+
+ Class[] validCasts = new Class[] {
+ org.apache.openjpa.persistence.OpenJPAEntityManager.class,
+ org.apache.openjpa.persistence.OpenJPAEntityManagerSPI.class,
+ org.apache.openjpa.kernel.DelegatingBroker.class,
+ org.apache.openjpa.kernel.Broker.class
+ };
+ for (Class c : validCasts) {
+ Object unwrapped = em.unwrap(c);
+ assertTrue(c.isInstance(unwrapped));
+ }
+ }
+}
Modified:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=750788&r1=750787&r2=750788&view=diff
==============================================================================
---
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
(original)
+++
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
Fri Mar 6 07:08:20 2009
@@ -1525,8 +1525,14 @@
}
public <T> T unwrap(Class<T> cls) {
- throw new UnsupportedOperationException(
- "JPA 2.0 - Method not yet implemented");
+ Object[] delegates = new Object[]{_broker.getInnermostDelegate(),
+ _broker.getDelegate(), _broker, this};
+ for (Object o : delegates) {
+ if (cls.isInstance(o))
+ return (T)o;
+ }
+ throw new PersistenceException(_loc.get("unwrap-em-invalid", cls)
+ .toString(), null, this, false);
}
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=750788&r1=750787&r2=750788&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
Fri Mar 6 07:08:20 2009
@@ -562,9 +562,24 @@
"JPA 2.0 - Method not yet implemented");
}
+ /**
+ * Returns the innermost implementation that is an instance of the given
+ * class.
+ *
+ * @throws PersistenceException if none in the delegate chain is an
+ * instance of the given class.
+ *
+ * @since 2.0.0
+ */
public <T> T unwrap(Class<T> cls) {
- throw new UnsupportedOperationException(
- "JPA 2.0 - Method not yet implemented");
+ Object[] delegates = new Object[]{_query.getInnermostDelegate(),
+ _query.getDelegate(), _query, this};
+ for (Object o : delegates) {
+ if (cls.isInstance(o))
+ return (T)o;
+ }
+ throw new PersistenceException(_loc.get("unwrap-query-invalid", cls)
+ .toString(), null, this, false);
}
//
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=750788&r1=750787&r2=750788&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
Fri Mar 6 07:08:20 2009
@@ -164,4 +164,6 @@
version-check-error: An error occurred while attempting to determine the \
version of "{0}".
no-result: Query "{0}" selected no result, but expected unique result.
-non-unique-result: Query "{0}" selected {1} results, but expected unique
result.
\ No newline at end of file
+non-unique-result: Query "{0}" selected {1} results, but expected unique
result.
+unwrap-em-invalid: EntityManager can not be unwrapped to an instance of "{0}".
+unwrap-query-invalid: Query can not be unwrapped to an instance of "{0}".
\ No newline at end of file