You are viewing a plain text version of this content. The canonical link for it is here.
Posted to graffito-commits@incubator.apache.org by cl...@apache.org on 2005/09/08 21:27:51 UTC

svn commit: r279633 - in /incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter: CollectionConverter.java impl/AbstractCollectionConverterImpl.java impl/DefaultCollectionConverterImpl.java

Author: clombart
Date: Thu Sep  8 14:27:46 2005
New Revision: 279633

URL: http://svn.apache.org/viewcvs?rev=279633&view=rev
Log:
Work on the CollectionDescriptor. 

Modified:
    incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/CollectionConverter.java
    incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/AbstractCollectionConverterImpl.java
    incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java

Modified: incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/CollectionConverter.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/CollectionConverter.java?rev=279633&r1=279632&r2=279633&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/CollectionConverter.java (original)
+++ incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/CollectionConverter.java Thu Sep  8 14:27:46 2005
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2004 The Apache Software Foundation.
+ * Copyright 2000-2005 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,8 +15,6 @@
  */
 package org.apache.portals.graffito.jcr.persistence.collectionconverter;
 
-import java.util.Collection;
-
 import javax.jcr.Node;
 import javax.jcr.Session;
 
@@ -24,21 +22,18 @@
 import org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor;
 
 /**
- * Convert any kind of Collection into severals JCR nodes
+ * Convert any kind of {@link ManageableCollection} into severals JCR nodes.
  * 
  * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
- * @version $Id: Exp $
+ * 
  */
 public interface CollectionConverter
 {
 
-    public void insertCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor,
-            Object object) throws JcrMappingException;
+    public void insertCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, ManageableCollection collection) throws JcrMappingException;
 
-    public void updateCollection(Session session, Node objectNode, CollectionDescriptor collectionDescriptor,
-            Object object) throws JcrMappingException;
+    public void updateCollection(Session session, Node objectNode, CollectionDescriptor collectionDescriptor, ManageableCollection collection) throws JcrMappingException;
 
-    public Collection getCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor,
-            Class collectionFieldClass) throws JcrMappingException;
+    public ManageableCollection getCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, Class collectionFieldClass) throws JcrMappingException;
 
 }

Modified: incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/AbstractCollectionConverterImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/AbstractCollectionConverterImpl.java?rev=279633&r1=279632&r2=279633&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/AbstractCollectionConverterImpl.java (original)
+++ incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/AbstractCollectionConverterImpl.java Thu Sep  8 14:27:46 2005
@@ -16,6 +16,7 @@
 
 package org.apache.portals.graffito.jcr.persistence.collectionconverter.impl;
 
+import org.apache.portals.graffito.jcr.mapper.Mapper;
 import org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter;
 
 /** 
@@ -26,10 +27,13 @@
 public abstract class AbstractCollectionConverterImpl
 {
     protected ObjectConverter objectConverter;
+    protected Mapper mapper;
     
-    public AbstractCollectionConverterImpl(ObjectConverter objectConverter)
+    
+    public AbstractCollectionConverterImpl(ObjectConverter objectConverter, Mapper mapper)
     {
         this.objectConverter = objectConverter;
+        this.mapper = mapper;
     }
 
 

Modified: incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java?rev=279633&r1=279632&r2=279633&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java (original)
+++ incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java Thu Sep  8 14:27:46 2005
@@ -16,11 +16,7 @@
 
 package org.apache.portals.graffito.jcr.persistence.collectionconverter.impl;
 
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -28,12 +24,42 @@
 
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.portals.graffito.jcr.exception.JcrMappingException;
+import org.apache.portals.graffito.jcr.mapper.Mapper;
+import org.apache.portals.graffito.jcr.mapper.model.ClassDescriptor;
 import org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor;
 import org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter;
+import org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection;
+import org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollectionUtil;
 import org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter;
 
 /** 
- *
+ * Default Collection Mapping/convertion implementation.
+ * 
+ * This collection mapping strategy maps a collection under an extra JCR node (specify by the jcrName).
+ * It can be usefull when the node type "nt:unstructured" is used for the collection elements. By this way, it is possible 
+ * to distinguish the collection elements from the other main object fields.
+ * 
+ * If the collection element class contains an id (see the FieldDescriptor definition), this id value is used to build the collection element node.
+ * Otherwise, the name is a simple indexed constant.
+ * 
+ * Example - without an id attribute:                 
+ *   /test (Main object containing the collection field )
+ *     /mycollection (extra node used to store the entire collection)
+ *          /collection-element1 (node used to store the first collection element)
+ *                /item-prop       
+ *                ....
+ *          /collection-element2 (node used to store the second collection element) 
+ *          ...
+ *          
+ * Example - with an id attribute:                 
+ *   /test (Main object containing the collection field )
+ *     /mycollection (extra node used to store the entire collection)
+ *          /aValue (id value assigned to the first element)
+ *                /item-prop       
+ *                ....
+ *          /anotherValue (id value assigned to the first element) 
+ *          ...
+
  * @author <a href="mailto:christophe.lombart@gmail.com">Christophe Lombart</a>
  * 
  */
