You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by cl...@apache.org on 2007/09/05 23:15:57 UTC

svn commit: r573060 - in /jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper: ./ impl/ model/

Author: clombart
Date: Wed Sep  5 14:15:56 2007
New Revision: 573060

URL: http://svn.apache.org/viewvc?rev=573060&view=rev
Log:
Refactor Mapper & reader (issue 1113). 

Added:
    jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/DescriptorReader.java
    jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/AbstractMapperImpl.java
Modified:
    jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterDescriptorReader.java
    jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterMapperImpl.java
    jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/model/MappingDescriptor.java

Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/DescriptorReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/DescriptorReader.java?rev=573060&view=auto
==============================================================================
--- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/DescriptorReader.java (added)
+++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/DescriptorReader.java Wed Sep  5 14:15:56 2007
@@ -0,0 +1,20 @@
+package org.apache.jackrabbit.ocm.mapper;
+
+import org.apache.jackrabbit.ocm.mapper.impl.AbstractMapperImpl;
+import org.apache.jackrabbit.ocm.mapper.model.MappingDescriptor;
+
+public interface DescriptorReader {
+
+	/**
+	 * Load all class descriptors found in an classdescriptor definition.
+	 * A classdescriptor definition can be a xml config file or annotations 
+	 * or another kind of resource which contain the classdescriptors 
+	 * 
+	 * DescriptorReader is an abstraction used to maximize reusability in {@link AbstractMapperImpl}
+	 * 
+	 * @return a {@link MappingDescriptor} wich will contains a collection of classdescriptors
+	 * 
+	 */
+	public abstract MappingDescriptor loadClassDescriptors();
+
+}
\ No newline at end of file

Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/AbstractMapperImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/AbstractMapperImpl.java?rev=573060&view=auto
==============================================================================
--- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/AbstractMapperImpl.java (added)
+++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/AbstractMapperImpl.java Wed Sep  5 14:15:56 2007
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.jackrabbit.ocm.mapper.impl;
+
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.ocm.exception.IncorrectPersistentClassException;
+import org.apache.jackrabbit.ocm.exception.InitMapperException;
+import org.apache.jackrabbit.ocm.exception.JcrMappingException;
+import org.apache.jackrabbit.ocm.mapper.DescriptorReader;
+import org.apache.jackrabbit.ocm.mapper.Mapper;
+import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor;
+import org.apache.jackrabbit.ocm.mapper.model.MappingDescriptor;
+
+/**
+ *
+ * Abstract class for {@link org.apache.jackrabbit.ocm.mapper.Mapper}
+ *
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
+ * 
+ */
+public abstract class AbstractMapperImpl implements Mapper {
+    protected static final Log log = LogFactory.getLog(AbstractMapperImpl.class);
+
+    protected DescriptorReader descriptorReader;
+    protected MappingDescriptor mappingDescriptor;
+    protected Collection rootClassDescriptors = new ArrayList(); // contains the class descriptor which have not ancestors 
+
+    public void buildMapper() 
+    {
+    	mappingDescriptor = descriptorReader.loadClassDescriptors();
+    	mappingDescriptor.setMapper(this);
+    	
+        if (null != this.mappingDescriptor) 
+        {
+            List errors = new ArrayList();
+            errors =  solveReferences(errors);            
+            errors = validateDescriptors(errors, rootClassDescriptors);
+
+            if (!errors.isEmpty()) 
+            {
+                throw new InitMapperException("Mapping files contain errors."
+                        + getErrorMessage(errors));
+            }
+        }
+        else 
+        {
+            throw new InitMapperException("No mappings were provided");
+        }
+                
+    }
+
+
+    protected List solveReferences(List errors) {
+        for(Iterator it = this.mappingDescriptor.getClassDescriptorsByClassName().entrySet().iterator(); it.hasNext(); ) {
+            Map.Entry entry = (Map.Entry) it.next();
+            ClassDescriptor cd = (ClassDescriptor) entry.getValue();
+
+            if (null != cd.getExtend() && !"".equals(cd.getExtend())) 
+            {
+                ClassDescriptor superClassDescriptor = this.mappingDescriptor.getClassDescriptorByName(cd.getExtend());
+
+                if (null == superClassDescriptor) 
+                {
+                    errors.add("Cannot find mapping for class "
+                            + cd.getExtend()
+                            + " referenced as extends from "
+                            + cd.getClassName());
+                }
+                else 
+                {
+            	       log.debug("Class " +cd.getClassName() +  " extends " + cd.getExtend());
+                    cd.setSuperClassDescriptor(superClassDescriptor);
+                }
+            }
+            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.getClassDescriptorByName(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;
+    }
+    
+    /**
+     * Validate all class descriptors.
+     * This method validates the toplevel ancestors and after the descendants. 
+     * Otherwise, we can have invalid settings in the class descriptors
+     * @param errors all errors found during the validation process
+     * @param classDescriptors the ancestor classdescriptors
+     * @return
+     */
+    protected List  validateDescriptors(List errors, Collection classDescriptors ) {
+        for(Iterator it = classDescriptors.iterator(); it.hasNext(); ) {
+            ClassDescriptor classDescriptor = (ClassDescriptor) it.next();
+            try {
+                classDescriptor.afterPropertiesSet();
+                if (classDescriptor.hasDescendants()) {
+                    errors = validateDescriptors(errors, classDescriptor.getDescendantClassDescriptors());
+                }
+            }
+            catch(JcrMappingException jme) {
+                log.warn("Mapping of class " + classDescriptor.getClassName() + " is invalid", jme);
+                errors.add(jme.getMessage());
+            }
+        }
+        return errors;
+    }    
+    
+    protected String getErrorMessage(List errors) {
+        final String lineSep = System.getProperty("line.separator");
+        StringBuffer buf = new StringBuffer();
+        for(Iterator it = errors.iterator(); it.hasNext();) {
+            buf.append(lineSep).append(it.next());
+        }
+
+        return buf.toString();
+    }    
+    
+    /**
+    *
+    * @see org.apache.jackrabbit.ocm.mapper.Mapper#getClassDescriptorByClass(java.lang.Class)
+    */
+   public ClassDescriptor getClassDescriptorByClass(Class clazz) {
+	   ClassDescriptor descriptor = mappingDescriptor.getClassDescriptorByName(clazz.getName());
+	   if (descriptor==null) {
+			throw new IncorrectPersistentClassException("Class of type: " + clazz.getName() + " has no descriptor.");
+	   }
+       return descriptor ; 
+   }
+   
+   /**
+   * @see org.apache.jackrabbit.ocm.mapper.Mapper#getClassDescriptorByNodeType(String)
+   */
+  public ClassDescriptor getClassDescriptorByNodeType(String jcrNodeType) {
+	  ClassDescriptor descriptor = mappingDescriptor.getClassDescriptorByNodeType(jcrNodeType);
+	   if (descriptor==null) {
+			throw new IncorrectPersistentClassException("Node type: " + jcrNodeType + " has no descriptor.");
+	   }
+      return descriptor ;      
+  }   
+}

Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterDescriptorReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterDescriptorReader.java?rev=573060&r1=573059&r2=573060&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterDescriptorReader.java (original)
+++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterDescriptorReader.java Wed Sep  5 14:15:56 2007
@@ -20,9 +20,13 @@
 import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
 
 import org.apache.commons.digester.Digester;
 import org.apache.jackrabbit.ocm.exception.InitMapperException;
+import org.apache.jackrabbit.ocm.mapper.DescriptorReader;
 import org.apache.jackrabbit.ocm.mapper.model.BeanDescriptor;
 import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor;
 import org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor;
@@ -36,11 +40,57 @@
  * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
  * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
  */
-public class DigesterDescriptorReader
+public class DigesterDescriptorReader implements DescriptorReader
 {
     private boolean validating = true;
     private URL dtdResolver;
     
+    private Collection configFileStreams = new ArrayList();
+    
+    public DigesterDescriptorReader(InputStream stream)
+    {
+        configFileStreams.add(stream);	
+    }
+    
+    public DigesterDescriptorReader(InputStream[] streams)
+    {
+        for (int i = 0; i < streams.length; i++) 
+        {
+        	configFileStreams.add(streams[i]);	
+		}
+    	
+    }
+    
+    public DigesterDescriptorReader(String xmlFile)
+    {
+    	try
+		{
+    		configFileStreams.add(new FileInputStream(xmlFile));
+		}		
+		catch (FileNotFoundException e)
+		{
+			throw new InitMapperException("Mapping file not found : " + xmlFile,e);
+		}
+    } 
+    
+    public DigesterDescriptorReader(String[] xmlFiles)
+    {
+   	
+    	for (int i = 0; i < xmlFiles.length; i++) 
+    	{
+        	try
+    		{
+        		configFileStreams.add(new FileInputStream(xmlFiles[i]));
+    		}
+    		
+    		catch (FileNotFoundException e)
+    		{
+    			throw new InitMapperException("Mapping file not found : " + xmlFiles[i],e);
+    		}    				
+		}
+    } 
+    
+    
     /**
      * Set if the mapping should be validated.
      * @param flag <tt>true</tt> if the mapping should be validated
@@ -56,86 +106,78 @@
 	/**
 	 * Load all class descriptors found in the xml mapping file.
 	 * 
-	 * @param stream the xml mapping file reference
 	 * @return a {@link MappingDescriptor}
 	 * 
 	 */
-	public MappingDescriptor loadClassDescriptors(InputStream stream)
+	public MappingDescriptor loadClassDescriptors()
 	{
 		try
 		{
-			Digester digester = new Digester();
-			digester.setValidating(this.validating);
-			if (null != this.dtdResolver) {
-                digester.register("-//The Apache Software Foundation//DTD Repository//EN",
-                                  this.dtdResolver.toString());
-            }
-	        digester.setClassLoader(getClass().getClassLoader());
-			
-	        MappingDescriptor mappingDescriptor = new MappingDescriptor();
-	        digester.push(mappingDescriptor);
-			
-
-			// --------------------------------------------------------------------------------
-			// Rules used for the class-descriptor element
-			// --------------------------------------------------------------------------------	                        
-			digester.addObjectCreate("jackrabbit-ocm/class-descriptor", ClassDescriptor.class);
-			digester.addSetProperties("jackrabbit-ocm/class-descriptor");
-			digester.addSetNext("jackrabbit-ocm/class-descriptor", "addClassDescriptor");		
-
-			// --------------------------------------------------------------------------------
-			// Rules used for the implement-descriptor element
-			// --------------------------------------------------------------------------------
-			digester.addObjectCreate("jackrabbit-ocm/class-descriptor/implement-descriptor", ImplementDescriptor.class);
-			digester.addSetProperties("jackrabbit-ocm/class-descriptor/implement-descriptor");
-            digester.addSetNext("jackrabbit-ocm/class-descriptor/implement-descriptor", "addImplementDescriptor");
-			
-			// --------------------------------------------------------------------------------
-			// Rules used for the field-descriptor element
-			// --------------------------------------------------------------------------------
-			digester.addObjectCreate("jackrabbit-ocm/class-descriptor/field-descriptor", FieldDescriptor.class);
-			digester.addSetProperties("jackrabbit-ocm/class-descriptor/field-descriptor");
-            digester.addSetNext("jackrabbit-ocm/class-descriptor/field-descriptor", "addFieldDescriptor");
-
-			// --------------------------------------------------------------------------------
-			// Rules used for the bean-descriptor element
-			// --------------------------------------------------------------------------------
-			digester.addObjectCreate("jackrabbit-ocm/class-descriptor/bean-descriptor", BeanDescriptor.class);
-			digester.addSetProperties("jackrabbit-ocm/class-descriptor/bean-descriptor");
-            digester.addSetNext("jackrabbit-ocm/class-descriptor/bean-descriptor", "addBeanDescriptor");
-
-			// --------------------------------------------------------------------------------
-			// Rules used for the collection-descriptor element
-			// --------------------------------------------------------------------------------
-			digester.addObjectCreate("jackrabbit-ocm/class-descriptor/collection-descriptor", CollectionDescriptor.class);
-			digester.addSetProperties("jackrabbit-ocm/class-descriptor/collection-descriptor");
-            digester.addSetNext("jackrabbit-ocm/class-descriptor/collection-descriptor", "addCollectionDescriptor");			
-
-            return (MappingDescriptor) digester.parse(stream);
+			MappingDescriptor mappingDescriptor = new MappingDescriptor();
+			for (Iterator iter = configFileStreams.iterator(); iter.hasNext();) 
+			{
+				InputStream xmlMappingDescriptorFile = (InputStream) iter.next();
+				Digester digester = new Digester();
+				digester.setValidating(this.validating);
+				if (null != this.dtdResolver) 
+				{
+	                digester.register("-//The Apache Software Foundation//DTD Repository//EN",
+	                                  this.dtdResolver.toString());
+	            }
+		        digester.setClassLoader(getClass().getClassLoader());
+				
+		        MappingDescriptor currentMappingDescriptor = new MappingDescriptor();
+		        digester.push(currentMappingDescriptor);
+				
+
+				// --------------------------------------------------------------------------------
+				// Rules used for the class-descriptor element
+				// --------------------------------------------------------------------------------	                        
+				digester.addObjectCreate("jackrabbit-ocm/class-descriptor", ClassDescriptor.class);
+				digester.addSetProperties("jackrabbit-ocm/class-descriptor");
+				digester.addSetNext("jackrabbit-ocm/class-descriptor", "addClassDescriptor");		
+
+				// --------------------------------------------------------------------------------
+				// Rules used for the implement-descriptor element
+				// --------------------------------------------------------------------------------
+				digester.addObjectCreate("jackrabbit-ocm/class-descriptor/implement-descriptor", ImplementDescriptor.class);
+				digester.addSetProperties("jackrabbit-ocm/class-descriptor/implement-descriptor");
+	            digester.addSetNext("jackrabbit-ocm/class-descriptor/implement-descriptor", "addImplementDescriptor");
+				
+				// --------------------------------------------------------------------------------
+				// Rules used for the field-descriptor element
+				// --------------------------------------------------------------------------------
+				digester.addObjectCreate("jackrabbit-ocm/class-descriptor/field-descriptor", FieldDescriptor.class);
+				digester.addSetProperties("jackrabbit-ocm/class-descriptor/field-descriptor");
+	            digester.addSetNext("jackrabbit-ocm/class-descriptor/field-descriptor", "addFieldDescriptor");
+
+				// --------------------------------------------------------------------------------
+				// Rules used for the bean-descriptor element
+				// --------------------------------------------------------------------------------
+				digester.addObjectCreate("jackrabbit-ocm/class-descriptor/bean-descriptor", BeanDescriptor.class);
+				digester.addSetProperties("jackrabbit-ocm/class-descriptor/bean-descriptor");
+	            digester.addSetNext("jackrabbit-ocm/class-descriptor/bean-descriptor", "addBeanDescriptor");
+
+				// --------------------------------------------------------------------------------
+				// Rules used for the collection-descriptor element
+				// --------------------------------------------------------------------------------
+				digester.addObjectCreate("jackrabbit-ocm/class-descriptor/collection-descriptor", CollectionDescriptor.class);
+				digester.addSetProperties("jackrabbit-ocm/class-descriptor/collection-descriptor");
+	            digester.addSetNext("jackrabbit-ocm/class-descriptor/collection-descriptor", "addCollectionDescriptor");			
+
+	            currentMappingDescriptor = (MappingDescriptor) digester.parse(xmlMappingDescriptorFile);
+				
+				mappingDescriptor.getClassDescriptorsByClassName().putAll(currentMappingDescriptor.getClassDescriptorsByClassName());
+				mappingDescriptor.getClassDescriptorsByNodeType().putAll(currentMappingDescriptor.getClassDescriptorsByNodeType());
+                
+			}
+			return mappingDescriptor;
 		}
 		catch (Exception e)
 		{
-			throw new InitMapperException("Impossible to read the xml mapping file", e);
+			throw new InitMapperException("Impossible to read the xml mapping descriptor file(s)", e);
 		}
 	}
 
-	/**
-	 * Load all class descriptors found in the xml mapping file.
-	 * 
-	 * @param xmlFile the xml mapping file reference
-	 * @return a {@link MappingDescriptor}
-	 * 
-	 */	
-	public MappingDescriptor loadClassDescriptors(String xmlFile)
-	{
-		try
-		{
-			return loadClassDescriptors(new FileInputStream(xmlFile));
-		}
-		
-		catch (FileNotFoundException e)
-		{
-			throw new InitMapperException("Mapping file not found : " + xmlFile,e);
-		}
-	}
+
 }

Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterMapperImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterMapperImpl.java?rev=573060&r1=573059&r2=573060&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterMapperImpl.java (original)
+++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/impl/DigesterMapperImpl.java Wed Sep  5 14:15:56 2007
@@ -20,35 +20,21 @@
 
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jackrabbit.ocm.exception.IncorrectPersistentClassException;
+
 import org.apache.jackrabbit.ocm.exception.InitMapperException;
-import org.apache.jackrabbit.ocm.exception.JcrMappingException;
 import org.apache.jackrabbit.ocm.mapper.Mapper;
-import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor;
 import org.apache.jackrabbit.ocm.mapper.model.MappingDescriptor;
 
 /**
  *
  * Digester implementation for {@link org.apache.jackrabbit.ocm.mapper.Mapper}
- *
+ * 
  * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
  * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
  */
-public class DigesterMapperImpl implements Mapper {
-    private static final Log log = LogFactory.getLog(DigesterMapperImpl.class);
-
-    private MappingDescriptor mappingDescriptor;
-    private Collection rootClassDescriptors = new ArrayList(); // contains the class descriptor which have not ancestors 
-
-    private String[] mappingFiles;
-    private InputStream[] mappingStreams;
-    private DigesterDescriptorReader descriptorReader;
+public class DigesterMapperImpl extends AbstractMapperImpl implements Mapper {
+    
 
     /**
      * No-arg constructor.
@@ -63,7 +49,7 @@
      *
      */
     public DigesterMapperImpl(String xmlFile) {
-        this.mappingFiles = new String[] { xmlFile };
+        descriptorReader = new DigesterDescriptorReader(xmlFile);
         this.buildMapper();
     }
 
@@ -74,7 +60,7 @@
      *
      */
     public DigesterMapperImpl(String[] files) {
-        this.mappingFiles = files;
+        descriptorReader = new DigesterDescriptorReader(files);
         this.buildMapper();
     }
 
@@ -84,7 +70,7 @@
      * @param stream The xml mapping file to read
      */
     public DigesterMapperImpl(InputStream stream) {
-        this.mappingStreams = new InputStream[] { stream };
+        descriptorReader = new DigesterDescriptorReader(stream);
         this.buildMapper();
     }
 
@@ -95,199 +81,8 @@
      *
      */
     public DigesterMapperImpl(InputStream[] streams) {
-        this.mappingStreams = streams;
-        this.buildMapper();
-    }
-
-    /**
-     * Set a mapping file.
-     * 
-     * @param file path to mapping file
-     */
-    public void setMappingFile(String file) {
-        setMappingFiles(new String[] { file });
+        descriptorReader = new DigesterDescriptorReader(streams);
         this.buildMapper();
     }
 
-    /**
-     * 
-     * @param files
-     */
-    public void setMappingFiles(String[] files) {
-        this.mappingFiles = files;
-    }
-
-    public void setMappingStream(InputStream stream) {
-        setMappingStreams(new InputStream[] { stream });
-    }
-
-    public void setMappingStreams(InputStream[] streams) {
-        this.mappingStreams = streams;
-    }
-
-    public void setDescriptorReader(DigesterDescriptorReader reader) {
-        this.descriptorReader = reader;
-    }
-
-    private Mapper buildMapper() {
-        if (this.descriptorReader == null) {
-            this.descriptorReader = new DigesterDescriptorReader();
-        }
-        if (this.mappingFiles != null && this.mappingFiles.length > 0) {
-            log.info("Read the xml mapping file : " +  this.mappingFiles[0]);
-            this.mappingDescriptor = this.descriptorReader.loadClassDescriptors(this.mappingFiles[0]);
-            this.mappingDescriptor.setMapper(this);
-
-            for (int i = 1; i < this.mappingFiles.length; i++) {
-                log.info("Read the xml mapping file : " +  this.mappingFiles[i]);
-                MappingDescriptor anotherMappingDescriptor = this.descriptorReader.loadClassDescriptors(this.mappingFiles[i]);
-                this.mappingDescriptor.getClassDescriptorsByClassName().putAll(anotherMappingDescriptor.getClassDescriptorsByClassName());
-                this.mappingDescriptor.getClassDescriptorsByNodeType().putAll(anotherMappingDescriptor.getClassDescriptorsByNodeType());
-                
-            }
-        }
-        else if (this.mappingStreams != null && this.mappingStreams.length > 0) {
-            log.info("Read the stream mapping file : " +  this.mappingStreams[0].toString());
-            this.mappingDescriptor = this.descriptorReader.loadClassDescriptors(this.mappingStreams[0]);
-            this.mappingDescriptor.setMapper(this);
-
-            for (int i = 1; i < this.mappingStreams.length; i++) {
-                log.info("Read the stream mapping file : " +  this.mappingStreams[i].toString());
-                MappingDescriptor anotherMappingDescriptor = this.descriptorReader.loadClassDescriptors(this.mappingStreams[i]);
-                this.mappingDescriptor.getClassDescriptorsByClassName().putAll(anotherMappingDescriptor.getClassDescriptorsByClassName());
-                this.mappingDescriptor.getClassDescriptorsByNodeType().putAll(anotherMappingDescriptor.getClassDescriptorsByNodeType());
-            }
-        }
-        if (null != this.mappingDescriptor) {
-            List errors = new ArrayList();
-            errors =  solveReferences(errors);            
-            errors = validateDescriptors(errors, rootClassDescriptors);
-
-            if (!errors.isEmpty()) {
-                throw new InitMapperException("Mapping files contain errors."
-                        + getErrorMessage(errors));
-            }
-        }
-        else {
-            throw new InitMapperException("No mappings were provided");
-        }
-        
-        return this;
-    }
-
-    private List solveReferences(List errors) {
-        for(Iterator it = this.mappingDescriptor.getClassDescriptorsByClassName().entrySet().iterator(); it.hasNext(); ) {
-            Map.Entry entry = (Map.Entry) it.next();
-            ClassDescriptor cd = (ClassDescriptor) entry.getValue();
-
-            if (null != cd.getExtend() && !"".equals(cd.getExtend())) 
-            {
-                ClassDescriptor superClassDescriptor = this.mappingDescriptor.getClassDescriptorByName(cd.getExtend());
-
-                if (null == superClassDescriptor) 
-                {
-                    errors.add("Cannot find mapping for class "
-                            + cd.getExtend()
-                            + " referenced as extends from "
-                            + cd.getClassName());
-                }
-                else 
-                {
-            	       log.debug("Class " +cd.getClassName() +  " extends " + cd.getExtend());
-                    cd.setSuperClassDescriptor(superClassDescriptor);
-                }
-            }
-            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.getClassDescriptorByName(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;
-    }
-    
-    /**
-     * Validate all class descriptors.
-     * This method validates the toplevel ancestors and after the descendants. 
-     * Otherwise, we can have invalid settings in the class descriptors
-     * @param errors all errors found during the validation process
-     * @param classDescriptors the ancestor classdescriptors
-     * @return
-     */
-    private List  validateDescriptors(List errors, Collection classDescriptors ) {
-        for(Iterator it = classDescriptors.iterator(); it.hasNext(); ) {
-            ClassDescriptor classDescriptor = (ClassDescriptor) it.next();
-            try {
-                classDescriptor.afterPropertiesSet();
-                if (classDescriptor.hasDescendants()) {
-                    errors = validateDescriptors(errors, classDescriptor.getDescendantClassDescriptors());
-                }
-            }
-            catch(JcrMappingException jme) {
-                log.warn("Mapping of class " + classDescriptor.getClassName() + " is invalid", jme);
-                errors.add(jme.getMessage());
-            }
-        }
-        return errors;
-    }    
-    
-    private String getErrorMessage(List errors) {
-        final String lineSep = System.getProperty("line.separator");
-        StringBuffer buf = new StringBuffer();
-        for(Iterator it = errors.iterator(); it.hasNext();) {
-            buf.append(lineSep).append(it.next());
-        }
-
-        return buf.toString();
-    }    
-    
-    /**
-    *
-    * @see org.apache.jackrabbit.ocm.mapper.Mapper#getClassDescriptorByClass(java.lang.Class)
-    */
-   public ClassDescriptor getClassDescriptorByClass(Class clazz) {
-	   ClassDescriptor descriptor = mappingDescriptor.getClassDescriptorByName(clazz.getName());
-	   if (descriptor==null) {
-			throw new IncorrectPersistentClassException("Class of type: " + clazz.getName() + " has no descriptor.");
-	   }
-       return descriptor ; 
-   }
-   
-   /**
-   * @see org.apache.jackrabbit.ocm.mapper.Mapper#getClassDescriptorByNodeType(String)
-   */
-  public ClassDescriptor getClassDescriptorByNodeType(String jcrNodeType) {
-	  ClassDescriptor descriptor = mappingDescriptor.getClassDescriptorByNodeType(jcrNodeType);
-	   if (descriptor==null) {
-			throw new IncorrectPersistentClassException("Node type: " + jcrNodeType + " has no descriptor.");
-	   }
-      return descriptor ;      
-  }
-   
 }

Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/model/MappingDescriptor.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/model/MappingDescriptor.java?rev=573060&r1=573059&r2=573060&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/model/MappingDescriptor.java (original)
+++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/mapper/model/MappingDescriptor.java Wed Sep  5 14:15:56 2007
@@ -17,18 +17,19 @@
 package org.apache.jackrabbit.ocm.mapper.model;
 
 
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.ocm.manager.ManagerConstant;
 import org.apache.jackrabbit.ocm.mapper.Mapper;
-import org.apache.jackrabbit.ocm.mapper.impl.DigesterMapperImpl;
+
 
 /**
- * This class match to the complete xml mapping files.
- * it contains mainly a collection of {@link ClassDescriptor}
+ * MappingDescriptor is an helper class used to access to the {@link ClassDescriptor}
  *
  * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
  * @version $Id: Exp $
@@ -47,6 +48,7 @@
         this.packageName = pckgName;
     }
     
+    
     /**
      * Add a new ClassDescriptor
      *
@@ -87,6 +89,11 @@
         return (ClassDescriptor) classDescriptorsByNodeType.get(nodeType);	
     }
 
+    public Collection getAllClassDescriptors()
+    {
+    	return classDescriptorsByClassName.values();
+    }
+    
     /**
      * Get all class descriptors by class name
      * @return all class descriptors found