From: <id...@us...> - 2009-03-09 18:10:04
|
Revision: 68 http://cse-ip.svn.sourceforge.net/cse-ip/?rev=68&view=rev Author: idueppe Date: 2009-03-09 18:09:08 +0000 (Mon, 09 Mar 2009) Log Message: ----------- Extracted the annotation injection code for unit testing into a separate project. Modified Paths: -------------- cse-ip/trunk/sandbox/cse-ip/pom.xml Added Paths: ----------- cse-ip/trunk/sandbox/cse-ip/framework/ cse-ip/trunk/sandbox/cse-ip/framework/pom.xml cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/.classpath cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/pom.xml cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjectionException.java cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjector.java cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationProcessor.java cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/common/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/common/test/ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/common/test/TestAnnotationInjector.java Added: cse-ip/trunk/sandbox/cse-ip/framework/pom.xml =================================================================== --- cse-ip/trunk/sandbox/cse-ip/framework/pom.xml (rev 0) +++ cse-ip/trunk/sandbox/cse-ip/framework/pom.xml 2009-03-09 18:09:08 UTC (rev 68) @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <parent> + <artifactId>cse-ip</artifactId> + <groupId>de.campussource.cse</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <groupId>de.campussource.cse</groupId> + <artifactId>framework</artifactId> + <packaging>pom</packaging> + <name>Framework</name> + <version>1.0-SNAPSHOT</version> + + <modules> + <module>test-utilities</module> + </modules> +</project> \ No newline at end of file Property changes on: cse-ip/trunk/sandbox/cse-ip/framework/pom.xml ___________________________________________________________________ Added: svn:mime-type + text/plain Added: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/.classpath =================================================================== --- cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/.classpath (rev 0) +++ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/.classpath 2009-03-09 18:09:08 UTC (rev 68) @@ -0,0 +1,17 @@ +<classpath> + <classpathentry kind="src" path="src/main/java"/> + <classpathentry kind="src" path="src/test/java" output="target/test-classes"/> + <classpathentry kind="output" path="target/classes"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> + <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar" sourcepath="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/easymock/easymock/2.2/easymock-2.2.jar" sourcepath="M2_REPO/org/easymock/easymock/2.2/easymock-2.2-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/easymock/easymockclassextension/2.2/easymockclassextension-2.2.jar" sourcepath="M2_REPO/org/easymock/easymockclassextension/2.2/easymockclassextension-2.2-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/javax/ejb/ejb-api/3.0/ejb-api-3.0.jar" sourcepath="M2_REPO/javax/ejb/ejb-api/3.0/ejb-api-3.0-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/junit/junit/4.4/junit-4.4.jar" sourcepath="M2_REPO/junit/junit/4.4/junit-4.4-sources.jar"> + <attributes> + <attribute value="jar:file:/D:/development/repository/junit/junit/4.4/junit-4.4-javadoc.jar!/" name="javadoc_location"/> + </attributes> + </classpathentry> + <classpathentry kind="var" path="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar" sourcepath="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/toplink/essentials/toplink-essentials/2.1-60e/toplink-essentials-2.1-60e.jar" sourcepath="M2_REPO/toplink/essentials/toplink-essentials/2.1-60e/toplink-essentials-2.1-60e-sources.jar"/> +</classpath> \ No newline at end of file Property changes on: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/.classpath ___________________________________________________________________ Added: svn:mime-type + text/plain Added: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/pom.xml =================================================================== --- cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/pom.xml (rev 0) +++ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/pom.xml 2009-03-09 18:09:08 UTC (rev 68) @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <parent> + <artifactId>framework</artifactId> + <groupId>de.campussource.cse</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <groupId>de.campussource.cse</groupId> + <artifactId>test-utilities</artifactId> + <packaging>jar</packaging> + <name>Framework Test Utilities</name> + <version>1.0-SNAPSHOT</version> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymock</artifactId> + <version>2.2</version> + </dependency> + <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymockclassextension</artifactId> + <version>2.2</version> + </dependency> + + <dependency> + <groupId>javax.ejb</groupId> + <artifactId>ejb-api</artifactId> + <version>3.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>toplink.essentials</groupId> + <artifactId>toplink-essentials</artifactId> + <version>2.1-60e</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>javax.persistence</groupId> + <artifactId>persistence-api</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file Property changes on: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/pom.xml ___________________________________________________________________ Added: svn:mime-type + text/plain Added: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjectionException.java =================================================================== --- cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjectionException.java (rev 0) +++ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjectionException.java 2009-03-09 18:09:08 UTC (rev 68) @@ -0,0 +1,33 @@ +package de.campussource.cse.common.test; + +/** + * Generell exception if something went wrong during injection. + * + * @author Ingo Dueppe + * + */ +public class AnnotationInjectionException extends RuntimeException { + private static final long serialVersionUID = 7995450539390210857L; + + public AnnotationInjectionException() { + super(); + } + + public AnnotationInjectionException(String message, Throwable cause) { + super(message, cause); + } + + public AnnotationInjectionException(String message) { + super(message); + } + + public AnnotationInjectionException(Throwable message) { + super(message); + } + + + public AnnotationInjectionException(Object target, Throwable cause) { + super(target.getClass().getCanonicalName(),cause); + } + +} Property changes on: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjectionException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjector.java =================================================================== --- cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjector.java (rev 0) +++ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjector.java 2009-03-09 18:09:08 UTC (rev 68) @@ -0,0 +1,94 @@ +package de.campussource.cse.common.test; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.ejb.EJB; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + + +public class AnnotationInjector { + + private Map<String, Object> context = new HashMap<String, Object>(); + + public AnnotationInjector autowire(Object object) { + intoContextByClassName(object); + autowireByField(object); + return this; + } + + public AnnotationInjector defaultPersistentUnit(EntityManager entityManager) { + addPersistenceUnit(PersistenceContext.class.getName(), entityManager); + return this; + } + + public AnnotationInjector addPersistenceUnit(String persistentUnit, EntityManager entityManager) { + context.put(persistentUnit, entityManager); + return this; + } + + private void intoContextByClassName(Object target) { + context.put(target.getClass().getName(), target); + } + + private void injectField(Object object, Field field, Object reference) { + boolean accessible = field.isAccessible(); + field.setAccessible(true); + try { + field.set(object, reference); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + field.setAccessible(accessible); + } + + protected void autowireByField(Object object) { + Field[] fields = retrieveAllDeclaredFieldsIncludedInheritance(object); + for (Field field : fields) { + if (field.isAnnotationPresent(PersistenceContext.class)) { + PersistenceContext annotation = field.getAnnotation(PersistenceContext.class); + Object target = null; + if (annotation.name().isEmpty()) { + // inject default persistence unit + target = context.get(PersistenceContext.class.getName()); + } else { + target = context.get(annotation.name()); + } + injectField(object, field, target); + } + if (field.isAnnotationPresent(EJB.class)) { + try { + Class fieldClass = field.getType(); + Object target = context.get(fieldClass.getName()); + if (target == null) { + target = fieldClass.newInstance(); + autowire(target); + context.put(fieldClass.getName(), target); + } + injectField(object, field, target); + } catch (InstantiationException e) { + throw new AnnotationInjectionException(object, e); + } catch (IllegalAccessException e) { + throw new AnnotationInjectionException(object, e); + } + } + } + } + + private Field[] retrieveAllDeclaredFieldsIncludedInheritance(Object object) { + List<Field> fields = new ArrayList<Field>(); + Class clazz = object.getClass(); + while (clazz != null) { + fields.addAll(Arrays.asList(clazz.getDeclaredFields())); + clazz = clazz.getSuperclass(); + } + return (Field[]) fields.toArray(new Field[fields.size()]); + } +} Property changes on: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationInjector.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationProcessor.java =================================================================== --- cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationProcessor.java (rev 0) +++ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationProcessor.java 2009-03-09 18:09:08 UTC (rev 68) @@ -0,0 +1,5 @@ +package de.campussource.cse.common.test; + +public interface AnnotationProcessor { + +} Property changes on: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/main/java/de/campussource/cse/common/test/AnnotationProcessor.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/common/test/TestAnnotationInjector.java =================================================================== --- cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/common/test/TestAnnotationInjector.java (rev 0) +++ cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/common/test/TestAnnotationInjector.java 2009-03-09 18:09:08 UTC (rev 68) @@ -0,0 +1,88 @@ +package de.campussource.cse.common.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import javax.ejb.EJB; +import javax.ejb.Stateful; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.easymock.classextension.EasyMock; +import org.junit.Test; + + +public class TestAnnotationInjector { + + @Test + public void testEJBInjection() { + AnnotationInjector injector = new AnnotationInjector(); + + BeanOne beanOne = new BeanOne(); + injector.autowire(beanOne); + + assertNotNull(beanOne.two); + assertNotNull(beanOne.two.one); + assertNotNull(beanOne.two.three.one); + assertEquals(beanOne, beanOne.two.one); + assertEquals(beanOne, beanOne.two.three.one); + } + + @Test + public void testPersistenceInjection() { + EntityManager em = EasyMock.createMock(EntityManager.class); + AnnotationInjector injector = new AnnotationInjector().defaultPersistentUnit(em); + + BeanOne beanOne = new BeanOne(); + injector.autowire(beanOne); + + assertNotNull(beanOne.context); + assertEquals(em, beanOne.context); + } + + @Test(expected=AnnotationInjectionException.class) + public void testInjectionError() { + new AnnotationInjector().autowire(new BeanError()); + } + + @Stateless + public static class BeanError { + @SuppressWarnings("unused") + @EJB + private NoBean bean; + } + + @Stateless + public static class NoBean { + public NoBean(BeanError error) { + } + } + + + @Stateless + public static class BeanOne { + @EJB + private BeanTwo two; + + @PersistenceContext + private EntityManager context; + } + + @Stateless + public static class BeanTwo { + @EJB + private BeanOne one; + @EJB + private BeanThree three; + } + + @Stateful + public static class BeanThree { + @EJB + private BeanOne one; + } + + + +} Property changes on: cse-ip/trunk/sandbox/cse-ip/framework/test-utilities/src/test/java/de/campussource/cse/common/test/TestAnnotationInjector.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: cse-ip/trunk/sandbox/cse-ip/pom.xml =================================================================== --- cse-ip/trunk/sandbox/cse-ip/pom.xml 2009-03-09 16:22:06 UTC (rev 67) +++ cse-ip/trunk/sandbox/cse-ip/pom.xml 2009-03-09 18:09:08 UTC (rev 68) @@ -47,6 +47,7 @@ </organization> <modules> + <module>framework</module> <module>ica-his-lsf</module> <module>sc-idmapper</module> <module>cse-ip-application</module> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |