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 ap...@apache.org on 2006/02/08 10:04:43 UTC

svn commit: r375909 - in /incubator/graffito/trunk/jcr/jcr-mapping/src: java/org/apache/portals/graffito/jcr/mapper/model/ java/org/apache/portals/graffito/jcr/persistence/atomictypeconverter/impl/ java/org/apache/portals/graffito/jcr/persistence/objec...

Author: apopescu
Date: Wed Feb  8 02:04:41 2006
New Revision: 375909

URL: http://svn.apache.org/viewcvs?rev=375909&view=rev
Log:
bean-descriptor:
- inline (done)
- converter (skeleton)

Added:
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/atomictypeconverter/impl/NullTypeConverterImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/BeanConverter.java
Modified:
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/BeanDescriptor.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/BeanDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/BeanDescriptor.java?rev=375909&r1=375908&r2=375909&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/BeanDescriptor.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/BeanDescriptor.java Wed Feb  8 02:04:41 2006
@@ -16,7 +16,9 @@
 package org.apache.portals.graffito.jcr.mapper.model;
 
 
+import org.apache.portals.graffito.jcr.persistence.objectconverter.BeanConverter;
 import org.apache.portals.graffito.jcr.persistence.objectconverter.impl.ObjectConverterImpl;
+import org.apache.portals.graffito.jcr.reflection.ReflectionUtils;
 
 /**
  * BeanDescriptor is used by the mapper to read general information on a bean field
@@ -25,13 +27,12 @@
  * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
  */
 public class BeanDescriptor {
-    private static final String DEFAULT_CONVERTER = ObjectConverterImpl.class.getName();
-
     private String fieldName;
     private String jcrName;
     private boolean proxy;
     private boolean inline;
-    private String converter = DEFAULT_CONVERTER;
+    private String converter;
+    private BeanConverter beanConverter;
     private String jcrNodeType;
     private boolean jcrAutoCreated;
     private boolean jcrMandatory;
@@ -81,22 +82,52 @@
         this.proxy = proxy;
     }
 
+    /**
+     * Are the current bean properties inlined in the parent
+     * 
+     * @return <tt>true</tt> if bean's properties are inlined in the parent node
+     */
     public boolean isInline() {
         return this.inline;
     }
 
+    /**
+     * Sets if the bean's properties should be inlined in the parent
+     * instead of being persisted on a subnode
+     * 
+     * @param flag <tt>true</tt> if the bean properties should be inlined
+     */
     public void setInline(boolean flag) {
         this.inline = flag;
     }
 
+    /**
+     * Get the <code>BeanConverter</code> fully qualified name or <tt>null</tt>
+     * if none specified by the bean descriptor.
+     * 
+     * @return fully qualified class name or <tt>null</tt>
+     */
     public String getConverter() {
         return this.converter;
     }
 
+    /**
+     * Sets the fully qualified name of a <code>BeanConverter</code> to be used.
+     * 
+     * @param converterClass a fully qualified class name
+     */
     public void setConverter(String converterClass) {
         this.converter = converterClass;
     }
 
+    public BeanConverter getBeanConverter() {
+        if(null == this.beanConverter && null != this.converter) {
+            this.beanConverter = (BeanConverter) ReflectionUtils.newInstance(this.converter);
+        }
+        
+        return this.beanConverter;
+    }
+    
     /** Getter for property jcrNodeType.
      *
      * @return jcrNodeType

Added: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/atomictypeconverter/impl/NullTypeConverterImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/atomictypeconverter/impl/NullTypeConverterImpl.java?rev=375909&view=auto
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/atomictypeconverter/impl/NullTypeConverterImpl.java (added)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/atomictypeconverter/impl/NullTypeConverterImpl.java Wed Feb  8 02:04:41 2006
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.portals.graffito.jcr.persistence.atomictypeconverter.impl;
+
+
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+
+import org.apache.portals.graffito.jcr.persistence.atomictypeconverter.AtomicTypeConverter;
+
+/**
+ * Double Type Converter
+ *
+ * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
+ */
+public class NullTypeConverterImpl implements AtomicTypeConverter {
+
+    /**
+     *
+     * @see org.apache.portals.graffito.jcr.persistence.atomictypeconverter.AtomicTypeConverter#getValue(java.lang.Object)
+     */
+    public Value getValue(ValueFactory valueFactory, Object propValue) {
+        return null;
+    }
+
+    /**
+     *
+     * @see org.apache.portals.graffito.jcr.persistence.atomictypeconverter.AtomicTypeConverter#getObject(javax.jcr.Value)
+     */
+    public Object getObject(Value value) {
+        return null;
+    }
+
+    /**
+     *
+     * @see org.apache.portals.graffito.jcr.persistence.atomictypeconverter.AtomicTypeConverter#getStringValue(java.lang.Object)
+     */
+    public String getStringValue(Object object) {
+        return null;
+    }
+}

