r6977 - in dumbhippo/trunk/server: src/com/dumbhippo/dm src/com/dumbhippo/dm/schema tests/com/dumbhippo/dm tests/com/dumbhippo/dm/dm tests/com/dumbhippo/dm/persistence



Author: otaylor
Date: 2007-12-05 16:48:52 -0600 (Wed, 05 Dec 2007)
New Revision: 6977

Added:
   dumbhippo/trunk/server/tests/com/dumbhippo/dm/InheritanceTests.java
   dumbhippo/trunk/server/tests/com/dumbhippo/dm/dm/TestSuperUserDMO.java
   dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestSuperUser.java
Modified:
   dumbhippo/trunk/server/src/com/dumbhippo/dm/DataModel.java
   dumbhippo/trunk/server/src/com/dumbhippo/dm/schema/DMClassHolder.java
   dumbhippo/trunk/server/tests/com/dumbhippo/dm/AllTests.java
   dumbhippo/trunk/server/tests/com/dumbhippo/dm/TestSupport.java
   dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestUser.java
Log:
Add simple inheritance facility:

  A @DMO object can derive from another @DMO object with the same 
  key type and will inherit its properties. There is no support for
  "abstract" base classes with properties that aren't exposed as
  resource types, or for properties on interfaces.

DMClassHolder.java: 
  - Add in properties from base classes that are @DMO as well as
    properties on the object itself.
  - Process fields in super classes for injections

TestSuperUser TestSuperUserDMO TestUser InheritanceTests TestSupper: 
  Test inheritance facilities.


Modified: dumbhippo/trunk/server/src/com/dumbhippo/dm/DataModel.java
===================================================================
--- dumbhippo/trunk/server/src/com/dumbhippo/dm/DataModel.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/src/com/dumbhippo/dm/DataModel.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -105,6 +105,9 @@
 	public <K, T extends DMObject<K>> void addDMClass(Class<T> clazz) {
 		if (completed)
 			throw new IllegalStateException("completeDMClasses has already been callled");
+
+		if (classes.get(clazz) != null) // Already added
+			return;
 		
 		DMClassHolder<?,?> classHolder = DMClassHolder.createForClass(this, clazz);
 		classes.put(clazz, classHolder);
@@ -140,7 +143,7 @@
 		
 		return classHolder;
 	}
-
+	
 	public DMClassHolder<?, ?> getClassHolder(String relativeBase) {
 		return classesByBase.get(relativeBase);
 	}

