You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ma...@apache.org on 2010/01/18 13:59:26 UTC

svn commit: r900379 - in /incubator/aries/trunk/jpa/jpa-container-context: ./ main/ main/test/ main/test/java/ main/test/java/org/ main/test/java/org/apache/ main/test/java/org/apache/aries/ main/test/java/org/apache/aries/jpa/ main/test/java/org/apach...

Author: mahrwald
Date: Mon Jan 18 12:59:26 2010
New Revision: 900379

URL: http://svn.apache.org/viewvc?rev=900379&view=rev
Log:
ARIES-118 Add unit tests for namespace handler

Added:
    incubator/aries/trunk/jpa/jpa-container-context/main/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/context/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/context/namespace/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/context/namespace/NSHandlerTest.java
    incubator/aries/trunk/jpa/jpa-container-context/main/test/resources/
    incubator/aries/trunk/jpa/jpa-container-context/main/test/resources/jpa.xml
Modified:
    incubator/aries/trunk/jpa/jpa-container-context/pom.xml
    incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/PersistenceManager.java
    incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/namespace/NSHandler.java

Added: incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/context/namespace/NSHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/context/namespace/NSHandlerTest.java?rev=900379&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/context/namespace/NSHandlerTest.java (added)
+++ incubator/aries/trunk/jpa/jpa-container-context/main/test/java/org/apache/aries/jpa/container/context/namespace/NSHandlerTest.java Mon Jan 18 12:59:26 2010
@@ -0,0 +1,189 @@
+/**
+ * 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.
+ */
+package org.apache.aries.jpa.container.context.namespace;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContextType;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.aries.blueprint.ComponentDefinitionRegistry;
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.PassThroughMetadata;
+import org.apache.aries.blueprint.container.Parser;
+import org.apache.aries.blueprint.reflect.BeanMetadataImpl;
+import org.apache.aries.jpa.container.context.PersistenceManager;
+import org.apache.aries.unittest.mocks.MethodCall;
+import org.apache.aries.unittest.mocks.Skeleton;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+import org.osgi.service.blueprint.reflect.BeanProperty;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceMetadata;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class NSHandlerTest {
+  private Element root;
+  private NSHandler sut;
+  private PersistenceManager manager;
+  private ParserContext parserCtx;
+  private Bundle clientBundle;
+  
+  @Before
+  public void setup() throws Exception {
+    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    factory.setNamespaceAware(true);
+    DocumentBuilder builder = factory.newDocumentBuilder();
+    Document doc = builder.parse(getClass().getClassLoader().getResourceAsStream("jpa.xml"));
+    root = doc.getDocumentElement();
+    
+    sut = new NSHandler();
+    manager = Skeleton.newMock(PersistenceManager.class);
+    sut.setManager(manager);
+    
+    clientBundle = Skeleton.newMock(Bundle.class);
+    
+    PassThroughMetadata bundleMeta =  Skeleton.newMock(PassThroughMetadata.class);
+    Skeleton.getSkeleton(bundleMeta).setReturnValue(
+        new MethodCall(PassThroughMetadata.class, "getObject"), clientBundle);
+    
+    ComponentDefinitionRegistry registry = Skeleton.newMock(ComponentDefinitionRegistry.class);
+    Skeleton.getSkeleton(registry).setReturnValue(
+        new MethodCall(ComponentDefinitionRegistry.class, "getComponentDefinition", "blueprintBundle"), 
+        bundleMeta);
+    
+    parserCtx = Skeleton.newMock(new ParserContextMock(), ParserContext.class);
+    Skeleton.getSkeleton(parserCtx).setReturnValue(
+        new MethodCall(ParserContext.class,"getComponentDefinitionRegistry"), registry);
+  }
+  
+  private static class ParserContextMock {
+    public<T> T parseElement(Class<T> type, ComponentMetadata enclosingComponent, Element element) {
+      return new Parser().parseElement(type, enclosingComponent, element);
+    }
+  }
+  
+  @Test
+  public void testUnit() {
+    Element e = getTestElement("unit");
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, Skeleton.newMock(BeanMetadata.class), null);
+    BeanProperty property = (BeanProperty) bean.getProperties().get(0);
+    ReferenceMetadata reference = (ReferenceMetadata) property.getValue();
+    
+    assertEquals("emf", property.getName());
+    assertEquals(EntityManagerFactory.class.getName(), reference.getInterface());
+    assertEquals("(osgi.unit.name=myUnit)", reference.getFilter());
+    
+    Skeleton.getSkeleton(manager).assertSkeletonNotCalled();
+  }
+  
+  @Test
+  public void testUnitNoName() {
+    Element e = getTestElement("unitNoName");
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, Skeleton.newMock(BeanMetadata.class), null);
+    BeanProperty property = (BeanProperty) bean.getProperties().get(0);
+    ReferenceMetadata reference = (ReferenceMetadata) property.getValue();
+    
+    assertEquals("emf2", property.getName());
+    assertEquals("(!(osgi.unit.name=*))", reference.getFilter());
+  }
+  
+  @Test 
+  public void testBeanMetadataOverwrite() {
+    Element e = getTestElement("unit");
+    BeanMetadataImpl oldBean = new BeanMetadataImpl();
+    oldBean.setId("myid");
+    oldBean.setProperties(Arrays.asList(Skeleton.newMock(BeanProperty.class)));
+    
+    BeanMetadata bean = (BeanMetadata) sut.decorate(e, oldBean, null);
+
+    assertEquals("myid", bean.getId());
+    assertEquals(2, bean.getProperties().size());
+  }
+
+  @Test
+  public void testDefaultContext() {
+    Element e = getTestElement("context");
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, Skeleton.newMock(BeanMetadata.class), parserCtx);
+    ReferenceMetadata reference = (ReferenceMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
+    
+    assertEquals(EntityManager.class.getName(), reference.getInterface());
+    assertEquals("(osgi.unit.name=myUnit)", reference.getFilter());
+    
+    Map<String,Object> props = new HashMap<String, Object>();
+    props.put("type", PersistenceContextType.TRANSACTION);
+    Skeleton.getSkeleton(manager).assertCalled(
+        new MethodCall(PersistenceManager.class, "registerContext", "myUnit", clientBundle, props));
+  }
+  
+  @Test
+  public void testContextWithProps() {
+    Element e = getTestElement("contextWithProps");
+    BeanMetadata bean = 
+      (BeanMetadata) sut.decorate(e, Skeleton.newMock(BeanMetadata.class), parserCtx);
+    ReferenceMetadata reference = (ReferenceMetadata) ((BeanProperty) bean.getProperties().get(0)).getValue();
+    
+    assertEquals(EntityManager.class.getName(), reference.getInterface());
+    assertEquals("(!(osgi.unit.name=*))", reference.getFilter());
+    
+    Map<String,Object> props = new HashMap<String, Object>();
+    props.put("type", PersistenceContextType.EXTENDED);
+    props.put("one", "eins");
+    props.put("two", "zwo");
+    Skeleton.getSkeleton(manager).assertCalled(
+        new MethodCall(PersistenceManager.class, "registerContext", null, clientBundle, props));    
+  }
+  
+  private Element getTestElement(String beanName) {
+    NodeList ns = root.getElementsByTagName("bean");
+    
+    Element bean = null;
+    for (int i=0; i<ns.getLength(); i++) {
+      bean = (Element) ns.item(i);
+      if (beanName.equals(bean.getAttribute("id")))
+        break;
+    }
+    
+    ns = bean.getChildNodes();
+    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()))
+          return e;
+      }
+    }
+    
+    return null;
+  }
+}

