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