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 2006/05/13 15:08:06 UTC

svn commit: r406118 [1/2] - in /incubator/graffito/trunk/jcr/jcr-mapping/src: dtd/ java/org/apache/portals/graffito/jcr/mapper/impl/ java/org/apache/portals/graffito/jcr/mapper/model/ java/org/apache/portals/graffito/jcr/persistence/ java/org/apache/po...

Author: clombart
Date: Sat May 13 08:08:04 2006
New Revision: 406118

URL: http://svn.apache.org/viewcvs?rev=406118&view=rev
Log:
Add several modifications : 

* jcrNodeType is not mandatory.If not present the default value is "nt:unstructured".
* discriminator field descriptor was removed. Only the flag discriminator is defined on the class descriptor. 
	If this flag is true, a mixin node type "graffito:discriminator" is added to the node. 
	This type contains one property to store the java classname (graffito:classname).
    With this implementation, the discriminator field is not necessary. So, the persistence mechanism is still transparent for the jaba beans.

* Interface support : like the inheritance support, there are 2 differents strategies : node type per concrete class or per complete hierarchy. The hierarchy strategy requires a discriminator node type.

Added:
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ImplementDescriptor.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/PersistenceConstant.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerInheritanceConcreteClassTest.java
      - copied, changed from r393615, incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtConcreteClassTest.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerInheritanceHierarchyTest.java
      - copied, changed from r388968, incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtHierarchyTest.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerInterfaceConcreteClassTest.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerInterfaceHierarchyTest.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/impl/
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/impl/CmsObjectImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/impl/ContentImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/impl/DocumentImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/impl/DocumentStream.java
      - copied, changed from r390238, incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/DocumentStream.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/impl/FolderImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/interfaces/AnotherInterface.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/interfaces/CmsObject.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/interfaces/Content.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/interfaces/Document.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/interfaces/Folder.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/interfaces/Interface.java