Added: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/BeanConverter.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/BeanConverter.java?rev=375909&view=auto
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/BeanConverter.java (added)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/BeanConverter.java Wed Feb  8 02:04:41 2006
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.portals.graffito.jcr.persistence.objectconverter;
+
+
+import javax.jcr.Node;
+import javax.jcr.Session;
+
+import org.apache.portals.graffito.jcr.exception.PersistenceException;
+import org.apache.portals.graffito.jcr.mapper.Mapper;
+
+/**
+ * Convert any kind of beans into JCR nodes & properties
+ *
+ * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
+ */
+public interface BeanConverter {
+    /**
+     * Insert 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 insert
+     * @throws PersistenceException when it is not possible to insert the object
+     */
+    public void insert(Session session, 
+                       Node parentNode,
+                       Mapper mapper,
+                       String beanName,
+                       Object object)
+    throws PersistenceException;
+
+    /**
+     * 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
+     * @throws PersistenceException when it is not possible to update the object
+     */
+    public void update(Session session, 
+                       Node parentNode, 
+                       Mapper mapper, 
+                       String beanName, 
+                       Object object)
+    throws PersistenceException;
+    
+    /**
+     * ???
+     */
+    public Object getObject(Session session,
+                            Node parentNode,
+                            Mapper mapper,
+                            String beanName,
+                            Class beanClass) 
+    throws PersistenceException;
+
+
+    /**
+     * ???
+     */
+    void remove(Session session, 
+                Node parentNode, 
+                Mapper mapper, 
+                String beanName)
+    throws PersistenceException;
+}

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java?rev=375909&r1=375908&r2=375909&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java Wed Feb  8 02:04:41 2006
@@ -16,7 +16,6 @@
 package org.apache.portals.graffito.jcr.persistence.objectconverter.impl;
 
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.Iterator;
 import java.util.Map;
 
@@ -26,15 +25,12 @@
 import javax.jcr.Session;
 import javax.jcr.Value;
 import javax.jcr.ValueFactory;
-import javax.jcr.ValueFormatException;
 import javax.jcr.lock.LockException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.version.VersionException;
 
-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.exception.PersistenceException;
 import org.apache.portals.graffito.jcr.mapper.Mapper;
@@ -44,6 +40,7 @@
 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.AtomicTypeConverterProvider;
+import org.apache.portals.graffito.jcr.persistence.atomictypeconverter.impl.NullTypeConverterImpl;
 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;
@@ -59,6 +56,8 @@
  * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
  */
 public class ObjectConverterImpl implements ObjectConverter {
+    private static final AtomicTypeConverter NULL_CONVERTER = new NullTypeConverterImpl();
+
     private Mapper mapper;
 
     private AtomicTypeConverterProvider atomicTypeConverterProvider;
@@ -124,12 +123,8 @@
      * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#insert(javax.jcr.Session, javax.jcr.Node, java.lang.String, java.lang.Object)
      */
     public void insert(Session session, Node parentNode, String nodeName, Object object) {
-        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");
-        }
-
+        ClassDescriptor classDescriptor = getClassDescriptor(object.getClass());
+        
         String jcrNodeType = classDescriptor.getJcrNodeType();
         if ((jcrNodeType == null) || jcrNodeType.equals("")) {
             throw new JcrMappingException("Undefined node type for  " + parentNode);
@@ -197,13 +192,7 @@
      */
     public void update(Session session, Node parentNode, String nodeName, Object object) {
         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");
-            }
-
+            ClassDescriptor classDescriptor = getClassDescriptor(object.getClass());
             Node objectNode = parentNode.getNode(nodeName);
             
             storeSimpleFields(session, object, classDescriptor, objectNode);
@@ -231,21 +220,15 @@
                 return null;
             }
 
-            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");
-            }
-
+            ClassDescriptor classDescriptor = getClassDescriptor(clazz);
             Node node = (Node) session.getItem(path);
             Object object = ReflectionUtils.newInstance(clazz);
 
             retrieveSimpleFields(session, classDescriptor, node, object);
-            retrieveBeanFields(session, path, classDescriptor, object);
+            retrieveBeanFields(session, classDescriptor, node, path, object);
             retrieveCollectionFields(session, classDescriptor, node, object);
 
             return object;
