You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by mp...@apache.org on 2005/08/25 01:46:04 UTC

svn commit: r239967 - in /cocoon/gsoc/mpfingsthorn/forms: WEB-INF/xconf/ java/org/apache/cocoon/forms/formmodel/ samples/library/ samples/library/forms/ samples/library/libraries/

Author: mpfingsthorn
Date: Wed Aug 24 16:45:25 2005
New Revision: 239967

URL: http://svn.apache.org/viewcvs?rev=239967&view=rev
Log:
New ExpandDefinition(Builder) to instantiate a non-class widget from the library. Also, inheritance works, by use of the "extends" attribute, specifying the id to load from the library (or local form definition).

Added:
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinitionBuilder.java
Modified:
    cocoon/gsoc/mpfingsthorn/forms/WEB-INF/xconf/cocoon-forms.xconf
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinitionBuilder.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/CaptchaFieldDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/NewDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/SubmitDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UnionDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UploadDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinition.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinitionList.java
    cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_binding.xml
    cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_model.xml
    cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_template.xml
    cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1.xml
    cocoon/gsoc/mpfingsthorn/forms/samples/library/sitemap.xmap

Modified: cocoon/gsoc/mpfingsthorn/forms/WEB-INF/xconf/cocoon-forms.xconf
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/WEB-INF/xconf/cocoon-forms.xconf?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/WEB-INF/xconf/cocoon-forms.xconf (original)
+++ cocoon/gsoc/mpfingsthorn/forms/WEB-INF/xconf/cocoon-forms.xconf Wed Aug 24 16:45:25 2005
@@ -139,6 +139,7 @@
     <widgets>
       <widget name="form" src="org.apache.cocoon.forms.formmodel.FormDefinitionBuilder"/>
       <widget name="import" src="org.apache.cocoon.forms.formmodel.ImportDefinitionBuilder"/>
+      <widget name="expand" src="org.apache.cocoon.forms.formmodel.ExpandDefinitionBuilder"/>
       <widget name="field" src="org.apache.cocoon.forms.formmodel.FieldDefinitionBuilder"/>
       <widget name="group" src="org.apache.cocoon.forms.formmodel.GroupDefinitionBuilder"/>
       <widget name="repeater" src="org.apache.cocoon.forms.formmodel.RepeaterDefinitionBuilder"/>

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java Wed Aug 24 16:45:25 2005
@@ -41,6 +41,26 @@
     }
     
     /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof AbstractContainerDefinition) {
+    		AbstractContainerDefinition other = (AbstractContainerDefinition)definition;
+    		
+    		Iterator otherwidgets = other.definitions.getWidgetDefinitions().iterator();
+    		while(otherwidgets.hasNext()) {
+    			try {
+    				this.definitions.addWidgetDefinition((WidgetDefinition)otherwidgets.next());
+    			} catch(DuplicateIdException ignore) {}
+    		}
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
+    
+    /**
      * checks completeness of this definition
      */
     public void checkCompleteness() throws IncompletenessException {

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinitionBuilder.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinitionBuilder.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinitionBuilder.java Wed Aug 24 16:45:25 2005
@@ -22,9 +22,9 @@
             WidgetDefinition def = null;
             if(this.context !=null)
 	            if((newId = (String)widgetElement.getAttribute("extends")) != null) {
-	            	if((def = definition.getWidgetDefinition(newId))!=null)
+	            	if((def = this.context.getLocalLibrary().getDefinition(newId))!=null)
 	            		this.context.setSuperDefinition(def);
-	            	else if((def = this.context.getLocalLibrary().getDefinition(newId))!=null)
+	            	else if((def = definition.getWidgetDefinition(newId))!=null)
 	            		this.context.setSuperDefinition(def);
 	            }
 	            else

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java Wed Aug 24 16:45:25 2005
@@ -54,6 +54,25 @@
     		throw new IncompletenessException("A datatype element is required!",this);
     	
     }
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof AbstractDatatypeWidgetDefinition) {
+    		AbstractDatatypeWidgetDefinition other = (AbstractDatatypeWidgetDefinition)definition;
+    		
+    		this.datatype = other.datatype;
+    		this.initialValue = other.initialValue;
+    		this.selectionList = other.selectionList;
+    		this.listener = other.listener;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
 
     public Datatype getDatatype() {
         return datatype;

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java Wed Aug 24 16:45:25 2005
@@ -16,6 +16,8 @@
 package org.apache.cocoon.forms.formmodel;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -61,6 +63,52 @@
             }
         }
         return this.formDefinition;
