You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by cl...@apache.org on 2008/08/28 21:06:36 UTC

svn commit: r689932 - in /jackrabbit/trunk/jackrabbit-ocm/src: main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/ test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/

Author: clombart
Date: Thu Aug 28 12:06:36 2008
New Revision: 689932

URL: http://svn.apache.org/viewvc?rev=689932&view=rev
Log:
Add better suppport of Map. From now, it is not necessary to use an id for object that will be used inside a map. 

See the AnnotationHashMapTest to get an example. 


Modified:
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/DefaultCollectionConverterImpl.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java
    jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/AnnotationHashMapTest.java

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/DefaultCollectionConverterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/DefaultCollectionConverterImpl.java?rev=689932&r1=689931&r2=689932&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/DefaultCollectionConverterImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/DefaultCollectionConverterImpl.java Thu Aug 28 12:06:36 2008
@@ -24,10 +24,15 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.jcr.ItemExistsException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.VersionException;
 
 import org.apache.jackrabbit.ocm.exception.JcrMappingException;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableCollection;
@@ -110,7 +115,17 @@
 
         ClassDescriptor elementClassDescriptor = mapper.getClassDescriptorByClass( ReflectionUtils.forName(collectionDescriptor.getElementClassName()));
 
-        Iterator collectionIterator = objects.getIterator();
+        if (objects instanceof ManageableCollection)
+           insertManageableCollection(session, objects, collectionNode, elementClassDescriptor);
+        else 
+           insertManageableMap(session, objects, collectionNode);
+        	
+    }
+
+	private void insertManageableCollection(Session session,
+			ManageableObjects objects, Node collectionNode,
+			ClassDescriptor elementClassDescriptor) {
+		Iterator collectionIterator = objects.getIterator();
         while (collectionIterator.hasNext()) {
             Object item = collectionIterator.next();
             String elementJcrName = null;
@@ -127,7 +142,19 @@
 
             objectConverter.insert(session, collectionNode, elementJcrName, item);
         }
-    }
+	}
+	
+	private void insertManageableMap(Session session, ManageableObjects objects, Node collectionNode) {
+
+		
+		Map map = (Map) objects.getObjects(); 
+		for (Object key : map.keySet())
+		{
+			Object item = map.get(key);
+			objectConverter.insert(session, collectionNode, key.toString(), item);
+			
+		}
+	}
 
     /**
      *
@@ -158,10 +185,23 @@
     	}
 
     	// update process
+    	if (objects instanceof ManageableCollection)
+           updateManagableCollection(session, parentNode, collectionDescriptor, objects, jcrName);
+    	else
+    	   updateManagableMap(session, parentNode, collectionDescriptor, objects, jcrName);
+    		
+    }
 
-        ClassDescriptor elementClassDescriptor = mapper.getClassDescriptorByClass( ReflectionUtils.forName(collectionDescriptor.getElementClassName()));
+	private void updateManagableCollection(Session session, Node parentNode,
+			CollectionDescriptor collectionDescriptor,
+			ManageableObjects objects, String jcrName)
+			throws PathNotFoundException, RepositoryException,
+			VersionException, LockException, ConstraintViolationException,
+			ItemExistsException {
+		ClassDescriptor elementClassDescriptor = mapper.getClassDescriptorByClass( ReflectionUtils.forName(collectionDescriptor.getElementClassName()));
         Node collectionNode = parentNode.getNode(jcrName);
-        //  If the collection elements have not an id, it is not possible to find the matching JCR nodes => delete the complete collection
+        //  If the collection elements have not an id, it is not possible to find the matching JCR nodes 
+        //  => delete the complete collection
         if (!elementClassDescriptor.hasIdField()) {
             collectionNode.remove();
             collectionNode = parentNode.addNode(jcrName);
@@ -211,7 +251,50 @@
                 ((Node) removeNodes.get(i)).remove();
             }
         }
-    }
+	}
+	
+	
+	private void updateManagableMap(Session session, Node parentNode,
+									CollectionDescriptor collectionDescriptor,
+									ManageableObjects objects, String jcrName)
+									throws PathNotFoundException, RepositoryException,
+									VersionException, LockException, ConstraintViolationException,
+									ItemExistsException {
+		
+		
+		ClassDescriptor elementClassDescriptor = mapper.getClassDescriptorByClass( ReflectionUtils.forName(collectionDescriptor.getElementClassName()));
+        Node collectionNode = parentNode.getNode(jcrName);
+
+        Map map = (Map) objects.getObjects(); 
+        Map updatedItems = new HashMap();
+		for (Object key : map.keySet())
+		{
+			Object item = map.get(key);
+			// Update existing JCR Nodes
+            if (collectionNode.hasNode(key.toString())) {
+                objectConverter.update(session, collectionNode, key.toString(), item);
+            }
+            else {
+                // Add new collection elements
+                objectConverter.insert(session, collectionNode, key.toString(), item);
+            } 
+            updatedItems.put(key.toString(), item);
+		}
+
+		// Delete the nodes that are not present in the Map 
+        NodeIterator nodeIterator = collectionNode.getNodes();
+        List removeNodes = new ArrayList();
+        while (nodeIterator.hasNext()) {
+            Node child = nodeIterator.nextNode();
+            if (!updatedItems.containsKey(child.getName())) {
+                    removeNodes.add(child);
+            }
+        }
+        for(int i = 0; i < removeNodes.size(); i++) {
+            ((Node) removeNodes.get(i)).remove();
+        }
+
+	}
 
     /**
      * @see AbstractCollectionConverterImpl#doGetCollection(Session, Node, CollectionDescriptor, Class)
@@ -236,19 +319,9 @@
             Object item = objectConverter.getObject(session, elementClass, itemNode.getPath());
             if ( objects instanceof ManageableCollection)
             	((ManageableCollection)objects).addObject(item);
-            else {
-            	ClassDescriptor elementClassDescriptor = mapper.getClassDescriptorByClass(elementClass);
-            	if (!elementClassDescriptor.hasIdField())
-            	{
-            		throw new JcrMappingException("Impossible to use a map for the field : "
-            				                      + collectionDescriptor.getFieldName()
-            				                      + " in the class : " + collectionDescriptor.getCollectionClassName()
-            				                      + ". The element objects have no id field (check their OCM mapping).");
-            	}
-            	Object elementId = ReflectionUtils.getNestedProperty(item,
-            			                           elementClassDescriptor.getIdFieldDescriptor().getFieldName());
-                ((ManageableMap) objects).addObject(elementId, item);
-            }
+            else 
+            	((ManageableMap) objects).addObject(itemNode.getName(), item);
+
         }
 
         return objects;

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java?rev=689932&r1=689931&r2=689932&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java Thu Aug 28 12:06:36 2008
@@ -54,9 +54,10 @@
  *
  * This collection mapping strategy maps the collection elements into subnodes based on the same node types.
  *
- * There are 2 constraints in this collection converter :
+ * There are 3 constraints in this collection converter :
  * 1/ this is not possible to have 2 different collections in the main object which are used the same jcr node type for their elements.
  * 2/ this is not possible to make a distinction between an empty collection and an null collection.
+ * 3/ Map are not supported. 
  *
  *
  * If the collection element class contains an id (see the FieldDescriptor definition), this id value is used to build the collection element node name.

Modified: jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/AnnotationHashMapTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/AnnotationHashMapTest.java?rev=689932&r1=689931&r2=689932&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/AnnotationHashMapTest.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/AnnotationHashMapTest.java Thu Aug 28 12:06:36 2008
@@ -96,13 +96,13 @@
             e1.setId("e1");
             e1.setText("Element 1");
             hashMapElement.addObject(e1);
-            map.put("e1", e1);
+            map.put("keyE1", e1);
 
             Element e2 = new Element();
             e2.setId("e2");
             e2.setText("Element 2");
             hashMapElement.addObject(e2);
-            map.put("e2", e2);
+            map.put("keyE2", e2);
 
             main.setHashMapElement(hashMapElement);
             main.setMap(map);
@@ -118,8 +118,12 @@
             assertNotNull("main.getHashMap() is null", main.getMap());
             assertTrue("Incorrect text", main.getText().equals("Main text"));
             map = (Map) main.getHashMapElement().getObjects();
-            assertTrue("Incorrect para element", ((Element) map.get("e1")).getText().equals("Element 1"));
-            assertTrue("Incorrect para element", ((Element) map.get("e1")).getText().equals("Element 1"));
+            assertTrue("Incorrect para element", map.get("e1").getText().equals("Element 1"));
+            assertTrue("Incorrect para element", map.get("e2").getText().equals("Element 2"));
+            
+            map = main.getMap();
+            assertTrue("Incorrect para element", map.get("keyE1").getText().equals("Element 1"));
+            assertTrue("Incorrect para element", map.get("keyE2").getText().equals("Element 2"));
 
             // --------------------------------------------------------------------------------
             // Update the object
@@ -131,19 +135,19 @@
             e1.setId("e1");
             e1.setText("Element 1");
             hashMapElement.addObject(e1);
-            map.put("e1", e1);
+            map.put("keyE1", e1);
 
             e2 = new Element();
             e2.setId("e3");
             e2.setText("Element 3");
             hashMapElement.addObject(e2);
-            map.put("e3", e2);
+            map.put("keyE3", e2);
 
             Element e3 = new Element();
             e3.setId("e4");
             e3.setText("Element 4");
             hashMapElement.addObject(e3);
-            map.put("e4", e3);
+            map.put("keyE4", e3);
 
             main.setHashMapElement(hashMapElement);
             main.setMap(map);
@@ -157,8 +161,12 @@
             assertNotNull("main.getElements() is null", main.getHashMapElement());
             assertTrue("Incorrect text", main.getText().equals("Main text"));
             map = (Map) main.getHashMapElement().getObjects();
-            assertTrue("Incorrect para element", ((Element) map.get("e4")).getText().equals("Element 4"));
-            assertTrue("Incorrect para element", main.getMap().get("e4").getText().equals("Element 4"));
+            assertTrue("Incorrect para element", map.get("e4").getText().equals("Element 4"));
+            assertTrue("Incorrect para element", map.get("e4").getText().equals("Element 4"));
+            
+            map = main.getMap();
+            assertTrue("Incorrect para element", map.get("keyE4").getText().equals("Element 4"));
+            assertTrue("Incorrect para element", map.get("keyE4").getText().equals("Element 4"));
         }
         catch (Exception e)
         {