@@ -41,86 +67,106 @@
 {
         
 
-    public DefaultCollectionConverterImpl(ObjectConverter objectConverter)
+    private static final String COLLECTION_ELEMENT_NAME = "collection-element";
+
+    public DefaultCollectionConverterImpl(ObjectConverter objectConverter, Mapper mapper)
     {
-        super(objectConverter);
+        super(objectConverter, mapper);
     }
 
     /**
-     * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#insertCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, java.lang.Object)
+     * 
+     * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#insertCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection)
      */
-    public void insertCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, Object object) throws JcrMappingException
+    public void insertCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, ManageableCollection collection) throws JcrMappingException
     {
-        
+
         try
         {
             String jcrName = collectionDescriptor.getJcrName();
-            String fieldIdName = collectionDescriptor.getFieldId();
-            Node collectionNode = null;
-            
-            // If a jcrName is defined for this collection : add or get the node used for the collection                
-            if (jcrName != null)
-            {
-                collectionNode = parentNode.addNode(jcrName);
-            }
-            else
+
+            if (jcrName == null)
             {
-                collectionNode = parentNode; 
+                throw new JcrMappingException("The JcrName attribute is not defined for the CollectionDescriptor : "
+                        + collectionDescriptor.getCollectionConverterClassName());
             }
-            
-           
-            Collection collection = (Collection) PropertyUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
-            
-            Iterator collectionIterator = collection.iterator();
-            while(collectionIterator.hasNext())
+
+            Node collectionNode = parentNode.addNode(jcrName);
+
+            Iterator collectionIterator = collection.getIterator();
+            ClassDescriptor elementClassDescriptor = mapper.getClassDescriptor(Class.forName(collectionDescriptor.getElementClassName()));
+
+            int elementCollectionCount = 0;
+            while (collectionIterator.hasNext())
             {
                 Object item = collectionIterator.next();
-                String jcrNameCollection = (String) PropertyUtils.getNestedProperty(item, fieldIdName);
-                objectConverter.insertNode(session, collectionNode, jcrNameCollection, item);    
+                String elementJcrName = null;
+
+                if (elementClassDescriptor.hasIdField())
+                {
+                      String idFieldName = elementClassDescriptor.getIdFieldDescriptor().getFieldName();
+                      elementJcrName = PropertyUtils.getNestedProperty(item, idFieldName).toString();
+                }
+                else
+                {
+
+                    elementCollectionCount++;
+                    elementJcrName = COLLECTION_ELEMENT_NAME + elementCollectionCount;
+                }
+
+                objectConverter.insertNode(session, collectionNode, elementJcrName, item);
             }
         }
         catch (Exception e)
         {
-            throw new JcrMappingException("Impossible to insert the collection field : " + collectionDescriptor.getFieldName() + "for " + collectionDescriptor.getClassName(), e);            
+            throw new JcrMappingException("Impossible to insert the collection field : " + collectionDescriptor.getFieldName()
+                    + "for " + collectionDescriptor.getElementClassName(), e);
         }
-        
+
     }
 
+
     /**
-     * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#updateCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, java.lang.Object)
+     * 
+     * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#updateCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection)
      */