Added: incubator/aries/trunk/jpa/jpa-container-context/main/test/resources/jpa.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-context/main/test/resources/jpa.xml?rev=900379&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-context/main/test/resources/jpa.xml (added)
+++ incubator/aries/trunk/jpa/jpa-container-context/main/test/resources/jpa.xml Mon Jan 18 12:59:26 2010
@@ -0,0 +1,42 @@
+<?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.0.0">
+
+  <bean id="unit">
+    <jpa:unit property="emf" unitname="myUnit" />
+  </bean>
+  
+  <bean id="unitNoName">
+    <jpa:unit property="emf2" />
+  </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>
+
+</blueprint>
\ No newline at end of file

Modified: incubator/aries/trunk/jpa/jpa-container-context/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-context/pom.xml?rev=900379&r1=900378&r2=900379&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-context/pom.xml (original)
+++ incubator/aries/trunk/jpa/jpa-container-context/pom.xml Mon Jan 18 12:59:26 2010
@@ -68,6 +68,22 @@
       <version>${version}</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.aries.testsupport</groupId>
+      <artifactId>org.apache.aries.testsupport.unit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>1.5.6</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   
   

Modified: incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/PersistenceManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/PersistenceManager.java?rev=900379&r1=900378&r2=900379&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/PersistenceManager.java (original)
+++ incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/PersistenceManager.java Mon Jan 18 12:59:26 2010
@@ -18,10 +18,10 @@
  */
 package org.apache.aries.jpa.container.context;
 
