[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);