-    public void updateCollection(Session session, Node objectNode, CollectionDescriptor collectionDescriptor, Object object) throws JcrMappingException
+    public void updateCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, ManageableCollection collection) throws JcrMappingException
     {
         try
         {
             String jcrName = collectionDescriptor.getJcrName();
-            String fieldIdName = collectionDescriptor.getFieldId();
-            Node collectionNode = null;
-            
-            // If a jcrName is defined for this collection : add or get the node used for the collection                
-            if (jcrName != null)
-            {
-                collectionNode = objectNode.getNode(jcrName);
-            }
-            else
+                                       
+            if (jcrName == null)
             {
-                collectionNode = objectNode; 
+                throw new JcrMappingException("The JcrName attribute is not defined for the CollectionDescriptor : " + collectionDescriptor.getCollectionConverterClassName());
             }
             
-            //TODO : manage null value for the collection
-            Collection collection = (Collection) PropertyUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
-            
-            Iterator collectionIterator = collection.iterator();
+            Node collectionNode = parentNode.getNode(jcrName);
+            ClassDescriptor elementClassDescriptor = mapper.getClassDescriptor(Class.forName(collectionDescriptor.getElementClassName()));
+            Iterator collectionIterator = collection.getIterator();
+            int elementCollectionCount = 0;
             while(collectionIterator.hasNext())
             {
                 Object item = collectionIterator.next();
-                String jcrNameCollection = (String) PropertyUtils.getNestedProperty(item, fieldIdName);
-                objectConverter.updateNode(session, collectionNode, jcrNameCollection, item);    
+                elementCollectionCount++;  
+                String elementJcrName = null;
+                if (elementClassDescriptor.hasIdField())
+                {
+                      String idFieldName = elementClassDescriptor.getIdFieldDescriptor().getFieldName();
+                      elementJcrName = PropertyUtils.getNestedProperty(item, idFieldName).toString();
+                }
+                else
+                {
+
+                    elementCollectionCount++;
+                    elementJcrName = COLLECTION_ELEMENT_NAME + elementCollectionCount;
+                }                
+                objectConverter.updateNode(session, collectionNode, elementJcrName, item);    
             }
         }
         catch (Exception e)
         {
-            throw new JcrMappingException("Impossible to update the collection field : " + collectionDescriptor.getFieldName() + "for " + collectionDescriptor.getClassName(), e);            
+            throw new JcrMappingException("Impossible to update the collection field : " + collectionDescriptor.getFieldName() + "for " + collectionDescriptor.getElementClassName(), e);            
         }
         
         
@@ -130,9 +176,8 @@
     /**
      * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#getCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, java.lang.Class)
      */
-    public Collection getCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, Class collectionFieldClass) throws JcrMappingException
-    {
-        
+    public ManageableCollection getCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, Class collectionFieldClass) throws JcrMappingException
+    {        
         try
         {
             String jcrName = collectionDescriptor.getJcrName();            
@@ -140,41 +185,22 @@
             Node collectionNode = parentNode.getNode(jcrName);
             NodeIterator children = collectionNode.getNodes();
                         
-            Collection collection = this.createCollectionObject(collectionFieldClass);                 
+            ManageableCollection collection = ManageableCollectionUtil.getManageableCollection(collectionFieldClass);                 
             
             while (children.hasNext())
             {
                 Node itemNode = children.nextNode();
-                Object item = objectConverter.getObject(session, Class.forName(collectionDescriptor.getClassName()), itemNode.getPath());                                
-                collection.add(item);                    
+                Object item = objectConverter.getObject(session, Class.forName(collectionDescriptor.getElementClassName()), itemNode.getPath());                                
+                collection.addObject(item);                    
             }
             
             return collection;
         }
         catch (Exception e)
         {
-            throw new JcrMappingException("Impossible to get the collection field : " + collectionDescriptor.getFieldName() + "for " + collectionDescriptor.getClassName(), e);
+            throw new JcrMappingException("Impossible to get the collection field : " + collectionDescriptor.getFieldName() + "for " + collectionDescriptor.getElementClassName(), e);
         }
     }
     
-    private Collection createCollectionObject(Class collectionFieldClass) throws JcrMappingException
-    {
-        if (collectionFieldClass.equals(ArrayList.class))
-        {
-            return new ArrayList();
-        }
-        
-        if (collectionFieldClass.equals(Vector.class))
-        {
-            return new Vector();
-        }        
-        
-        if (collectionFieldClass.equals(Collection.class) || collectionFieldClass.equals(List.class))
-        {
-            return new ArrayList();
-        }
-        
-        throw new JcrMappingException("Unsupported Collection Type : " + collectionFieldClass.getName()); 
-    }
 
 }