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/10/15 21:57:31 UTC

svn commit: r705010 - in /jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter: ObjectConverter.java impl/ObjectConverterImpl.java

Author: clombart
Date: Wed Oct 15 12:57:31 2008
New Revision: 705010

URL: http://svn.apache.org/viewvc?rev=705010&view=rev
Log:
this is the second patch provided by Boni Gopalan for issue JCR-1784 (The UUID of the collection elements changes on update). 

Modified:
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ObjectConverter.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ObjectConverter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ObjectConverter.java?rev=705010&r1=705009&r2=705010&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ObjectConverter.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ObjectConverter.java Wed Oct 15 12:57:31 2008
@@ -108,6 +108,16 @@
 	 * Update the object
 	 *
 	 * @param session the JCR session
+	 * @param objectNode The node to store the object
+	 * @param object the object to update
+	 * @throws ObjectContentManagerException when it is not possible to update the object
+	 */
+    public void update(Session session, Node objectNode, Object object) throws ObjectContentManagerException;
+    
+	/**
+	 * Update the object
+	 *
+	 * @param session the JCR session
 	 * @param parentNode The parent node used to store the new JCR element (object)
 	 * @param nodeName The node name used to store the object
 	 * @param object the object to update

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java?rev=705010&r1=705009&r2=705010&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java Wed Oct 15 12:57:31 2008
@@ -21,6 +21,7 @@
 import java.util.Map;
 
 import javax.jcr.Node;
+import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -64,6 +65,7 @@
  *
  * @author <a href="mailto:christophe.lombart@gmail.com">Lombart  Christophe </a>
  * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
+ * @author <a href='mailto:boni.g@bioimagene.com'>Boni Gopalan</a>
  */
 public class ObjectConverterImpl implements ObjectConverter {
 
@@ -275,32 +277,21 @@
 		try {
 			ClassDescriptor classDescriptor = mapper.getClassDescriptorByClass(ReflectionUtils.getBeanClass(object));
 			Node objectNode = session.getNodeByUUID(uuId);
-
-			checkNodeType(session, classDescriptor);
-
-			checkCompatiblePrimaryNodeTypes(session, objectNode, classDescriptor, false);
-
-			simpleFieldsHelp.storeSimpleFields(session, object, classDescriptor, objectNode);
-			updateBeanFields(session, object, classDescriptor, objectNode);
-			updateCollectionFields(session, object, classDescriptor, objectNode);
-			simpleFieldsHelp.refreshUuidPath(session, classDescriptor, objectNode, object);
+			update(session, objectNode, object);
 		} catch (PathNotFoundException pnfe) {
 			throw new ObjectContentManagerException("Impossible to update the object with UUID: " + uuId , pnfe);
 		} catch (RepositoryException re) {
 			throw new org.apache.jackrabbit.ocm.exception.RepositoryException("Impossible to update the object with UUID: " + uuId, re);
 		}
 	}
-	
-	
+
 	/**
 	 *
 	 * @see org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter#update(javax.jcr.Session,
-	 *      javax.jcr.Node, java.lang.String, java.lang.Object)
+	 *      javax.jcr.Node, java.lang.Object)
 	 */
-	public void update(Session session, Node parentNode, String nodeName, Object object) {
-		try {
+	public void update(Session session, Node objectNode, Object object) {
 			ClassDescriptor classDescriptor = mapper.getClassDescriptorByClass(ReflectionUtils.getBeanClass(object));
-			Node objectNode = parentNode.getNode(nodeName);
 
 			checkNodeType(session, classDescriptor);
 
@@ -310,6 +301,19 @@
 			updateBeanFields(session, object, classDescriptor, objectNode);
 			updateCollectionFields(session, object, classDescriptor, objectNode);
 			simpleFieldsHelp.refreshUuidPath(session, classDescriptor, objectNode, object);
+	}
+	
+
+	/**
+	 *
+	 * @see org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter#update(javax.jcr.Session,
+	 *      javax.jcr.Node, java.lang.String, java.lang.Object)
+	 */
+	public void update(Session session, Node parentNode, String nodeName, Object object) {
+		try {
+			ClassDescriptor classDescriptor = mapper.getClassDescriptorByClass(ReflectionUtils.getBeanClass(object));
+			Node objectNode = getNode(parentNode,classDescriptor,nodeName,object);
+			update(session, objectNode, object);
 		} catch (PathNotFoundException pnfe) {
 			throw new ObjectContentManagerException("Impossible to update the object: " + nodeName + " at node : " + parentNode, pnfe);
 		} catch (RepositoryException re) {
@@ -319,6 +323,36 @@
 	}
 
 	/**
+	 * 
+	 * @param parentNode the parent node at which to look for the node element.
+	 * @param nodeName the node name to look for
+	 * @param object the data.
+	 * @param classDescriptor
+	 * @return The child node we are interested in.
+	 */
+	private Node getNode(Node parentNode, ClassDescriptor classDescriptor, String nodeName, Object object) throws RepositoryException{
+		if (parentNode == null) return null;
+		NodeIterator nodes = parentNode.getNodes(nodeName);
+		if (nodes.getSize() == 1) return nodes.nextNode();
+		if (classDescriptor.hasUUIdField()){
+            String uuidFieldName = classDescriptor.getUuidFieldDescriptor().getFieldName();
+            Object objUuid = ReflectionUtils.getNestedProperty(object, uuidFieldName);
+        	String currentItemUuid = (objUuid == null) ? null : objUuid.toString();
+        	if (currentItemUuid != null){
+        		//The Node already exists so we need to update the existing node 
+        		//rather than to replace it.
+        		return parentNode.getSession().getNodeByUUID(currentItemUuid);
+        	}
+        	else{
+        		throw new NullPointerException("Cannot locate the node to update since there is no UUID provided even though, " + classDescriptor.getClassName() + " has been mapped with a UUID field , " + uuidFieldName );
+        	}
+        		
+		}
+		return parentNode.getNode(nodeName);
+		
+	}
+	
+	/**
 	 * @see org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter#getObject(javax.jcr.Session,
 	 *      java.lang.Class, java.lang.String)
 	 */