-import java.util.Map;
+import java.util.HashMap;
 
 import org.osgi.framework.Bundle;
 
 public interface PersistenceManager {
-  void registerContext(String unitName, Bundle client, Map<String,Object> properties);
+  void registerContext(String unitName, Bundle client, HashMap<String,Object> properties);
 }

Modified: incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/namespace/NSHandler.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/namespace/NSHandler.java?rev=900379&r1=900378&r2=900379&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/namespace/NSHandler.java (original)
+++ incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/namespace/NSHandler.java Mon Jan 18 12:59:26 2010
@@ -19,12 +19,15 @@
 package org.apache.aries.jpa.container.context.namespace;
 
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContextType;
 
 import org.apache.aries.blueprint.NamespaceHandler;
 import org.apache.aries.blueprint.ParserContext;
@@ -34,10 +37,14 @@
 import org.apache.aries.blueprint.reflect.ReferenceMetadataImpl;
 import org.apache.aries.jpa.container.context.PersistenceManager;
 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;
 import org.osgi.service.blueprint.reflect.MapEntry;
 import org.osgi.service.blueprint.reflect.MapMetadata;
 import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.Target;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -45,7 +52,7 @@
 
 public class NSHandler implements NamespaceHandler {
   
-  private static final String NS_URI = "http://aries.apache.org/xmlns/jpa/v1.0.0";
+  public static final String NS_URI = "http://aries.apache.org/xmlns/jpa/v1.0.0";
   private static final String BLUEPRINT_NS = "http://www.osgi.org/xmlns/blueprint/v1.0.0";
   
   private static final String TAG_UNIT = "unit";
@@ -57,8 +64,7 @@
   private static final String ATTR_UNIT_NAME = "unitname";
   
   private static final String TYPE_JTA = "TRANSACTION";
-  private static final String TYPE_EXTENDED = "EXTENDED";
-  private static final String DEFAULT_UNIT_NAME = "";
+  private static final String DEFAULT_UNIT_NAME = null;
   
   private PersistenceManager manager;
   
@@ -67,58 +73,118 @@
   }
 
   public ComponentMetadata decorate(Node node, ComponentMetadata component, ParserContext context) {
-    /*
-     * The namespace does not allow any decorated elements, so we should never get here.
-     * In case we do -> explode.
-     */
-    throw new UnsupportedOperationException();
-  }
-
-  public Set<Class> getManagedClasses() {
-    return null;
-  }
-
-  public URL getSchemaLocation(String namespace) {
-    return getClass().getResource("jpa.xsd");
-  }
-
-  public Metadata parse(Element element, ParserContext context) {
+    if (node.getNodeType() != Node.ELEMENT_NODE)
+      throw new IllegalArgumentException();    
+    
+    Element element = (Element) node;
+    
+    if (!(component instanceof BeanMetadata))
+      throw new IllegalArgumentException();
+    
+    final BeanMetadata bean = (BeanMetadata) component;
+    
     if (!NS_URI.equals(element.getNamespaceURI()))
       throw new IllegalArgumentException();
         
-    Metadata result = null;
-    if (TAG_UNIT.equals(element)) {
-      result = createInjectMetadata(element, EntityManagerFactory.class);
-    } else if (TAG_CONTEXT.equals(element)) {
+    if (!TAG_UNIT.equals(element.getLocalName()) && !TAG_CONTEXT.equals(element.getLocalName()))
+      throw new IllegalArgumentException();
+    
+    final BeanProperty beanProperty = createInjectMetadata(element, 
+        TAG_UNIT.equals(element.getLocalName()) ? EntityManagerFactory.class : EntityManager.class);
+      
+    if (TAG_CONTEXT.equals(element.getLocalName())) {
       Bundle client = getBlueprintBundle(context);
       String unitName = parseUnitName(element);
 
-      Map<String,Object> properties = new HashMap<String, Object>();
+      HashMap<String,Object> properties = new HashMap<String, Object>();
       properties.put(ATTR_TYPE, parseType(element));
       properties.putAll(parseJPAProperties(element, context));
 
       manager.registerContext(unitName, client, properties);      
-      result = createInjectMetadata(element, EntityManager.class);
-    } else {
-      throw new IllegalArgumentException();
     }
     
-    return result;
+    return new BeanMetadata() {
+      
+      public String getId() {
+        return bean.getId();
+      }
+      
+      public List<String> getDependsOn() {
+        return bean.getDependsOn();
+      }
+      
+      public int getActivation() {
+        return bean.getActivation();
+      }
+      
+      public String getScope() {
+        return bean.getScope();
+      }
+      
+      public List<BeanProperty> getProperties() {
+        ArrayList<BeanProperty> result = new ArrayList<BeanProperty>(bean.getProperties());
+        result.add(beanProperty);
+        return result;
+      }
+      
+      public String getInitMethod() {
+        return bean.getInitMethod();
+      }
+      
+      public String getFactoryMethod() {
+        return bean.getFactoryMethod();
+      }
+      
+      public Target getFactoryComponent() {
+        return bean.getFactoryComponent();
+      }
+      
+      public String getDestroyMethod() {
+        return bean.getDestroyMethod();
+      }
+      
+      public String getClassName() {
+        return bean.getClassName();
+      }
+      
+      public List<BeanArgument> getArguments() {
+        return bean.getArguments();
+      }
+    };
+  }
+
+  public Set<Class> getManagedClasses() {
+    return null;
+  }
+
+  public URL getSchemaLocation(String namespace) {
+    return getClass().getResource("jpa.xsd");
+  }
+
+  public Metadata parse(Element element, ParserContext context) {
+    /*
+     * The namespace does not any top-level elements, so we should never get here.
+     * In case we do -> explode.
+     */
+    throw new UnsupportedOperationException();
   }
   
-  private Metadata createInjectMetadata(Element element, Class<?> clazz) {
+  private BeanProperty createInjectMetadata(Element element, Class<?> clazz) {
     String unitName = parseUnitName(element);
     String property = parseProperty(element);
 
     ReferenceMetadataImpl refMetadata = new ReferenceMetadataImpl();
     refMetadata.setInterface(clazz.getName());
-    refMetadata.setFilter("(osgi.unit.name="+unitName+")");
+    if (unitName != null)
+      refMetadata.setFilter("(osgi.unit.name="+unitName+")");
+    else
+      refMetadata.setFilter("(!(osgi.unit.name=*))");
     
     MutableBeanProperty propertyMetadata = new BeanPropertyImpl();
     propertyMetadata.setName(property);
     propertyMetadata.setValue(refMetadata);
     
-    return refMetadata;
+    return propertyMetadata;
   }
   
   private Bundle getBlueprintBundle(ParserContext context) {
@@ -137,9 +203,10 @@
     return element.getAttribute(ATTR_PROPERTY);
   }
 
-  private String parseType(Element element) {
-    return element.hasAttribute(ATTR_TYPE) ? 
-        element.getAttribute(ATTR_TYPE) : TYPE_JTA;
+  private PersistenceContextType parseType(Element element) {
+    String typeName = element.hasAttribute(ATTR_TYPE) ? element.getAttribute(ATTR_TYPE) : TYPE_JTA;
+    
+    return PersistenceContextType.valueOf(typeName);
   }
   
   private String parseUnitName(Element element) {
@@ -153,8 +220,8 @@
     
     for (int i=0; i<ns.getLength(); i++) {
       MapMetadata metadata = context.parseElement(MapMetadata.class, null, (Element) ns.item(i));
-      for (MapEntry entry : metadata.getEntries()) {
-        if (!(entry.getKey() instanceof ValueMetadata) && !(entry.getValue() instanceof ValueMetadata)) {
+      for (MapEntry entry : (List<MapEntry>) metadata.getEntries()) {
+        if (entry.getKey() instanceof ValueMetadata && entry.getValue() instanceof ValueMetadata) {
           ValueMetadata key = (ValueMetadata) entry.getKey();
           ValueMetadata value = (ValueMetadata) entry.getValue();