I didn't think this could be done until Donald mentioned it, but apparently it can be done [1], [2].
[1] http://subversion.tigris.org/faq.html#change-log-msg [2] http://www.mail-archive.com/[email protected]/msg13378.html -mike On Fri, Mar 6, 2009 at 7:53 AM, Donald Woods <[email protected]> wrote: > Can you update the svn log to refer to OPENJPA-960 instead? > > > -Donald > > > > [email protected] wrote: > >> 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 >> >> >> >>
