You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by mn...@apache.org on 2010/12/10 14:09:44 UTC

svn commit: r1044342 - in /incubator/aries/trunk: jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/impl/ jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/con...

Author: mnuttall
Date: Fri Dec 10 13:09:43 2010
New Revision: 1044342

URL: http://svn.apache.org/viewvc?rev=1044342&view=rev
Log:
ARIES-512: JPA itests: use blueprint:comp/ to reference a datasource declared in blueprint from persistence.xml. Includes a fix to PersistenceContextManager by Tim Ward. 

Added:
    incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/OSGI-INF/
    incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/OSGI-INF/blueprint/
    incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml
Modified:
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContext.java
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContextFactory.java
    incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/impl/PersistenceContextManager.java
    incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
    incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java
    incubator/aries/trunk/jpa/jpa-container-testbundle/pom.xml
    incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/DelayedLookupDataSource.java
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContext.java?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContext.java Fri Dec 10 13:09:43 2010
@@ -131,7 +131,7 @@ public class BlueprintURLContext impleme
     }
   }
   
-  public BlueprintURLContext (Bundle callersBundle, BlueprintName parentName, Map<String, Object> env, 
+  private BlueprintURLContext (Bundle callersBundle, BlueprintName parentName, Map<String, Object> env, 
       BlueprintContainer bpc) { 
     _callersBundle = callersBundle;
     _parentName = parentName;

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContextFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContextFactory.java?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContextFactory.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/BlueprintURLContextFactory.java Fri Dec 10 13:09:43 2010
@@ -26,6 +26,8 @@ import javax.naming.Name;
 import javax.naming.spi.ObjectFactory;
 
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.jndi.JNDIConstants;
 
 public class BlueprintURLContextFactory implements ObjectFactory {
 
@@ -37,13 +39,17 @@ public class BlueprintURLContextFactory 
 
   @Override
   public Object getObjectInstance(Object obj, Name name, Context callersCtx, Hashtable<?, ?> envmt) throws Exception {
+    BundleContext bc = (BundleContext) envmt.get(JNDIConstants.BUNDLE_CONTEXT);
+    Bundle b = (bc != null)? bc.getBundle() : null;
     Object result = null;
     if (obj == null) {
-      result = new BlueprintURLContext(_callersBundle, envmt);
+      result = new BlueprintURLContext((b == null) ? _callersBundle : b,
+          envmt);
     } else if (obj instanceof String) {
       Context ctx = null;
       try {
-        ctx = new BlueprintURLContext(_callersBundle, envmt);
+        ctx = new BlueprintURLContext((b == null) ? _callersBundle : b,
+            envmt);
         result = ctx.lookup((String) obj);
       } finally {
         if (ctx != null) {

Modified: incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/impl/PersistenceContextManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/impl/PersistenceContextManager.java?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/impl/PersistenceContextManager.java (original)
+++ incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/impl/PersistenceContextManager.java Fri Dec 10 13:09:43 2010
@@ -26,8 +26,8 @@ import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceContextType;
@@ -434,12 +434,21 @@ public class PersistenceContextManager e
       //Find the ManagedFactories for the persistence unit
       List<ManagedPersistenceContextFactory> factoriesToQuiesce = new ArrayList<ManagedPersistenceContextFactory>();
       synchronized (this) {
-        for(String name : units) {
-          ServiceRegistration reg = entityManagerRegistrations.get(name);
+        Iterator<String> it = units.iterator();
+        while(it.hasNext()) {
+          ServiceRegistration reg = entityManagerRegistrations.get(it.next());
+          //If there's no managed factory then we don't need to quiesce this unit
+          boolean needsQuiesce = false;
           if(reg != null) {
             ManagedPersistenceContextFactory fact = (ManagedPersistenceContextFactory) bundleToQuiesce.getBundleContext().getService(reg.getReference());
-            if(fact != null)
+            if(fact != null) {
               factoriesToQuiesce.add(fact);
+              needsQuiesce = true;
+            }
+          }
+          //If the unit doesn't need quiescing then remove it from our check
+          if(!!!needsQuiesce) {
+            it.remove();
           }
         }
       }

Modified: incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java (original)
+++ incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java Fri Dec 10 13:09:43 2010
@@ -21,14 +21,9 @@ import static org.ops4j.pax.exam.CoreOpt
 import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
 import static org.ops4j.pax.exam.OptionUtils.combine;
 
-import java.util.Hashtable;
-
 import javax.persistence.EntityManagerFactory;
-import javax.persistence.spi.PersistenceProvider;
 
 import org.apache.aries.jpa.container.PersistenceUnitConstants;
-import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.CoreOptions;
@@ -44,7 +39,6 @@ import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.Version;
-import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 
 @RunWith(JUnit4TestRunner.class)
@@ -58,6 +52,23 @@ public class JPAContainerTest {
   public void findEntityManagerFactory() throws Exception {
     EntityManagerFactory emf = getOsgiService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)(" + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))", DEFAULT_TIMEOUT);
   }
+  
+  @Test
+  public void findEntityManagerFactory2() throws Exception {
+    EntityManagerFactory emf = getOsgiService(EntityManagerFactory.class, "(&(osgi.unit.name=bp-test-unit)(" + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))", DEFAULT_TIMEOUT);
+  }
+  
+  @Test
+  public void findEntityManager() throws Exception {
+    EntityManagerFactory emf = getOsgiService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)(" + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))", DEFAULT_TIMEOUT);
+    emf.createEntityManager();
+  }
+  
+  @Test
+  public void findEntityManager2() throws Exception {
+    EntityManagerFactory emf = getOsgiService(EntityManagerFactory.class, "(&(osgi.unit.name=bp-test-unit)(" + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))", DEFAULT_TIMEOUT);
+    emf.createEntityManager();
+  }
 
   @org.ops4j.pax.exam.junit.Configuration
   public static Option[] configuration() {
@@ -77,18 +88,27 @@ public class JPAContainerTest {
         systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG"),
 
         // Bundles
-        mavenBundle("org.osgi", "org.osgi.compendium"),
+        mavenBundle("commons-lang", "commons-lang"),
+        mavenBundle("commons-collections", "commons-collections"),
+        mavenBundle("commons-pool", "commons-pool"),
         mavenBundle("org.apache.aries", "org.apache.aries.util"),
-        mavenBundle("org.apache.geronimo.specs", "geronimo-jpa_2.0_spec"),
+        mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint"),
+        mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.api"),
+        mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.core"),
+        mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.url"),
         mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.api"),
         mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container"),
+        mavenBundle("org.apache.derby", "derby"),
         mavenBundle("org.apache.geronimo.specs", "geronimo-jta_1.1_spec"),
-        mavenBundle("commons-lang", "commons-lang"),
-        mavenBundle("commons-collections", "commons-collections"),
-        mavenBundle("commons-pool", "commons-pool"),
-        mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.serp"),
+        mavenBundle("org.apache.geronimo.specs", "geronimo-jpa_2.0_spec"),
         mavenBundle("org.apache.openjpa", "openjpa"),
+        mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.serp"),
+        mavenBundle("org.osgi", "org.osgi.compendium"),
 
+        //vmOption ("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5006"),
+        //waitForFrameworkStartup(),
+        
+       
 //        mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.jpa"),
 //        mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.core"),
 //        mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.asm"),

Modified: incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java (original)
+++ incubator/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java Fri Dec 10 13:09:43 2010
@@ -25,7 +25,6 @@ import static org.ops4j.pax.exam.CoreOpt
 import static org.ops4j.pax.exam.OptionUtils.combine;
 
 import java.util.HashMap;
-import java.util.Map;
 
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceContextType;
@@ -105,10 +104,13 @@ public class JPAContextTest {
         // Bundles
         mavenBundle("org.osgi", "org.osgi.compendium"),
         mavenBundle("org.apache.aries", "org.apache.aries.util"),
+        // Adding blueprint to the runtime is a hack to placate the maven bundle plugin. 
+        mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint"),
         mavenBundle("org.apache.geronimo.specs", "geronimo-jpa_2.0_spec"),
         mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.api"),
         mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container"),
         mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.context"),
+        mavenBundle("org.apache.derby", "derby"),
         mavenBundle("org.apache.geronimo.specs", "geronimo-jta_1.1_spec"),
         mavenBundle("commons-lang", "commons-lang"),
         mavenBundle("commons-collections", "commons-collections"),

Modified: incubator/aries/trunk/jpa/jpa-container-testbundle/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-testbundle/pom.xml?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-testbundle/pom.xml (original)
+++ incubator/aries/trunk/jpa/jpa-container-testbundle/pom.xml Fri Dec 10 13:09:43 2010
@@ -55,6 +55,7 @@
                         <Export-Package>
                             org.apache.aries.jpa.container.itest.entities;version="${pom.version}",
                         </Export-Package>
+                        <Private-Package>org.apache.aries.jpa.container.itest</Private-Package>
                         <_versionpolicy>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy>
                         <_removeheaders>Ignore-Package,Include-Resource,Private-Package,Bundle-DocURL</_removeheaders>
                         <Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>

Modified: incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml (original)
+++ incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml Fri Dec 10 13:09:43 2010
@@ -32,4 +32,12 @@
       
     </properties>
   </persistence-unit>
+  
+  <persistence-unit name="bp-test-unit" transaction-type="RESOURCE_LOCAL">
+    <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>
+  </persistence-unit>
 </persistence>

Added: incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml?rev=1044342&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml (added)
+++ incubator/aries/trunk/jpa/jpa-container-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml Fri Dec 10 13:09:43 2010
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+  <bean id="jta" class="org.apache.derby.jdbc.EmbeddedDataSource">
+    <property name="databaseName" value="memory:testDB"/>
+    <property name="createDatabase" value="create"/> 
+  </bean>
+  
+  <bean id="nonjta" class="org.apache.derby.jdbc.EmbeddedDataSource">
+    <property name="databaseName" value="memory:testDB"/> 
+    <property name="createDatabase" value="create"/>
+  </bean>
+  
+  
+  <service ref="jta" interface="javax.sql.DataSource"/>
+    
+</blueprint>
+

Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/DelayedLookupDataSource.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/DelayedLookupDataSource.java?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/DelayedLookupDataSource.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/DelayedLookupDataSource.java Fri Dec 10 13:09:43 2010
@@ -21,11 +21,14 @@ package org.apache.aries.jpa.container.u
 import java.io.PrintWriter;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Hashtable;
 
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import javax.sql.DataSource;
 
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,7 +42,16 @@ public class DelayedLookupDataSource imp
   private DataSource getDs() {
     if(ds == null) {
       try {
-        InitialContext ctx = new InitialContext();
+        
+        Hashtable<String, Object> props = new Hashtable<String, Object>();
+        
+        BundleContext bCtx = persistenceBundle.getBundleContext();
+        if(bCtx == null)
+          throw new IllegalStateException("The bundle " + 
+              persistenceBundle.getSymbolicName() + "_" + persistenceBundle.getVersion() + 
+              " is not started.");
+        props.put("osgi.service.jndi.bundleContext", bCtx);
+        InitialContext ctx = new InitialContext(props);
         ds = (DataSource) ctx.lookup(jndiName);
       } catch (NamingException e) {
         _logger.error("No JTA datasource could be located using the JNDI name " + jndiName,
@@ -51,9 +63,11 @@ public class DelayedLookupDataSource imp
   }
 
   private final String jndiName;
+  private final Bundle persistenceBundle;
   
-  public DelayedLookupDataSource (String jndi) {
+  public DelayedLookupDataSource (String jndi, Bundle persistenceBundle) {
     jndiName = jndi;
+    this.persistenceBundle = persistenceBundle;
   }
   
   public Connection getConnection() throws SQLException {

Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java?rev=1044342&r1=1044341&r2=1044342&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java Fri Dec 10 13:09:43 2010
@@ -94,7 +94,7 @@ public class PersistenceUnitInfoImpl imp
     String jndiString = (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.JTA_DATASOURCE);
     DataSource toReturn = null;
     if(jndiString != null) {
-      toReturn = new DelayedLookupDataSource(jndiString);
+      toReturn = new DelayedLookupDataSource(jndiString, bundle);
     }
     return toReturn;
   }
@@ -126,7 +126,7 @@ public class PersistenceUnitInfoImpl imp
     String jndiString = (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.NON_JTA_DATASOURCE);
     DataSource toReturn = null;
     if(jndiString != null) {
-      toReturn = new DelayedLookupDataSource(jndiString);
+      toReturn = new DelayedLookupDataSource(jndiString, bundle);
     }
     return toReturn;
   }