You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2010/11/10 17:34:23 UTC
svn commit: r1033573 - in /cayenne/sandbox/cayenne-mixin/branches/3.0: ./
src/main/java/org/apache/cayenne/mixin/
src/test/java/org/apache/cayenne/mixin/
Author: aadamchik
Date: Wed Nov 10 16:34:23 2010
New Revision: 1033573
URL: http://svn.apache.org/viewvc?rev=1033573&view=rev
Log:
a way to get the handlers back from MixinHandlerManager
Added:
cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MockMixinHandler.java
Modified:
cayenne/sandbox/cayenne-mixin/branches/3.0/pom.xml
cayenne/sandbox/cayenne-mixin/branches/3.0/src/main/java/org/apache/cayenne/mixin/MixinHandlerManager.java
cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MixinHandlerManagerTest.java
Modified: cayenne/sandbox/cayenne-mixin/branches/3.0/pom.xml
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-mixin/branches/3.0/pom.xml?rev=1033573&r1=1033572&r2=1033573&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-mixin/branches/3.0/pom.xml (original)
+++ cayenne/sandbox/cayenne-mixin/branches/3.0/pom.xml Wed Nov 10 16:34:23 2010
@@ -8,7 +8,7 @@
<version>3.0.1</version>
</parent>
<artifactId>cayenne-mixin</artifactId>
- <version>3.0.0.1</version>
+ <version>3.0.0.2</version>
<name>Library: cayenne-mixin</name>
<packaging>jar</packaging>
<properties>
Modified: cayenne/sandbox/cayenne-mixin/branches/3.0/src/main/java/org/apache/cayenne/mixin/MixinHandlerManager.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-mixin/branches/3.0/src/main/java/org/apache/cayenne/mixin/MixinHandlerManager.java?rev=1033573&r1=1033572&r2=1033573&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-mixin/branches/3.0/src/main/java/org/apache/cayenne/mixin/MixinHandlerManager.java (original)
+++ cayenne/sandbox/cayenne-mixin/branches/3.0/src/main/java/org/apache/cayenne/mixin/MixinHandlerManager.java Wed Nov 10 16:34:23 2010
@@ -20,6 +20,8 @@ package org.apache.cayenne.mixin;
import java.lang.annotation.Annotation;
import java.lang.annotation.Inherited;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataObject;
@@ -33,15 +35,24 @@ import org.apache.cayenne.util.Util;
*/
public class MixinHandlerManager {
+ protected ConcurrentMap<Class<?>, MixinHandler<?>> handlers;
protected EntityResolver entityResolver;
public MixinHandlerManager(EntityResolver entityResolver) {
+ this.handlers = new ConcurrentHashMap<Class<?>, MixinHandler<?>>();
this.entityResolver = entityResolver;
}
@SuppressWarnings("all")
public void addMixinHandler(MixinHandler<?> handler) {
+ // we allow multiple handler types for the same mixin, but each handler
+ // class must be unique
+ if (handlers.putIfAbsent(handler.getClass(), handler) != null) {
+ throw new IllegalStateException("A handler of type "
+ + handler.getClass().getName() + " is already registered");
+ }
+
Class<? extends Annotation> type = handler.getMixinType();
boolean inherited = type.isAnnotationPresent(Inherited.class);
@@ -71,4 +82,13 @@ public class MixinHandlerManager {
} while (inherited && entityTypeOrSupertype != null);
}
}
+
+ /**
+ * Returns a previously registered {@link MixinHandler} or null if no
+ * handler of a given type is registered.
+ */
+ @SuppressWarnings("all")
+ public <T extends MixinHandler<?>> T getMixinHandler(Class<T> handlerType) {
+ return (T) handlers.get(handlerType);
+ }
}
Modified: cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MixinHandlerManagerTest.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MixinHandlerManagerTest.java?rev=1033573&r1=1033572&r2=1033573&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MixinHandlerManagerTest.java (original)
+++ cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MixinHandlerManagerTest.java Wed Nov 10 16:34:23 2010
@@ -21,6 +21,7 @@ package org.apache.cayenne.mixin;
import junit.framework.TestCase;
import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.DataObject;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.ObjEntity;
@@ -35,18 +36,18 @@ public class MixinHandlerManagerTest ext
public void testAddMixinHandler() {
EntityResolver resolver = new EntityResolver();
-
+
DataMap map = new DataMap("m");
ObjEntity e1 = new ObjEntity("x");
e1.setClassName(MockMixinDataObject.class.getName());
map.addObjEntity(e1);
-
+
ObjEntity e2 = new ObjEntity("y");
e2.setClassName(CayenneDataObject.class.getName());
map.addObjEntity(e2);
-
+
resolver.addDataMap(map);
-
+
MixinHandlerManager mixinHandlerManager = new MixinHandlerManager(
resolver);
@@ -72,4 +73,60 @@ public class MixinHandlerManagerTest ext
mixinHandlerManager.addMixinHandler(handler);
assertEquals(1, counter[0]);
}
+
+ public void testAddMixinHandlerDupes() {
+ EntityResolver resolver = new EntityResolver();
+ MixinHandlerManager mixinHandlerManager = new MixinHandlerManager(
+ resolver);
+
+ mixinHandlerManager.addMixinHandler(new MockMixinHandler());
+
+ // disallow dupes for same TYPE of handler
+ try {
+ mixinHandlerManager.addMixinHandler(new MockMixinHandler());
+ fail("dupe handler not detected");
+ } catch (IllegalStateException e) {
+ // expected
+ }
+
+ // allow dupes for different handlers for the same mixin
+ mixinHandlerManager.addMixinHandler(new MixinHandler<MockMixin>() {
+ @Override
+ public void addMixin(Class<? extends DataObject> entityType) {
+ // noop
+ }
+
+ @Override
+ public Class<MockMixin> getMixinType() {
+ return MockMixin.class;
+ }
+ });
+ }
+
+ public void testGetMixinHandler() {
+ EntityResolver resolver = new EntityResolver();
+ MixinHandlerManager mixinHandlerManager = new MixinHandlerManager(
+ resolver);
+
+ MixinHandler<MockMixin> h1 = new MockMixinHandler();
+
+ MixinHandler<MockMixin> h2 = new MixinHandler<MockMixin>() {
+ @Override
+ public void addMixin(Class<? extends DataObject> entityType) {
+ // noop
+ }
+
+ @Override
+ public Class<MockMixin> getMixinType() {
+ return MockMixin.class;
+ }
+ };
+
+ mixinHandlerManager.addMixinHandler(h2);
+ assertNull(mixinHandlerManager.getMixinHandler(MockMixinHandler.class));
+
+ mixinHandlerManager.addMixinHandler(h1);
+ assertSame(h1, mixinHandlerManager
+ .getMixinHandler(MockMixinHandler.class));
+ }
}
Added: cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MockMixinHandler.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MockMixinHandler.java?rev=1033573&view=auto
==============================================================================
--- cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MockMixinHandler.java (added)
+++ cayenne/sandbox/cayenne-mixin/branches/3.0/src/test/java/org/apache/cayenne/mixin/MockMixinHandler.java Wed Nov 10 16:34:23 2010
@@ -0,0 +1,16 @@
+package org.apache.cayenne.mixin;
+
+import org.apache.cayenne.DataObject;
+
+public class MockMixinHandler implements MixinHandler<MockMixin> {
+
+ @Override
+ public void addMixin(Class<? extends DataObject> entityType) {
+ // noop
+ }
+
+ @Override
+ public Class<MockMixin> getMixinType() {
+ return MockMixin.class;
+ }
+}