-
         }         
         catch(PathNotFoundException pnfe) {
             // HINT should never get here
@@ -262,12 +245,7 @@
      * @throws JcrMappingException
      */
     public String getPath(Session session, Object object) {
-        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"
-            );            }
+        ClassDescriptor classDescriptor = getClassDescriptor(object.getClass());
 
         final FieldDescriptor pathFieldDescriptor = classDescriptor.getPathFieldDescriptor();
         if (pathFieldDescriptor == null) {
@@ -287,10 +265,11 @@
      * @throws JcrMappingException
      * @throws org.apache.portals.graffito.jcr.exception.RepositoryException
      */
-    private void retrieveSimpleFields(Session session, 
-                                      ClassDescriptor classDescriptor, 
-                                      Node node, 
-                                      Object object) {
+    private Object retrieveSimpleFields(Session session, 
+                                        ClassDescriptor classDescriptor, 
+                                        Node node, 
+                                        Object object) {
+        Object initializedBean = object;
         try {
             Iterator fieldDescriptorIterator = classDescriptor.getFieldDescriptors().iterator();
     
@@ -301,15 +280,24 @@
                 String propertyName = fieldDescriptor.getJcrName();
     
                 if (fieldDescriptor.isPath()) {
-                    ReflectionUtils.setNestedProperty(object, fieldName, node.getPath());
+                    if (null == initializedBean) { // HINT: lazy initialize target bean
+                        initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
+                    }
+                    
+                    ReflectionUtils.setNestedProperty(initializedBean, fieldName, node.getPath());
                 } else {
-                    AtomicTypeConverter converter= getAtomicTypeConverter(fieldDescriptor, 
-                                                                          object, 
-                                                                          fieldName);
                     if (node.hasProperty(propertyName)) {
-                        Object fieldValue = converter.getObject(
-                                node.getProperty(propertyName).getValue());
-                        ReflectionUtils.setNestedProperty(object, fieldName, fieldValue);
+                        Value propValue = node.getProperty(propertyName).getValue();
+                        if (null != propValue && null == initializedBean) { // HINT: lazy initialize target bean
+                            initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
+                        }
+
+                        AtomicTypeConverter converter= getAtomicTypeConverter(fieldDescriptor, 
+                                                                              initializedBean, 
+                                                                              fieldName);
+                        
+                        Object fieldValue = converter.getObject(propValue);
+                        ReflectionUtils.setNestedProperty(initializedBean, fieldName, fieldValue);
                     }
                 }
             }
@@ -322,23 +310,39 @@
                     + node,
                     re);
         }
+        
+        return initializedBean;
     }
-
+    
     /**
      * Retrieve bean fields
      */
     private void retrieveBeanFields(Session session,
-                                    String path,
                                     ClassDescriptor classDescriptor,
+                                    Node node,
+                                    String path,
                                     Object object) {
         Iterator beanDescriptorIterator = classDescriptor.getBeanDescriptors().iterator();
         while (beanDescriptorIterator.hasNext()) {
             BeanDescriptor beanDescriptor = (BeanDescriptor) beanDescriptorIterator.next();
             String beanName = beanDescriptor.getFieldName();
             Class beanClass = ReflectionUtils.getPropertyType(object, beanName);
-            Object bean = this.getObject(session,
-                                         beanClass,
-                                         path + "/" + beanDescriptor.getJcrName());
+            Object bean = null;
+            if (beanDescriptor.isInline()) {
+                bean = this.retrieveSimpleFields(session, getClassDescriptor(beanClass), node, null);
+            }
+            else if (null != beanDescriptor.getBeanConverter()) {
+                bean = beanDescriptor.getBeanConverter().getObject(session,
+                        node,
+                        this.mapper,
+                        beanName,
+                        beanClass);
+            }
+            else {
+                bean = this.getObject(session,
+                                      beanClass,
+                                      path + "/" + beanDescriptor.getJcrName());
+            }
             ReflectionUtils.setNestedProperty(object, beanName, bean);
         }
     }
@@ -382,7 +386,19 @@
             Object bean = ReflectionUtils.getNestedProperty(object,
                                                             beanDescriptor.getFieldName());
             if (bean != null) {
-                this.insert(session, objectNode, jcrName, bean);
+                if (beanDescriptor.isInline()) {
+                    this.storeSimpleFields(session, bean, getClassDescriptor(bean.getClass()), objectNode);
+                }
+                else if (null != beanDescriptor.getBeanConverter()) {
+                    beanDescriptor.getBeanConverter().insert(session,
+                            objectNode,
+                            this.mapper,
+                            jcrName,
+                            object);
+                }
+                else {
+                    this.insert(session, objectNode, jcrName, bean);
+                }
             }
         }
     }
