Author: jmarino
Date: Tue Oct  3 00:28:55 2006
New Revision: 452329

URL: http://svn.apache.org/viewvc?view=rev&rev=452329
Log:
minor revisions to JPA extension; add testcase

Added:
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/InvalidInjectionSite.java
   (with props)
    incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/EntityManagerProcessorTestCase.java
   (with props)
Modified:
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/Constants.java
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerFactoryImplementation.java
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerProcessor.java
    
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/JPAAtomicComponent.java

Modified: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/Constants.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/Constants.java?view=diff&rev=452329&r1=452328&r2=452329
==============================================================================
--- 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/Constants.java
 (original)
+++ 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/Constants.java
 Tue Oct  3 00:28:55 2006
@@ -15,10 +15,12 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- */ 
+ */
 package org.apache.tuscany.service.openjpa;
 
 /**
+ * Constants used by the JPA extension
+ *
  * @version $Rev$ $Date$
  */
 public final class Constants {

Modified: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerFactoryImplementation.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerFactoryImplementation.java?view=diff&rev=452329&r1=452328&r2=452329
==============================================================================
--- 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerFactoryImplementation.java
 (original)
+++ 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerFactoryImplementation.java
 Tue Oct  3 00:28:55 2006
@@ -22,6 +22,9 @@
 import org.apache.tuscany.spi.model.ComponentType;
 
 /**
+ * Represents the implementation type of a system service that manages JPA
+ * <code>EntityManagerFactoryImplementation</code> implementations
+ *
  * @version $Rev$ $Date$
  */
 public class EntityManagerFactoryImplementation extends 
AtomicImplementation<ComponentType> {

Modified: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerProcessor.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerProcessor.java?view=diff&rev=452329&r1=452328&r2=452329
==============================================================================
--- 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerProcessor.java
 (original)
+++ 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/EntityManagerProcessor.java
 Tue Oct  3 00:28:55 2006
@@ -18,63 +18,61 @@
  */
 package org.apache.tuscany.service.openjpa;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.lang.reflect.Member;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceContext;
 
+import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
-import 
org.apache.tuscany.spi.implementation.java.ImplementationProcessorExtension;
+import org.apache.tuscany.spi.implementation.java.AbstractPropertyProcessor;
+import 
org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
 import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
-import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
-import org.apache.tuscany.spi.implementation.java.JavaMappedService;
-import org.apache.tuscany.spi.implementation.java.PojoComponentType;
 import org.apache.tuscany.spi.implementation.java.ProcessingException;
 
+
 /**
+ * Evaluates constructors, methods, and fields annotated with [EMAIL 
PROTECTED] PersistenceContext }, creating a mapped property
+ * that will inject an [EMAIL PROTECTED] EntityManager} on an implementation 
instance.
+ *
  * @version $Rev$ $Date$
  */
-public class EntityManagerProcessor extends ImplementationProcessorExtension {
-
-    public void visitMethod(CompositeComponent parent,
-                            Method method,
-                            PojoComponentType<JavaMappedService, 
JavaMappedReference, JavaMappedProperty<?>> type,
-                            DeploymentContext context) throws 
ProcessingException {
+public class EntityManagerProcessor extends 
AbstractPropertyProcessor<PersistenceContext> {
 
-        if (method.getAnnotation(PersistenceContext.class) == null) {
-            return;
-        }
-        // TODO process other JPA annotations
-        addProperty(parent, method, type);
+    public EntityManagerProcessor(@Autowire ImplementationProcessorService 
service) {
+        super(PersistenceContext.class, service);
     }
 
-    public void visitField(CompositeComponent parent, Field field,
-                           PojoComponentType<JavaMappedService, 
JavaMappedReference, JavaMappedProperty<?>> type,
-                           DeploymentContext context) throws 
ProcessingException {
-        if (field.getAnnotation(PersistenceContext.class) == null) {
-            return;
+    protected String getName(PersistenceContext annotation) {
+        String name = annotation.unitName();
+        if (name == null) {
+            return "_defaultJPAPersistenceUnit";
         }
-        // TODO process other JPA annotations
-        addProperty(parent, field, type);
+        return name;
     }
 
-    private void addProperty(CompositeComponent parent,
-                             Member member,
-                             PojoComponentType<JavaMappedService, 
JavaMappedReference, JavaMappedProperty<?>> type)
-        throws ProcessingException {
-        EntityManagerFactory emf = 
parent.resolveInstance(EntityManagerFactory.class);
-        if (emf == null) {
-            ProcessingException e = new 
ProcessingException("EntityManagerFactory not configured in composite");
-            e.setIdentifier(parent.getName());
+    protected <T>JavaMappedProperty<T> createProperty(String name,
+                                                      Class<T> javaType,
+                                                      Member member) throws 
ProcessingException {
+        if (!EntityManager.class.equals(javaType)) {
+            InvalidInjectionSite e =
+                new InvalidInjectionSite("Injection site must by of type " + 
EntityManager.class.getName());
+            e.setIdentifier(name);
             throw e;
         }
-        JavaMappedProperty<EntityManager> prop = new 
JavaMappedProperty<EntityManager>();
-        prop.setMember(member);
-        prop.setName(member.getName());
-        prop.setDefaultValueFactory(new EntityManagerObjectFactory(emf));
-        type.add(prop);
+        return super.createProperty(name, javaType, member);
     }
+
+    @SuppressWarnings("unchecked")
+    protected <T> void initProperty(JavaMappedProperty<T> property,
+                                    PersistenceContext annotation,
+                                    CompositeComponent parent,
+                                    DeploymentContext context) {
+        EntityManagerFactory emf = 
parent.resolveSystemInstance(EntityManagerFactory.class);
+        ObjectFactory factory = new EntityManagerObjectFactory(emf);
+        property.setDefaultValueFactory(factory);
+    }
+
 }

Added: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/InvalidInjectionSite.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/InvalidInjectionSite.java?view=auto&rev=452329
==============================================================================
--- 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/InvalidInjectionSite.java
 (added)
+++ 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/InvalidInjectionSite.java
 Tue Oct  3 00:28:55 2006
@@ -0,0 +1,41 @@
+/*
+ * 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.tuscany.service.openjpa;
+
+import org.apache.tuscany.spi.implementation.java.ProcessingException;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InvalidInjectionSite extends ProcessingException {
+    public InvalidInjectionSite() {
+    }
+
+    public InvalidInjectionSite(String message) {
+        super(message);
+    }
+
+    public InvalidInjectionSite(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public InvalidInjectionSite(Throwable cause) {
+        super(cause);
+    }
+}

Propchange: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/InvalidInjectionSite.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/InvalidInjectionSite.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/JPAAtomicComponent.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/JPAAtomicComponent.java?view=diff&rev=452329&r1=452328&r2=452329
==============================================================================
--- 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/JPAAtomicComponent.java
 (original)
+++ 
incubator/tuscany/java/sca/services/persistence/openjpa/src/main/java/org/apache/tuscany/service/openjpa/JPAAtomicComponent.java
 Tue Oct  3 00:28:55 2006
@@ -30,6 +30,11 @@
 import org.apache.tuscany.spi.extension.SystemAtomicComponentExtension;
 
 /**
+ * A system service that manages a JPA <code>EntityManagerFactory</code>. This 
service is used by [EMAIL PROTECTED]
+ * EntityManagerProcessor} to inject an <code>EntityManager<code> on a 
constructor parameter, field, or method of an
+ * implementation instance. Since a JPA persistence context is specific to an 
application, this system service is scoped
+ * to the application composite. That is, it is contained as a system child of 
the application composite.
+ *
  * @version $Rev$ $Date$
  */
 public class JPAAtomicComponent extends SystemAtomicComponentExtension {

Added: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/EntityManagerProcessorTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/EntityManagerProcessorTestCase.java?view=auto&rev=452329
==============================================================================
--- 
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/EntityManagerProcessorTestCase.java
 (added)
+++ 
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/EntityManagerProcessorTestCase.java
 Tue Oct  3 00:28:55 2006
@@ -0,0 +1,128 @@
+/*
+ * 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.tuscany.service.openjpa;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContext;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.implementation.java.ImplementationProcessor;
+import 
org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
+import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
+import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
+import org.apache.tuscany.spi.implementation.java.JavaMappedService;
+import org.apache.tuscany.spi.implementation.java.PojoComponentType;
+
+import junit.framework.TestCase;
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class EntityManagerProcessorTestCase extends TestCase {
+
+    private ImplementationProcessor processor;
+    private CompositeComponent parent;
+
+    public void testVisitMethod() throws Exception {
+        Method method = Foo.class.getMethod("setBar", EntityManager.class);
+        PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>> type =
+            new PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>>();
+        processor.visitMethod(parent, method, type, null);
+        JavaMappedProperty<?> prop = type.getProperties().get("bar");
+        assertEquals(EntityManagerObjectFactory.class, 
prop.getDefaultValueFactory().getClass());
+    }
+
+    public void testVisitBadMethod() throws Exception {
+        Method method = Foo.class.getMethod("setBadBar", String.class);
+        PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>> type =
+            new PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>>();
+        try {
+            processor.visitMethod(parent, method, type, null);
+            fail();
+        } catch (InvalidInjectionSite e) {
+            // expected
+        }
+    }
+
+    public void testVisitField() throws Exception {
+        Field field = Foo.class.getDeclaredField("bar");
+        PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>> type =
+            new PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>>();
+        processor.visitField(parent, field, type, null);
+        JavaMappedProperty<?> prop = type.getProperties().get("bar");
+        assertEquals(EntityManagerObjectFactory.class, 
prop.getDefaultValueFactory().getClass());
+    }
+
+    public void testBadVisitField() throws Exception {
+        Field field = Foo.class.getDeclaredField("badField");
+        PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>> type =
+            new PojoComponentType<JavaMappedService, JavaMappedReference, 
JavaMappedProperty<?>>();
+        try {
+            processor.visitField(null, field, type, null);
+            fail();
+        } catch (InvalidInjectionSite e) {
+            // expected
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    protected void setUp() throws Exception {
+        super.setUp();
+        EntityManagerFactory emf = 
EasyMock.createMock(EntityManagerFactory.class);
+        EasyMock.replay(emf);
+        parent = EasyMock.createMock(CompositeComponent.class);
+        
EasyMock.expect(parent.resolveSystemInstance(EntityManagerFactory.class)).andReturn(emf).atLeastOnce();
+        EasyMock.replay(parent);
+        ImplementationProcessorService service = 
EasyMock.createMock(ImplementationProcessorService.class);
+        service.addName(EasyMock.isA(List.class), EasyMock.eq(0), 
EasyMock.isA(String.class));
+        EasyMock.expectLastCall().andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                ((List<Object>) 
EasyMock.getCurrentArguments()[0]).add(EasyMock.getCurrentArguments()[2]);
+                return null;
+            }
+        });
+        EasyMock.replay(service);
+        processor = new EntityManagerProcessor(service);
+    }
+
+    private static class Foo {
+
+
+        @PersistenceContext
+        protected EntityManager bar;
+
+        @PersistenceContext
+        protected String badField;
+
+        @PersistenceContext
+        public void setBar(EntityManager d) {
+        }
+
+        @PersistenceContext
+        public void setBadBar(String d) {
+        }
+
+    }
+}

Propchange: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/EntityManagerProcessorTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/services/persistence/openjpa/src/test/java/org/apache/tuscany/service/openjpa/EntityManagerProcessorTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to