Removed:
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtConcreteClassTest.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtHierarchyTest.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/CmsObject.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/Content.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/Document.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/DocumentStream.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/Folder.java
Modified:
    incubator/graffito/trunk/jcr/jcr-mapping/src/dtd/graffito-jcr-mapping.dtd
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterDescriptorReader.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterMapperImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ClassDescriptor.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/CollectionDescriptor.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/FieldDescriptor.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/MappingDescriptor.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.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/query/impl/QueryManagerImpl.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-atomic.xml
    incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml
    incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml
    incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping.xml
    incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/repository/repository/nodetypes/custom_nodetypes.xml
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/TestBase.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/AllTests.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/AnotherDescendant.java
    incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/inheritance/Descendant.java

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/dtd/graffito-jcr-mapping.dtd
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/dtd/graffito-jcr-mapping.dtd?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/dtd/graffito-jcr-mapping.dtd (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/dtd/graffito-jcr-mapping.dtd Sat May 13 08:08:04 2006
@@ -28,21 +28,26 @@
     * jcrSuperTypes : the jcr super types, optional
     * jcrMixinTypes: the jcr mixin types (comma separated list) (optional)
     * extends: name of super class (optional)
-    * extends-strategy:
-    * polymorphism: specify the behavior of this class in queries; default implicit
     * abstract: true if this class is abstract and it is used in hierarchy mappings
-    * discriminator-value: use only when extends-strategy="concreteclass" and abstract="false"
+    * discriminator true if the mapped node  requires  an graffito:discriminator node type. This type contains a classname property.
 -->
-<!ELEMENT class-descriptor (field-descriptor*, bean-descriptor*, collection-descriptor*)>
+<!ELEMENT class-descriptor (implement-descriptor*, field-descriptor*, bean-descriptor*, collection-descriptor*)>
 
 <!ATTLIST class-descriptor
 	className CDATA #REQUIRED
 	jcrNodeType CDATA #IMPLIED
     jcrSuperTypes CDATA #IMPLIED
     jcrMixinTypes CDATA #IMPLIED
-    extends CDATA #IMPLIED
+    extend CDATA #IMPLIED
 	abstract (true|false) "false"
-	discriminatorValue CDATA #IMPLIED
+	interface (true|false) "false"
+	discriminator (true|false) "true"
+>
+
+<!ELEMENT implement-descriptor EMPTY>
+
+<!ATTLIST implement-descriptor
+	interfaceName CDATA #REQUIRED
 >
 
 <!--
@@ -67,7 +72,6 @@
 	jcrName CDATA #IMPLIED 
 	id (true | false) "false"
 	path (true | false) "false"
-	discriminator (true | false) "false"
     jcrType (String | Date | Long | Double | Boolean | Binary) #IMPLIED
     jcrAutoCreated (true | false) "false"
     jcrMandatory (true | false) "false"

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterDescriptorReader.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterDescriptorReader.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterDescriptorReader.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterDescriptorReader.java Sat May 13 08:08:04 2006
@@ -26,7 +26,9 @@
 import org.apache.portals.graffito.jcr.mapper.model.ClassDescriptor;
 import org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor;
 import org.apache.portals.graffito.jcr.mapper.model.FieldDescriptor;
+import org.apache.portals.graffito.jcr.mapper.model.ImplementDescriptor;
 import org.apache.portals.graffito.jcr.mapper.model.MappingDescriptor;
+import org.xml.sax.SAXParseException;
 
 /**
  * Helper class that reads the xml mapping file and load all class descriptors into memory (object graph)
@@ -68,80 +70,47 @@
                 digester.register("-//The Apache Software Foundation//DTD Repository//EN",
                                   this.dtdResolver.toString());
             }
-            
-			digester.addObjectCreate("graffito-jcr", MappingDescriptor.class);
-            digester.addSetProperties("graffito-jcr", "package", "package");
+			
+	        MappingDescriptor mappingDescriptor = new MappingDescriptor();
+	        digester.push(mappingDescriptor);
+			
+	       // TODO : activater the following line wich cause some bugs when loading the xml stream  
+           //digester.addSetProperties("graffito-jcr", package, pa);
 
 			// --------------------------------------------------------------------------------
 			// Rules used for the class-descriptor element
-			// --------------------------------------------------------------------------------
-
+			// --------------------------------------------------------------------------------	                        
 			digester.addObjectCreate("graffito-jcr/class-descriptor", ClassDescriptor.class);
-			digester.addSetProperties("graffito-jcr/class-descriptor", "className", "className");
-			digester.addSetProperties("graffito-jcr/class-descriptor", "jcrNodeType", "jcrNodeType");
-            digester.addSetProperties("graffito-jcr/class-descriptor", "jcrSuperTypes", "jcrSuperTypes");
-            digester.addSetProperties("graffito-jcr/class-descriptor", "jcrMixinTypes", "jcrMixinTypes");
-            digester.addSetProperties("graffito-jcr/class-descriptor", "extends", "superClass");
-            digester.addSetProperties("graffito-jcr/class-descriptor", "abstract", "abstract");
-			digester.addSetNext("graffito-jcr/class-descriptor", "addClassDescriptor");
+			digester.addSetProperties("graffito-jcr/class-descriptor");
+			digester.addSetNext("graffito-jcr/class-descriptor", "addClassDescriptor");		
 
 			// --------------------------------------------------------------------------------
 			// Rules used for the field-descriptor element
 			// --------------------------------------------------------------------------------
-
+			digester.addObjectCreate("graffito-jcr/class-descriptor/implement-descriptor", ImplementDescriptor.class);
+			digester.addSetProperties("graffito-jcr/class-descriptor/implement-descriptor");
+            digester.addSetNext("graffito-jcr/class-descriptor/implement-descriptor", "addImplementDescriptor");
+			
+			// --------------------------------------------------------------------------------
+			// Rules used for the field-descriptor element
+			// --------------------------------------------------------------------------------
 			digester.addObjectCreate("graffito-jcr/class-descriptor/field-descriptor", FieldDescriptor.class);
-			digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "fieldName", "fieldName");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "fieldType", "fieldType");
-			digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "jcrName", "jcrName");
-			digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "id", "id");
-			digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "path", "path");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "discriminator", "discriminator");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "jcrType", "jcrType");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "jcrAutoCreated", "jcrAutoCreated");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "jcrMandatory", "jcrMandatory");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "jcrOnParentVersion", "jcrOnParentVersion");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "jcrProtected", "jcrProtected");
-            digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor", "jcrMultiple", "jcrMultiple");
-
+			digester.addSetProperties("graffito-jcr/class-descriptor/field-descriptor");
             digester.addSetNext("graffito-jcr/class-descriptor/field-descriptor", "addFieldDescriptor");
 
 			// --------------------------------------------------------------------------------
 			// Rules used for the bean-descriptor element
 			// --------------------------------------------------------------------------------
-
 			digester.addObjectCreate("graffito-jcr/class-descriptor/bean-descriptor", BeanDescriptor.class);
-			digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "fieldName", "fieldName");
-			digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "jcrName", "jcrName");
-			digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "proxy", "proxy");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "inline", "inline");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "converter", "converter");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "jcrNodeType", "jcrNodeType");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "jcrAutoCreated", "jcrAutoCreated");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "jcrMandatory", "jcrMandatory");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "jcrOnParentVersion", "jcrOnParentVersion");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "jcrProtected", "jcrProtected");
-            digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor", "jcrSameNameSiblings", "jcrSameNameSiblings");
-			
+			digester.addSetProperties("graffito-jcr/class-descriptor/bean-descriptor");
             digester.addSetNext("graffito-jcr/class-descriptor/bean-descriptor", "addBeanDescriptor");
 
 			// --------------------------------------------------------------------------------
 			// Rules used for the collection-descriptor element
 			// --------------------------------------------------------------------------------
-
 			digester.addObjectCreate("graffito-jcr/class-descriptor/collection-descriptor", CollectionDescriptor.class);
-			digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "fieldName", "fieldName");
-			digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "jcrName", "jcrName");
-			digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "proxy", "proxy");
-			digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "elementClassName", "elementClassName");
-			digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "collectionConverter", "collectionConverterClassName");
-			digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "collectionClassName", "collectionClassName");
-            digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "jcrNodeType", "jcrNodeType");
-            digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "jcrAutoCreated", "jcrAutoCreated");
-            digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "jcrMandatory", "jcrMandatory");
-            digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "jcrOnParentVersion", "jcrOnParentVersion");
-            digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "jcrProtected", "jcrProtected");
-            digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor", "jcrSameNameSiblings", "jcrSameNameSiblings");            
-			digester.addSetNext("graffito-jcr/class-descriptor/collection-descriptor", "addCollectionDescriptor");
+			digester.addSetProperties("graffito-jcr/class-descriptor/collection-descriptor");
+            digester.addSetNext("graffito-jcr/class-descriptor/collection-descriptor", "addCollectionDescriptor");			
 
             return (MappingDescriptor) digester.parse(stream);
 		}
@@ -164,9 +133,10 @@
 		{
 			return loadClassDescriptors(new FileInputStream(xmlFile));
 		}
+		
 		catch (FileNotFoundException e)
 		{
-			throw new InitMapperException(e);
+			throw new InitMapperException("Mapping file not found : " + xmlFile,e);
 		}
 	}
 }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterMapperImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterMapperImpl.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterMapperImpl.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/impl/DigesterMapperImpl.java Sat May 13 08:08:04 2006
@@ -170,23 +170,53 @@
             Map.Entry entry = (Map.Entry) it.next();
             ClassDescriptor cd = (ClassDescriptor) entry.getValue();
 
-            if (null != cd.getSuperClass() && !"".equals(cd.getSuperClass())) {
-                ClassDescriptor superClassDescriptor = this.mappingDescriptor.getClassDescriptor(cd.getSuperClass());
+            if (null != cd.getExtend() && !"".equals(cd.getExtend())) 
+            {
+                ClassDescriptor superClassDescriptor = this.mappingDescriptor.getClassDescriptor(cd.getExtend());
 
-                if (null == superClassDescriptor) {
+                if (null == superClassDescriptor) 
+                {
                     errors.add("Cannot find mapping for class "
-                            + cd.getSuperClass()
+                            + cd.getExtend()
                             + " referenced as extends from "
                             + cd.getClassName());
                 }
-                else {
-            	    log.debug("Class " +cd.getClassName() +  " extends " + cd.getSuperClass());
+                else 
+                {
+            	       log.debug("Class " +cd.getClassName() +  " extends " + cd.getExtend());
                     cd.setSuperClassDescriptor(superClassDescriptor);
                 }
             }
-            else {
-                rootClassDescriptors.add(cd);	
+            else
+            {
+                   rootClassDescriptors.add(cd);
             }
+            
+            Collection interfaces = cd.getImplements();
+            if (interfaces.size() > 0) 
+            {	
+            	      for (Iterator iterator = interfaces.iterator(); iterator.hasNext();)
+            	      {
+            	    	          String interfaceName= (String) iterator.next();
+                          ClassDescriptor interfaceClassDescriptor = this.mappingDescriptor.getClassDescriptor(interfaceName);
+
+                          if (null == interfaceClassDescriptor) 
+                          {
+                              errors.add("Cannot find mapping for interface "
+                                      + interfaceName
+                                      + " referenced as implements from "
+                                      + cd.getClassName());
+                          }
+                          else 
+                          {
+                      	       log.debug("Class " +cd.getClassName() +  " implements " + interfaceName);
+                              //cd.setSuperClassDescriptor(interfaceClassDescriptor);
+                      	      interfaceClassDescriptor.addDescendantClassDescriptor(cd); 
+                          }
+            	    	      
+            	      }
+            }
+            
         }
 
         return errors;

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ClassDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ClassDescriptor.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ClassDescriptor.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ClassDescriptor.java Sat May 13 08:08:04 2006
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -51,7 +52,6 @@
     private String[] jcrMixinTypes = new String[0];
     private FieldDescriptor idFieldDescriptor;
     private FieldDescriptor pathFieldDescriptor;
-    private FieldDescriptor discriminatorFieldDescriptor;
 
     private Map fieldDescriptors = new HashMap();    
     private Map beanDescriptors = new HashMap();        
@@ -60,19 +60,45 @@
     private Map fieldNames = new HashMap();
 
     private String superClassName;
-    private String extendsStrategy;
-    private boolean abstractClass = false;
+    private String extendsStrategy;    
+    private boolean isAbstract = false;    
     private boolean hasDescendant = false;
+    private boolean hasDiscriminator = true; 
    
+       
+    private boolean isInterface=false;
+    private List interfaces = new ArrayList();
     
     public void setAbstract(boolean flag) {
-        this.abstractClass = flag;
+        this.isAbstract = flag;
     }
 
     public boolean isAbstract() {
-        return this.abstractClass;
+        return this.isAbstract;
     }
 
+    public void setInterface(boolean flag) {
+    	   this.isInterface = flag;
+    }
+       
+    public boolean isInterface() {
+    	    return isInterface;
+    }
+    
+    public boolean hasInterfaces()
+    {
+    	   return this.interfaces.size() > 0;
+    }
+
+    public void setDiscriminator(boolean flag)
+    {
+        this.hasDiscriminator = flag;	
+    }
+    
+    public boolean hasDiscriminator() {        
+ 	   return this.hasDiscriminator;
+ }    
+    
     public boolean usesNodeTypePerHierarchyStrategy() {
         return NODETYPE_PER_HIERARCHY.equals(this.extendsStrategy);
     }
@@ -120,14 +146,16 @@
         if (fieldDescriptor.isPath()) {
             this.pathFieldDescriptor = fieldDescriptor;
         }
-        if (fieldDescriptor.isDiscriminator()) {
-            this.discriminatorFieldDescriptor = fieldDescriptor;
-        }
 
         fieldDescriptors.put(fieldDescriptor.getFieldName(), fieldDescriptor);
         fieldNames.put(fieldDescriptor.getFieldName(), fieldDescriptor.getJcrName());
     }
 
+    public void addImplementDescriptor(ImplementDescriptor implementDescriptor)
+    {
+        interfaces.add(implementDescriptor.getInterfaceName());	
+    }
+    
     /**
      * Get the FieldDescriptor to used for a specific java bean attribute
      * @param fieldName The java bean attribute name
@@ -224,28 +252,13 @@
         return null;
     }
 
-    public FieldDescriptor getDiscriminatorFieldDescriptor() {       
-        if (null != this.discriminatorFieldDescriptor) {
-            return this.discriminatorFieldDescriptor;
-        }
-
-        if (null != this.superClassDescriptor) {
-            return this.superClassDescriptor.getDiscriminatorFieldDescriptor();
-        }
-
-        return null;        
-    }
-
-    public boolean hasDiscriminatorField() {
-        return this.getDiscriminatorFieldDescriptor() != null;
-    }
 
     /**
      * Check if this class has an ID
      * @return true if the class has an ID
      */
-    public boolean hasIdField() {
-        return this.idFieldDescriptor != null;
+    public boolean hasIdField() {        
+        return (this.idFieldDescriptor != null && ! this.idFieldDescriptor.equals(""));
     }
 
     /**
@@ -254,7 +267,31 @@
      * @return the JCR name found
      */
     public String getJcrName(String fieldName) {
-        return (String) this.fieldNames.get(fieldName);
+        String jcrName =  (String) this.fieldNames.get(fieldName);
+        if (this.isInterface && jcrName == null)
+        {
+            return this.getJcrNameFromDescendants(this, fieldName);          
+        }
+        
+        return jcrName;
+    }
+    
+    private String getJcrNameFromDescendants(ClassDescriptor classDescriptor, String fieldName )
+    {
+        Iterator  descendants = classDescriptor.getDescendantClassDescriptors().iterator();
+        while (descendants.hasNext())
+        {
+        	    ClassDescriptor descendant = (ClassDescriptor) descendants.next();
+        	    String jcrName =  (String) descendant.fieldNames.get(fieldName);
+        	    if(jcrName != null)
+        	    {
+        	    	   return jcrName;
+        	    }
+        	    return this.getJcrNameFromDescendants(descendant, fieldName);
+        }
+        return null;
+
+    	
     }
     
     public Map getFieldNames() {
@@ -319,7 +356,7 @@
         validateBeanFields();
         lookupSuperDescriptor();
         lookupInheritanceSettings();
-        validateInheritanceSettings();
+//        validateInheritanceSettings();
     }
 
 	private void validateClassName() {
@@ -346,16 +383,21 @@
 	
 	private void lookupSuperDescriptor() {
         if (null != superClassDescriptor) {
-            this.fieldDescriptors = mergeFields(this.fieldDescriptors, this.superClassDescriptor.getFieldDescriptors());
-            this.beanDescriptors = mergeBeans(this.beanDescriptors, this.superClassDescriptor.getBeanDescriptors());
-            this.collectionDescriptors = mergeCollections(this.collectionDescriptors, this.superClassDescriptor.getCollectionDescriptors());
-            this.fieldNames.putAll(this.superClassDescriptor.getFieldNames());
+            this.hasDiscriminator = superClassDescriptor.hasDiscriminator();
+            if (! this.isInterface)
+            {
+                this.fieldDescriptors = mergeFields(this.fieldDescriptors, this.superClassDescriptor.getFieldDescriptors());
+                this.beanDescriptors = mergeBeans(this.beanDescriptors, this.superClassDescriptor.getBeanDescriptors());
+                this.collectionDescriptors = mergeCollections(this.collectionDescriptors, this.superClassDescriptor.getCollectionDescriptors());            
+                this.fieldNames.putAll(this.superClassDescriptor.getFieldNames());
+            }
+        
         }
     }
 
     private void lookupInheritanceSettings() {
-        if ((null != this.superClassDescriptor) || (this.hasDescendants() )) {
-            if (this.hasDiscriminatorField()) {
+        if ((null != this.superClassDescriptor) || (this.hasDescendants()) || this.hasInterfaces()) {
+            if (this.hasDiscriminator()) {
                 this.extendsStrategy = NODETYPE_PER_HIERARCHY;
             }
             else {
@@ -364,36 +406,19 @@
         }
     }
 	
-    private void validateInheritanceSettings() {
-        if (NODETYPE_PER_CONCRETECLASS.equals(this.extendsStrategy)) {
-            this.discriminatorFieldDescriptor = getDiscriminatorFieldDescriptor();
-
-            if (null != this.discriminatorFieldDescriptor) {
-                throw new JcrMappingException("Discriminator specify for  the class : " + className + " but it is a node type per concrete class hierarchy");
-            }
-        }
-        else if (NODETYPE_PER_HIERARCHY.equals(this.extendsStrategy)) {
-            this.discriminatorFieldDescriptor = getDiscriminatorFieldDescriptor();
-
-            if (null == this.discriminatorFieldDescriptor) {
-                throw new JcrMappingException("No discriminator specify for the class : " + className);
-            }
-        }
-    }
-
 
     /**
      * @return return the super class name if defined in mapping, or
      * <tt>null</tt> if not set
      */
-    public String getSuperClass() {
+    public String getExtend() {
         return this.superClassName;
     }
 
     /**
      * @param className
      */
-    public void setSuperClass(String className) {
+    public void setExtend(String className) {
         this.superClassName = className;
     }
 
@@ -452,7 +477,13 @@
         this.superClassDescriptor= superClassDescriptor;
         superClassDescriptor.addDescendantClassDescriptor(this);
     }
+   
 
+    public Collection getImplements()
+    {
+    	    return interfaces;
+    }
+    
     private Map mergeFields(Map existing, Collection superSource) {
         if (null == superSource) {
             return existing;
@@ -464,9 +495,9 @@
             if (!merged.containsKey(fieldDescriptor.getFieldName())) {
                 merged.put(fieldDescriptor.getFieldName(), fieldDescriptor);
             }
-            else {
-                log.warn("Field name conflict in " + this.className + " - field : " +fieldDescriptor.getFieldName() + " -  this  field name is also defined  in the ancestor class : " + this.getSuperClass());
-            }
+//            else {
+//                log.warn("Field name conflict in " + this.className + " - field : " +fieldDescriptor.getFieldName() + " -  this  field name is also defined  in the ancestor class : " + this.getExtend());
+//            }
         }
 
         return merged;
@@ -484,9 +515,9 @@
             if (!merged.containsKey(beanDescriptor.getFieldName())) {
                 merged.put(beanDescriptor.getFieldName(), beanDescriptor);
             }
-            else {
-                log.warn("Bean name conflict in " + this.className + " - field : " +beanDescriptor.getFieldName() + " -  this  field name is also defined  in the ancestor class : " + this.getSuperClass());
-            }
+//            else {
+//                log.warn("Bean name conflict in " + this.className + " - field : " +beanDescriptor.getFieldName() + " -  this  field name is also defined  in the ancestor class : " + this.getExtend());
+//            }
         }
 
         return merged;
@@ -503,13 +534,33 @@
             if (!merged.containsKey(collectionDescriptor.getFieldName())) {
                 merged.put(collectionDescriptor.getFieldName(), collectionDescriptor);
             }
-            else {
-                log.warn("Collection name conflict in " + this.className + " - field : " +collectionDescriptor.getFieldName() + " -  this  field name is also defined  in the ancestor class : " + this.getSuperClass());
-            }
+//            else {
+//                log.warn("Collection name conflict in " + this.className + " - field : " +collectionDescriptor.getFieldName() + " -  this  field name is also defined  in the ancestor class : " + this.getExtend());
+//            }
         }
 
         return merged;
     }    
+    
+    
+//    private List mergeInterfaces(List  existing, Collection superSource) {
+//        if (null == superSource) {
+//            return existing;
+//        }
+//
+//        ArrayList merged = new ArrayList(existing);
+//        for (Iterator it = superSource.iterator(); it.hasNext();)
+//        {
+//             String interfaceName = (String) it.next();
+//             if (! merged.contains(interfaceName))
+//             {
+//            	     merged.add(interfaceName);
+//             }            	 
+//        }
+//        
+//        return merged;
+//    }    
+    
     
 	public String toString() {
 		return "Class Descriptor : " +  this.getClassName();

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/CollectionDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/CollectionDescriptor.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/CollectionDescriptor.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/CollectionDescriptor.java Sat May 13 08:08:04 2006
@@ -105,7 +105,7 @@
      * 
      * @return The collection converter class name 
      */
-    public String getCollectionConverterClassName()
+    public String getCollectionConverter()
     {
         return collectionConverterClassName;
     }
@@ -114,7 +114,7 @@
      * Set the collection converter class name
      * @param collectionConverterClassName The converter to set
      */
-    public void setCollectionConverterClassName(String collectionConverterClassName)
+    public void setCollectionConverter(String collectionConverterClassName)
     {
         this.collectionConverterClassName = collectionConverterClassName;
     }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/FieldDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/FieldDescriptor.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/FieldDescriptor.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/FieldDescriptor.java Sat May 13 08:08:04 2006
@@ -38,7 +38,7 @@
     private ClassDescriptor classDescriptor;
     private boolean id;
     private boolean path;
-    private boolean discriminator;
+   
 
     /**
      * @return Returns the fieldName.
@@ -241,14 +241,6 @@
      */
     public void setJcrMultiple(boolean value) {
         this.jcrMultiple = value;
-    }
-
-    public void setDiscriminator(boolean value) {
-        this.discriminator = value;
-    }
-
-    public boolean isDiscriminator() {
-        return this.discriminator;
     }
 
     /**

Added: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ImplementDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ImplementDescriptor.java?rev=406118&view=auto
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ImplementDescriptor.java (added)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/ImplementDescriptor.java Sat May 13 08:08:04 2006
@@ -0,0 +1,42 @@
+/*
+ * 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.mapper.model;
+
+
+/**
+ *
+ *
+ * ImplementDescriptor is used by the mapper to read general information on a implemented interface
+ *
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
+ *
+ */
+public class ImplementDescriptor {
+    private String interfaceName;
+
+	public String getInterfaceName() {
+		return interfaceName;
+	}
+
+	public void setInterfaceName(String interfaceName) {
+		this.interfaceName = interfaceName;
+	}
+
+	public String toString() {
+		
+		return "Field Descriptor : " +  this.interfaceName;
+	}    
+}

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/MappingDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/MappingDescriptor.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/MappingDescriptor.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/mapper/model/MappingDescriptor.java Sat May 13 08:08:04 2006
@@ -55,8 +55,8 @@
         if (null != this.packageName && !"".equals(this.packageName)) {
             classDescriptor.setClassName(this.packageName + "." + classDescriptor.getClassName());
 
-            if (null != classDescriptor.getSuperClass() && !"".equals(classDescriptor.getSuperClass())) {
-                classDescriptor.setSuperClass(this.packageName + "." + classDescriptor.getSuperClass());
+            if (null != classDescriptor.getExtend() && !"".equals(classDescriptor.getExtend())) {
+                classDescriptor.setExtend(this.packageName + "." + classDescriptor.getExtend());
             }
         }
 

Added: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/PersistenceConstant.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/PersistenceConstant.java?rev=406118&view=auto
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/PersistenceConstant.java (added)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/PersistenceConstant.java Sat May 13 08:08:04 2006
@@ -0,0 +1,34 @@
+/*
+ * 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;
+
+
+
+/**
+ *  
+ * General Persistence Constants use in several classes
+ * 
+ * @author <a href="mailto:christophe.lombart@gmail.com">Lombart Christophe </a>
+ * 
+ */
+public interface PersistenceConstant
+{
+	public static final String NT_UNSTRUCTURED = "nt:unstructured";    
+	public static final String DISCRIMINATOR_NODE_TYPE = "graffito:discriminator";
+	public static final String DISCRIMINATOR_PROPERTY_NAME = "graffito:classname"; 
+	
+        
+}
\ No newline at end of file

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/collectionconverter/impl/DefaultCollectionConverterImpl.java Sat May 13 08:08:04 2006
@@ -100,7 +100,7 @@
         if (jcrName == null) {
             throw new JcrMappingException(
                     "The JcrName attribute is not defined for the CollectionDescriptor : "
-                    + collectionDescriptor.getFieldName());
+                    + collectionDescriptor.getFieldName() + " for the classdescriptor : " + collectionDescriptor.getClassDescriptor().getClassName());
         }
 
         Node collectionNode = parentNode.addNode(jcrName);

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=406118&r1=406117&r2=406118&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 Sat May 13 08:08:04 2006
@@ -42,6 +42,7 @@
 import org.apache.portals.graffito.jcr.mapper.model.ClassDescriptor;
 import org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor;
 import org.apache.portals.graffito.jcr.mapper.model.FieldDescriptor;
+import org.apache.portals.graffito.jcr.persistence.PersistenceConstant;
 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;
@@ -53,11 +54,12 @@
 import org.apache.portals.graffito.jcr.reflection.ReflectionUtils;
 import org.apache.portals.graffito.jcr.repository.RepositoryUtil;
 
+import sun.reflect.misc.ReflectUtil;
+
 /**
  * Default implementation for {@link ObjectConverterImpl}
  * 
- * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart
- *         Christophe </a>
+ * @author <a href="mailto:christophe.lombart@gmail.com">Lombart  Christophe </a>
  * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
  */
 public class ObjectConverterImpl implements ObjectConverter {
@@ -143,7 +145,7 @@
 
 		String jcrNodeType = classDescriptor.getJcrNodeType();
 		if ((jcrNodeType == null) || jcrNodeType.equals("")) {
-			throw new JcrMappingException("Undefined node type for  " + parentNode);
+			jcrNodeType= PersistenceConstant.NT_UNSTRUCTURED;
 		}
 
 		Node objectNode = null;
@@ -157,20 +159,45 @@
 					+ object.getClass(), re);
 		}
 
-		if (null != classDescriptor.getJcrMixinTypes()) {
-			String[] mixinTypes = classDescriptor.getJcrMixinTypes();
-			for (int i = 0; i < mixinTypes.length; i++) {
-				try {
-					objectNode.addMixin(mixinTypes[i].trim());
-				} catch (NoSuchNodeTypeException nsnte) {
-					throw new JcrMappingException("Unknown mixin type " + mixinTypes[i].trim() + " for mapped class "
-							+ object.getClass(), nsnte);
-				} catch (RepositoryException re) {
-					throw new PersistenceException("Cannot create new node of type " + jcrNodeType + " from mapped class "
-							+ object.getClass(), re);
+		String[] mixinTypes = classDescriptor.getJcrMixinTypes();
+		String mixinTypeName = null;
+		try {						
+			
+			// Add mixin types
+			if (null != classDescriptor.getJcrMixinTypes()) {
+				for (int i = 0; i < mixinTypes.length; i++) {
+					mixinTypeName = mixinTypes[i].trim();
+					objectNode.addMixin(mixinTypeName);
 				}
 			}
+			
+			// Add mixin types defined in the associated interfaces 
+			if (! classDescriptor.hasDiscriminator() && classDescriptor.hasInterfaces())
+			{
+				Iterator  interfacesIterator = classDescriptor.getImplements().iterator();
+				while (interfacesIterator.hasNext())
+				{
+					String interfaceName = (String)  interfacesIterator.next();
+					ClassDescriptor interfaceDescriptor =  mapper.getClassDescriptor(ReflectionUtils.forName(interfaceName));
+					objectNode.addMixin(interfaceDescriptor.getJcrNodeType().trim());
+				}			    
+			}
+			
+			// If required, add the discriminator node type 
+			if (classDescriptor.hasDiscriminator())
+			{
+				mixinTypeName = PersistenceConstant.DISCRIMINATOR_NODE_TYPE;
+				objectNode.addMixin(mixinTypeName);
+				objectNode.setProperty(PersistenceConstant.DISCRIMINATOR_PROPERTY_NAME, ReflectionUtils.getBeanClass(object).getName());
+			}
+		} catch (NoSuchNodeTypeException nsnte) {
+			throw new JcrMappingException(
+					"Unknown mixin type " + mixinTypeName + " for mapped class " + object.getClass(), nsnte);
+		} catch (RepositoryException re) {
+			throw new PersistenceException("Cannot create new node of type " + jcrNodeType + " from mapped class "
+					+ object.getClass(), re);
 		}
+		
 
 		storeSimpleFields(session, object, classDescriptor, objectNode);
 		insertBeanFields(session, object, classDescriptor, objectNode);
@@ -207,7 +234,8 @@
 			Node objectNode = parentNode.getNode(nodeName);
 
 			checkNodeType(session, classDescriptor);
-			checkCompatibleNodeTypes(session, objectNode, classDescriptor, false);
+			
+			checkCompatiblePrimaryNodeTypes(session, objectNode, classDescriptor, false);
 
 			storeSimpleFields(session, object, classDescriptor, objectNode);
 			updateBeanFields(session, object, classDescriptor, objectNode);
@@ -235,18 +263,19 @@
 			checkNodeType(session, classDescriptor);
 
 			Node node = (Node) session.getItem(path);
-
-			checkCompatibleNodeTypes(session, node, classDescriptor, true);
+            if (! classDescriptor.isInterface())
+            {
+			    checkCompatiblePrimaryNodeTypes(session, node, classDescriptor, true);
+            }
+            
 			Object object = null;
-			if (classDescriptor.usesNodeTypePerHierarchyStrategy()) {
-				String discriminatorProperty = classDescriptor.getDiscriminatorFieldDescriptor().getJcrName();
-
-				if (!node.hasProperty(discriminatorProperty)) {
+			if (classDescriptor.usesNodeTypePerHierarchyStrategy()) {				
+				if (!node.hasProperty(PersistenceConstant.DISCRIMINATOR_PROPERTY_NAME)) {
 					throw new PersistenceException("Cannot fetch object of type '" + clazz.getName()
 							+ "' using NODETYPE_PER_HIERARCHY. Discriminator property is not present.");
 				}
 
-				String className = node.getProperty(discriminatorProperty).getValue().getString();
+				String className = node.getProperty(PersistenceConstant.DISCRIMINATOR_PROPERTY_NAME).getValue().getString();
 				classDescriptor = getClassDescriptor(Class.forName(className));
 				object = ReflectionUtils.newInstance(className);
 			} else {
@@ -288,11 +317,31 @@
 	 *             thrown if an error occured in the underlying repository
 	 */
 	private void checkNodeType(Session session, ClassDescriptor classDescriptor) {
+		String jcrTypeName = null;
 		try {
-			session.getWorkspace().getNodeTypeManager().getNodeType(classDescriptor.getJcrNodeType());
+			
+			
+			//Don't check the primary node type for interfaces. They are only associated to mixin node type
+			if ( classDescriptor.isInterface())
+			{
+				String[] mixinTypes = classDescriptor.getJcrMixinTypes();
+				for (int i=0; i<mixinTypes.length; i++)
+				{
+					jcrTypeName = mixinTypes[i];
+				     session.getWorkspace().getNodeTypeManager().getNodeType(jcrTypeName);
+				}
+			}
+			else
+			{
+				jcrTypeName = classDescriptor.getJcrNodeType();
+				if(jcrTypeName != null && !  jcrTypeName.equals(""))
+				{
+				    session.getWorkspace().getNodeTypeManager().getNodeType(jcrTypeName);
+				}
+			}
 		} catch (NoSuchNodeTypeException nsnte) {
-			throw new JcrMappingException("Mapping for class '" + classDescriptor.getClassName() + "' use unknown node type '"
-					+ classDescriptor.getJcrNodeType() + "'");
+			throw new JcrMappingException("Mapping for class '" + classDescriptor.getClassName() + "' use unknown primary or mixin node type '"
+					+  jcrTypeName  + "'");
 		} catch (RepositoryException re) {
 			throw new org.apache.portals.graffito.jcr.exception.RepositoryException(re);
 		}
@@ -318,7 +367,7 @@
 	 * @throws org.apache.portals.graffito.jcr.exception.RepositoryException
 	 *             thrown if an error occured in the underlying repository
 	 */
-	private void checkCompatibleNodeTypes(Session session, Node node, ClassDescriptor classDescriptor, boolean checkVersionNode) {
+	private void checkCompatiblePrimaryNodeTypes(Session session, Node node, ClassDescriptor classDescriptor, boolean checkVersionNode) {
 		try {
 			NodeType nodeType = node.getPrimaryNodeType();
 
@@ -352,6 +401,13 @@
 	 *         <tt>false</tt> otherwise
 	 */
 	private boolean checkCompatibleNodeTypes(NodeType nodeType, ClassDescriptor descriptor) {
+		
+		//return true if node type is not used
+		if (descriptor.getJcrNodeType() == null ||descriptor.getJcrNodeType().equals("") )
+		{
+			return true;
+		}
+		
 		if (nodeType.getName().equals(descriptor.getJcrNodeType())) {
 			return true;
 		}
@@ -412,14 +468,13 @@
 
 					ReflectionUtils.setNestedProperty(initializedBean, fieldName, node.getPath());
 
-				} else if (classDescriptor.usesNodeTypePerHierarchyStrategy() && fieldDescriptor.isDiscriminator()) {
+				} else if (classDescriptor.usesNodeTypePerHierarchyStrategy() && classDescriptor.hasDiscriminator()) {
 
-					if (node.hasProperty(classDescriptor.getDiscriminatorFieldDescriptor().getJcrName())) {
+					if (node.hasProperty(PersistenceConstant.DISCRIMINATOR_PROPERTY_NAME)) {
 						if (null == initializedBean) {
 							initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
 						}
-						String value = node.getProperty(classDescriptor.getDiscriminatorFieldDescriptor().getJcrName())
-								.getValue().getString();
+						String value = node.getProperty(propertyName).getValue().getString();
 						ReflectionUtils.setNestedProperty(initializedBean, fieldName, value);
 					} else {
 						throw new PersistenceException("Class '" + classDescriptor.getClassName()
@@ -610,19 +665,13 @@
 					continue;
 				}
 
-				if (classDescriptor.usesNodeTypePerHierarchyStrategy() && fieldDescriptor.isDiscriminator()) {
-					objectNode.setProperty(fieldDescriptor.getJcrName(), classDescriptor.getClassName());
-					continue;
-				}
-
 				boolean protectedProperty = fieldDescriptor.isJcrProtected();
 
 				if (objectNode.hasProperty(jcrName)) {
 					protectedProperty = objectNode.getProperty(jcrName).getDefinition().isProtected();
 				}
 
-				if (!protectedProperty) { // DO NOT TRY TO WRITE PROTECTED
-											// PROPERTIES
+				if (!protectedProperty) { // DO NOT TRY TO WRITE PROTECTED  PROPERTIES
 					Object fieldValue = ReflectionUtils.getNestedProperty(object, fieldName);
 					AtomicTypeConverter converter = getAtomicTypeConverter(fieldDescriptor, object, fieldName);
 					Value value = converter.getValue(valueFactory, fieldValue);
@@ -657,7 +706,7 @@
 	}
 
 	private CollectionConverter getCollectionConverter(Session session, CollectionDescriptor collectionDescriptor) {
-		String className = collectionDescriptor.getCollectionConverterClassName();
+		String className = collectionDescriptor.getCollectionConverter();
 		Map atomicTypeConverters = this.atomicTypeConverterProvider.getAtomicTypeConverters();
 		if (className == null) {
 			return new DefaultCollectionConverterImpl(atomicTypeConverters, this, this.mapper);

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/query/impl/QueryManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/query/impl/QueryManagerImpl.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/query/impl/QueryManagerImpl.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/query/impl/QueryManagerImpl.java Sat May 13 08:08:04 2006
@@ -23,13 +23,14 @@
 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.FieldDescriptor;
+import org.apache.portals.graffito.jcr.persistence.PersistenceConstant;
 import org.apache.portals.graffito.jcr.query.Filter;
 import org.apache.portals.graffito.jcr.query.Query;
 import org.apache.portals.graffito.jcr.query.QueryManager;
 
 public class QueryManagerImpl implements QueryManager {
-
-    private Mapper mapper;
+    
+	private Mapper mapper;
     private Map atomicTypeConverters;
 
     public QueryManagerImpl(Mapper mapper, Map atomicTypeConverters) {
@@ -53,7 +54,7 @@
 
         // Check if the class has  an inheritance discriminator field
         ClassDescriptor classDescriptor = mapper.getClassDescriptor(filter.getFilterClass());
-        if (classDescriptor.hasDiscriminatorField()) {
+        if (classDescriptor.hasDiscriminator()) {
             Filter discrininatorFilter = buildDiscriminatorFilter(query, classDescriptor);
             filter = filter.addAndFilter(discrininatorFilter);
         }
@@ -88,10 +89,8 @@
 
     private Filter buildDiscriminatorFilter(Query query, ClassDescriptor classDescriptor) {
         Filter discriminatorFilter = this.createFilter(query.getFilter().getFilterClass());
-        if (!classDescriptor.isAbstract()) {
-            FieldDescriptor fieldDescriptor = classDescriptor.getDiscriminatorFieldDescriptor();
-            discriminatorFilter.addEqualTo(fieldDescriptor.getFieldName(),
-                                           classDescriptor.getClassName());
+        if (!classDescriptor.isAbstract() && (! classDescriptor.isInterface()) ) {        
+            discriminatorFilter.addJCRExpression("@" + PersistenceConstant.DISCRIMINATOR_PROPERTY_NAME + "='" +    classDescriptor.getClassName() + "'");
         }
 
         if (classDescriptor.hasDescendants()) {
@@ -113,7 +112,15 @@
     private String getNodeType(Filter filter) {
         ClassDescriptor classDescriptor = mapper.getClassDescriptor(filter.getFilterClass());
 
-        return classDescriptor.getJcrNodeType();
+        String jcrNodeType = classDescriptor.getJcrNodeType();
+        if (jcrNodeType == null || jcrNodeType.equals(""))
+        	{
+           return PersistenceConstant.NT_UNSTRUCTURED;	
+        	}
+        else
+        {
+           return jcrNodeType;	
+        }
     }
 
 }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-atomic.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-atomic.xml?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-atomic.xml (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-atomic.xml Sat May 13 08:08:04 2006
@@ -3,7 +3,7 @@
 <!DOCTYPE graffito-jcr PUBLIC "-//The Apache Software Foundation//DTD Repository//EN" "./src/dtd/graffito-jcr-mapping.dtd">
 <graffito-jcr>
     <class-descriptor
-		className="org.apache.portals.graffito.jcr.testmodel.Atomic" jcrNodeType="nt:unstructured">
+		className="org.apache.portals.graffito.jcr.testmodel.Atomic" jcrNodeType="nt:unstructured" discriminator="false" >
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="string" jcrName="string" />
 		<field-descriptor fieldName="booleanObject" jcrName="booleanObject" />
@@ -20,7 +20,7 @@
 	</class-descriptor>
 
     <class-descriptor
-		className="org.apache.portals.graffito.jcr.testmodel.MultiValue" jcrNodeType="nt:unstructured">
+		className="org.apache.portals.graffito.jcr.testmodel.MultiValue" jcrNodeType="nt:unstructured" discriminator="false" >
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="name" jcrName="name" />
 		<collection-descriptor fieldName="multiValues" jcrName="multiValue" proxy="false" 

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml Sat May 13 08:08:04 2006
@@ -3,34 +3,58 @@
 <!DOCTYPE graffito-jcr PUBLIC "-//The Apache Software Foundation//DTD Repository//EN" "./src/dtd/graffito-jcr-mapping.dtd">
 <graffito-jcr>    
 
-     <!--  MAPPING USED TO TEST NODE TYPE PER HIERARCHY  -->
-     
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Ancestor" jcrNodeType="nt:unstructured"  abstract="true" >
+     <!--MAPPING USED TO TEST INTERFACES WITHOUT NODE TYPE   -->	
+
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.interfaces.Interface"  interface="true"  />
+	
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.interfaces.AnotherInterface"  interface="true" />
+
+     <!--MAPPING USED TO TEST INTERFACES WITH NODE TYPE   -->	
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.interfaces.CmsObject"  interface="true" discriminator="false"
+	                                   jcrNodeType="graffito:cmsobject" />
+
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.interfaces.Folder"  interface="true" discriminator="false" 
+	                                   extend="org.apache.portals.graffito.jcr.testmodel.interfaces.CmsObject"  jcrNodeType="graffito:folder" />
+
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.interfaces.Content"  interface="true" discriminator="false" 
+	                                   extend="org.apache.portals.graffito.jcr.testmodel.interfaces.CmsObject"  jcrNodeType="graffito:content"  />
+	                                   
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.interfaces.Document"  interface="true" discriminator="false" 
+	                                   extend="org.apache.portals.graffito.jcr.testmodel.interfaces.Content"  jcrNodeType="graffito:document"  />
+	                                   
+	                                   
+     <!--  MAPPING USED TO TEST NODE TYPE PER HIERARCHY  -->	
+     
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Ancestor"  abstract="true" >
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="ancestorField" jcrName="ancestorField" />
-		<field-descriptor fieldName="discriminator" jcrName="discriminator" discriminator="true"  />
 	</class-descriptor>
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Descendant" jcrNodeType="nt:unstructured" 
-	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.Ancestor" >
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Descendant" 
+	                                   extend="org.apache.portals.graffito.jcr.testmodel.inheritance.Ancestor">
+	    <implement-descriptor interfaceName="org.apache.portals.graffito.jcr.testmodel.interfaces.AnotherInterface" />
 		<field-descriptor fieldName="descendantField" jcrName="descendantField" />  
 	</class-descriptor >
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.AnotherDescendant" jcrNodeType="nt:unstructured" 
-	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.Ancestor"  >                               
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.AnotherDescendant" 
+	                                   extend="org.apache.portals.graffito.jcr.testmodel.inheritance.Ancestor"  >
+	    <implement-descriptor interfaceName="org.apache.portals.graffito.jcr.testmodel.interfaces.Interface" />	                                   
 		<field-descriptor fieldName="anotherDescendantField" jcrName="anotherDescendantField" />  
 
 	</class-descriptor>
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.SubDescendant" jcrNodeType="nt:unstructured" 
-	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.Descendant"  >                               
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.SubDescendant" 
+	                                   extend="org.apache.portals.graffito.jcr.testmodel.inheritance.Descendant"  >                               
 		<field-descriptor fieldName="subDescendantField" jcrName="subDescendantField" />  
 
 	</class-descriptor>
 	
      <!--  MAPPING USED TO TEST NODE TYPE PER CONCRETE CLASS  -->	
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.CmsObject" jcrNodeType="graffito:cmsobject"  abstract="true" >
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.CmsObjectImpl" jcrNodeType="graffito:cmsobjectimpl"  
+	                                   discriminator="false" abstract="true" >
+		<implement-descriptor interfaceName="org.apache.portals.graffito.jcr.testmodel.interfaces.CmsObject" />	  	                                    
+		
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="name" jcrName="graffito:name" id="true" />
 		<!--  bean-descriptor  fieldName="parentFolder" 						 
@@ -38,25 +62,28 @@
 
 	</class-descriptor>     
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Folder" jcrNodeType="graffito:folder" 
-	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.CmsObject" >
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.FolderImpl" jcrNodeType="graffito:folderimpl" 
+	                                    extend="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.CmsObjectImpl" >
+		<implement-descriptor interfaceName="org.apache.portals.graffito.jcr.testmodel.interfaces.Folder" />	  		                                    
 		<collection-descriptor fieldName="children" proxy="true" 
-		                       elementClassName="org.apache.portals.graffito.jcr.testmodel.inheritance.CmsObject" 
+		                       elementClassName="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.CmsObjectImpl" 
 		                       collectionConverter="org.apache.portals.graffito.jcr.persistence.collectionconverter.impl.NTCollectionConverterImpl" />
 	</class-descriptor >	
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Content" jcrNodeType="graffito:content" abstract="true"
-	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.CmsObject" >
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.ContentImpl" jcrNodeType="graffito:contentimpl" abstract="true"
+	                                   extend="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.CmsObjectImpl" >
+       		<implement-descriptor interfaceName="org.apache.portals.graffito.jcr.testmodel.interfaces.Content" />	  		                                    
 	</class-descriptor>	
 		
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Document" jcrNodeType="graffito:document" 
-	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.Content" >
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.DocumentImpl" jcrNodeType="graffito:documentimpl" 
+	                                    extend="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.ContentImpl" >
+		<implement-descriptor interfaceName="org.apache.portals.graffito.jcr.testmodel.interfaces.Document" />	  		                                    	                                    
 		<field-descriptor fieldName="contentType" jcrName="graffito:contenttype" />  
 		<field-descriptor fieldName="size" jcrName="graffito:size" />  	
 		<bean-descriptor fieldName="documentStream" jcrName="graffito:documentstream" proxy="true"  />			
 	</class-descriptor >	
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.DocumentStream" jcrNodeType="graffito:documentstream"  >
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.impl.DocumentStream" jcrNodeType="graffito:documentstream"  >
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="encoding" jcrName="graffito:encoding" />
 		<field-descriptor fieldName="content" jcrName="graffito:binarycontent" />

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml Sat May 13 08:08:04 2006
@@ -3,7 +3,7 @@
 <!DOCTYPE graffito-jcr PUBLIC "-//The Apache Software Foundation//DTD Repository//EN" "./src/dtd/graffito-jcr-mapping.dtd">
 <graffito-jcr>
     
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.proxy.Main" 	jcrNodeType="nt:unstructured">
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.proxy.Main" 	jcrNodeType="nt:unstructured"  >
 		<!-- Field-descriptor is used to map simple attributes to jcr property -->
 		<field-descriptor fieldName="path" path="true" />
 		<bean-descriptor fieldName="proxyDetail" jcrName="proxydetail" proxy="true" jcrNodeType="nt:unstructured" />		
@@ -16,7 +16,7 @@
                                                   elementClassName="org.apache.portals.graffito.jcr.testmodel.proxy.Detail" jcrNodeType="nt:unstructured"/>                                                  		
 	</class-descriptor>
 
-	<class-descriptor 	className="org.apache.portals.graffito.jcr.testmodel.proxy.Detail" jcrNodeType="nt:unstructured">		
+	<class-descriptor 	className="org.apache.portals.graffito.jcr.testmodel.proxy.Detail" jcrNodeType="nt:unstructured" >		
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="field" jcrName="field" />
 	</class-descriptor>

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping.xml?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping.xml (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping.xml Sat May 13 08:08:04 2006
@@ -53,14 +53,14 @@
 
 	</class-descriptor>
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.C" jcrNodeType="graffito:C">
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.C" jcrNodeType="graffito:C" discriminator="false" >
 		<!-- Field-descriptor is used to map simple attributes to jcr property -->
 		<field-descriptor fieldName="id" jcrName="graffito:id" 	id="true" />
 		<field-descriptor fieldName="name" jcrName="graffito:name" />
 	</class-descriptor>
 
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.Page" jcrNodeType="graffito:page">
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.Page" jcrNodeType="graffito:page" discriminator="false" >
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="title" jcrName="graffito:title" />
 		<collection-descriptor fieldName="paragraphs" proxy="false" 
@@ -68,23 +68,23 @@
 		                       collectionConverter="org.apache.portals.graffito.jcr.persistence.collectionconverter.impl.NTCollectionConverterImpl" />
 	</class-descriptor>
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.Paragraph" jcrNodeType="graffito:paragraph">
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.Paragraph" jcrNodeType="graffito:paragraph" discriminator="false" >
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="text" jcrName="graffito:text"/>
 	</class-descriptor>
 
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.hashmap.Main" jcrNodeType="nt:unstructured">
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.hashmap.Main" jcrNodeType="nt:unstructured" discriminator="false" >
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="text" jcrName="text" />
-		<collection-descriptor fieldName="elements" proxy="false" 
+		<collection-descriptor fieldName="elements"  proxy="false" 
 		                       elementClassName="org.apache.portals.graffito.jcr.testmodel.hashmap.Element" 
 		                       collectionConverter="org.apache.portals.graffito.jcr.persistence.collectionconverter.impl.NTCollectionConverterImpl" 
 		                       collectionClassName="org.apache.portals.graffito.jcr.testmodel.hashmap.HashMapElement" />
 		                       
 	</class-descriptor>
 
-	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.hashmap.Element" jcrNodeType="graffito:element">
+	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.hashmap.Element" jcrNodeType="graffito:element" discriminator="false" >
 		<field-descriptor fieldName="id" jcrName="graffito:id"  />
 		<field-descriptor fieldName="text" jcrName="graffito:text" />
 	</class-descriptor>

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/repository/repository/nodetypes/custom_nodetypes.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/repository/repository/nodetypes/custom_nodetypes.xml?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/repository/repository/nodetypes/custom_nodetypes.xml (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/repository/repository/nodetypes/custom_nodetypes.xml Sat May 13 08:08:04 2006
@@ -66,7 +66,7 @@
     <propertyDefinition name="graffito:text" requiredType="String" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false" />    
   </nodeType>
   
-   <nodeType name="graffito:cmsobject" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
+   <nodeType name="graffito:cmsobjectimpl" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
     <supertypes>
       <supertype>nt:base</supertype>
     </supertypes>
@@ -75,16 +75,16 @@
 
   </nodeType>
 
-   <nodeType name="graffito:content" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
+   <nodeType name="graffito:contentimpl" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
     <supertypes>
-      <supertype>graffito:cmsobject</supertype>
+      <supertype>graffito:cmsobjectimpl</supertype>
     </supertypes>
   </nodeType>
 
 
-   <nodeType name="graffito:document" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
+   <nodeType name="graffito:documentimpl" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
     <supertypes>
-      <supertype>graffito:content</supertype>
+      <supertype>graffito:contentimpl</supertype>
     </supertypes>    
     <propertyDefinition name="graffito:contenttype" requiredType="String" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false" />
     <propertyDefinition name="graffito:size" requiredType="Long" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false" />    
@@ -95,13 +95,13 @@
     </childNodeDefinition>        
   </nodeType>
   
-  <nodeType name="graffito:folder" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
+  <nodeType name="graffito:folderimpl" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
     <supertypes>
-      <supertype>graffito:cmsobject</supertype>       
+      <supertype>graffito:cmsobjectimpl</supertype>       
     </supertypes>    
-    <childNodeDefinition name="*" defaultPrimaryType="graffito:cmsobject" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="true">
+    <childNodeDefinition name="*" defaultPrimaryType="graffito:cmsobjectimpl" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="true">
       <requiredPrimaryTypes>
-        <requiredPrimaryType>graffito:cmsobject</requiredPrimaryType>         
+        <requiredPrimaryType>graffito:cmsobjectimpl</requiredPrimaryType>         
       </requiredPrimaryTypes>
     </childNodeDefinition>        
   </nodeType>
@@ -116,6 +116,37 @@
     <propertyDefinition name="graffito:binarycontent" requiredType="Binary" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false" />    
   </nodeType>
 
-    
+   <nodeType name="graffito:discriminator" isMixin="true">
+    <supertypes>
+      <supertype>nt:base</supertype>
+    </supertypes>
+    <propertyDefinition name="graffito:classname" requiredType="String" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false" />    
+  </nodeType>
+   
+
+   <nodeType name="graffito:cmsobject" isMixin="true">
+    <supertypes>
+      <supertype>nt:base</supertype>
+    </supertypes>
+  </nodeType>    
+
+   <nodeType name="graffito:folder" isMixin="true">
+    <supertypes>
+      <supertype>graffito:cmsobject</supertype>
+    </supertypes>
+  </nodeType>    
+
+   <nodeType name="graffito:content" isMixin="true">
+    <supertypes>
+      <supertype>graffito:cmsobject</supertype>
+    </supertypes>
+  </nodeType>    
+
+   <nodeType name="graffito:document" isMixin="true">
+    <supertypes>
+      <supertype>graffito:content</supertype>
+    </supertypes>
+  </nodeType>    
+
 </nodeTypes>
 

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/TestBase.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/TestBase.java?rev=406118&r1=406117&r2=406118&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/TestBase.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/TestBase.java Sat May 13 08:08:04 2006
@@ -66,7 +66,7 @@
 import org.apache.portals.graffito.jcr.persistence.atomictypeconverter.impl.TimestampTypeConverterImpl;
 import org.apache.portals.graffito.jcr.persistence.atomictypeconverter.impl.UtilDateTypeConverterImpl;
 import org.apache.portals.graffito.jcr.persistence.impl.PersistenceManagerImpl;
-import org.apache.portals.graffito.jcr.persistence.impl.PersistenceManagerNtHierarchyTest;
+import org.apache.portals.graffito.jcr.persistence.impl.PersistenceManagerInheritanceHierarchyTest;
 import org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter;
 import org.apache.portals.graffito.jcr.persistence.objectconverter.impl.ObjectConverterImpl;
 import org.apache.portals.graffito.jcr.query.QueryManager;
@@ -268,7 +268,8 @@
             while (iterator.hasNext())
             {
                 Object  object = iterator.next();
-                if (ReflectionUtils.getNestedProperty(object, "path").equals(path))
+                String itemPath = (String)  ReflectionUtils.getNestedProperty(object, "path");
+                if (itemPath.equals(path))
                 {
                     if (object.getClass() == objectClass)
                     {