Modified: aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java Wed Jan 7 19:37:42 2015 @@ -45,11 +45,7 @@ import javax.transaction.UserTransaction import org.apache.aries.jpa.container.itest.entities.Car; import org.apache.aries.jpa.itest.AbstractJPAItest; -import org.junit.Ignore; import org.junit.Test; -import org.ops4j.pax.exam.Configuration; -import org.ops4j.pax.exam.CoreOptions; -import org.ops4j.pax.exam.Option; public abstract class JPAContextTest extends AbstractJPAItest { @@ -82,7 +78,6 @@ public abstract class JPAContextTest ext EntityManagerFactory emf = getProxyEMF(BP_TEST_UNIT); final EntityManager managedEm = emf.createEntityManager(); - ensureTREBehaviour(false, managedEm, "contains", new Object()); ensureTREBehaviour(false, managedEm, "createNamedQuery", "hi"); ensureTREBehaviour(false, managedEm, "createNativeQuery", "hi"); @@ -116,8 +111,7 @@ public abstract class JPAContextTest ext ensureTREBehaviour(true, managedEm, "find", Object.class, new Object(), LockModeType.OPTIMISTIC); ensureTREBehaviour(false, managedEm, "find", Object.class, new Object(), LockModeType.NONE, new HashMap()); - ensureTREBehaviour(true, managedEm, "find", Object.class, new Object(), LockModeType.OPTIMISTIC, - new HashMap()); + ensureTREBehaviour(true, managedEm, "find", Object.class, new Object(), LockModeType.OPTIMISTIC, new HashMap()); ensureTREBehaviour(false, managedEm, "getCriteriaBuilder"); ensureTREBehaviour(true, managedEm, "getLockMode", new Object()); ensureTREBehaviour(false, managedEm, "getMetamodel"); @@ -139,7 +133,11 @@ public abstract class JPAContextTest ext ensureTREBehaviour(false, managedEm, "createNativeQuery", "hi", "hi"); ensureTREBehaviour(false, managedEm, "createQuery", "hi"); ensureTREBehaviour(false, managedEm, "find", Object.class, new Object()); + ut.rollback(); + ut.begin(); ensureTREBehaviour(false, managedEm, "flush"); + ut.rollback(); + ut.begin(); ensureTREBehaviour(false, managedEm, "getDelegate"); ensureTREBehaviour(false, managedEm, "getFlushMode"); ensureTREBehaviour(false, managedEm, "getReference", Object.class, new Object()); @@ -333,41 +331,48 @@ public abstract class JPAContextTest ext assertEquals("black", list.get(0).getColour()); assertEquals("C3CCC", list.get(0).getNumberPlate()); - assertEquals(5, list.get(1).getNumberOfSeats()); - assertEquals(1200, list.get(1).getEngineSize()); - assertEquals("blue", list.get(1).getColour()); + assertEquals(2, list.get(1).getNumberOfSeats()); + assertEquals(2000, list.get(1).getEngineSize()); + assertEquals("red", list.get(1).getColour()); assertEquals("A1AAA", list.get(1).getNumberPlate()); } - private void ensureTREBehaviour(boolean expectedToFail, EntityManager em, String methodName, Object... args) throws Exception { - List<Class<?>> argTypes = new ArrayList<Class<?>>(); - for(Object o : args) { - if(o instanceof Map) - argTypes.add(Map.class); - else if (o instanceof CriteriaQuery) - argTypes.add(CriteriaQuery.class); - else - argTypes.add(o.getClass()); - } - - Method m = EntityManager.class.getMethod(methodName, - argTypes.toArray(new Class[args.length])); - - try { - m.invoke(em, args); - if(expectedToFail) - fail("A transaction is required"); - } catch (InvocationTargetException ite) { - if(expectedToFail && - !!!(ite.getCause() instanceof TransactionRequiredException)) - fail("We got the wrong failure. Expected a TransactionRequiredException" + - ", got a " + ite.toString()); - else if (!!!expectedToFail && - ite.getCause() instanceof TransactionRequiredException) - fail("We got the wrong failure. Expected not to get a TransactionRequiredException" + - ", but we got one anyway!"); + private void ensureTREBehaviour(boolean expectedToFail, EntityManager em, String methodName, + Object... args) throws Exception { + List<Class<?>> argTypes = new ArrayList<Class<?>>(); + for (Object o : args) { + if (o instanceof Map) + argTypes.add(Map.class); + else if (o instanceof CriteriaQuery) + argTypes.add(CriteriaQuery.class); + else + argTypes.add(o.getClass()); + } + + Method m = EntityManager.class.getMethod(methodName, argTypes.toArray(new Class[args.length])); + + try { + m.invoke(em, args); + if (expectedToFail) { + fail("Should have failed with TransactionRequiredException"); + } + } catch (InvocationTargetException ite) { + Throwable e = ite; + while(e != null && !(e instanceof TransactionRequiredException)) { + e = e.getCause(); + } + if(e==null) { + e = ite.getCause(); + } + if (expectedToFail && !(ite.getCause() instanceof TransactionRequiredException)) { + fail("We got the wrong failure. Expected a TransactionRequiredException" + ", got a " + + ite.toString()); + } else if (!expectedToFail && ite.getCause() instanceof TransactionRequiredException) { + fail("We got the wrong failure. Expected not to get a TransactionRequiredException" + + ", but we got one anyway!"); + } + } } - } }
Modified: aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/OpenjpaContextTest.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/OpenjpaContextTest.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/OpenjpaContextTest.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/OpenjpaContextTest.java Wed Jan 7 19:37:42 2015 @@ -26,7 +26,7 @@ public class OpenjpaContextTest extends public Option[] configuration() { return options( baseOptions(), - ariesJpa(), + ariesJpa20(), transactionWrapper(), openJpa(), testBundle() Modified: aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java Wed Jan 7 19:37:42 2015 @@ -28,147 +28,178 @@ import org.osgi.framework.ServiceReferen @RunWith(PaxExam.class) @ExamReactorStrategy(PerClass.class) public abstract class AbstractJPAItest extends AbstractIntegrationTest { - protected static final String TEST_UNIT = "test-unit"; - protected static final String BP_TEST_UNIT = "bp-test-unit"; - protected static final String BP_XA_TEST_UNIT = "bp-xa-test-unit"; - protected static final String TEST_BUNDLE_NAME = "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle"; - private static final String FILTER_CONTAINER_MANAGED = "(" + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)"; - private static final String FILTER_PROXY = "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*)"; - - protected void registerClient(String unitName) { - PersistenceContextProvider provider = context().getService(PersistenceContextProvider.class); - HashMap<String, Object> props = new HashMap<String, Object>(); - props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION); - provider.registerContext(unitName, bundleContext.getBundle(), props); - } - - protected EntityManagerFactory getProxyEMF(String name) { - return context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=" + name + ")" - + FILTER_CONTAINER_MANAGED + FILTER_PROXY +")"); - } - - protected EntityManagerFactory getEMF(String name) { - return context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=" + name + ")" + FILTER_CONTAINER_MANAGED + ")"); - } - - @SuppressWarnings("rawtypes") - protected ServiceReference[] getEMFRefs(String name) throws InvalidSyntaxException { - return bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=" + name + ")" - + FILTER_CONTAINER_MANAGED + ")"); - } - - @SuppressWarnings("rawtypes") - protected ServiceReference[] getProxyEMFRefs(String name) - throws InvalidSyntaxException { - return bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=" + name + ")" - + FILTER_CONTAINER_MANAGED + FILTER_PROXY + ")"); - } + protected static final String TEST_UNIT = "test-unit"; + protected static final String BP_TEST_UNIT = "bp-test-unit"; + protected static final String BP_XA_TEST_UNIT = "bp-xa-test-unit"; + protected static final String TEST_BUNDLE_NAME = "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle"; + private static final String FILTER_CONTAINER_MANAGED = "(" + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)"; + private static final String FILTER_PROXY = "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*)"; + + protected void registerClient(String unitName) { + PersistenceContextProvider provider = context().getService(PersistenceContextProvider.class); + HashMap<String, Object> props = new HashMap<String, Object>(); + props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION); + provider.registerContext(unitName, bundleContext.getBundle(), props); + } + + protected EntityManagerFactory getProxyEMF(String name) { + String filter = "(&(osgi.unit.name=" + name + ")" + FILTER_CONTAINER_MANAGED + FILTER_PROXY + ")"; + return context().getService(EntityManagerFactory.class, filter, 5000); + } + + protected EntityManagerFactory getEMF(String name) { + return context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=" + name + ")" + FILTER_CONTAINER_MANAGED + ")"); + } + + @SuppressWarnings("rawtypes") + protected ServiceReference[] getEMFRefs(String name) throws InvalidSyntaxException { + return bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=" + name + ")" + + FILTER_CONTAINER_MANAGED + ")"); + } + @SuppressWarnings("rawtypes") + protected ServiceReference[] getProxyEMFRefs(String name) throws InvalidSyntaxException { + return bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=" + name + ")" + + FILTER_CONTAINER_MANAGED + FILTER_PROXY + ")"); + } + + private MavenArtifactProvisionOption mvnBundle(String groupId, String artifactId) { + return mavenBundle(groupId, artifactId).versionAsInProject(); + } - protected Option baseOptions() { + protected Option baseOptions() { String localRepo = System.getProperty("maven.repo.local"); - + if (localRepo == null) { localRepo = System.getProperty("org.ops4j.pax.url.mvn.localRepository"); } - return composite( - junitBundles(), + return composite(junitBundles(), mavenBundle("org.ops4j.pax.logging", "pax-logging-api", "1.7.2"), mavenBundle("org.ops4j.pax.logging", "pax-logging-service", "1.7.2"), - mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(), + mvnBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit"), // this is how you set the default log level when using pax // logging (logProfile) systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"), - when(localRepo != null).useOptions(vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)) - ); + when(localRepo != null).useOptions(vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo))); + } + + private Option ariesJpaInternal() { + return composite( + frameworkProperty("org.osgi.framework.system.packages") + .value("javax.accessibility,javax.activation,javax.activity,javax.annotation,javax.annotation.processing,javax.crypto,javax.crypto.interfaces,javax.crypto.spec,javax.imageio,javax.imageio.event,javax.imageio.metadata,javax.imageio.plugins.bmp,javax.imageio.plugins.jpeg,javax.imageio.spi,javax.imageio.stream,javax.jws,javax.jws.soap,javax.lang.model,javax.lang.model.element,javax.lang.model.type,javax.lang.model.util,javax.management,javax.management.loading,javax.management.modelmbean,javax.management.monitor,javax.management.openmbean,javax.management.relation,javax.management.remote,javax.management.remote.rmi,javax.management.timer,javax.naming,javax.naming.directory,javax.naming.event,javax.naming.ldap,javax.naming.spi,javax.net,javax.net.ssl,javax.print,javax.print.attribute,javax.print.attribute.standard,javax.print.event,javax.rmi,javax.rmi.CORBA,javax.rmi.ssl,javax.script,javax.security.auth,javax.security.auth.callback,javax.security.auth.kerberos,ja vax.security.auth.login,javax.security.auth.spi,javax.security.auth.x500,javax.security.cert,javax.security.sasl,javax.sound.midi,javax.sound.midi.spi,javax.sound.sampled,javax.sound.sampled.spi,javax.sql,javax.sql.rowset,javax.sql.rowset.serial,javax.sql.rowset.spi,javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.plaf.metal,javax.swing.plaf.multi,javax.swing.plaf.synth,javax.swing.table,javax.swing.text,javax.swing.text.html,javax.swing.text.html.parser,javax.swing.text.rtf,javax.swing.tree,javax.swing.undo,javax.tools,javax.xml,javax.xml.bind,javax.xml.bind.annotation,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.bind.helpers,javax.xml.bind.util,javax.xml.crypto,javax.xml.crypto.dom,javax.xml.crypto.dsig,javax.xml.crypto.dsig.dom,javax.xml.crypto.dsig.keyinfo,javax.xml.crypto.dsig.spec,javax.xml.datatype,javax.xml.namespace,javax.xml.parsers,javax.xml.soap, " + + "javax.xml.stream; version=1.0,javax.xml.stream.events; version=1.0,javax.xml.stream.util; version=1.0," + + "javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transform.stax,javax.xml.transform.stream,javax.xml.validation,javax.xml.ws,javax.xml.ws.handler,javax.xml.ws.handler.soap,javax.xml.ws.http,javax.xml.ws.soap,javax.xml.ws.spi,javax.xml.xpath,org.ietf.jgss,org.omg.CORBA,org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA.TypeCodePackage,org.omg.CORBA.portable,org.omg.CORBA_2_3,org.omg.CORBA_2_3.portable,org.omg.CosNaming,org.omg.CosNaming.NamingContextExtPackage,org.omg.CosNaming.NamingContextPackage,org.omg.Dynamic,org.omg.DynamicAny,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage,org.omg.IOP,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage,org.omg.Messaging,org.omg.PortableInterceptor,org.omg.PortableInterceptor.ORBInitInfoPackage,org.omg.PortableServer,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.P ortableServer.ServantLocatorPackage,org.omg.PortableServer.portable,org.omg.SendingContext,org.omg.stub.java.rmi,org.w3c.dom,org.w3c.dom.bootstrap,org.w3c.dom.css,org.w3c.dom.events,org.w3c.dom.html,org.w3c.dom.ls,org.w3c.dom.ranges,org.w3c.dom.stylesheets,org.w3c.dom.traversal,org.w3c.dom.views,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers"), + + mvnBundle("org.ow2.asm", "asm-all"), + + mvnBundle("org.apache.aries.proxy", "org.apache.aries.proxy.api"), + mvnBundle("org.apache.aries.proxy", "org.apache.aries.proxy.impl"), + + mvnBundle("org.apache.aries.jndi", "org.apache.aries.jndi.api"), + mvnBundle("org.apache.aries.jndi", "org.apache.aries.jndi.core"), + mvnBundle("org.apache.aries.jndi", "org.apache.aries.jndi.url"), + + mvnBundle("org.apache.aries.quiesce", "org.apache.aries.quiesce.api"), + mvnBundle("org.apache.aries", "org.apache.aries.util"), + + mvnBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.api"), + mvnBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.core"), + + mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.api"), + mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container"), + mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.context"), + mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.blueprint.aries"), + + mvnBundle("org.apache.geronimo.specs", "geronimo-jta_1.1_spec"), + mvnBundle("org.apache.aries.transaction", "org.apache.aries.transaction.manager"), + + mvnBundle("commons-lang", "commons-lang"), + mvnBundle("commons-collections", "commons-collections"), + mvnBundle("commons-pool", "commons-pool"), + + mvnBundle("org.apache.derby", "derby") + ); + } + + protected Option ariesJpa20() { + return composite( + ariesJpaInternal(), + mvnBundle("org.osgi", "org.osgi.enterprise"), + mavenBundle("org.apache.geronimo.specs", "geronimo-jpa_2.0_spec", "1.1") + ); + } + + protected Option ariesJpa21() { + return composite( + ariesJpaInternal(), + mvnBundle("org.eclipse.persistence", "javax.persistence") + ); + } + + protected Option transactionWrapper() { + return mvnBundle("org.apache.aries.transaction", "org.apache.aries.transaction.wrappers"); + } + + protected Option eclipseLink() { + return composite( + mvnBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.commons-dbcp"), + mvnBundle("org.eclipse.persistence", "org.eclipse.persistence.jpa"), + mvnBundle("org.eclipse.persistence", "org.eclipse.persistence.core"), + mvnBundle("org.eclipse.persistence", "org.eclipse.persistence.asm"), + mvnBundle("org.eclipse.persistence", "org.eclipse.persistence.antlr"), + mvnBundle("org.eclipse.persistence", "org.eclipse.persistence.jpa.jpql"), + mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.eclipselink.adapter") + ); + } + + protected Option openJpa() { + return composite( + mvnBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.serp"), + mvnBundle("org.apache.geronimo.specs", "geronimo-servlet_2.5_spec"), + mvnBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.commons-dbcp"), + mvnBundle("org.apache.xbean", "xbean-asm4-shaded"), + mvnBundle("org.apache.openjpa", "openjpa") + ); } - - protected Option ariesJpa() { - return composite( - frameworkProperty("org.osgi.framework.system.packages") - .value("javax.accessibility,javax.activation,javax.activity,javax.annotation,javax.annotation.processing,javax.crypto,javax.crypto.interfaces,javax.crypto.spec,javax.imageio,javax.imageio.event,javax.imageio.metadata,javax.imageio.plugins.bmp,javax.imageio.plugins.jpeg,javax.imageio.spi,javax.imageio.stream,javax.jws,javax.jws.soap,javax.lang.model,javax.lang.model.element,javax.lang.model.type,javax.lang.model.util,javax.management,javax.management.loading,javax.management.modelmbean,javax.management.monitor,javax.management.openmbean,javax.management.relation,javax.management.remote,javax.management.remote.rmi,javax.management.timer,javax.naming,javax.naming.directory,javax.naming.event,javax.naming.ldap,javax.naming.spi,javax.net,javax.net.ssl,javax.print,javax.print.attribute,javax.print.attribute.standard,javax.print.event,javax.rmi,javax.rmi.CORBA,javax.rmi.ssl,javax.script,javax.security.auth,javax.security.auth.callback,javax.security.auth.kerberos,javax.securit y.auth.login,javax.security.auth.spi,javax.security.auth.x500,javax.security.cert,javax.security.sasl,javax.sound.midi,javax.sound.midi.spi,javax.sound.sampled,javax.sound.sampled.spi,javax.sql,javax.sql.rowset,javax.sql.rowset.serial,javax.sql.rowset.spi,javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.plaf.metal,javax.swing.plaf.multi,javax.swing.plaf.synth,javax.swing.table,javax.swing.text,javax.swing.text.html,javax.swing.text.html.parser,javax.swing.text.rtf,javax.swing.tree,javax.swing.undo,javax.tools,javax.xml,javax.xml.bind,javax.xml.bind.annotation,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.bind.helpers,javax.xml.bind.util,javax.xml.crypto,javax.xml.crypto.dom,javax.xml.crypto.dsig,javax.xml.crypto.dsig.dom,javax.xml.crypto.dsig.keyinfo,javax.xml.crypto.dsig.spec,javax.xml.datatype,javax.xml.namespace,javax.xml.parsers,javax.xml.soap,javax.xml.s tream,javax.xml.stream.events,javax.xml.stream.util,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transform.stax,javax.xml.transform.stream,javax.xml.validation,javax.xml.ws,javax.xml.ws.handler,javax.xml.ws.handler.soap,javax.xml.ws.http,javax.xml.ws.soap,javax.xml.ws.spi,javax.xml.xpath,org.ietf.jgss,org.omg.CORBA,org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA.TypeCodePackage,org.omg.CORBA.portable,org.omg.CORBA_2_3,org.omg.CORBA_2_3.portable,org.omg.CosNaming,org.omg.CosNaming.NamingContextExtPackage,org.omg.CosNaming.NamingContextPackage,org.omg.Dynamic,org.omg.DynamicAny,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage,org.omg.IOP,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage,org.omg.Messaging,org.omg.PortableInterceptor,org.omg.PortableInterceptor.ORBInitInfoPackage,org.omg.PortableServer,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.PO APackage,org.omg.PortableServer.ServantLocatorPackage,org.omg.PortableServer.portable,org.omg.SendingContext,org.omg.stub.java.rmi,org.w3c.dom,org.w3c.dom.bootstrap,org.w3c.dom.css,org.w3c.dom.events,org.w3c.dom.html,org.w3c.dom.ls,org.w3c.dom.ranges,org.w3c.dom.stylesheets,org.w3c.dom.traversal,org.w3c.dom.views,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers"), - //mavenBundle("org.osgi", "org.osgi.compendium").versionAsInProject(), - //mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.cglib").versionAsInProject(), - mavenBundle("org.osgi", "org.osgi.enterprise").versionAsInProject(), - mavenBundle("org.ow2.asm", "asm-all").versionAsInProject(), - - mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy.api").versionAsInProject(), - mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy.impl").versionAsInProject(), - - mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.api").versionAsInProject(), - mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.core").versionAsInProject(), - mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.url").versionAsInProject(), - - mavenBundle("org.apache.aries.quiesce", "org.apache.aries.quiesce.api").versionAsInProject(), - mavenBundle("org.apache.aries", "org.apache.aries.util").versionAsInProject(), - - mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.api").versionAsInProject(), - mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.core").versionAsInProject(), - - mavenBundle("org.apache.geronimo.specs", "geronimo-jpa_2.0_spec", "1.1"), - // mavenBundle("org.hibernate.javax.persistence", "hibernate-jpa-2.1-api").versionAsInProject(), - mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.api").versionAsInProject(), - mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container").versionAsInProject(), - mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.context").versionAsInProject(), - mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.blueprint.aries").versionAsInProject(), - - mavenBundle("org.apache.geronimo.specs", "geronimo-jta_1.1_spec").versionAsInProject(), - mavenBundle("org.apache.aries.transaction", "org.apache.aries.transaction.manager").versionAsInProject(), - - mavenBundle("commons-lang", "commons-lang").versionAsInProject(), - mavenBundle("commons-collections", "commons-collections").versionAsInProject(), - mavenBundle("commons-pool", "commons-pool").versionAsInProject(), - - mavenBundle("org.apache.derby", "derby").versionAsInProject() - - ); - } - - protected Option transactionWrapper() { - return mavenBundle("org.apache.aries.transaction", "org.apache.aries.transaction.wrappers" ).versionAsInProject(); - } - - protected Option eclipseLink() { - return composite( - mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.jpa").versionAsInProject(), - mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.core").versionAsInProject(), - mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.asm").versionAsInProject(), - mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.antlr").versionAsInProject(), - mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.eclipselink.adapter").versionAsInProject() + + protected Option hibernate() { + return composite( + mvnBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.antlr"), + mvnBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.ant"), + mvnBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.dom4j"), + mvnBundle("org.apache.servicemix.bundles" , "org.apache.servicemix.bundles.serp"), + mvnBundle("com.fasterxml", "classmate"), + mvnBundle("org.javassist", "javassist"), + mvnBundle("org.jboss.logging", "jboss-logging"), + mvnBundle("org.hibernate.common", "hibernate-commons-annotations"), + mvnBundle("org.jboss", "jandex"), + mvnBundle("org.hibernate", "hibernate-core"), + mvnBundle("org.hibernate", "hibernate-entitymanager"), + mvnBundle("org.hibernate", "hibernate-osgi") ); - } - - protected Option openJpa() { - return composite( - mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.serp").versionAsInProject(), - mavenBundle("org.apache.geronimo.specs", "geronimo-servlet_2.5_spec").versionAsInProject(), - mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.commons-dbcp").versionAsInProject(), - mavenBundle("org.apache.xbean","xbean-asm4-shaded").versionAsInProject(), - mavenBundle("org.apache.openjpa", "openjpa").versionAsInProject() - ); - } - - protected Option testDs() { - return mavenBundle("org.apache.aries.transaction", "org.apache.aries.transaction.testds").versionAsInProject(); - } - - protected MavenArtifactProvisionOption derbyDataSourceFactory() { - return mavenBundle("org.ops4j.pax.jdbc", "pax-jdbc-derby").versionAsInProject(); - } - - protected MavenArtifactProvisionOption testBundle() { - return mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.itest.bundle").versionAsInProject(); - } - - protected MavenArtifactProvisionOption testBundleBlueprint() { - return mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.blueprint.itest.bundle").versionAsInProject(); - } - - protected MavenArtifactProvisionOption testBundleEclipseLink() { - return mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.itest.bundle.eclipselink"); - } - - protected MavenArtifactProvisionOption testBundleAdvanced() { - return mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.advanced.itest.bundle").versionAsInProject(); - } + } + + protected Option testDs() { + return mvnBundle("org.apache.aries.transaction", "org.apache.aries.transaction.testds"); + } + + protected MavenArtifactProvisionOption derbyDataSourceFactory() { + return mvnBundle("org.ops4j.pax.jdbc", "pax-jdbc-derby"); + } + + protected MavenArtifactProvisionOption testBundle() { + return mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.itest.bundle"); + } + + protected MavenArtifactProvisionOption testBundleBlueprint() { + return mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.blueprint.itest.bundle"); + } + + protected MavenArtifactProvisionOption testBundleEclipseLink() { + return mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.itest.bundle.eclipselink"); + } + + protected MavenArtifactProvisionOption testBundleAdvanced() { + return mvnBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.advanced.itest.bundle"); + } } Modified: aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java Wed Jan 7 19:37:42 2015 @@ -15,114 +15,28 @@ */ package org.apache.aries.jpa.quiesce.itest; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.ops4j.pax.exam.CoreOptions.options; - -import java.util.Collections; - -import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; -import javax.transaction.UserTransaction; -import org.apache.aries.jpa.itest.AbstractJPAItest; -import org.apache.aries.quiesce.manager.QuiesceCallback; -import org.apache.aries.quiesce.participant.QuiesceParticipant; -import org.junit.After; import org.junit.Test; -import org.ops4j.pax.exam.Configuration; -import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; -import org.ops4j.pax.exam.spi.reactors.PerMethod; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleException; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; - -@ExamReactorStrategy(PerMethod.class) -public class QuiesceJPATest extends AbstractJPAItest { - private static final int WAIT_TIME = 200; - private static final String JPA_CONTAINER = "org.apache.aries.jpa.container"; - private static final String JPA_CONTEXT = "org.apache.aries.jpa.container.context"; - private final String TEST_BUNDLE = "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle"; - - @Inject - UserTransaction tm; - - //This is load bearing. we have to wait to create the EntityManager until the DataSource is available - @Inject - DataSource ds; - - private class TestQuiesceCallback implements QuiesceCallback{ - - protected int calls = 0; - - public void bundleQuiesced(Bundle... arg0) { - calls++; - } - - public boolean bundleClearedUp() - { - return calls == 1; - } - } - - private class MultiQuiesceCallback extends TestQuiesceCallback implements QuiesceCallback{ - - private boolean contextFirst = true; - - public void bundleQuiesced(Bundle... arg0) { - if(++calls == 1) - try { - getEMF(TEST_UNIT); - } catch (Throwable t){ - contextFirst = false; - if(t instanceof RuntimeException) - throw (RuntimeException) t; - else if (t instanceof Error) - throw (Error) t; - else - throw new RuntimeException(t); - } - - } - - public boolean bundleClearedUp() - { - return calls == 2 && contextFirst; - } - } - - - @After - public void restartTestBundles() throws BundleException { - restartTestBundle(); - restartBundle(JPA_CONTAINER); - restartBundle(JPA_CONTEXT); - try { - tm.rollback(); - } catch (Exception e) { - // Ignore - } - } +import org.ops4j.pax.exam.spi.reactors.PerClass; +@ExamReactorStrategy(PerClass.class) +public class QuiesceJPATest extends AbstractQuiesceJPATest { @Test public void testSimpleContextQuiesce() throws Exception { registerClient(TEST_UNIT); getProxyEMF(TEST_UNIT); - //Quiesce it - TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE); + // Quiesce should work + TestQuiesceCallback callback = quiesce(JPA_CONTEXT, TEST_BUNDLE); Thread.sleep(WAIT_TIME); assertFinished(callback); - assertNoProxyEMFForTestUnit(); + // After restart emf should be there again restartTestBundle(); - getProxyEMF(TEST_UNIT); } @@ -130,41 +44,27 @@ public class QuiesceJPATest extends Abst public void testComplexContextQuiesce() throws Exception { registerClient(TEST_UNIT); - EntityManagerFactory emf = getProxyEMF(TEST_UNIT); - tm.begin(); - emf.createEntityManager().getProperties(); - - TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE); - assertNotFinished(callback); - - emf = getProxyEMF(TEST_UNIT); - tm.commit(); - assertTrue("Quiesce not finished", callback.bundleClearedUp()); - assertNoProxyEMFForTestUnit(); + testQuiesceContext(); restartTestBundle(); - emf = getProxyEMF(TEST_UNIT); - tm.begin(); - emf.createEntityManager().getProperties(); - tm.commit(); - - Thread.sleep(WAIT_TIME); - //Test again to make sure we don't hold state over - emf = getProxyEMF(TEST_UNIT); + testQuiesceContext(); + } + + private void testQuiesceContext() throws Exception { + EntityManagerFactory emf = getProxyEMF(TEST_UNIT); tm.begin(); emf.createEntityManager().getProperties(); - callback = getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE); + TestQuiesceCallback callback = quiesce(JPA_CONTEXT, TEST_BUNDLE); assertNotFinished(callback); - emf = getProxyEMF(TEST_UNIT); + getProxyEMF(TEST_UNIT); tm.commit(); - assertFinished(callback); assertNoProxyEMFForTestUnit(); - } + } @Test public void testContextRuntimeQuiesce() throws Exception { @@ -174,7 +74,7 @@ public class QuiesceJPATest extends Abst tm.begin(); emf.createEntityManager().getProperties(); - TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, JPA_CONTEXT); + TestQuiesceCallback callback = quiesce(JPA_CONTEXT, JPA_CONTEXT); assertNotFinished(callback); emf = getProxyEMF(TEST_UNIT); @@ -186,35 +86,34 @@ public class QuiesceJPATest extends Abst @Test public void testSimpleUnitQuiesce() throws Exception { - assertEMFForTestUnit(); + getEMF(TEST_UNIT); - TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE); + TestQuiesceCallback callback = quiesce(JPA_CONTAINER, TEST_BUNDLE); Thread.sleep(WAIT_TIME); assertFinished(callback); assertNoEMFForTestUnit(); restartTestBundle(); - assertEMFForTestUnit(); + getEMF(TEST_UNIT); } @Test public void testComplexUnitQuiesce() throws Exception { - quiesceUnit(); + testQuiesceUnit(); restartTestBundle(); - getEMF(TEST_UNIT).createEntityManager().close(); //Test a second time to make sure state isn't held - quiesceUnit(); + testQuiesceUnit(); } - private void quiesceUnit() throws Exception { + private void testQuiesceUnit() throws Exception { EntityManager em = getEMF(TEST_UNIT).createEntityManager(); - TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE); + TestQuiesceCallback callback = quiesce(JPA_CONTAINER, TEST_BUNDLE); assertNotFinished(callback); - assertEMFForTestUnit(); + getEMF(TEST_UNIT); em.close(); assertFinished(callback); assertNoEMFForTestUnit(); @@ -225,146 +124,13 @@ public class QuiesceJPATest extends Abst EntityManagerFactory emf = getEMF(TEST_UNIT); EntityManager em = emf.createEntityManager(); - TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTAINER, JPA_CONTAINER); + TestQuiesceCallback callback = quiesce(JPA_CONTAINER, JPA_CONTAINER); assertNotFinished(callback); - assertEMFForTestUnit(); - em.close(); - assertFinished(callback); - assertNoEMFForTestUnit(); - } - - @Test - public void testComplexQuiesceInteraction() throws Exception { - registerClient(TEST_UNIT); - - EntityManagerFactory emf = getProxyEMF(TEST_UNIT); - tm.begin(); - emf.createEntityManager().getProperties(); - - //Quiesce the Unit, nothing should happen - TestQuiesceCallback unitCallback = getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE); - assertNotFinished(unitCallback); - - emf = getProxyEMF(TEST_UNIT); - - //Quiesce the context, still nothing - TestQuiesceCallback contextCallback = getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE); - assertNotFinished(unitCallback, contextCallback); - - emf = getProxyEMF(TEST_UNIT); - - //Keep the unit alive - emf = getEMF(TEST_UNIT); - - EntityManager em = emf.createEntityManager(); - tm.commit(); - assertFinished(contextCallback); - assertNoProxyEMFForTestUnit(); - assertEMFForTestUnit(); + getEMF(TEST_UNIT); em.close(); - - assertFinished(unitCallback); - assertNoEMFForTestUnit(); - } - - @Test - public void testComplexQuiesceInteraction2() throws Exception { - registerClient(TEST_UNIT); - - EntityManagerFactory emf = getProxyEMF(TEST_UNIT); - - tm.begin(); - - emf.createEntityManager().getProperties(); - - MultiQuiesceCallback callback = new MultiQuiesceCallback(); - - //Quiesce the Unit, nothing should happen - QuiesceParticipant participant = getParticipant(JPA_CONTAINER); - participant.quiesce(callback, Collections.singletonList(context().getBundleByName( - TEST_BUNDLE))); - - //Quiesce the context, still nothing - participant = getParticipant(JPA_CONTEXT); - participant.quiesce(callback, Collections.singletonList( - context().getBundleByName(TEST_BUNDLE))); - assertNotFinished(callback); - - emf = getProxyEMF(TEST_UNIT); - assertEMFForTestUnit(); - - tm.commit(); - assertFinished(callback); assertNoEMFForTestUnit(); } - private void assertFinished(TestQuiesceCallback callback) { - assertTrue("Quiesce not finished", callback.bundleClearedUp()); - } - - private void assertNotFinished(TestQuiesceCallback... callbacks) - throws InterruptedException { - Thread.sleep(WAIT_TIME); - for (TestQuiesceCallback callback : callbacks) { - assertFalse("Quiesce finished", callback.bundleClearedUp()); - } - } - - private void assertNoEMFForTestUnit() throws InvalidSyntaxException { - assertNull("No unit should exist", getEMFRefs(TEST_UNIT)); - } - - private void assertEMFForTestUnit() { - getEMF(TEST_UNIT); - } - - private void assertNoProxyEMFForTestUnit() throws InvalidSyntaxException { - assertNull("No context should exist", getProxyEMFRefs(TEST_UNIT)); - } - - private TestQuiesceCallback getQuiesceCallback(String participantName, String bundleName) throws InvalidSyntaxException { - QuiesceParticipant participant = getParticipant(participantName); - TestQuiesceCallback callback = new TestQuiesceCallback(); - participant.quiesce(callback, Collections.singletonList(context().getBundleByName(bundleName))); - return callback; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - private QuiesceParticipant getParticipant(String bundleName) throws InvalidSyntaxException { - ServiceReference[] refs = bundleContext.getServiceReferences(QuiesceParticipant.class.getName(), null); - - if(refs != null) { - for(ServiceReference ref : refs) { - if(ref.getBundle().getSymbolicName().equals(bundleName)) - return (QuiesceParticipant) bundleContext.getService(ref); - } - } - - - return null; - } - - private void restartTestBundle() throws BundleException { - restartBundle(TEST_BUNDLE_NAME); - } - - private void restartBundle(String bundleName) throws BundleException { - Bundle b = context().getBundleByName(bundleName); - b.stop(); - b.start(); - } - - @Configuration - public Option[] configuration() { - return options( - baseOptions(), - ariesJpa(), - openJpa(), - testDs(), - testBundle() - ); - } - } Modified: aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/pom.xml URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/pom.xml?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/pom.xml (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/pom.xml Wed Jan 7 19:37:42 2015 @@ -30,9 +30,9 @@ <groupId>org.apache.aries.jpa</groupId> <artifactId>org.apache.aries.jpa.container.itest.bundle.eclipselink</artifactId> - <version>0.3.1-SNAPSHOT</version> + <version>1.0.3-SNAPSHOT</version> <packaging>bundle</packaging> - <name>Test Bundle for Aries JPA Container iTests</name> + <name>Test Bundle for Aries JPA Container iTests Eclipselink</name> <scm> <connection>scm:svn:http://svn.apache.org/repos/asf/aries/trunk/jpa/jpa-container-testbundle-eclipselink</connection> @@ -46,11 +46,13 @@ org.apache.aries.jpa.container.itest* </aries.osgi.export.pkg> <aries.osgi.import> - javax.persistence;version="[1.0.0,3.0.0)", + javax.persistence*;version="[1.1,3.0)", * </aries.osgi.import> <aries.osgi.private.pkg/> <aries.osgi.symbolic.name>${project.artifactId}</aries.osgi.symbolic.name> + <!-- Only test bundle --> + <aries.skip.version.check>true</aries.skip.version.check> </properties> <dependencies> @@ -60,24 +62,8 @@ <scope>provided</scope> </dependency> <dependency> - <groupId>org.apache.geronimo.specs</groupId> - <artifactId>geronimo-jpa_2.0_spec</artifactId> - <version>1.1</version> - </dependency> - <dependency> - <groupId>org.eclipse.persistence</groupId> - <artifactId>org.eclipse.persistence.jpa</artifactId> - <version>2.1.0</version> - </dependency> - <dependency> - <groupId>org.eclipse.persistence</groupId> - <artifactId>org.eclipse.persistence.core</artifactId> - <version>2.1.0</version> - </dependency> - - <dependency> <groupId>org.eclipse.persistence</groupId> - <artifactId>org.eclipse.persistence.asm</artifactId> + <artifactId>javax.persistence</artifactId> <version>2.1.0</version> </dependency> </dependencies> Modified: aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/src/main/resources/META-INF/persistence.xml URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/src/main/resources/META-INF/persistence.xml?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/src/main/resources/META-INF/persistence.xml (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-testbundle-eclipselink/src/main/resources/META-INF/persistence.xml Wed Jan 7 19:37:42 2015 @@ -17,11 +17,12 @@ specific language governing permissions and limitations under the License. --> -<persistence xmlns="http://java.sun.com/xml/ns/persistence" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" - version="1.0"> - +<persistence version="2.1" + xmlns="http://xmlns.jcp.org/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence + http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> + <persistence-unit name="test-unit" transaction-type="RESOURCE_LOCAL"> <description>Test persistence unit for the JPA Container and Context iTests</description> <jta-data-source>osgi:service/javax.sql.DataSource</jta-data-source> @@ -32,34 +33,54 @@ </properties> </persistence-unit> - - <persistence-unit name="bp-test-unit" transaction-type="JTA"> - <description>Test persistence unit for the JPA Container and Context iTests</description> - <jta-data-source>blueprint:comp/jta</jta-data-source> - <non-jta-data-source>blueprint:comp/nonjta</non-jta-data-source> - <class>org.apache.aries.jpa.container.itest.entities.Car</class> - <exclude-unlisted-classes>true</exclude-unlisted-classes> - <properties> - <!-- These properties are creating the database on the fly. We are using them to avoid the tests having - to create a database --> - <property name="eclipselink.target-database" value="Derby"/> - <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> - <property name="eclipselink.ddl-generation.output-mode" value="database" /> - </properties> - </persistence-unit> - - <persistence-unit name="bp-xa-test-unit" transaction-type="JTA"> - <description>Test persistence unit for the JPA Container and Context iTests</description> - <jta-data-source>blueprint:comp/xa</jta-data-source> - <non-jta-data-source>blueprint:comp/nonjta</non-jta-data-source> - <class>org.apache.aries.jpa.container.itest.entities.Car</class> - <exclude-unlisted-classes>true</exclude-unlisted-classes> - <properties> - <!-- These properties are creating the database on the fly. We are using them to avoid the tests having - to create a database --> - <property name="eclipselink.target-database" value="Derby"/> - <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> - <property name="eclipselink.ddl-generation.output-mode" value="database" /> - </properties> - </persistence-unit> + + <persistence-unit name="bp-test-unit" transaction-type="JTA"> + <description>Test persistence unit for the JPA Container and Context iTests</description> + <jta-data-source>blueprint:comp/jta</jta-data-source> + <non-jta-data-source>blueprint:comp/nonjta</non-jta-data-source> + <class>org.apache.aries.jpa.container.itest.entities.Car</class> + <exclude-unlisted-classes>true</exclude-unlisted-classes> + <properties> +<!-- These properties are creating the database on the fly. We are using them to avoid the tests having + to create a database --> + <property name="eclipselink.target-database" value="Derby" /> + <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> + <property name="eclipselink.ddl-generation.output-mode" value="database" /> + </properties> + </persistence-unit> + + <persistence-unit name="bp-xa-test-unit" transaction-type="JTA"> + <description>Test persistence unit for the JPA Container and Context iTests</description> + <jta-data-source>blueprint:comp/xa</jta-data-source> + <non-jta-data-source>blueprint:comp/nonjta</non-jta-data-source> + <class>org.apache.aries.jpa.container.itest.entities.Car</class> + <exclude-unlisted-classes>true</exclude-unlisted-classes> + <properties> +<!-- These properties are creating the database on the fly. We are using them to avoid the tests having + to create a database --> + <property name="eclipselink.target-database" value="Derby" /> + <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> + <property name="eclipselink.ddl-generation.output-mode" value="database" /> + </properties> + </persistence-unit> + + <persistence-unit name="script-test-unit" transaction-type="RESOURCE_LOCAL"> + <properties> + <property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:TEST;create=true"/> + <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/> + <property name="eclipselink.target-database" value="Derby"/> + <property name="javax.persistence.schema-generation.database.action" + value="drop-and-create"/> + <property name="javax.persistence.schema-generation.create-source" + value="script"/> + <property name="javax.persistence.schema-generation.create-script-source" + value="META-INF/sql/create.sql" /> + <property name="javax.persistence.sql-load-script-source" + value="META-INF/sql/data.sql" /> + <property name="javax.persistence.schema-generation.drop-source" + value="script" /> + <property name="javax.persistence.schema-generation.drop-script-source" + value="META-INF/sql/drop.sql" /> + </properties> + </persistence-unit> </persistence> Modified: aries/branches/subsystemsR6/jpa/jpa-container-testbundle/pom.xml URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-testbundle/pom.xml?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-testbundle/pom.xml (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-testbundle/pom.xml Wed Jan 7 19:37:42 2015 @@ -41,12 +41,17 @@ </scm> <properties> + <!-- As this is only a test bundle we skip the check --> + <aries.skip.version.check>true</aries.skip.version.check> + <!-- Export package versions are maintained in packageinfo files --> <aries.osgi.export.pkg> org.apache.aries.jpa.container.itest.entities </aries.osgi.export.pkg> <aries.osgi.import> javax.persistence;version="[1.0.0,3.0.0)", + org.hibernate.proxy;resolution:=optional, + javassist.util.proxy;resolution:=optional, * </aries.osgi.import> <aries.osgi.private.pkg /> @@ -55,15 +60,9 @@ <dependencies> <dependency> - <groupId>org.hibernate.javax.persistence</groupId> - <artifactId>hibernate-jpa-2.1-api</artifactId> - <version>1.0.0.Final</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.openjpa</groupId> - <artifactId>openjpa</artifactId> - <version>2.2.2</version> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-jpa_2.0_spec</artifactId> + <version>1.1</version> <scope>provided</scope> </dependency> </dependencies> @@ -79,29 +78,6 @@ </instructions> </configuration> </plugin> - <plugin> - <artifactId>maven-antrun-plugin</artifactId> - <executions> - <execution> - <phase>process-classes</phase> - <configuration> - <tasks> - <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask" classpathref="maven.compile.classpath" /> - <openjpac> - <classpath refid="maven.compile.classpath" /> - <classpath> - <pathelement location="target/classes" /> - <pathelement location="src/main/resources" /> - </classpath> - </openjpac> - </tasks> - </configuration> - <goals> - <goal>run</goal> - </goals> - </execution> - </executions> - </plugin> </plugins> </build> Modified: aries/branches/subsystemsR6/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml (original) +++ aries/branches/subsystemsR6/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml Wed Jan 7 19:37:42 2015 @@ -24,12 +24,20 @@ <persistence-unit name="test-unit" transaction-type="RESOURCE_LOCAL"> <description>Test persistence unit for the JPA Container and Context iTests</description> + <jta-data-source>osgi:service/javax.sql.DataSource</jta-data-source> <non-jta-data-source>osgi:service/javax.sql.DataSource</non-jta-data-source> - <class>org.apache.aries.jpa.container.itest.entities.Car</class> - <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> - + <!-- This is to avoid compile time enhancement which would conflict with hibernate --> + <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/> + + <!-- These properties are creating the database on the fly. We are using them to avoid the tests having + to create a database --> + <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> + <property name="openjpa.jdbc.DBDictionary" value="derby"/> + + <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/> + <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> @@ -37,13 +45,14 @@ <description>Test persistence unit for the JPA Container and Context iTests</description> <jta-data-source>blueprint:comp/jta</jta-data-source> <non-jta-data-source>blueprint:comp/nonjta</non-jta-data-source> - <class>org.apache.aries.jpa.container.itest.entities.Car</class> - <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <!-- These properties are creating the database on the fly. We are using them to avoid the tests having to create a database --> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> <property name="openjpa.jdbc.DBDictionary" value="derby"/> + <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/> + <property name="hibernate.hbm2ddl.auto" value="create-drop"/> + <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/> </properties> </persistence-unit> @@ -51,20 +60,18 @@ <description>Test persistence unit for the JPA Container and Context iTests</description> <jta-data-source>blueprint:comp/xa</jta-data-source> <non-jta-data-source>blueprint:comp/nonjta</non-jta-data-source> - <class>org.apache.aries.jpa.container.itest.entities.Car</class> - <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <!-- These properties are creating the database on the fly. We are using them to avoid the tests having to create a database --> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> <property name="openjpa.jdbc.DBDictionary" value="derby"/> + <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/> + <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> <persistence-unit name="dsf-test-unit" transaction-type="RESOURCE_LOCAL"> <description>Test persistence unit for the JPA Container DataSourceFactory iTests</description> - <class>org.apache.aries.jpa.container.itest.entities.Car</class> - <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <!-- These properties are creating the database on the fly. We are using them to avoid the tests having to create a database --> @@ -72,13 +79,13 @@ <property name="javax.persistence.jdbc.databaseName" value="memory:TEST;create=true"/> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> <property name="openjpa.jdbc.DBDictionary" value="derby"/> + <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/> + <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> <persistence-unit name="dsf-xa-test-unit" transaction-type="JTA"> <description>Test persistence unit for the JPA Container DataSourceFactory iTests</description> - <class>org.apache.aries.jpa.container.itest.entities.Car</class> - <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <!-- These properties are creating the database on the fly. We are using them to avoid the tests having to create a database --> @@ -86,6 +93,8 @@ <property name="javax.persistence.jdbc.databaseName" value="memory:TEST;create=true"/> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> <property name="openjpa.jdbc.DBDictionary" value="derby"/> + <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/> + <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> </persistence> Modified: aries/branches/subsystemsR6/jpa/jpa-container/pom.xml URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/pom.xml?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/pom.xml (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/pom.xml Wed Jan 7 19:37:42 2015 @@ -31,7 +31,7 @@ <groupId>org.apache.aries.jpa</groupId> <artifactId>org.apache.aries.jpa.container</artifactId> <packaging>bundle</packaging> - <version>1.0.2-SNAPSHOT</version> + <version>1.0.3-SNAPSHOT</version> <name>Aries JPA Container</name> <scm> @@ -96,9 +96,9 @@ <scope>provided</scope> </dependency> <dependency> - <groupId>org.hibernate.javax.persistence</groupId> - <artifactId>hibernate-jpa-2.1-api</artifactId> - <version>1.0.0.Final</version> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-jpa_2.0_spec</artifactId> + <version>1.1</version> <scope>provided</scope> </dependency> <dependency> Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java Wed Jan 7 19:37:42 2015 @@ -22,10 +22,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.Hashtable; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -37,6 +35,10 @@ import javax.persistence.spi.Persistence import org.apache.aries.jpa.container.ManagedPersistenceUnitInfo; import org.apache.aries.jpa.container.PersistenceUnitConstants; import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit; +import org.apache.aries.jpa.container.quiesce.impl.DestroyCallback; +import org.apache.aries.jpa.container.quiesce.impl.EMFProxyFactory; +import org.apache.aries.jpa.container.quiesce.impl.NamedCallback; +import org.apache.aries.jpa.container.quiesce.impl.QuiesceEMF; import org.apache.aries.util.AriesFrameworkUtil; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -50,29 +52,11 @@ import org.slf4j.LoggerFactory; * This class manages the lifecycle of Persistence Units and their associated * {@link EntityManagerFactory} objects. */ +@SuppressWarnings({ + "unchecked", "rawtypes" +}) public class EntityManagerFactoryManager implements ServiceTrackerCustomizer { - /** - * A callback for a named persistence units - */ - class NamedCallback { - private final Set<String> names; - private final DestroyCallback callback; - public NamedCallback(Collection<String> names, DestroyCallback countdown) { - this.names = new HashSet<String>(names); - callback = countdown; - } - - public void callback(String name) { - boolean winner; - synchronized (this) { - winner = !!!names.isEmpty() && names.remove(name) && names.isEmpty(); - } - if(winner) - callback.callback(); - } - } - /** The container's {@link BundleContext} */ private final BundleContext containerContext; /** The persistence bundle */ @@ -84,7 +68,7 @@ public class EntityManagerFactoryManager /** The original parsed data */ private Collection<ParsedPersistenceUnit> parsedData; /** A Map of created {@link EntityManagerFactory}s */ - private Map<String, CountingEntityManagerFactory> emfs = null; + private Map<String, EntityManagerFactory> emfs = null; /** The {@link ServiceRegistration} objects for the {@link EntityManagerFactory}s */ private ConcurrentMap<String, ServiceRegistration> registrations = null; /** Quiesce this Manager */ @@ -107,18 +91,13 @@ public class EntityManagerFactoryManager * {@link PersistenceBundleManager} that is synchronized * on itself, and the resulting manager should be immediately * stored in the bundleToManager Map - * + * + * @param containerCtx * @param b - * @param infos - * @param ref - * @param parsedUnits */ - public EntityManagerFactoryManager(BundleContext containerCtx, Bundle b, Collection<ParsedPersistenceUnit> parsedUnits, ServiceReference ref, Collection<? extends ManagedPersistenceUnitInfo> infos) { + public EntityManagerFactoryManager(BundleContext containerCtx, Bundle b) { containerContext = containerCtx; bundle = b; - provider = ref; - persistenceUnits = getInfoMap(infos); - parsedData = parsedUnits; } private Map<String, ? extends ManagedPersistenceUnitInfo> getInfoMap( @@ -145,9 +124,12 @@ public class EntityManagerFactoryManager * @param ref The provider service reference * @return true if the the provider is being used by this manager */ - public synchronized boolean providerRemoved(ServiceReference ref) { - - boolean toReturn = provider.equals(ref); + public synchronized boolean providerRemoved(ServiceReference ref) + { + boolean toReturn = false; + if (provider != null) { + toReturn = provider.equals(ref); + } if(toReturn) destroy(); @@ -171,8 +153,6 @@ public class EntityManagerFactoryManager //If we are Resolved as a result of having stopped //and missed the STOPPING event we need to unregister unregisterEntityManagerFactories(); - //Create the EMF objects if necessary - createEntityManagerFactories(); break; //Starting and active both require EMFs to be registered case Bundle.STARTING : @@ -208,7 +188,7 @@ public class EntityManagerFactoryManager if(registrations != null) { for(Entry<String, ServiceRegistration> entry : registrations.entrySet()) { AriesFrameworkUtil.safeUnregisterService(entry.getValue()); - emfs.get(entry.getKey()).clearQuiesce(); + clearQuiesce(emfs.get(entry.getKey())); persistenceUnits.get(entry.getKey()).unregistered(); } // remember to set registrations to be null @@ -216,14 +196,21 @@ public class EntityManagerFactoryManager } } + private void unregisterEntityManagerFactory(String unit) { if(registrations != null) { AriesFrameworkUtil.safeUnregisterService(registrations.remove(unit)); - emfs.get(unit).clearQuiesce(); + clearQuiesce(emfs.get(unit)); persistenceUnits.get(unit).unregistered(); } } - + + private void clearQuiesce(EntityManagerFactory emf) { + if (emf instanceof QuiesceEMF) { + ((QuiesceEMF) emf).clearQuiesce(); + } + } + /** * Register {@link EntityManagerFactory} services * @@ -248,7 +235,7 @@ public class EntityManagerFactoryManager PersistenceUnitConstants.OSGI_UNIT_PROVIDER, provider)); } //Register each EMF - for(Entry<String, ? extends EntityManagerFactory> entry : emfs.entrySet()) + for(Entry<String, EntityManagerFactory> entry : emfs.entrySet()) { Hashtable<String,Object> props = new Hashtable<String, Object>(); @@ -302,7 +289,7 @@ public class EntityManagerFactoryManager return true; } } - + /** * Create {@link EntityManagerFactory} services for this peristence unit * throws InvalidPersistenceUnitException if this {@link EntityManagerFactory} is no longer @@ -310,7 +297,7 @@ public class EntityManagerFactoryManager */ private void createEntityManagerFactories() throws InvalidPersistenceUnitException { if (emfs == null) { - emfs = new HashMap<String, CountingEntityManagerFactory>(); + emfs = new HashMap<String, EntityManagerFactory>(); } //Only try if we have a provider and EMFs if(provider == null || !emfs.isEmpty() || quiesce) { @@ -329,7 +316,8 @@ public class EntityManagerFactoryManager ManagedPersistenceUnitInfo mpui = persistenceUnits.get(unitName); try { EntityManagerFactory emf = providerService.createContainerEntityManagerFactory(mpui.getPersistenceUnitInfo(), mpui.getContainerProperties()); - emfs.put(unitName, new CountingEntityManagerFactory(emf, unitName)); + EntityManagerFactory emfProxy = EMFProxyFactory.createProxy(emf, unitName); + emfs.put(unitName, emfProxy); } catch (Exception e) { _logger.warn("Error creating EntityManagerFactory", e); } @@ -339,6 +327,8 @@ public class EntityManagerFactoryManager containerContext.ungetService(provider); } } + + /** * Manage the EntityManagerFactories for the following @@ -395,7 +385,7 @@ public class EntityManagerFactoryManager if(registrations != null) unregisterEntityManagerFactories(); if(emfs != null) { - for(Entry<String, ? extends EntityManagerFactory> entry : emfs.entrySet()) { + for(Entry<String, EntityManagerFactory> entry : emfs.entrySet()) { try { entry.getValue().close(); } catch (Exception e) { @@ -414,11 +404,12 @@ public class EntityManagerFactoryManager { return parsedData; } + /** Quiesce this Manager */ public void quiesce(DestroyCallback countdown) { //Find the EMFs to quiesce, and their Service registrations - Map<CountingEntityManagerFactory, ServiceRegistration> entries = new HashMap<CountingEntityManagerFactory, ServiceRegistration>(); + Map<EntityManagerFactory, ServiceRegistration> entries = new HashMap<EntityManagerFactory, ServiceRegistration>(); Collection<String> names = new ArrayList<String>(); synchronized(this) { if((bundle.getState() & (Bundle.ACTIVE | Bundle.STARTING)) != 0) @@ -434,14 +425,19 @@ public class EntityManagerFactoryManager if(entries.isEmpty()) countdown.callback(); else { - NamedCallback callback = new NamedCallback(names, countdown); - for(Entry<CountingEntityManagerFactory, ServiceRegistration> entry : entries.entrySet()) { - CountingEntityManagerFactory emf = entry.getKey(); - emf.quiesce(callback, entry.getValue()); + NamedCallback callback = new NamedCallback(names, countdown); + for(Entry<EntityManagerFactory, ServiceRegistration> entry : entries.entrySet()) { + quiesce(entry.getKey(), callback, entry.getValue()); } } } - + + private void quiesce(EntityManagerFactory emf, NamedCallback callback, ServiceRegistration reg) { + if (emf instanceof QuiesceEMF) { + ((QuiesceEMF) emf).quiesce(callback, reg); + } + } + @Override public StringBuffer addingService(ServiceReference reference) { //Use String.valueOf to save us from nulls @@ -514,4 +510,5 @@ public class EntityManagerFactoryManager } } } + } Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java Wed Jan 7 19:37:42 2015 @@ -219,6 +219,7 @@ public class PersistenceBundleHelper //Remember to trim off the "!/" String toLocate = location.substring(bangIndex + 2); + @SuppressWarnings("resource") JarInputStream jis = new JarInputStream(url.openStream()); JarEntry entry = jis.getNextJarEntry(); Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java Wed Jan 7 19:37:42 2015 @@ -19,6 +19,7 @@ package org.apache.aries.jpa.container.impl; +import java.io.Closeable; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -46,10 +47,15 @@ import org.apache.aries.jpa.container.pa import org.apache.aries.jpa.container.parsing.PersistenceDescriptorParser; import org.apache.aries.jpa.container.parsing.PersistenceDescriptorParserException; import org.apache.aries.jpa.container.parsing.impl.PersistenceDescriptorParserImpl; +import org.apache.aries.jpa.container.quiesce.impl.CountdownCallback; +import org.apache.aries.jpa.container.quiesce.impl.DestroyCallback; +import org.apache.aries.jpa.container.quiesce.impl.QuiesceHandler; +import org.apache.aries.jpa.container.quiesce.impl.QuiesceParticipantFactory; import org.apache.aries.jpa.container.tx.impl.OSGiTransactionManager; import org.apache.aries.jpa.container.unit.impl.ManagedPersistenceUnitInfoFactoryImpl; import org.apache.aries.util.AriesFrameworkUtil; import org.apache.aries.util.VersionRange; +import org.apache.aries.util.io.IOUtils; import org.apache.aries.util.tracker.RecursiveBundleTracker; import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; @@ -70,11 +76,9 @@ import org.slf4j.LoggerFactory; * It also keeps track of PersistenceProvider services and delegates the EMF creation to the * matching PersistenceProvider */ -public class PersistenceBundleManager implements BundleTrackerCustomizer, ServiceTrackerCustomizer, BundleActivator +@SuppressWarnings("rawtypes") +public class PersistenceBundleManager implements BundleTrackerCustomizer, ServiceTrackerCustomizer, BundleActivator, QuiesceHandler { - /** The QuiesceParticipant implementation class name */ - private static final String QUIESCE_PARTICIPANT_CLASS = "org.apache.aries.quiesce.participant.QuiesceParticipant"; - /** Logger */ private static final Logger _logger = LoggerFactory.getLogger("org.apache.aries.jpa.container"); @@ -110,10 +114,8 @@ public class PersistenceBundleManager im private RecursiveBundleTracker tracker; private ServiceTracker serviceTracker; - /** The quiesce participant service */ - private ServiceRegistration quiesceReg; /** A callback to shutdown the quiesce participant when it is done */ - private DestroyCallback quiesceParticipant; + private Closeable quiesceParticipant; /** Are we quiescing */ private AtomicBoolean quiesce = new AtomicBoolean(false); @@ -283,11 +285,16 @@ public class PersistenceBundleManager im EntityManagerFactoryManager mgr = (EntityManagerFactoryManager) object; //If the bundle was updated we need to destroy it and re-initialize //the EntityManagerFactoryManager - if(event != null && event.getType() == BundleEvent.UPDATED) { + //If the bundle becomes unresolved we need to destroy persistenceUnits, since they + //keep a reference to bundle classloader which has wiring m_isDisposed set to true + //this occurs when Karaf BundleWatcher is used. + if(event != null && (event.getType() == BundleEvent.UPDATED || event.getType() == BundleEvent.UNRESOLVED)) { mgr.destroy(); persistenceUnitFactory.destroyPersistenceBundle(ctx, bundle); - //Don't add to the managersAwaitingProviders, the setupManager will do it - setupManager(bundle, mgr, true); + if (event.getType() == BundleEvent.UPDATED) { + //Don't add to the managersAwaitingProviders, the setupManager will do it + setupManager(bundle, mgr, true); + } } else { try { boolean reassign; @@ -380,11 +387,11 @@ public class PersistenceBundleManager im infos = persistenceUnitFactory. createManagedPersistenceUnitMetadata(ctx, bundle, ref, pUnits); } - //Either update the existing manager or create a new one - if(mgr != null) - mgr.manage(pUnits, ref, infos); - else - mgr = new EntityManagerFactoryManager(ctx, bundle, pUnits, ref, infos); + + if(mgr == null) { + mgr = new EntityManagerFactoryManager(ctx, bundle); + } + mgr.manage(pUnits, ref, infos); //Register the manager (this may re-add, but who cares) synchronized (this) { @@ -634,6 +641,7 @@ public class PersistenceBundleManager im } + @SuppressWarnings("unchecked") public void start(BundleContext context) throws Exception { ctx = context; @@ -648,15 +656,7 @@ public class PersistenceBundleManager im open(); - try{ - context.getBundle().loadClass(QUIESCE_PARTICIPANT_CLASS); - //Class was loaded, register - quiesceParticipant = new QuiesceParticipantImpl(this); - quiesceReg = context.registerService(QUIESCE_PARTICIPANT_CLASS, - quiesceParticipant, null); - } catch (ClassNotFoundException e) { - _logger.info(NLS.MESSAGES.getMessage("quiesce.manager.not.there")); - } + QuiesceParticipantFactory.create(context, this); } private void initParser() { @@ -667,22 +667,21 @@ public class PersistenceBundleManager im public void stop(BundleContext context) throws Exception { close(); AriesFrameworkUtil.safeUnregisterService(parserReg); - AriesFrameworkUtil.safeUnregisterService(quiesceReg); - if(quiesceParticipant != null) - quiesceParticipant.callback(); + IOUtils.close(quiesceParticipant); } public BundleContext getCtx() { return ctx; } + @Override public void quiesceBundle(Bundle bundleToQuiesce, final DestroyCallback callback) { boolean thisBundle = bundleToQuiesce.equals(ctx.getBundle()); if(thisBundle) { quiesce.compareAndSet(false, true); - AriesFrameworkUtil.safeUnregisterService(quiesceReg); + } Collection<EntityManagerFactoryManager> toDestroyNow = new ArrayList<EntityManagerFactoryManager>(); @@ -712,7 +711,7 @@ public class PersistenceBundleManager im if(quiesceNow.isEmpty()) { callback.callback(); } else { - DestroyCallback countdown = new CoundownCallback(quiesceNow.size(), callback); + DestroyCallback countdown = new CountdownCallback(quiesceNow.size(), callback); for(EntityManagerFactoryManager emfm : quiesceNow) emfm.quiesce(countdown); Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/JPAHandler.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/JPAHandler.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/JPAHandler.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/JPAHandler.java Wed Jan 7 19:37:42 2015 @@ -106,9 +106,9 @@ public class JPAHandler extends DefaultH pu.addClassName(s); else if("exclude-unlisted-classes".equals(elementName)) pu.setExcludeUnlisted(Boolean.parseBoolean(s)); - else if ("2.0".equals(jpaVersion) && "shared-cache-mode".equals(elementName)) + else if (checkJpa2Version() && "shared-cache-mode".equals(elementName)) pu.setSharedCacheMode(s); - else if ("2.0".equals(jpaVersion) && "validation-mode".equals(elementName)) + else if (checkJpa2Version() && "validation-mode".equals(elementName)) pu.setValidationMode(s); } @@ -128,4 +128,7 @@ public class JPAHandler extends DefaultH return persistenceUnits; } + private boolean checkJpa2Version() { + return ("2.0".equals(jpaVersion) || "2.1".equals(jpaVersion)); + } } Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java Wed Jan 7 19:37:42 2015 @@ -26,13 +26,12 @@ import java.util.Properties; import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit; import org.osgi.framework.Bundle; -import org.osgi.framework.ServiceReference; /** * An implementation of PersistenceUnit for parsed persistence unit metadata * */ -@SuppressWarnings("unchecked") +@SuppressWarnings({"unchecked", "rawtypes"}) public class PersistenceUnitImpl implements ParsedPersistenceUnit { /** A map to hold the metadata from the xml */ @@ -41,13 +40,6 @@ public class PersistenceUnitImpl impleme private final Bundle bundle; /** - * The Service Reference for the provider to which this persistence - * unit is tied - */ - private ServiceReference provider; - - - /** * Create a new persistence unit with the given name, transaction type, location and * defining bundle * @@ -174,14 +166,6 @@ public class PersistenceUnitImpl impleme } /** - * @param providerRef - */ - public void setProviderReference(ServiceReference providerRef) - { - provider = providerRef; - } - - /** * @param sharedCacheMode */ public void setSharedCacheMode(String sharedCacheMode) Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/SchemaLocatingHandler.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/SchemaLocatingHandler.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/SchemaLocatingHandler.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/SchemaLocatingHandler.java Wed Jan 7 19:37:42 2015 @@ -40,6 +40,7 @@ public class SchemaLocatingHandler exten * URI for the JPA persistence namespace */ private static final String PERSISTENCE_NS_URI = "http://java.sun.com/xml/ns/persistence"; + private static final String PERSISTENCE_21_NS_URI = "http://xmlns.jcp.org/xml/ns/persistence"; /** * A static cache of schemas in use in the runtime @@ -53,7 +54,7 @@ public class SchemaLocatingHandler exten Schema s = null; String version = null; - if(PERSISTENCE_NS_URI.equals(uri) && "persistence".equals(localName) ) { + if((PERSISTENCE_NS_URI.equals(uri) || PERSISTENCE_21_NS_URI.equals(uri)) && "persistence".equals(localName) ) { version = attributes.getValue("version"); s = validate(version); } @@ -93,6 +94,8 @@ public class SchemaLocatingHandler exten schemaURL = this.getClass().getResource("persistence.xsd.rsrc"); } else if ("2.0".equals(type)) { schemaURL = this.getClass().getResource("persistence_2_0.xsd.rsrc"); + } else if ("2.1".equals(type)) { + schemaURL = this.getClass().getResource("persistence_2_1.xsd.rsrc"); } Schema schema = null; Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/OSGiTransactionManager.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/OSGiTransactionManager.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/OSGiTransactionManager.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/OSGiTransactionManager.java Wed Jan 7 19:37:42 2015 @@ -20,11 +20,7 @@ package org.apache.aries.jpa.container.t import java.util.concurrent.atomic.AtomicReference; -import javax.transaction.HeuristicMixedException; -import javax.transaction.HeuristicRollbackException; import javax.transaction.InvalidTransactionException; -import javax.transaction.NotSupportedException; -import javax.transaction.RollbackException; import javax.transaction.SystemException; import javax.transaction.Transaction; import javax.transaction.TransactionManager; @@ -44,6 +40,7 @@ public class OSGiTransactionManager impl private final SingleServiceTracker<TransactionManager> tracker; + @SuppressWarnings("unchecked") public static void init(BundleContext ctx) { try { Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/XADatasourceEnlistingWrapper.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/XADatasourceEnlistingWrapper.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/XADatasourceEnlistingWrapper.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/tx/impl/XADatasourceEnlistingWrapper.java Wed Jan 7 19:37:42 2015 @@ -34,7 +34,6 @@ import javax.transaction.Status; import javax.transaction.Synchronization; import javax.transaction.SystemException; import javax.transaction.Transaction; -import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; import org.apache.aries.jpa.container.impl.NLS; Modified: aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java URL: http://svn.apache.org/viewvc/aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java?rev=1650143&r1=1650142&r2=1650143&view=diff ============================================================================== --- aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java (original) +++ aries/branches/subsystemsR6/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java Wed Jan 7 19:37:42 2015 @@ -32,12 +32,14 @@ import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; +@SuppressWarnings("rawtypes") public class ManagedPersistenceUnitInfoFactoryImpl implements ManagedPersistenceUnitInfoFactory { private ConcurrentMap<Bundle, Collection<ManagedPersistenceUnitInfoImpl>> persistenceUnits = new ConcurrentHashMap<Bundle, Collection<ManagedPersistenceUnitInfoImpl>>(); + public Collection<? extends ManagedPersistenceUnitInfo> createManagedPersistenceUnitMetadata( BundleContext containerContext, Bundle persistenceBundle, ServiceReference providerReference,
