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

svn commit: r998981 - in /incubator/aries/trunk/jpa/jpa-blueprint-aries/src: main/java/org/apache/aries/jpa/blueprint/aries/impl/ main/resources/org/apache/aries/jpa/blueprint/namespace/ test/java/org/apache/aries/jpa/blueprint/aries/test/ test/resources/

Author: timothyjward
Date: Mon Sep 20 16:14:50 2010
New Revision: 998981

URL: http://svn.apache.org/viewvc?rev=998981&view=rev
Log:
ARIES-413 - Blueprint JPA integration: support for constructor/factory injection of JPA resources

Added:
    incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/resources/org/apache/aries/jpa/blueprint/namespace/jpa_110.xsd
    incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/resources/jpa_110.xml
Modified:
    incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/java/org/apache/aries/jpa/blueprint/aries/impl/NSHandler.java
    incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/java/org/apache/aries/jpa/blueprint/aries/test/NSHandlerTest.java

Modified: incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/java/org/apache/aries/jpa/blueprint/aries/impl/NSHandler.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/java/org/apache/aries/jpa/blueprint/aries/impl/NSHandler.java?rev=998981&r1=998980&r2=998981&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/java/org/apache/aries/jpa/blueprint/aries/impl/NSHandler.java (original)
+++ incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/java/org/apache/aries/jpa/blueprint/aries/impl/NSHandler.java Mon Sep 20 16:14:50 2010
@@ -44,6 +44,7 @@ import org.apache.aries.jpa.container.Pe
 import org.apache.aries.jpa.container.context.PersistenceContextProvider;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.blueprint.reflect.BeanArgument;
 import org.osgi.service.blueprint.reflect.BeanMetadata;
 import org.osgi.service.blueprint.reflect.BeanProperty;
 import org.osgi.service.blueprint.reflect.ComponentMetadata;
