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/06 22:04:31 UTC
svn commit: r279147 -
/incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/ObjectConverter.java
Author: clombart
Date: Tue Sep 6 15:04:28 2005
New Revision: 279147
URL: http://svn.apache.org/viewcvs?rev=279147&view=rev
Log:
* Apply patches provided by Martin Koci
- Review catch blocks
- Manage mandatory & autocreated JCR properties (need to makes more unit tests)
* Use the CollectionConverter component
Modified:
incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/ObjectConverter.java
Modified: incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/ObjectConverter.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/ObjectConverter.java?rev=279147&r1=279146&r2=279147&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/ObjectConverter.java (original)
+++ incubator/graffito/trunk/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/ObjectConverter.java Tue Sep 6 15:04:28 2005
@@ -16,18 +16,18 @@
package org.apache.portals.graffito.jcr.persistence.objectconverter;
import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import javax.jcr.Node;
-import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFormatException;
+import javax.jcr.nodetype.PropertyDefinition;
+import org.apache.commons.beanutils.ConstructorUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.portals.graffito.jcr.exception.JcrMappingException;
import org.apache.portals.graffito.jcr.mapper.Mapper;
@@ -37,6 +37,8 @@
import org.apache.portals.graffito.jcr.mapper.model.FieldDescriptor;
import org.apache.portals.graffito.jcr.persistence.atomictypeconverter.AtomicTypeConverter;
import org.apache.portals.graffito.jcr.persistence.atomictypeconverter.AtomicTypeConverterFactory;
+import org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter;
+import org.apache.portals.graffito.jcr.persistence.collectionconverter.impl.DefaultCollectionConverterImpl;
import org.apache.portals.graffito.jcr.repository.RepositoryUtil;
/**
@@ -107,6 +109,11 @@
try
{
ClassDescriptor classDescriptor = mapper.getClassDescriptor(clazz);
+ if (classDescriptor == null)
+ {
+ throw new JcrMappingException("Class of type: " + clazz.getName() + " is not JCR persistable. Maybe element 'class-descriptor' for this type in mapping file is missing" );
+ }
+
Node node = (Node) session.getItem(path);
Object object = clazz.newInstance();
@@ -197,30 +204,23 @@
while(collectionDescriptorIterator.hasNext())
{
CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
- String jcrName = collectionDescriptor.getJcrName();
- String fieldName = collectionDescriptor.getFieldName();
-
- Node collectionNode = node.getNode(jcrName);
- NodeIterator children = collectionNode.getNodes();
-
- //TODO : support other collection type and Map ?
- Collection collection = new ArrayList();
- while (children.hasNext())
- {
- Node itemNode = children.nextNode();
- Object item = this.getObject(session, Class.forName(collectionDescriptor.getClassName()), itemNode.getPath());
- collection.add(item);
- }
-
- PropertyUtils.setNestedProperty(object, fieldName, collection);
+ CollectionConverter collectionConverter = this.getCollectionConverter(collectionDescriptor);
+ Class collectionFieldClass = PropertyUtils.getPropertyDescriptor(object, collectionDescriptor.getFieldName()).getPropertyType();
+ Collection collection = collectionConverter.getCollection(session, node, collectionDescriptor, collectionFieldClass );
+ PropertyUtils.setNestedProperty(object, collectionDescriptor.getFieldName(), collection);
}
}
- private void insertNode(Session session, Node parentNode, String nodeName, Object object) throws JcrMappingException
+ public void insertNode(Session session, Node parentNode, String nodeName, Object object) throws JcrMappingException
{
try
{
ClassDescriptor classDescriptor = mapper.getClassDescriptor(object.getClass());
+ if (classDescriptor == null)
+ {
+ throw new JcrMappingException("Class of type: " + object.getClass().getName() + " is not JCR persistable. Maybe element 'class-descriptor' for this type in mapping file is missing" );
+ }
+
String jcrNodeType = classDescriptor.getJcrNodeType();
if (jcrNodeType == null || jcrNodeType.equals(""))
{
@@ -237,16 +237,21 @@
}
catch (Exception e)
{
- throw new JcrMappingException("Impossible to add the node : " + parentNode);
+ throw new JcrMappingException("Impossible to add the node : " + parentNode, e);
}
}
- private void updateNode(Session session, Node parentNode, String nodeName, Object object) throws JcrMappingException
+ public void updateNode(Session session, Node parentNode, String nodeName, Object object) throws JcrMappingException
{
try
{
ClassDescriptor classDescriptor = mapper.getClassDescriptor(object.getClass());
+ if (classDescriptor == null)
+ {
+ throw new JcrMappingException("Class of type: " + object.getClass().getName() + " is not JCR persistable. Maybe element 'class-descriptor' for this type in mapping file is missing" );
+ }
+
String jcrNodeType = classDescriptor.getJcrNodeType();
if (jcrNodeType == null || jcrNodeType.equals(""))
{
@@ -263,10 +268,11 @@
}
catch (Exception e)
{
- throw new JcrMappingException("Impossible to add the node : " + parentNode);
+ throw new JcrMappingException("Impossible to add the node : " + parentNode, e);
}
}
+
private void insertBeanFields(Session session, Object object, ClassDescriptor classDescriptor, Node objectNode) throws JcrMappingException
{
try
@@ -317,30 +323,8 @@
while (collectionDescriptorIterator.hasNext())
{
CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
- 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.addNode(jcrName);
- }
- else
- {
- collectionNode = objectNode;
- }
-
- //TODO : manage null value for the collection
- Collection collection = (Collection) PropertyUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
-
- Iterator collectionIterator = collection.iterator();
- while(collectionIterator.hasNext())
- {
- Object item = collectionIterator.next();
- String jcrNameCollection = (String) PropertyUtils.getNestedProperty(item, fieldIdName);
- this.insertNode(session, collectionNode, jcrNameCollection, item);
- }
+ CollectionConverter collectionConverter = this.getCollectionConverter(collectionDescriptor);
+ collectionConverter.insertCollection(session, objectNode, collectionDescriptor,object);
}
}
catch (Exception e)
@@ -358,30 +342,8 @@
while (collectionDescriptorIterator.hasNext())
{
CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
- 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
- {
- collectionNode = objectNode;
- }
-
- //TODO : manage null value for the collection
- Collection collection = (Collection) PropertyUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
-
- Iterator collectionIterator = collection.iterator();
- while(collectionIterator.hasNext())
- {
- Object item = collectionIterator.next();
- String jcrNameCollection = (String) PropertyUtils.getNestedProperty(item, fieldIdName);
- this.updateNode(session, collectionNode, jcrNameCollection, item);
- }
+ CollectionConverter collectionConverter = this.getCollectionConverter(collectionDescriptor);
+ collectionConverter.updateCollection(session, objectNode, collectionDescriptor, object);
}
}
catch (Exception e)
@@ -400,18 +362,81 @@
{
FieldDescriptor fieldDescriptor = (FieldDescriptor) fieldDescriptorIterator.next();
String fieldName = fieldDescriptor.getFieldName();
- String jcrName = fieldDescriptor.getJcrName();
+ String jcrName = fieldDescriptor.getJcrName();
+
+ // Check if the node property is "autocreated"
+ boolean autoCreated = false;
+
+ if (objectNode.hasProperty(jcrName))
+ {
+ autoCreated = objectNode.getProperty(jcrName).getDefinition().isAutoCreated();
+ }
+
+ // All auto created JCR properties are ignored
+ if (! autoCreated)
+ {
+ Object fieldValue = PropertyUtils.getNestedProperty(object, fieldName);
- Object fieldValue = PropertyUtils.getNestedProperty(object, fieldName);
+ AtomicTypeConverter converter = atomicTypeConverterFactory.getJCRTypeConverter(PropertyUtils.getPropertyType(object, fieldName));
+ Value value = converter.getJcrValueFromJavaObject(fieldValue);
+ // Check if mandatory property are not null
+ this.checkMandatoryProperty(objectNode, fieldDescriptor, value);
+
+ objectNode.setProperty(jcrName, value);
+ }
- AtomicTypeConverter converter = atomicTypeConverterFactory.getJCRTypeConverter(PropertyUtils.getPropertyType(object, fieldName));
- Value value = converter.getJcrValueFromJavaObject(fieldValue);
- objectNode.setProperty(jcrName, value);
+
}
}
catch (Exception e)
{
throw new JcrMappingException("Impossible to store the bean fields", e);
+ }
+ }
+
+ private CollectionConverter getCollectionConverter(CollectionDescriptor collectionDescriptor) throws JcrMappingException
+ {
+
+ try
+ {
+ String className = collectionDescriptor.getCollectionConverterClassName();
+ if (className == null)
+ {
+ return new DefaultCollectionConverterImpl(this);
+ }
+ else
+ {
+ Class converterClass = Class.forName(className);
+ return (CollectionConverter) ConstructorUtils.invokeConstructor(converterClass, this);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new JcrMappingException("Impossible to get the collection descriptor for " + collectionDescriptor.getCollectionConverterClassName(), e);
+ }
+
+ }
+
+ private void checkMandatoryProperty(Node objectNode, FieldDescriptor fieldDescriptor, Value value ) throws JcrMappingException
+ {
+ try
+ {
+ PropertyDefinition[] propertyDefinitions = objectNode.getPrimaryNodeType().getDeclaredPropertyDefinitions();
+ for (int i = 0; i < propertyDefinitions.length; i++)
+ {
+ PropertyDefinition definition = propertyDefinitions[i];
+ if (definition.getName().equals(fieldDescriptor.getJcrName()) && definition.isMandatory()
+ && definition.isAutoCreated() == false && value == null)
+ {
+ throw new JcrMappingException("Class of type:" + fieldDescriptor.getClassDescriptor().getClassName()
+ + " has property: " + fieldDescriptor.getFieldName() + " declared as JCR property: "
+ + fieldDescriptor.getJcrName() + " This property is mandatory but property in bean has value null");
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ throw new JcrMappingException("Impossible to check mandatory property" , e);
}
}
}