Modified: dumbhippo/trunk/server/src/com/dumbhippo/dm/schema/DMClassHolder.java
===================================================================
--- dumbhippo/trunk/server/src/com/dumbhippo/dm/schema/DMClassHolder.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/src/com/dumbhippo/dm/schema/DMClassHolder.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -205,13 +205,18 @@
 	}
 	
 	public void processInjections(DMSession session, T t) {
-		for (Field field : baseClass.getDeclaredFields()) {
-			if (field.isAnnotationPresent(Inject.class)) {
-				injectField(session, t, field);
-			} else if (field.isAnnotationPresent(EJB.class)) {
-				Object bean = EJBUtil.defaultLookup(field.getType());
-				setField(t, field, bean);			
+		Class<?> clazz = baseClass;
+		while (clazz != null) {
+			for (Field field : clazz.getDeclaredFields()) {
+				if (field.isAnnotationPresent(Inject.class)) {
+					injectField(session, t, field);
+				} else if (field.isAnnotationPresent(EJB.class)) {
+					Object bean = EJBUtil.defaultLookup(field.getType());
+					setField(t, field, bean);			
+				}
 			}
+			
+			clazz = clazz.getSuperclass();
 		}
 	}
 	
@@ -370,7 +375,7 @@
 		List<DMPropertyHolder<K,T,?>> foundProperties = new ArrayList<DMPropertyHolder<K,T,?>>();
 		Map<String, Integer> nameCount = new HashMap<String, Integer>();
 		
-		for (CtMethod method : baseCtClass.getMethods()) {
+		for (CtMethod method : baseCtClass.getDeclaredMethods()) {
 			DMPropertyHolder<K,T,?> property = DMPropertyHolder.getForMethod(model, baseClass, keyClass, method);
 			if (property != null) {
 				foundProperties.add(property);
@@ -381,6 +386,27 @@
 			}
 		}
 		
+		Class<?> parentClass = baseClass.getSuperclass();
+		while (parentClass != null) {
+			DMO parentAnnotation = parentClass.getAnnotation(DMO.class);
+			if (parentAnnotation != null) {
+				DMClassHolder<?,?> parentClassHolder = model.getClassHolder(parentClass);
+				
+				for (int i = 0; i < parentClassHolder.getPropertyCount(); i++) {
+					@SuppressWarnings("unchecked")
+					DMPropertyHolder<K,T,?> property = (DMPropertyHolder<K,T,?>)parentClassHolder.getProperty(i);
+					
+					foundProperties.add(property);
+					if (!nameCount.containsKey(property.getName()))
+						nameCount.put(property.getName(), 1);
+					else
+						nameCount.put(property.getName(), 1 + nameCount.get(property.getName()));
+				}
+			}
+			
+			parentClass = parentClass.getSuperclass();
+		}
+		
 		// Sort the properties based on the ordering we impose on DMPropertyHolder 
 		// (see comment for DMPropertyHolder.computeHash()
 		Collections.sort(foundProperties);

Modified: dumbhippo/trunk/server/tests/com/dumbhippo/dm/AllTests.java
===================================================================
--- dumbhippo/trunk/server/tests/com/dumbhippo/dm/AllTests.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/tests/com/dumbhippo/dm/AllTests.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -24,6 +24,7 @@
         suite.addTest(new TestSuite(FilterTests.class));
         
         suite.addTest(new TestSuite(FeedTests.class));
+        suite.addTest(new TestSuite(InheritanceTests.class));
 
         return suite;
     }

Added: dumbhippo/trunk/server/tests/com/dumbhippo/dm/InheritanceTests.java
===================================================================
--- dumbhippo/trunk/server/tests/com/dumbhippo/dm/InheritanceTests.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/tests/com/dumbhippo/dm/InheritanceTests.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -0,0 +1,48 @@
+package com.dumbhippo.dm;
+
+import javax.persistence.EntityManager;
+
+import org.slf4j.Logger;
+
+import com.dumbhippo.GlobalSetup;
+import com.dumbhippo.dm.dm.TestSuperUserDMO;
+import com.dumbhippo.dm.persistence.TestSuperUser;
+import com.dumbhippo.identity20.Guid;
+import com.dumbhippo.server.NotFoundException;
+
+public class InheritanceTests  extends AbstractSupportedTests {
+	@SuppressWarnings("unused")
+	static private final Logger logger = GlobalSetup.getLogger(InheritanceTests.class);
+
+	public void testInheritance() throws NotFoundException {
+		TestSuperUser superUser;
+		TestSuperUserDMO superUserDMO;
+		EntityManager em;
+		ReadOnlySession session;
+		Guid guid;
+		TestViewpoint viewpoint = new TestViewpoint(Guid.createNew());
+		
+		em = support.beginSessionRW(viewpoint);
+
+		superUser = new TestSuperUser("The Nose", "The ability to tell if leftovers have gone bad");
+		guid = superUser.getGuid();
+		em.persist(superUser);
+
+		em.getTransaction().commit();
+		
+		//////////////////////////////////////
+
+		em = support.beginSessionRO(viewpoint);
+		
+		session = support.currentSessionRO();
+		
+		superUserDMO = session.find(TestSuperUserDMO.class, guid);
+		assertTrue(superUserDMO != null);
+		assertEquals(guid.toString(), superUserDMO.getKey().toString());
+		assertEquals("http://mugshot.org/o/test/superUser/"; + guid, superUserDMO.getResourceId());
+		assertEquals("*The Nose*", superUserDMO.getName());
+		assertEquals("The ability to tell if leftovers have gone bad", superUserDMO.getSuperPower());
+
+		em.getTransaction().commit();
+	}
+}

Modified: dumbhippo/trunk/server/tests/com/dumbhippo/dm/TestSupport.java
===================================================================
--- dumbhippo/trunk/server/tests/com/dumbhippo/dm/TestSupport.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/tests/com/dumbhippo/dm/TestSupport.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -13,6 +13,7 @@
 import com.dumbhippo.dm.dm.TestBlogEntryDMO;
 import com.dumbhippo.dm.dm.TestGroupDMO;
 import com.dumbhippo.dm.dm.TestGroupMemberDMO;
+import com.dumbhippo.dm.dm.TestSuperUserDMO;
 import com.dumbhippo.dm.dm.TestUserDMO;
 
 public class TestSupport {
@@ -39,6 +40,7 @@
 							  TestViewpoint.class,
 							  new TestViewpoint(null));
 		model.addDMClass(TestUserDMO.class);
+		model.addDMClass(TestSuperUserDMO.class);
 		model.addDMClass(TestGroupDMO.class);
 		model.addDMClass(TestGroupMemberDMO.class);
 		model.addDMClass(TestBlogEntryDMO.class);

Added: dumbhippo/trunk/server/tests/com/dumbhippo/dm/dm/TestSuperUserDMO.java
===================================================================
--- dumbhippo/trunk/server/tests/com/dumbhippo/dm/dm/TestSuperUserDMO.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/tests/com/dumbhippo/dm/dm/TestSuperUserDMO.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -0,0 +1,29 @@
+package com.dumbhippo.dm.dm;
+
+import org.slf4j.Logger;
+
+import com.dumbhippo.GlobalSetup;
+import com.dumbhippo.dm.annotations.DMO;
+import com.dumbhippo.dm.annotations.DMProperty;
+import com.dumbhippo.dm.persistence.TestSuperUser;
+import com.dumbhippo.identity20.Guid;
+
+ DMO(classId="http://mugshot.org/p/o/test/superUser";, resourceBase="/o/test/superUser")
+public abstract class TestSuperUserDMO extends TestUserDMO {
+	@SuppressWarnings("unused")
+	static private final Logger logger = GlobalSetup.getLogger(TestSuperUserDMO.class);
+
+	protected TestSuperUserDMO(Guid key) {
+		super(key);
+	}
+
+	@DMProperty(defaultInclude=true)
+	public String getSuperPower() {
+		return ((TestSuperUser)user).getSuperPower();
+	}
+	
+	@Override
+	public String getName() {
+		return "*" + super.getName() + "*";
+	}
+}

Added: dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestSuperUser.java
===================================================================
--- dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestSuperUser.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestSuperUser.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -0,0 +1,26 @@
+package com.dumbhippo.dm.persistence;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+ Entity
+public class TestSuperUser extends TestUser {
+	private String superPower;
+
+	protected TestSuperUser() {
+	}
+	
+	public TestSuperUser(String name, String superPower) {
+		super(name);
+		this.superPower = superPower;
+	}
+
+	@Column
+	public String getSuperPower() {
+		return superPower;
+	}
+
+	public void setSuperPower(String superPower) {
+		this.superPower = superPower;
+	}
+}

Modified: dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestUser.java
===================================================================
--- dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestUser.java	2007-12-05 21:51:31 UTC (rev 6976)
+++ dumbhippo/trunk/server/tests/com/dumbhippo/dm/persistence/TestUser.java	2007-12-05 22:48:52 UTC (rev 6977)
@@ -5,9 +5,12 @@
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
 import javax.persistence.OneToMany;
 
 @Entity
+ Inheritance(strategy = InheritanceType.JOINED)
 public class TestUser extends TestGuidPersistable {
 	private String name;
 	private Set<TestGroupMember> groupMembers;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]