@@ -67,12 +68,16 @@ import org.w3c.dom.NodeList;
  * the {@link GlobalPersistenceManager}.
  */
 public class NSHandler implements NamespaceHandler {
+    private static final String ATTR_INDEX = "index";
+
     /** Logger */
     private static final Logger _logger = LoggerFactory
             .getLogger("org.apache.aries.jpa.blueprint.aries");
 
-    /** The JPA namespace */
-    public static final String NS_URI = "http://aries.apache.org/xmlns/jpa/v1.0.0";
+    /** The JPA 1.0.0 namespace */
+    public static final String NS_URI_100 = "http://aries.apache.org/xmlns/jpa/v1.0.0";
+    /** The JPA 1.0.0 namespace */
+    public static final String NS_URI_110 = "http://aries.apache.org/xmlns/jpa/v1.1.0";
     /** The standard blueprint namespace */
     private static final String BLUEPRINT_NS = "http://www.osgi.org/xmlns/blueprint/v1.0.0";
 
@@ -128,8 +133,8 @@ public class NSHandler implements Namesp
         Element element = (Element) node;
         // The surrounding component should always be a bean
         if (!(component instanceof BeanMetadata)) {
-            _logger.error("The JPA namespace should only be used to inject properties into a bean. The surrounding component was {}.",
-                            new Object[] { component });
+            _logger.error("The JPA namespace should only be used to inject properties or constuctor arguments into a bean." +
+            		" The surrounding component was {}.", new Object[] { component });
             throw new IllegalArgumentException(component.toString());
         }
         
@@ -142,27 +147,45 @@ public class NSHandler implements Namesp
 
         MutableBeanMetadata bean = (MutableBeanMetadata) component;
 
-        if (!NS_URI.equals(element.getNamespaceURI())) {
-            _logger
-                    .error(
-                            "The JPA namespace handler should not be called for the namespace {}.",
+        if (!NS_URI_100.equals(element.getNamespaceURI())
+            && !NS_URI_110.equals(element.getNamespaceURI())) {
+            _logger.error("The JPA namespace handler should not be called for the namespace {}.",
                             new Object[] { element.getNamespaceURI() });
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("The JPA namespace handler should not be called for the namespace " 
+                   + element.getNamespaceURI());
         }
 
         if (!TAG_UNIT.equals(element.getLocalName())
                 && !TAG_CONTEXT.equals(element.getLocalName())) {
-            _logger
-                    .error(
-                            "The JPA namespace handler did not recognize the element named {}.",
+            _logger.error("The JPA namespace handler did not recognize the element named {}.",
                             new Object[] { element.getLocalName() });
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("The JPA namespace handler did not recognize the element named " 
+                   + element.getLocalName());
         }
 
-        // Create an injection point for the JPA resource (a blueprint property)
-        final BeanProperty beanProperty = createInjectMetadata(element,
-                TAG_UNIT.equals(element.getLocalName()), context);
-
+        String property = element.getAttribute(ATTR_PROPERTY);
+        property = property.isEmpty() ? null : property;
+        String index = element.getAttribute(ATTR_INDEX);
+        index = index.isEmpty() ? null : index;
+        if(property != null && index != null) {
+          _logger.error("It is invalid to specify a bean property and an index") ;
+        } else if (property != null) {
+            
+                
+            // Create an injection point for the JPA resource (a blueprint property)
+            BeanProperty beanProperty = createBeanProperty(element, property,
+                    TAG_UNIT.equals(element.getLocalName()), context);
+
+            bean.addProperty(beanProperty);
+        } else {
+          
+          //Create a constructor argument for the JPA resource
+          BeanArgument argument = createArgument(element, index, 
+              TAG_UNIT.equals(element.getLocalName()), context);
+          
+          bean.addArgument(argument);
+        }
+        
         // If this is a persistence context then register it with the manager
         if (TAG_CONTEXT.equals(element.getLocalName())) {
             Bundle client = getBlueprintBundle(context);
@@ -188,8 +211,6 @@ public class NSHandler implements Namesp
             }
         }
 
-        bean.addProperty(beanProperty);
-        
         return bean;
     }
 
@@ -200,8 +221,10 @@ public class NSHandler implements Namesp
     }
 
     public URL getSchemaLocation(String namespace) {
-        if(NS_URI.equals(namespace))
+        if(NS_URI_100.equals(namespace))
             return getClass().getResource("/org/apache/aries/jpa/blueprint/namespace/jpa.xsd");
+        else if (NS_URI_110.equals(namespace))
+            return getClass().getResource("/org/apache/aries/jpa/blueprint/namespace/jpa_110.xsd");
         else
             return null;
     }
@@ -246,10 +269,9 @@ public class NSHandler implements Namesp
      *            The current parser context
      * @return
      */
-    private BeanProperty createInjectMetadata(Element element,
+    private BeanProperty createBeanProperty(Element element, final String property,
             boolean isPersistenceUnit, ParserContext ctx) {
         String unitName = parseUnitName(element);
-        final String property = element.getAttribute(ATTR_PROPERTY);
 
         if (_logger.isDebugEnabled()) {
             if (isPersistenceUnit)
@@ -260,45 +282,8 @@ public class NSHandler implements Namesp
                                 new Object[] { unitName, property });
         }
 
-        // Create a service reference for the EMF (it is an EMF for persistence
-        // contexts and units)
-        final MutableReferenceMetadata refMetadata = (MutableReferenceMetadata) ctx
-                .createMetadata(ReferenceMetadata.class);
-        refMetadata.setActivation(ACTIVATION_EAGER.equalsIgnoreCase(ctx
-                .getDefaultActivation()) ? ReferenceMetadata.ACTIVATION_EAGER
-                : ReferenceMetadata.ACTIVATION_LAZY);
-        refMetadata.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
-        refMetadata.setInterface(EntityManagerFactory.class.getName());
-
-        // Pick the right EMF by looking for the presence, or absence, of the
-        // PROXY_FACTORY service property
-        StringBuilder filter = new StringBuilder("(&");
-        // Persistence units do not have the property, persistence contexts do
-        if (isPersistenceUnit)
-            filter.append("(!(").append(PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE)
-            .append("=*))");
-        else
-            filter.append("(").append(PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE)
-                    .append("=*)");
-
-        // Add the empty name filter if necessary
-        if (!"".equals(unitName))
-            filter.append("(" + PersistenceUnitConstants.OSGI_UNIT_NAME + "="
-                    + unitName + ")");
-        else
-            filter.append(EMPTY_UNIT_NAME_FILTER);
-
-        filter.append(")");
-
-        refMetadata.setFilter(filter.toString());
-        refMetadata.setTimeout(Integer.parseInt(ctx.getDefaultTimeout()));
-        refMetadata.setDependsOn((List<String>) Collections.EMPTY_LIST);
-        refMetadata.setId(ctx.generateId());
-
-        // Finally, if this is a persistence context we need to create the
-        // entity manager as the Target
-        final Metadata target = isPersistenceUnit ? refMetadata
-                : createInjectionBeanMetedata(ctx, refMetadata);
+        final Metadata target = createTargetMetadata(isPersistenceUnit, ctx,
+            unitName);
 
         return new BeanProperty() {
             public Metadata getValue() {
@@ -310,6 +295,116 @@ public class NSHandler implements Namesp
             }
         };
     }
+    
+    /**
+     * Create a BeanProperty that will inject a JPA resource into a bean
+     * 
+     * @param element
+     *            The element being parsed
+     * @param isPersistenceUnit
+     *            true if this is a persistence unit
+     * @param ctx
+     *            The current parser context
+     * @return
+     */
+    private BeanArgument createArgument(Element element, final String index,
+            final boolean isPersistenceUnit, ParserContext ctx) {
+        
+        String unitName = parseUnitName(element);
+        if (_logger.isDebugEnabled()) {
+          if (isPersistenceUnit) {
+              if (index == null)
+                  _logger.debug("Creating blueprint injection metadata to inject the unit {} as a constructor argument",
+                              new Object[] { unitName });
+              else
+                  _logger.debug("Creating blueprint injection metadata to inject the unit {} as a constructor argument" +
+                      " with index {}", new Object[] { unitName, index });
+          } else {
+              if (index == null)
+                  _logger.debug("Creating blueprint injection metadata to inject the context {} as a constructor argument",
+                              new Object[] { unitName });
+              else
+                  _logger.debug("Creating blueprint injection metadata to inject the context {} as a constructor argument" +
+                      " with index {}", new Object[] { unitName, index });
+          }
+      }
+        
+        final int i;
+        
+        if(index == null) {
+            i = -1;
+        } else {
+            try {
+                i = Integer.parseInt(index);
+            } catch (NumberFormatException nfe) {
+                throw new IllegalArgumentException("The string " + index + " could not be parsed as an index.", nfe);
+            }
+        }
+        
+        final Metadata target = createTargetMetadata(isPersistenceUnit, ctx,
+            unitName);
+
+        return new BeanArgument() {
+            public Metadata getValue() {
+                return target;
+            }
+
+            @Override
+            public String getValueType() {
+              return isPersistenceUnit ? "javax.persistence.EntityManagerFactory" 
+                                       : "javax.persistence.EntityManager";
+            }
+
+            @Override
+            public int getIndex() {
+              return i;
+            }
+        };
+    }
+
+    private Metadata createTargetMetadata(boolean isPersistenceUnit,
+        ParserContext ctx, String unitName) {
+      // Create a service reference for the EMF (it is an EMF for persistence
+      // contexts and units)
+      final MutableReferenceMetadata refMetadata = (MutableReferenceMetadata) ctx
+              .createMetadata(ReferenceMetadata.class);
+      refMetadata.setActivation(ACTIVATION_EAGER.equalsIgnoreCase(ctx
+              .getDefaultActivation()) ? ReferenceMetadata.ACTIVATION_EAGER
+              : ReferenceMetadata.ACTIVATION_LAZY);
+      refMetadata.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
+      refMetadata.setInterface(EntityManagerFactory.class.getName());
+
+      // Pick the right EMF by looking for the presence, or absence, of the
+      // PROXY_FACTORY service property
+      StringBuilder filter = new StringBuilder("(&");
+      // Persistence units do not have the property, persistence contexts do
+      if (isPersistenceUnit)
+          filter.append("(!(").append(PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE)
+          .append("=*))");
+      else
+          filter.append("(").append(PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE)
+                  .append("=*)");
+
+      // Add the empty name filter if necessary
+      if (!"".equals(unitName))
+          filter.append("(" + PersistenceUnitConstants.OSGI_UNIT_NAME + "="
+                  + unitName + ")");
+      else
+          filter.append(EMPTY_UNIT_NAME_FILTER);
+
+      filter.append(")");
+
+      refMetadata.setFilter(filter.toString());
+      refMetadata.setTimeout(Integer.parseInt(ctx.getDefaultTimeout()));
+      refMetadata.setDependsOn((List<String>) Collections.EMPTY_LIST);
+      refMetadata.setId(ctx.generateId());
+
+      // Finally, if this is a persistence context we need to create the
+      // entity manager as the Target
+      final Metadata target = isPersistenceUnit ? refMetadata
+              : createInjectionBeanMetedata(ctx, refMetadata);
+      return target;
+    }
 
     /**
      * This method turns a persistence context factory into an

Added: incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/resources/org/apache/aries/jpa/blueprint/namespace/jpa_110.xsd
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/resources/org/apache/aries/jpa/blueprint/namespace/jpa_110.xsd?rev=998981&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/resources/org/apache/aries/jpa/blueprint/namespace/jpa_110.xsd (added)
+++ incubator/aries/trunk/jpa/jpa-blueprint-aries/src/main/resources/org/apache/aries/jpa/blueprint/namespace/jpa_110.xsd Mon Sep 20 16:14:50 2010
@@ -0,0 +1,57 @@
+<?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.
+
+-->
+<xsd:schema xmlns="http://aries.apache.org/xmlns/jpa/v1.0.0"
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+            xmlns:osgi="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+            targetNamespace="http://aries.apache.org/xmlns/jpa/v1.1.0"
+            elementFormDefault="qualified"
+            attributeFormDefault="unqualified"
+            version="1.0.0">
+
+    <xsd:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>
+
+  <xsd:element name="context" type="TcontextType" />
+  <xsd:element name="unit" type="TunitType" />
+  
+  <xsd:complexType name="TcontextType">
+    <xsd:sequence>
+      <xsd:element name="map" type="osgi:Tmap" minOccurs="0" maxOccurs="1" />
+    </xsd:sequence>
+    <xsd:attribute name="property" type="xsd:string" use="optional" />
+    <xsd:attribute name="index" type="xsd:string" use="optional" />
+    <xsd:attribute name="unitname" type="xsd:string" use="optional" />
+    <xsd:attribute name="type" type="TcontextScopeType" use="optional" />
+  </xsd:complexType>
+
+  <xsd:complexType name="TunitType">
+    <xsd:attribute name="property" type="xsd:string" use="optional" />
+    <xsd:attribute name="index" type="xsd:string" use="optional" />
+    <xsd:attribute name="unitname" type="xsd:string" use="optional" />
+  </xsd:complexType>
+
+   <xsd:simpleType name="TcontextScopeType">
+        <xsd:restriction base="xsd:token">
+            <xsd:enumeration value="TRANSACTION"/>
+            <xsd:enumeration value="EXTENDED"/>
+        </xsd:restriction>
+   </xsd:simpleType>
+
+</xsd:schema>
+  

Modified: incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/java/org/apache/aries/jpa/blueprint/aries/test/NSHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/java/org/apache/aries/jpa/blueprint/aries/test/NSHandlerTest.java?rev=998981&r1=998980&r2=998981&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/java/org/apache/aries/jpa/blueprint/aries/test/NSHandlerTest.java (original)
+++ incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/java/org/apache/aries/jpa/blueprint/aries/test/NSHandlerTest.java Mon Sep 20 16:14:50 2010
@@ -19,9 +19,11 @@
 package org.apache.aries.jpa.blueprint.aries.test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -49,6 +51,7 @@ import org.apache.aries.unittest.mocks.S
 import org.junit.Before;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
+import org.osgi.service.blueprint.reflect.BeanArgument;
 import org.osgi.service.blueprint.reflect.BeanMetadata;
 import org.osgi.service.blueprint.reflect.BeanProperty;
 import org.osgi.service.blueprint.reflect.ComponentMetadata;
@@ -62,6 +65,7 @@ import org.w3c.dom.NodeList;
 
 public class NSHandlerTest {
   private Element root;
+  private Element root_110;
   private NSHandler sut;
   private PersistenceContextProvider manager;
   private ParserContext parserCtx;
@@ -78,6 +82,10 @@ public class NSHandlerTest {
     Document doc = builder.parse(getClass().getClassLoader().getResourceAsStream("jpa.xml"));
     root = doc.getDocumentElement();
     
+    builder = factory.newDocumentBuilder();
+    doc = builder.parse(getClass().getClassLoader().getResourceAsStream("jpa_110.xml"));
+    root_110 = doc.getDocumentElement();
+    
     sut = new NSHandler();
     manager = Skeleton.newMock(PersistenceContextProvider.class);
     sut.setManager(manager);
@@ -127,7 +135,24 @@ public class NSHandlerTest {
   
   @Test
   public void testUnit() {
-    Element e = getTestElement("unit");
+    Element e = getTestElement("unit", root);
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
+    BeanProperty property = (BeanProperty) bean.getProperties().get(0);
+    ReferenceMetadata reference = (ReferenceMetadata) property.getValue();
+    
+    assertEquals("emf", property.getName());
+    assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+    assertEquals("(&(!(org.apache.aries.jpa.proxy.factory=*))(osgi.unit.name=myUnit))", reference.getFilter());
+    
+    Skeleton.getSkeleton(manager).assertSkeletonNotCalled();
+    
+    assertTrue(registeredComponents.isEmpty());
+  }
+  
+  @Test
+  public void testUnit_110() {
+    Element e = getTestElement("unit", root_110);
     BeanMetadata bean = 
       (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
     BeanProperty property = (BeanProperty) bean.getProperties().get(0);
@@ -144,7 +169,22 @@ public class NSHandlerTest {
   
   @Test
   public void testUnitNoName() {
-    Element e = getTestElement("unitNoName");
+    Element e = getTestElement("unitNoName", root);
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
+    BeanProperty property = (BeanProperty) bean.getProperties().get(0);
+    ReferenceMetadata reference = (ReferenceMetadata) property.getValue();
+    
+    assertEquals("emf2", property.getName());
+    assertEquals("(&(!(org.apache.aries.jpa.proxy.factory=*))"+NSHandler.EMPTY_UNIT_NAME_FILTER+")", 
+        reference.getFilter());
+
+    assertTrue(registeredComponents.isEmpty());
+  }
+  
+  @Test
+  public void testUnitNoName_110() {
+    Element e = getTestElement("unitNoName", root_110);
     BeanMetadata bean = 
       (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
     BeanProperty property = (BeanProperty) bean.getProperties().get(0);
@@ -159,7 +199,22 @@ public class NSHandlerTest {
   
   @Test
   public void testEmptyUnitName() {
-    Element e = getTestElement("emptyUnitName");
+    Element e = getTestElement("emptyUnitName", root);
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
+    BeanProperty property = (BeanProperty) bean.getProperties().get(0);
+    ReferenceMetadata reference = (ReferenceMetadata) property.getValue();
+    
+    assertEquals("emf3", property.getName());
+    assertEquals("(&(!(org.apache.aries.jpa.proxy.factory=*))"+NSHandler.EMPTY_UNIT_NAME_FILTER+")",
+        reference.getFilter());
+    
+    assertTrue(registeredComponents.isEmpty());
+  }
+  
+  @Test
+  public void testEmptyUnitName_110() {
+    Element e = getTestElement("emptyUnitName", root_110);
     BeanMetadata bean = 
       (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
     BeanProperty property = (BeanProperty) bean.getProperties().get(0);
@@ -174,7 +229,22 @@ public class NSHandlerTest {
   
   @Test 
   public void testBeanMetadataOverwrite() {
-    Element e = getTestElement("unit");
+    Element e = getTestElement("unit", root);
+    BeanMetadataImpl oldBean = new BeanMetadataImpl();
+    oldBean.setId("myid");
+    oldBean.setProperties(Arrays.asList(Skeleton.newMock(BeanProperty.class)));
+    
+    BeanMetadata bean = (BeanMetadata) sut.decorate(e, oldBean, parserCtx);
+
+    assertEquals("myid", bean.getId());
+    assertEquals(2, bean.getProperties().size());
+    
+    assertTrue(registeredComponents.isEmpty());
+  }
+  
+  @Test 
+  public void testBeanMetadataOverwrite_110() {
+    Element e = getTestElement("unit", root);
     BeanMetadataImpl oldBean = new BeanMetadataImpl();
     oldBean.setId("myid");
     oldBean.setProperties(Arrays.asList(Skeleton.newMock(BeanProperty.class)));
@@ -189,7 +259,29 @@ public class NSHandlerTest {
 
   @Test
   public void testDefaultContext() {
-    Element e = getTestElement("context");
+    Element e = getTestElement("context", root);
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
+    BeanMetadata innerBean = (BeanMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
+
+    assertEquals("createEntityManager", innerBean.getFactoryMethod());
+    assertEquals("internalClose", innerBean.getDestroyMethod());
+
+    assertEquals(1, registeredComponents.size());
+    ReferenceMetadata reference = (ReferenceMetadata) registeredComponents.get(0);
+    
+    assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+    assertEquals("(&(org.apache.aries.jpa.proxy.factory=*)(osgi.unit.name=myUnit))", reference.getFilter());
+    
+    Map<String,Object> props = new HashMap<String, Object>();
+    props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
+    Skeleton.getSkeleton(manager).assertCalled(
+        new MethodCall(PersistenceContextProvider.class, "registerContext", "myUnit", clientBundle, props));
+  }
+  
+  @Test
+  public void testDefaultContext_110() {
+    Element e = getTestElement("context", root_110);
     BeanMetadata bean = 
       (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
     BeanMetadata innerBean = (BeanMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
@@ -213,7 +305,31 @@ public class NSHandlerTest {
   public void testContextNoPersistenceContextProvider() {
     
     sut.contextUnavailable(null);
-    Element e = getTestElement("context");
+    Element e = getTestElement("context", root);
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
+    BeanMetadata innerBean = (BeanMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
+
+    assertEquals("createEntityManager", innerBean.getFactoryMethod());
+    assertEquals("internalClose", innerBean.getDestroyMethod());
+
+    assertEquals(1, registeredComponents.size());
+    ReferenceMetadata reference = (ReferenceMetadata) registeredComponents.get(0);
+    
+    assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+    assertEquals("(&(org.apache.aries.jpa.proxy.factory=*)(osgi.unit.name=myUnit))", reference.getFilter());
+    
+    Map<String,Object> props = new HashMap<String, Object>();
+    props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
+    Skeleton.getSkeleton(manager).assertNotCalled(
+        new MethodCall(PersistenceContextProvider.class, "registerContext", String.class, Bundle.class, Map.class));
+  }
+  
+  @Test
+  public void testContextNoPersistenceContextProvider_110() {
+    
+    sut.contextUnavailable(null);
+    Element e = getTestElement("context", root_110);
     BeanMetadata bean = 
       (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
     BeanMetadata innerBean = (BeanMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
@@ -235,7 +351,31 @@ public class NSHandlerTest {
   
   @Test
   public void testContextWithProps() {
-    Element e = getTestElement("contextWithProps");
+    Element e = getTestElement("contextWithProps", root);
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
+    BeanMetadata innerBean = (BeanMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
+    
+    assertEquals("createEntityManager", innerBean.getFactoryMethod());
+    
+    assertEquals(1, registeredComponents.size());
+    ReferenceMetadata reference = (ReferenceMetadata) registeredComponents.get(0);
+    
+    assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+    assertEquals("(&(org.apache.aries.jpa.proxy.factory=*)"+NSHandler.EMPTY_UNIT_NAME_FILTER+")", 
+        reference.getFilter());
+    
+    Map<String,Object> props = new HashMap<String, Object>();
+    props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.EXTENDED);
+    props.put("one", "eins");
+    props.put("two", "zwo");
+    Skeleton.getSkeleton(manager).assertCalled(
+        new MethodCall(PersistenceContextProvider.class, "registerContext", "", clientBundle, props));    
+  }
+  
+  @Test
+  public void testContextWithProps_110() {
+    Element e = getTestElement("contextWithProps", root_110);
     BeanMetadata bean = 
       (BeanMetadata) sut.decorate(e, new BeanMetadataImpl(), parserCtx);
     BeanMetadata innerBean = (BeanMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
@@ -259,13 +399,127 @@ public class NSHandlerTest {
   
   @Test
   public void testNoMoreProxying() {
-      Element e = getTestElement("contextWithProps");
+      Element e = getTestElement("contextWithProps", root);
       BeanMetadata input = new BeanMetadataImpl();
       Object output = sut.decorate(e, input, parserCtx);
       assertTrue(input == output);
   }
   
-  private Element getTestElement(String beanName) {
+  @Test
+  public void testNoMoreProxying_110() {
+      Element e = getTestElement("contextWithProps", root_110);
+      BeanMetadata input = new BeanMetadataImpl();
+      Object output = sut.decorate(e, input, parserCtx);
+      assertTrue(input == output);
+  }
+  
+  @Test
+  public void testNonIndexedArgs_110() {
+      Element e = getTestElement("withUnitArg", root_110);
+      BeanMetadata input = new BeanMetadataImpl();
+      Object output = sut.decorate(e, input, parserCtx);
+      assertEquals("Wrong number of arguments",
+          1 ,input.getArguments().size());
+      assertEquals("Wrong class type", "javax.persistence.EntityManagerFactory",
+          ((BeanArgument)input.getArguments().get(0)).getValueType());
+      assertEquals("Wrong index", -1,
+          ((BeanArgument)input.getArguments().get(0)).getIndex());
+      
+      ReferenceMetadata reference = (ReferenceMetadata) ((BeanArgument)input.getArguments().get(0)).getValue();
+      assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+      assertEquals("(&(!(org.apache.aries.jpa.proxy.factory=*))(osgi.unit.name=myUnit))", reference.getFilter());
+      
+      Skeleton.getSkeleton(manager).assertSkeletonNotCalled();
+      assertTrue(registeredComponents.isEmpty());
+      
+      e = getTestElement("withContextArg", root_110);
+      input = new BeanMetadataImpl();
+      output = sut.decorate(e, input, parserCtx);
+      
+      assertEquals("Wrong number of arguments",
+          1 ,input.getArguments().size());
+      assertEquals("Wrong type", "javax.persistence.EntityManager",
+          ((BeanArgument)input.getArguments().get(0)).getValueType());
+      assertEquals("Wrong index", -1,
+          ((BeanArgument)input.getArguments().get(0)).getIndex());
+      
+      BeanMetadata innerBean = (BeanMetadata) ((BeanArgument)input.getArguments().get(0)).getValue();
+
+      assertEquals("createEntityManager", innerBean.getFactoryMethod());
+      assertEquals("internalClose", innerBean.getDestroyMethod());
+
+      assertEquals(1, registeredComponents.size());
+      reference = (ReferenceMetadata) registeredComponents.get(0);
+      
+      assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+      assertEquals("(&(org.apache.aries.jpa.proxy.factory=*)(osgi.unit.name=myUnit))", reference.getFilter());
+      
+      Map<String,Object> props = new HashMap<String, Object>();
+      props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
+      Skeleton.getSkeleton(manager).assertCalled(
+          new MethodCall(PersistenceContextProvider.class, "registerContext", "myUnit", clientBundle, Map.class));
+  }
+  
+  @Test
+  public void testIndexedArgs_110() {
+      Element e = getTestElement("withIndexedUnitArg", root_110);
+      BeanMetadata input = new BeanMetadataImpl();
+      Object output = sut.decorate(e, input, parserCtx);
+      assertEquals("Wrong number of arguments",
+          1 ,input.getArguments().size());
+      assertEquals("Wrong class type", "javax.persistence.EntityManagerFactory",
+          ((BeanArgument)input.getArguments().get(0)).getValueType());
+      assertEquals("Wrong index", 0,
+          ((BeanArgument)input.getArguments().get(0)).getIndex());
+      
+      ReferenceMetadata reference = (ReferenceMetadata) ((BeanArgument)input.getArguments().get(0)).getValue();
+      assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+      assertEquals("(&(!(org.apache.aries.jpa.proxy.factory=*))(osgi.unit.name=myUnit))", reference.getFilter());
+      
+      Skeleton.getSkeleton(manager).assertSkeletonNotCalled();
+      assertTrue(registeredComponents.isEmpty());
+      
+      e = getTestElement("withIndexedContextArg", root_110);
+      input = new BeanMetadataImpl();
+      output = sut.decorate(e, input, parserCtx);
+      
+      assertEquals("Wrong number of arguments",
+          1 ,input.getArguments().size());
+      assertEquals("Wrong type", "javax.persistence.EntityManager",
+          ((BeanArgument)input.getArguments().get(0)).getValueType());
+      assertEquals("Wrong index", 1,
+          ((BeanArgument)input.getArguments().get(0)).getIndex());
+      
+      BeanMetadata innerBean = (BeanMetadata) ((BeanArgument)input.getArguments().get(0)).getValue();
+
+      assertEquals("createEntityManager", innerBean.getFactoryMethod());
+      assertEquals("internalClose", innerBean.getDestroyMethod());
+
+      assertEquals(1, registeredComponents.size());
+      reference = (ReferenceMetadata) registeredComponents.get(0);
+      
+      assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+      assertEquals("(&(org.apache.aries.jpa.proxy.factory=*)(osgi.unit.name=myUnit))", reference.getFilter());
+      
+      Map<String,Object> props = new HashMap<String, Object>();
+      props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
+      Skeleton.getSkeleton(manager).assertCalled(
+          new MethodCall(PersistenceContextProvider.class, "registerContext", "myUnit", clientBundle, Map.class));
+  }
+  
+  @Test
+  public void testInvalidIndex_110() {
+      Element e = getTestElement("withInvalidIndexArg", root_110);
+      BeanMetadata input = new BeanMetadataImpl();
+      try {
+          Object output = sut.decorate(e, input, parserCtx);
+          fail("Should throw an exception");
+      } catch (IllegalArgumentException iae) {
+          assertTrue("Wrong cause type", iae.getCause() instanceof NumberFormatException);
+      }
+  }
+  
+  private Element getTestElement(String beanName, Element root) {
     NodeList ns = root.getElementsByTagName("bean");
     
     Element bean = null;
@@ -279,7 +533,8 @@ public class NSHandlerTest {
     for (int i=0; i<ns.getLength(); i++) {
       if (ns.item(i).getNodeType() == Node.ELEMENT_NODE) {
         Element e = (Element) ns.item(i);
-        if (NSHandler.NS_URI.equals(e.getNamespaceURI()))
+        if (NSHandler.NS_URI_100.equals(e.getNamespaceURI())
+            || NSHandler.NS_URI_110.equals(e.getNamespaceURI()))
           return e;
       }
     }
@@ -290,7 +545,10 @@ public class NSHandlerTest {
   @Test
   public void testgetSchemaLocation()
   {
-    assertNotNull("No schema found", sut.getSchemaLocation(NSHandler.NS_URI));
+    assertNotNull("No schema found", sut.getSchemaLocation(NSHandler.NS_URI_100));
+    assertNotNull("No schema found", sut.getSchemaLocation(NSHandler.NS_URI_110));
+    assertFalse("Should not be the same schema", sut.getSchemaLocation(NSHandler.NS_URI_100)
+                  .equals(sut.getSchemaLocation(NSHandler.NS_URI_110)));
     assertNull("No schema expected", sut.getSchemaLocation("http://maven.apache.org/POM/4.0.0"));
   }
 }

Added: incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/resources/jpa_110.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/resources/jpa_110.xml?rev=998981&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/resources/jpa_110.xml (added)
+++ incubator/aries/trunk/jpa/jpa-blueprint-aries/src/test/resources/jpa_110.xml Mon Sep 20 16:14:50 2010
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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" 
+  xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.1.0">
+
+  <bean id="unit">
+    <jpa:unit property="emf" unitname="myUnit" />
+  </bean>
+  
+  <bean id="unitNoName">
+    <jpa:unit property="emf2" />
+  </bean>
+  
+  <bean id="emptyUnitName">
+    <jpa:unit property="emf3" unitname="" />
+  </bean>
+  
+  <bean id="context">
+    <jpa:context property="em" unitname="myUnit"/>
+  </bean>
+  
+  <bean id="contextWithProps">
+    <jpa:context property="em" type="EXTENDED">
+      <map>
+        <entry key="one" value="eins" />
+        <entry key="two" value="zwo" />
+      </map>
+    </jpa:context>
+  </bean>
+
+  <bean id="withUnitArg">
+    <jpa:unit unitname="myUnit"/>
+  </bean>
+  
+  <bean id="withContextArg">
+    <jpa:context unitname="myUnit"/>
+  </bean>
+
+  <bean id="withIndexedUnitArg">
+    <jpa:unit index="0" unitname="myUnit"/>
+  </bean>
+  
+  <bean id="withIndexedContextArg">
+    <jpa:context index="1" unitname="myUnit"/>
+  </bean>
+
+  <bean id="withInvalidIndexArg">
+    <jpa:unit index="1A" unitname="myUnit"/>
+  </bean>
+</blueprint>
\ No newline at end of file