+    }
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	System.out.println("Init from def: "+definition);
+    	if(definition instanceof AbstractWidgetDefinition) {
+    		AbstractWidgetDefinition other = (AbstractWidgetDefinition)definition;
+    		
+    		this.state = other.state;
+    		this.createListener = other.createListener; // this works, we don't really remove listeners, right?
+    		
+    		this.validators = new ArrayList();
+    		if(other.validators!=null) {
+    			Collections.copy(this.validators,other.validators);
+    		}
+    		
+    		if(other.attributes!=null) {
+    			if(attributes==null)
+    				attributes = new HashMap();
+    	    	copyMap(attributes,other.attributes);
+    		}
+    		if(other.displayData!=null) {
+    			if(displayData==null)
+    				displayData = new HashMap();
+    	    	copyMap(displayData,other.displayData);
+    		}
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
+    
+    /**
+     * helper to copy a map
+     * 
+     * @param dest destination map
+     * @param src source map
+     */
+    protected void copyMap(Map dest, Map src) {
+    	dest.clear();
+    	Iterator it = src.entrySet().iterator();
+    	while(it.hasNext()) {
+    		Map.Entry entry = (Map.Entry)it.next();
+    		dest.put(entry.getKey(),entry.getValue());
+    	}
     }
     
     /**

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java Wed Aug 24 16:45:25 2005
@@ -81,14 +81,19 @@
     }
     
     protected void setupDefinition(Element widgetElement, AbstractWidgetDefinition definition) throws Exception {
+    	
+    	// location
+    	definition.setLocation(DomHelper.getLocation(widgetElement));
+    	
+    	if(this.context.getSuperDefinition()!=null)
+    		definition.initializeFrom(this.context.getSuperDefinition());
+    	
         setCommonProperties(widgetElement, definition);
         setValidators(widgetElement, definition);
         setCreateListeners(widgetElement, definition);
     }
 
     private void setCommonProperties(Element widgetElement, AbstractWidgetDefinition widgetDefinition) throws Exception {
-        // location
-        widgetDefinition.setLocation(DomHelper.getLocation(widgetElement));
         
         // id
         if (widgetDefinition instanceof FormDefinition) {

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java Wed Aug 24 16:45:25 2005
@@ -31,6 +31,23 @@
     public void setActionCommand(String actionCommand) {
         this.actionCommand = actionCommand;
     }
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof ActionDefinition) {
+    		ActionDefinition other = (ActionDefinition)definition;
+    		
+    		this.actionCommand = other.actionCommand;
+    		this.listener = other.listener;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
 
     public String getActionCommand() {
         return actionCommand;

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java Wed Aug 24 16:45:25 2005
@@ -21,6 +21,7 @@
 import org.outerj.expression.Expression;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -71,6 +72,36 @@
      */
     private WidgetDefinitionList container = new WidgetDefinitionList(this);
 
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof AggregateFieldDefinition) {
+    		AggregateFieldDefinition other = (AggregateFieldDefinition)definition;
+    		
+    		this.combineExpr = other.combineExpr;
+    		this.splitRegexp = other.splitRegexp;
+    		this.splitPattern = other.splitPattern;
+    		this.splitFailMessage = other.splitFailMessage;
+    		
+    		Iterator defs = other.container.getWidgetDefinitions().iterator();
+    		while(defs.hasNext()) {
+    			container.addWidgetDefinition((WidgetDefinition)defs.next());
+    		}
+    		
+    		Collections.copy(this.splitMappings,other.splitMappings);
+    		
+    		Iterator fields = other.mappedFields.iterator();
+    		while(fields.hasNext()) {
+    			this.mappedFields.add(fields.next());
+    		}
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
 
     public void addWidgetDefinition(WidgetDefinition widgetDefinition) throws DuplicateIdException {
         checkMutable();

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java Wed Aug 24 16:45:25 2005
@@ -35,6 +35,24 @@
         return new BooleanField(this);
     }
     
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof BooleanFieldDefinition) {
+    		BooleanFieldDefinition other = (BooleanFieldDefinition)definition;
+    		
+    		this.listener = other.listener;
+    		this.initialValue = other.initialValue;
+    		this.trueParamValue = other.trueParamValue;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
+    
     public void setInitialValue(Boolean value) {
         checkMutable();
         this.initialValue = value;

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/CaptchaFieldDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/CaptchaFieldDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/CaptchaFieldDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/CaptchaFieldDefinition.java Wed Aug 24 16:45:25 2005
@@ -31,6 +31,22 @@
     public CaptchaFieldDefinition(Context avalonContext) {
         this.avalonContext = avalonContext;
     }
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof CaptchaFieldDefinition) {
+    		CaptchaFieldDefinition other = (CaptchaFieldDefinition)definition;
+    		
+    		this.length = other.length;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
 
     public Widget createInstance() {
         CaptchaField field = new CaptchaField(this, avalonContext);

Added: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinition.java?rev=239967&view=auto
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinition.java (added)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinition.java Wed Aug 24 16:45:25 2005
@@ -0,0 +1,90 @@
+/*
+ * Copyright 1999-2004 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.cocoon.forms.formmodel;
+
+import java.util.List;
+import java.util.ListIterator;
+
+// TODO: The exception messages should use I18n.
+/**
+ * This is the "{@link WidgetDefinition}" which is used to instantiate a
+ * definition from a library which is not a {@link ClassDefinition}. 
+ * The resolve step replaces this definition with
+ * the definition contained in the referenced {@link Library}.
+ * 
+ * Taken from NewDefinition
+ *
+ * @version $Id: ExpandDefinition 46126 2004-09-15 18:42:28Z tim $
+ */
+public class ExpandDefinition extends AbstractWidgetDefinition {
+    private boolean resolving;
+    private WidgetDefinition widgetDefinition;
+
+    public ExpandDefinition() {
+        super();
+        resolving = false;
+        widgetDefinition = null;
+    }
+
+    private WidgetDefinition getWidgetDefinition() throws Exception {
+        FormDefinition formDefinition = getFormDefinition();
+        
+        widgetDefinition = formDefinition.getLocalLibrary().getDefinition(getId());
+        
+        if (widgetDefinition == null)
+            throw new Exception("ExpandDefinition: Widget with id \"" + getId() + "\" does not exist (" + getLocation() + ")");
+
+        return widgetDefinition;
+    }
+
+    // TODO: Should add checking for union defaults which would cause non-terminating recursion.
+    public void resolve(List parents, WidgetDefinition parent) throws Exception {
+        // Non-terminating recursion detection
+        if (resolving) {
+            // Search up parent list in hopes of finding a "Union" before finding previous "Expand" for this "Class".
+            ListIterator parentsIt = parents.listIterator(parents.size());
+            while(parentsIt.hasPrevious()) {
+                WidgetDefinition definition = (WidgetDefinition)parentsIt.previous();
+                if (definition instanceof UnionDefinition) break;
+                if (definition == this)
+                    throw new Exception("ExpandDefinition: Non-terminating recursion detected in widget definition : "
+                        + parent.getId() + " (" + getLocation() + ")");
+            }
+        }
+        // Resolution
+        resolving = true;
+        //parents.add(this);
+        widgetDefinition = getWidgetDefinition();
+        parents.add(this);
+        
+        if (widgetDefinition instanceof ContainerDefinition) {
+            ((ContainerDefinition)widgetDefinition).resolve(parents, parent);
+        } else if (widgetDefinition instanceof ExpandDefinition) {
+            ((ExpandDefinition)widgetDefinition).resolve(parents, parent);
+        } else if (widgetDefinition instanceof NewDefinition) {
+            ((NewDefinition)widgetDefinition).resolve(parents, parent);
+        } else {
+            ((ContainerDefinition)parent).addWidgetDefinition(widgetDefinition);
+        }
+        
+        parents.remove(parents.size()-1);
+        resolving = false;
+    }
+
+    public Widget createInstance() {
+        return null;
+    }
+}

Added: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinitionBuilder.java?rev=239967&view=auto
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinitionBuilder.java (added)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/ExpandDefinitionBuilder.java Wed Aug 24 16:45:25 2005
@@ -0,0 +1,34 @@
+/*
+ * Copyright 1999-2004 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.cocoon.forms.formmodel;
+
+import org.w3c.dom.Element;
+
+/**
+ * Builds {NewDefinition}s.
+ *
+ * @version $Id: NewDefinitionBuilder.java 155211 2005-02-24 17:05:51Z sylvain $
+ */
+public class ExpandDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
+
+    public WidgetDefinition buildWidgetDefinition(Element element) throws Exception {
+        ExpandDefinition definition = new ExpandDefinition();
+        setupDefinition(element, definition);
+        definition.makeImmutable();
+        
+        return definition;
+    }
+}

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java Wed Aug 24 16:45:25 2005
@@ -27,6 +27,22 @@
         Field field = new Field(this);
         return field;
     }
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof FieldDefinition) {
+    		FieldDefinition other = (FieldDefinition)definition;
+    		
+    		this.required = other.required;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
 
     public boolean isRequired() {
         return required;

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/NewDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/NewDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/NewDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/NewDefinition.java Wed Aug 24 16:45:25 2005
@@ -75,9 +75,10 @@
             WidgetDefinition definition = (WidgetDefinition)definitionsIt.next();
             if (definition instanceof ContainerDefinition) {
                 ((ContainerDefinition)definition).resolve(parents, parent);
-            }
-            if (definition instanceof NewDefinition) {
+            } else if (definition instanceof NewDefinition) {
                 ((NewDefinition)definition).resolve(parents, parent);
+            } else if (definition instanceof ExpandDefinition) {
+                ((ExpandDefinition)definition).resolve(parents, parent);
             } else {
                 ((ContainerDefinition)parent).addWidgetDefinition(definition);
             }

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java Wed Aug 24 16:45:25 2005
@@ -43,6 +43,22 @@
     public RepeaterActionDefinition(String repeaterName) {
         this.name = repeaterName;
     }
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof RepeaterActionDefinition) {
+    		RepeaterActionDefinition other = (RepeaterActionDefinition)definition;
+    		
+    		this.name = other.name;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
 
     public Widget createInstance() {
         return new RepeaterAction(this);
@@ -76,6 +92,22 @@
             this.selectName = selectName;
         }
 
+        /**
+         * initialize this definition with the other, sort of like a copy constructor
+         */
+        public void initializeFrom(WidgetDefinition definition) throws Exception {
+        	super.initializeFrom(definition);
+        	
+        	if(definition instanceof DeleteRowsActionDefinition) {
+        		DeleteRowsActionDefinition other = (DeleteRowsActionDefinition)definition;
+        		
+        		this.selectName = other.selectName;
+        		
+        	} else {
+        		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+        	}
+        }
+        
         public boolean hasActionListeners() {
             // we always want to be notified
             return true;
@@ -124,6 +156,22 @@
     public static class InsertRowsActionDefinition extends RepeaterActionDefinition {
         
         private String selectName;
+        
+        /**
+         * initialize this definition with the other, sort of like a copy constructor
+         */
+        public void initializeFrom(WidgetDefinition definition) throws Exception {
+        	super.initializeFrom(definition);
+        	
+        	if(definition instanceof InsertRowsActionDefinition) {
+        		InsertRowsActionDefinition other = (InsertRowsActionDefinition)definition;
+        		
+        		this.selectName = other.selectName;
+        		
+        	} else {
+        		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+        	}
+        }
         
         public InsertRowsActionDefinition(String repeaterName, String selectWidgetName) {
             super(repeaterName);

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java Wed Aug 24 16:45:25 2005
@@ -27,6 +27,21 @@
         super();
         this.initialSize = initialSize;
     }
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof RepeaterDefinition) {
+    		RepeaterDefinition other = (RepeaterDefinition)definition;
+    		
+    		this.initialSize = other.initialSize;
+    	} else {
+     		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+     	}
+    }
 
     public Widget createInstance() {
         return new Repeater(this);

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/SubmitDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/SubmitDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/SubmitDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/SubmitDefinition.java Wed Aug 24 16:45:25 2005
@@ -15,6 +15,7 @@
  */
 package org.apache.cocoon.forms.formmodel;
 
+
 /**
  * Definition for a {@link Submit}.
  * 
@@ -25,6 +26,22 @@
 public class SubmitDefinition extends ActionDefinition {
     
     private boolean validateForm;
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof SubmitDefinition) {
+    		SubmitDefinition other = (SubmitDefinition)definition;
+    		
+    		this.validateForm = other.validateForm;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
     
     public void setValidateForm(boolean validateForm) {
         checkMutable();

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UnionDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UnionDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UnionDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UnionDefinition.java Wed Aug 24 16:45:25 2005
@@ -49,6 +49,21 @@
         return defaultValue;
     }
     */
+    
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof UnionDefinition) {
+    		UnionDefinition other = (UnionDefinition)definition;
+    		this.caseWidgetId = other.caseWidgetId;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
 
     public void setCaseWidgetId(String id) {
         checkMutable();

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UploadDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UploadDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UploadDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/UploadDefinition.java Wed Aug 24 16:45:25 2005
@@ -36,6 +36,23 @@
         this.mimeTypes = mimeTypes;
     }
     
+    /**
+     * initialize this definition with the other, sort of like a copy constructor
+     */
+    public void initializeFrom(WidgetDefinition definition) throws Exception {
+    	super.initializeFrom(definition);
+    	
+    	if(definition instanceof UploadDefinition) {
+    		UploadDefinition other = (UploadDefinition)definition;
+    		
+    		this.required = other.required;
+    		this.mimeTypes = other.mimeTypes;
+    		
+    	} else {
+    		throw new Exception("Definition to inherit from is not of the right type! (at "+getLocation()+")");
+    	}
+    }
+    
     public void addMimeTypes(String types) {
     	if(types != null) {
     		if(mimeTypes == null)

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinition.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinition.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinition.java Wed Aug 24 16:45:25 2005
@@ -28,6 +28,11 @@
  */
 public interface WidgetDefinition {
 
+	/**
+	 * Initializes this definition with values from the given other definition
+	 */
+	void initializeFrom(WidgetDefinition definition) throws Exception;
+	
     /**
      * Gets the {@link FormDefinition}.
      */

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinitionList.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinitionList.java?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinitionList.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinitionList.java Wed Aug 24 16:45:25 2005
@@ -96,6 +96,10 @@
                         // Remove NewDefinition in preparation for its referenced class of widget definitions to be added.
                         this.definitionsIt.remove();
                         ((NewDefinition)widgetDefinition).resolve(parents, containerDefinition);
+                    } else if(widgetDefinition instanceof ExpandDefinition) {
+                    	// Remove ExpandDefinition in preparation for its referenced widget definition to be added.
+                        this.definitionsIt.remove();
+                        ((ExpandDefinition)widgetDefinition).resolve(parents, containerDefinition);
                     } else {
                         if (widgetDefinition instanceof ContainerDefinition)
                             ((ContainerDefinition)widgetDefinition).resolve(parents, containerDefinition);

Modified: cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_binding.xml
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_binding.xml?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_binding.xml (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_binding.xml Wed Aug 24 16:45:25 2005
@@ -20,5 +20,7 @@
   path="/data" >
   
   <fb:value id="field1" path="field1"/>
+  <fb:value id="field2" path="field2"/>
+  <fb:value id="field3" path="field3"/>
   
 </fb:context>

Modified: cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_model.xml
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_model.xml?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_model.xml (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_model.xml Wed Aug 24 16:45:25 2005
@@ -22,5 +22,11 @@
     <fd:import prefix="lib" uri="cocoon:/library/library_form1.xml"/>
     
     <fd:new id="lib:class1"/>
+    <fd:expand id="lib:field2"/>
+    
+    <fd:field id="field3" extends="lib:field2">
+      <fd:datatype base="integer"/>
+    </fd:field>
+    
   </fd:widgets>
 </fd:form>

Modified: cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_template.xml
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_template.xml?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_template.xml (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_template.xml Wed Aug 24 16:45:25 2005
@@ -23,6 +23,8 @@
         <fi:styling layout="columns"/>
         <fi:items>
           <ft:widget id="field1"/>
+          <ft:widget id="field2"/>
+          <ft:widget id="field3"/>
         </fi:items>
       </fi:group>
       <input type="submit"/>

Modified: cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1.xml
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1.xml?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1.xml (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1.xml Wed Aug 24 16:45:25 2005
@@ -21,10 +21,16 @@
     <fd:class id="class1">
       <fd:widgets>
         <fd:field id="field1">
-          <fd:label>Field:</fd:label>
+          <fd:label>Field1:</fd:label>
           <fd:datatype base="string"/>
         </fd:field>
       </fd:widgets>
     </fd:class>
+    
+    <fd:field id="field2">
+      <fd:label>Field2:</fd:label>
+      <fd:datatype base="string"/>
+    </fd:field>
+    
   </fd:widgets>
 </fd:library>

Modified: cocoon/gsoc/mpfingsthorn/forms/samples/library/sitemap.xmap
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/samples/library/sitemap.xmap?rev=239967&r1=239966&r2=239967&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/sitemap.xmap (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/sitemap.xmap Wed Aug 24 16:45:25 2005
@@ -112,7 +112,7 @@
         <map:call resource="simple-page2html">
           <map:parameter name="file" value="resources/result_jx.xml"/>
         </map:call>
-        <map:serialize/>
+        <map:serialize type="xml"/>
       </map:match>
       
       <map:match pattern="resources/**">