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]