[ARIES-1530] Support plugins when using the EclipseLink adapter
git-svn-id: https://svn.apache.org/repos/asf/aries/trunk/jpa@1738840 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/EclipseAdditionalTest.java b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/EclipseAdditionalTest.java
index cd20dff..6c1dcf6 100644
--- a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/EclipseAdditionalTest.java
+++ b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/EclipseAdditionalTest.java
@@ -15,24 +15,35 @@
*/
package org.apache.aries.jpa.container.itest;
+import static javax.persistence.spi.PersistenceUnitTransactionType.RESOURCE_LOCAL;
+import static org.junit.Assert.assertEquals;
import static org.ops4j.pax.exam.CoreOptions.streamBundle;
+import static org.osgi.service.jdbc.DataSourceFactory.OSGI_JDBC_DRIVER_CLASS;
import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import org.apache.aries.jpa.itest.AbstractJPAItest;
+import org.eclipse.persistence.config.SessionCustomizer;
+import org.eclipse.persistence.sessions.Session;
import org.junit.Assert;
import org.junit.Test;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.osgi.framework.Constants;
+import org.osgi.service.jdbc.DataSourceFactory;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
public class EclipseAdditionalTest extends AbstractJPAItest {
- @Test
+ private static final String CUSTOMIZER_CALLED = "org.apache.aries.jpa.itest.eclipse.customizer";
+
+ @Test
public void testContextCreationWithStartingBundle() throws Exception {
getBundleByName("org.apache.aries.jpa.container.itest.bundle.eclipselink").start();
getEMF("script-test-unit");
@@ -42,6 +53,30 @@
public void testEntityManagerFactoryBuilderWithIncompletePersistenceUnit() throws Exception {
getService(EntityManagerFactoryBuilder.class, "(osgi.unit.name=incompleteTestUnit)", 1000);
}
+
+ @Test
+ public void testEntityManagerFactoryBuilderWithIncompletePersistenceUnitAddPlugin() throws Exception {
+ EntityManagerFactoryBuilder builder = getService(EntityManagerFactoryBuilder.class, "(osgi.unit.name=incompleteTestUnit)", 1000);
+
+ DataSourceFactory dsf = getService(DataSourceFactory.class,
+ "(" + OSGI_JDBC_DRIVER_CLASS + "=org.apache.derby.jdbc.EmbeddedDriver)");
+
+ Properties jdbcProps = new Properties();
+ jdbcProps.setProperty("url", "jdbc:derby:memory:DSFTEST;create=true");
+
+ Map<String, Object> props = new HashMap<String, Object>();
+ props.put("javax.persistence.nonJtaDataSource", dsf.createDataSource(jdbcProps));
+ props.put("javax.persistence.transactionType", RESOURCE_LOCAL.name());
+
+ props.put("org.apache.aries.jpa.eclipselink.plugin.types", SessionCustomizerImpl.class);
+ props.put("eclipselink.session.customizer", SessionCustomizerImpl.class.getName());
+
+ EntityManagerFactory emf = builder.createEntityManagerFactory(props);
+ emf.createEntityManager();
+ assertEquals("invoked", emf
+ .getProperties().get(CUSTOMIZER_CALLED));
+
+ }
@Test(expected = IllegalStateException.class)
public void testEntityManagerFactoryWithIncompletePersistenceUnit() throws Exception {
@@ -64,7 +99,15 @@
derbyDSF(), //
testBundleEclipseLink().noStart(),//
streamBundle(testBundle)
- // debug()
+// ,debug()
};
}
+
+ public static class SessionCustomizerImpl implements SessionCustomizer {
+
+ @Override
+ public void customize(Session arg0) throws Exception {
+ arg0.setProperty(CUSTOMIZER_CALLED, "invoked");
+ }
+ }
}
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkPersistenceProvider.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkPersistenceProvider.java
index 7d0adb1..00b8e69 100644
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkPersistenceProvider.java
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkPersistenceProvider.java
@@ -27,7 +27,7 @@
import org.osgi.framework.Bundle;
-@SuppressWarnings("rawtypes")
+@SuppressWarnings({"rawtypes", "unchecked"})
final class EclipseLinkPersistenceProvider implements PersistenceProvider {
private final PersistenceProvider delegate;
private final Bundle eclipeLinkBundle;
@@ -47,14 +47,14 @@
return delegate.createEntityManagerFactory(arg0, arg1);
}
- @Override
+ @Override
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo punit, Map props) {
- return delegate.createContainerEntityManagerFactory(new PersistenceUnitProxyWithTargetServer(punit, eclipeLinkBundle), props);
+ return delegate.createContainerEntityManagerFactory(new PersistenceUnitProxyWithTargetServer(punit, eclipeLinkBundle, props), props);
}
@Override
public void generateSchema(PersistenceUnitInfo punit, Map arg1) {
- delegate.generateSchema(new PersistenceUnitProxyWithTargetServer(punit, eclipeLinkBundle), arg1);
+ delegate.generateSchema(new PersistenceUnitProxyWithTargetServer(punit, eclipeLinkBundle, arg1), arg1);
}
@Override
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java
index 06d5e06..f062b92 100644
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java
@@ -20,6 +20,7 @@
import java.net.URL;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import javax.persistence.SharedCacheMode;
@@ -41,10 +42,10 @@
private final PersistenceUnitInfo delegate;
private final ClassLoader unionClassLoader;
- public PersistenceUnitProxyWithTargetServer(PersistenceUnitInfo info, Bundle b) {
+ public PersistenceUnitProxyWithTargetServer(PersistenceUnitInfo info, Bundle b, Map<String, Object> arg1) {
delegate = info;
unionClassLoader = new UnionClassLoader(delegate.getClassLoader(), b,
- FrameworkUtil.getBundle(getClass()));
+ FrameworkUtil.getBundle(getClass()), arg1);
}
@Override
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java
index 9cdcfb9..3a5242b 100644
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java
@@ -23,6 +23,9 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleReference;
@@ -35,15 +38,33 @@
private static final Logger LOG = LoggerFactory.getLogger(UnionClassLoader.class);
private final Bundle eclipseLinkBundle;
private final Bundle adaptorBundle;
+ private final Map<String, Class<?>> registeredPlugins = new HashMap<String, Class<?>>();
- public UnionClassLoader(ClassLoader parentLoader, Bundle b, Bundle adaptor) {
+ public UnionClassLoader(ClassLoader parentLoader, Bundle b, Bundle adaptor, Map<String, Object> arg1) {
super(parentLoader);
this.eclipseLinkBundle = b;
this.adaptorBundle = adaptor;
+
+ //Populate the plugins
+
+ Object o = arg1 == null ? null : arg1.get("org.apache.aries.jpa.eclipselink.plugin.types");
+
+ if(o instanceof Class) {
+ Class<?> c = (Class<?>) o;
+ registeredPlugins.put(c.getName(), c);
+ } else if (o instanceof Collection) {
+ for(Object o2 : (Collection<?>) o) {
+ Class<?> c = (Class<?>) o2;
+ registeredPlugins.put(c.getName(), c);
+ }
+ }
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
+ if(registeredPlugins.containsKey(name)) {
+ return registeredPlugins.get(name);
+ }
if ("org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSServer".equals(name)
|| "org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSWrapper".equals(name)) {
return loadTempClass(name);