@@ -405,13 +421,34 @@
 
                 // if the bean is null, remove existing node
                 if ((bean == null)) {
-                    if (objectNode.hasNode(jcrName)) {
-                        objectNode.getNode(jcrName).remove();
+                    if (beanDescriptor.isInline()) {
+                        Class beanClass = ReflectionUtils.getPropertyType(object, beanDescriptor.getFieldName());
+                        this.storeSimpleFields(session, bean, getClassDescriptor(beanClass), objectNode);
+                    }
+                    else if (null != beanDescriptor.getBeanConverter()) {
+                        beanDescriptor.getBeanConverter().remove(session, objectNode, this.mapper, jcrName);
+                    }
+                    else {
+                        if (objectNode.hasNode(jcrName)) {
+                            objectNode.getNode(jcrName).remove();
+                        }
+                    }
+                } 
+                else {
+                    if (beanDescriptor.isInline()) {
+                        this.storeSimpleFields(session, bean, getClassDescriptor(bean.getClass()), objectNode);
+                    }
+                    else if (null != beanDescriptor.getBeanConverter()) {
+                        beanDescriptor.getBeanConverter().update(session,
+                                objectNode,
+                                this.mapper, 
+                                jcrName,
+                                bean);
+                    }
+                    else {
+                        this.update(session, objectNode, jcrName, bean);
                     }
-                } else {
-                    this.update(session, objectNode, jcrName, bean);
                 }
-
             }
         } 
         catch(VersionException ve) {
@@ -567,9 +604,29 @@
     private AtomicTypeConverter getAtomicTypeConverter(FieldDescriptor fd, 
                                                        Object object, 
                                                        String fieldName) {
-        Class fieldTypeClass= fd.getFieldTypeClass() != null 
-            ? fd.getFieldTypeClass() : ReflectionUtils.getPropertyType(object, fieldName);
-            
-        return this.atomicTypeConverterProvider.getAtomicTypeConverter(fieldTypeClass);
+        Class fieldTypeClass = null;
+        if (null != fd.getFieldTypeClass()) {
+            fieldTypeClass = fd.getFieldTypeClass();
+        }
+        else if (null != object) {
+            fieldTypeClass = ReflectionUtils.getPropertyType(object, fieldName);
+        }
+
+        if (null != fieldTypeClass) {
+            return this.atomicTypeConverterProvider.getAtomicTypeConverter(fieldTypeClass);
+        }
+        else {
+            return NULL_CONVERTER;
+        }
+    }
+    
+    protected ClassDescriptor getClassDescriptor(Class beanClass) {
+        ClassDescriptor classDescriptor = mapper.getClassDescriptor(beanClass);
+        if(null == classDescriptor) {
+            throw new JcrMappingException("Class of type: " + beanClass.getName()
+                    + " is not JCR persistable. Maybe element 'class-descriptor' for this type in mapping file is missing");
+        }
+  
+        return classDescriptor;
     }
 }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java?rev=375909&r1=375908&r2=375909&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java Wed Feb  8 02:04:41 2006
@@ -6,6 +6,7 @@
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.portals.graffito.jcr.exception.JcrMappingException;
 import org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter;
+import org.apache.portals.graffito.jcr.persistence.objectconverter.BeanConverter;
 
 
 /**
@@ -13,6 +14,10 @@
  */
 abstract public class ReflectionUtils {
     public static Object getNestedProperty(Object object, String fieldName) {
+        if (null == object) {
+            return null;
+        }
+        
         try {
             return PropertyUtils.getNestedProperty(object, fieldName);
         }
@@ -85,6 +90,21 @@
         }
         catch(Exception ex) {
             throw new JcrMappingException("Cannot set the field " + fieldName,
+                    ex);
+        }
+    }
+
+    /**
+     * @param string
+     * @return
+     */
+    public static Object newInstance(String clazz) {
+        try {
+            return Class.forName(clazz).newInstance();
+        }
+        catch(Exception ex) {
+            throw new JcrMappingException("Cannot create instance for class "
+                    + clazz,
                     ex);
         }
     }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java?rev=375909&r1=375908&r2=375909&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java Wed Feb  8 02:04:41 2006
@@ -78,9 +78,9 @@
             assertNotNull("BeanDescriptor is null", beanDescriptor);
             assertTrue("Invalid jcrName for field b", beanDescriptor.getJcrName().equals("b"));
             assertEquals("Invalid bean-descriptor inline", true, beanDescriptor.isInline());
-            assertEquals("Invalid bean default descriptor", 
-                         ObjectConverterImpl.class.getName(),
-                         beanDescriptor.getConverter());
+            assertNull("Invalid bean default converter", beanDescriptor.getConverter());
+            assertNull("Invalid bean converter", beanDescriptor.getBeanConverter());
+            
             
             CollectionDescriptor collectionDescriptor = classDescriptor.getCollectionDescriptor("collection");
             assertNotNull("CollectionDescriptor is null", collectionDescriptor);