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/09/03 02:25:50 UTC

svn commit: r267351 - in /cocoon/gsoc/mpfingsthorn/forms: java/org/apache/cocoon/forms/binding/ java/org/apache/cocoon/forms/binding/library/ java/org/apache/cocoon/forms/formmodel/ java/org/apache/cocoon/forms/formmodel/library/ samples/library/forms/...

Author: mpfingsthorn
Date: Fri Sep  2 17:25:02 2005
New Revision: 267351

URL: http://svn.apache.org/viewcvs?rev=267351&view=rev
Log:
Libraries now include relative to themselves. Fixed some inheritance issue for top-level widgets and bindings. They ignored the extends attribute, not anymore though. Added some more library depth to the sample to test it.

Added:
    cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second.xml   (with props)
    cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second_binding.xml   (with props)
Modified:
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/ComposedJXPathBindingBase.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/JXPathBindingManager.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/Library.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManager.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManagerImpl.java
    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/AbstractWidgetDefinitionBuilder.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/Library.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManager.java
    cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManagerImpl.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

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/ComposedJXPathBindingBase.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/ComposedJXPathBindingBase.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/ComposedJXPathBindingBase.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/ComposedJXPathBindingBase.java Fri Sep  2 17:25:02 2005
@@ -33,41 +33,6 @@
 public class ComposedJXPathBindingBase extends JXPathBindingBase {
     private final JXPathBindingBase[] subBindings;
     
-    
-    public static JXPathBindingBase[] mergeBindings(JXPathBindingBase[] existing, JXPathBindingBase[] extra) throws Exception {
-    	
-    	if(existing == null || existing.length == 0)
-    		return extra;
-    	
-    	if(extra == null || extra.length == 0)
-    		return existing;
-    	
-    	// have to do it the stupid painter way..
-    	ArrayList list = new ArrayList(existing.length);
-    	for(int i=0; i<existing.length; i++)
-    		list.add(existing[i]);
-    	
-    	for(int i=0; i<extra.length; i++) {
-    		if(extra[i].getId()==null)
-    			list.add(extra[i]);
-    		else {
-    			// try to replace existing one
-    			boolean match = false;
-    			for(int j=0; j<list.size(); j++) {
-    				if(extra[i].getId().equals(((JXPathBindingBase)list.get(j)).getId())) {
-    					list.set(j,extra[i]);
-    					match = true;
-    					break; // stop searching
-    				}
-    			}
-    			// if no match, just add
-    			if(!match)
-    				list.add(extra[i]);
-    		}
-    	}	
-    	
-    	return (JXPathBindingBase[])list.toArray(new JXPathBindingBase[0]);
-    }
 
     /**
      * need accessors!

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/JXPathBindingManager.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/JXPathBindingManager.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/JXPathBindingManager.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/JXPathBindingManager.java Fri Sep  2 17:25:02 2005
@@ -15,6 +15,7 @@
  */
 package org.apache.cocoon.forms.binding;
 
+import java.util.ArrayList;
 import java.util.Stack;
 
 import org.apache.avalon.framework.activity.Disposable;
@@ -39,6 +40,7 @@
 import org.apache.cocoon.forms.datatype.DatatypeManager;
 import org.apache.cocoon.forms.util.DomHelper;
 import org.apache.cocoon.forms.util.SimpleServiceSelector;
+import org.apache.cocoon.util.location.LocationAttributes;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceResolver;
 import org.w3c.dom.Document;
@@ -97,7 +99,7 @@
                                        configuration.getChild("bindings"));
         
         libraryManager = new LibraryManagerImpl();
-        libraryManager.setAssistant(getBuilderAssistant());
+        libraryManager.setBindingManager(this);
         LifecycleHelper.setupComponent(libraryManager,
         								getLogger(),
         								this.avalonContext,
@@ -166,7 +168,7 @@
         }
     }
 
-    private Assistant getBuilderAssistant() {
+    public Assistant getBuilderAssistant() {
         return new Assistant();
     }
 
@@ -225,10 +227,22 @@
             if(context.getLocalLibrary() == null) {
             	Library lib = new Library(libraryManager);
             	context.setLocalLibrary(lib);
+            	lib.setAssistant(getBuilderAssistant());
+            	lib.setSourceURI(LocationAttributes.getURI(configElm));
             	flag = true;
-            	System.out.println("Set local library on "+context+" to "+lib);
             }
             
+            if(context.getLocalLibrary()!=null && configElm.getAttribute("extends")!=null) {
+        		try {
+        			context.setSuperBinding(context.getLocalLibrary().getBinding(configElm.getAttribute("extends")));
+        			
+        		} catch(LibraryException e) {
+        			throw new RuntimeException("Error extending binding! (at "+DomHelper.getLocation(configElm)+")",e);
+        		}
+        	} else {
+        		context.setSuperBinding(null);
+        	}
+            
             JXPathBindingBase childBinding = bindingBuilder.buildBinding(configElm, this);
             
             if(flag && childBinding != null) {
@@ -238,13 +252,46 @@
             // this might get called unnecessarily, but solves issues with the libraries
             if(childBinding != null)
             	childBinding.enableLogging(getLogger());
-            	
-            System.out.println("made new binding! "+configElm.getLocalName());
             
             
             return childBinding;
         }
 
+        private JXPathBindingBase[] mergeBindings(JXPathBindingBase[] existing, JXPathBindingBase[] extra) {
+        	
+        	if(existing == null || existing.length == 0)
+        		return extra;
+        	
+        	if(extra == null || extra.length == 0)
+        		return existing;
+        	
+        	// have to do it the stupid painter way..
+        	ArrayList list = new ArrayList(existing.length);
+        	for(int i=0; i<existing.length; i++)
+        		list.add(existing[i]);
+        	
+        	for(int i=0; i<extra.length; i++) {
+        		if(extra[i].getId()==null)
+        			list.add(extra[i]);
+        		else {
+        			// try to replace existing one
+        			boolean match = false;
+        			for(int j=0; j<list.size(); j++) {
+        				if(extra[i].getId().equals(((JXPathBindingBase)list.get(j)).getId())) {
+        					list.set(j,extra[i]);
+        					match = true;
+        					break; // stop searching
+        				}
+        			}
+        			// if no match, just add
+        			if(!match)
+        				list.add(extra[i]);
+        		}
+        	}	
+        	
+        	return (JXPathBindingBase[])list.toArray(new JXPathBindingBase[0]);
+        }
+        
         /**
          * proxy for compatibility
          * 
@@ -291,7 +338,7 @@
                         
                         popContext();
                     }
-                    return childBindings;
+                    return mergeBindings(existingBindings,childBindings);
                 }
             }
             return null;

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/Library.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/Library.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/Library.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/Library.java Fri Sep  2 17:25:02 2005
@@ -26,6 +26,7 @@
 import org.apache.cocoon.forms.binding.BindingManager;
 import org.apache.cocoon.forms.binding.JXPathBindingManager;
 import org.apache.cocoon.forms.util.DomHelper;
+import org.apache.cocoon.util.location.LocationAttributes;
 
 import org.w3c.dom.Element;
 
@@ -47,6 +48,7 @@
 	// shared object with dependencies
 	protected Object shared = new Object();
 	
+	protected String sourceURI = null;
 	protected JXPathBindingManager.Assistant assistant = null;
 	
 	public Library(ServiceManager sm) {
@@ -65,6 +67,13 @@
 		this.assistant = assistant;
 	}
 	
+	public void setSourceURI(String uri) {
+		sourceURI = uri;
+	}
+	public String getSourceURI() {
+		return sourceURI;
+	}
+	
 	public boolean dependenciesHaveChanged() throws Exception {
 		
 		Iterator it = this.inclusions.values().iterator();
@@ -91,7 +100,7 @@
 		try {
 			// library keys may not contain ":"!
 			if( (!inclusions.containsKey(key) || key.indexOf(SEPARATOR)>-1) 
-					&& manager.getLibrary(librarysource)!=null) {
+					&& manager.getLibrary(librarysource, sourceURI)!=null) {
 				inclusions.put(key,new Dependency(librarysource));
 				return true;
 			}
@@ -119,7 +128,7 @@
 		if(librarykey!=null) {
 			if(inclusions.containsKey(librarykey)) {
 				try {
-					return manager.getLibrary(((Dependency)inclusions.get(librarykey)).sourceURI).getBinding(definitionkey);
+					return manager.getLibrary(((Dependency)inclusions.get(librarykey)).dependencySourceURI, sourceURI).getBinding(definitionkey);
 				} catch(Exception e) {
 					throw new LibraryException("Couldn't get Library key='"+librarykey+"' source='"+inclusions.get(librarykey)+"",e);
 				}
@@ -132,6 +141,7 @@
 	}
 	
 	public void buildLibrary(Element libraryElement) throws Exception {
+		sourceURI = LocationAttributes.getURI(libraryElement);
 		this.assistant.getContext().setLocalLibrary(this);
         Element[] bindingElements = DomHelper.getChildElements(libraryElement, BindingManager.NAMESPACE);
         for (int i = 0; i < bindingElements.length; i++) {
@@ -158,21 +168,21 @@
 	 */
 	public class Dependency {
 		
-		private String sourceURI;
+		private String dependencySourceURI;
 		private Object shared;
 		
-		public Dependency(String sourceURI) throws Exception {
-			this.sourceURI = sourceURI;
+		public Dependency(String dependencySourceURI) throws Exception {
+			this.dependencySourceURI = dependencySourceURI;
 			
-			Library lib = manager.getLibrary(sourceURI);
+			Library lib = manager.getLibrary(this.dependencySourceURI,sourceURI);
 			this.shared = lib.shared;
 		}
 		
 		public boolean isValid() throws LibraryException {
 			try {
 				
-				if(manager.libraryInCache(sourceURI)) {
-					Library lib = manager.getLibrary(sourceURI);
+				if(manager.libraryInCache(dependencySourceURI,sourceURI)) {
+					Library lib = manager.getLibrary(dependencySourceURI,sourceURI);
 					
 					if(this.shared == lib.shared)
 						return true;

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManager.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManager.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManager.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManager.java Fri Sep  2 17:25:02 2005
@@ -30,9 +30,11 @@
 	String ROLE = LibraryManager.class.getName();
 	
 	Library getLibrary(String librarysource) throws Exception;
+	Library getLibrary(String librarysource, String relative) throws Exception;
 	Library getNewLibrary();
 	
 	boolean libraryInCache(String librarysource) throws Exception;
+	boolean libraryInCache(String librarysource, String relative) throws Exception;
 	
 	void debug(String msg);
 }

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManagerImpl.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManagerImpl.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManagerImpl.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/binding/library/LibraryManagerImpl.java Fri Sep  2 17:25:02 2005
@@ -49,7 +49,7 @@
     private Configuration configuration;
     private CacheManager cacheManager;
     
-    private JXPathBindingManager.Assistant assistant;
+    private JXPathBindingManager bindingManager;
 
     public void configure(Configuration configuration) throws ConfigurationException {
         this.configuration = configuration;
@@ -61,8 +61,8 @@
         this.cacheManager = (CacheManager)serviceManager.lookup(CacheManager.ROLE);
     }
     
-    public void setAssistant(JXPathBindingManager.Assistant assistant) {
-    	this.assistant = assistant;
+    public void setBindingManager(JXPathBindingManager bindingManager) {
+    	this.bindingManager = bindingManager;
     }
     
     public void initialize() throws Exception {
@@ -71,18 +71,22 @@
     }
     
     public boolean libraryInCache(String librarysource) throws Exception {
+    	return libraryInCache(librarysource,null);
+    }
+    
+    public boolean libraryInCache(String librarysource, String relative) throws Exception {
     	SourceResolver sourceResolver = null;
         Source source = null;
         
         if(getLogger().isDebugEnabled())
-        	getLogger().debug("Checking if library is in cache: '"+librarysource+"'");
+        	getLogger().debug("Checking if library is in cache: '"+librarysource+"' relative to '"+relative+"'");
 
         Library lib = null;
         boolean result = false;
         
         try {
             sourceResolver = (SourceResolver)serviceManager.lookup(SourceResolver.ROLE);
-            source = sourceResolver.resolveURI(librarysource);
+            source = sourceResolver.resolveURI(librarysource, relative, null);
             
             lib = (Library)this.cacheManager.get(source, PREFIX);
             
@@ -96,7 +100,7 @@
             	result = true;
         } catch(Exception e) {
         	if(getLogger().isErrorEnabled())
-            	getLogger().error("Problem getting library '"+librarysource+"'!",e);
+            	getLogger().error("Problem getting library '"+librarysource+"' relative to '"+relative+"'!",e);
         	throw e;
         } finally {
             if (source != null)
@@ -107,15 +111,19 @@
 
         if(getLogger().isDebugEnabled()) {
         	if(result)
-        		getLogger().debug("Library IS in cache : '"+librarysource+"'");
+        		getLogger().debug("Library IS in cache : '"+librarysource+"' relative to '"+relative+"'");
         	else
-        		getLogger().debug("Library IS NOT in cache : '"+librarysource+"'");
+        		getLogger().debug("Library IS NOT in cache : '"+librarysource+"' relative to '"+relative+"'");
         }
         
         return result;
     }
     
-	public Library getLibrary(String librarysource) throws Exception {
+    public Library getLibrary(String librarysource) throws Exception {
+    	return getLibrary(librarysource,null);
+    }
+    
+	public Library getLibrary(String librarysource, String relative) throws Exception {
 		SourceResolver sourceResolver = null;
         Source source = null;
         Document libraryDocument = null;
@@ -123,11 +131,11 @@
         Library lib = null;
         
         if(getLogger().isDebugEnabled())
-        	getLogger().debug("Getting library instance: '"+librarysource+"'");
+        	getLogger().debug("Getting library instance: '"+librarysource+"' relative to '"+relative+"'");
         
         try {
             sourceResolver = (SourceResolver)serviceManager.lookup(SourceResolver.ROLE);
-            source = sourceResolver.resolveURI(librarysource);
+            source = sourceResolver.resolveURI(librarysource, relative, null);
             
             lib = (Library)this.cacheManager.get(source, PREFIX);
             
@@ -169,7 +177,7 @@
 	
 	public Library getNewLibrary() {
 		Library lib = new Library(this);
-		lib.setAssistant(this.assistant);
+		lib.setAssistant(this.bindingManager.getBuilderAssistant());
         
         if(getLogger().isDebugEnabled())
         	getLogger().debug("Created new library! "+lib);

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=267351&r1=267350&r2=267351&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 Fri Sep  2 17:25:02 2005
@@ -49,10 +49,13 @@
     	if(definition instanceof AbstractContainerDefinition) {
     		AbstractContainerDefinition other = (AbstractContainerDefinition)definition;
     		
+    		System.err.println("Nr of inherited defs: "+other.definitions.getWidgetDefinitions().size());
     		Iterator otherwidgets = other.definitions.getWidgetDefinitions().iterator();
     		while(otherwidgets.hasNext()) {
     			try {
-    				this.definitions.addWidgetDefinition((WidgetDefinition)otherwidgets.next());
+    				WidgetDefinition def = (WidgetDefinition)otherwidgets.next();
+    				this.definitions.addWidgetDefinition(def);
+    				System.err.println("Container: added "+def.getId());
     			} catch(DuplicateIdException ignore) {}
     		}
     	} else {

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=267351&r1=267350&r2=267351&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 Fri Sep  2 17:25:02 2005
@@ -14,6 +14,10 @@
 		Element widgetsElement = DomHelper.getChildElement(element, Constants.DEFINITION_NS, widgetsElementName, true);
         // All child elements of the widgets element are widgets
         Element[] widgetElements = DomHelper.getChildElements(widgetsElement, Constants.DEFINITION_NS);
+        WidgetDefinitionBuilderContext oldContext = this.context;
+        this.context = new WidgetDefinitionBuilderContext(this.context);
+        this.context.setSuperDefinition(null);
+        
         if(widgetElements!=null)
         for (int i = 0; i < widgetElements.length; i++) {
             Element widgetElement = widgetElements[i];
@@ -21,13 +25,13 @@
             String newId = null;
             WidgetDefinition def = null;
             if(this.context !=null)
-	            if((newId = (String)widgetElement.getAttribute("extends")) != null) {
+	            if((newId = widgetElement.getAttribute("extends")) != null) {
 	            	if((def = this.context.getLocalLibrary().getDefinition(newId))!=null)
 	            		this.context.setSuperDefinition(def);
 	            	else if((def = definition.getWidgetDefinition(newId))!=null)
 	            		this.context.setSuperDefinition(def);
 	            }
-	            else
+	            else 
 	            	this.context.setSuperDefinition(null);
                 
             WidgetDefinition widgetDefinition = buildAnotherWidgetDefinition(widgetElement);
@@ -36,6 +40,7 @@
             	definition.addWidgetDefinition(widgetDefinition);
         }
         
+        this.context = oldContext;
     }
 
 }

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=267351&r1=267350&r2=267351&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 Fri Sep  2 17:25:02 2005
@@ -85,6 +85,8 @@
     	// location
     	definition.setLocation(DomHelper.getLocation(widgetElement));
     	
+    	System.err.println(widgetElement.getAttribute("id")+" ("+widgetElement.getAttribute("extends")+"): "+this.context.getSuperDefinition());
+    	
     	if(this.context.getSuperDefinition()!=null)
     		definition.initializeFrom(this.context.getSuperDefinition());
     	

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java Fri Sep  2 17:25:02 2005
@@ -18,6 +18,7 @@
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.cocoon.forms.formmodel.library.LibraryManager;
+import org.apache.cocoon.util.location.LocationAttributes;
 import org.w3c.dom.Element;
 
 /**
@@ -43,6 +44,9 @@
         FormDefinition formDefinition = new FormDefinition(libraryManager);
         this.context = new WidgetDefinitionBuilderContext();
         this.context.setLocalLibrary(formDefinition.getLocalLibrary());
+        
+        // set local URI
+        formDefinition.getLocalLibrary().setSourceURI(LocationAttributes.getURI(formElement));
         
         super.setupDefinition(formElement, formDefinition);
         setDisplayData(formElement, formDefinition);

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/Library.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/Library.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/Library.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/Library.java Fri Sep  2 17:25:02 2005
@@ -27,6 +27,7 @@
 import org.apache.cocoon.forms.formmodel.WidgetDefinitionBuilder;
 import org.apache.cocoon.forms.formmodel.WidgetDefinitionBuilderContext;
 import org.apache.cocoon.forms.util.DomHelper;
+import org.apache.cocoon.util.location.LocationAttributes;
 
 import org.w3c.dom.Element;
 
@@ -52,6 +53,7 @@
 	// shared object with dependencies
 	protected Object shared = new Object();
 	
+	protected String sourceURI = null;
 	protected WidgetDefinitionBuilderContext context;
 	
 	public Library(LibraryManager lm) {
@@ -60,6 +62,13 @@
 		context.setLocalLibrary(this);
 	}
 	
+	public void setSourceURI(String uri) {
+		sourceURI = uri;
+	}
+	public String getSourceURI() {
+		return sourceURI;
+	}
+	
 	public void setWidgetDefinitionBuilderSelector(ServiceSelector selector) {
 		this.widgetDefinitionBuilderSelector = selector;
 	}
@@ -90,7 +99,7 @@
 		try {
 			// library keys may not contain ":"!
 			if( (!inclusions.containsKey(key) || key.indexOf(SEPARATOR)>-1) 
-					&& manager.getLibrary(librarysource)!=null) {
+					&& manager.getLibrary(librarysource, sourceURI)!=null) {
 				inclusions.put(key,new Dependency(librarysource));
 				return true;
 			}
@@ -118,7 +127,7 @@
 		if(librarykey!=null) {
 			if(inclusions.containsKey(librarykey)) {
 				try {
-					return manager.getLibrary(((Dependency)inclusions.get(librarykey)).sourceURI).getDefinition(definitionkey);
+					return manager.getLibrary(((Dependency)inclusions.get(librarykey)).dependencySourceURI, sourceURI).getDefinition(definitionkey);
 				} catch(Exception e) {
 					throw new LibraryException("Couldn't get Library key='"+librarykey+"' source='"+inclusions.get(librarykey)+"",e);
 				}
@@ -131,6 +140,7 @@
 	}
 	
 	public void buildLibrary(Element libraryElement) throws Exception {
+		sourceURI = LocationAttributes.getURI(libraryElement);
 		Element widgetsElement = DomHelper.getChildElement(libraryElement, Constants.DEFINITION_NS, "widgets", true);
         // All child elements of the widgets element are widgets
         Element[] widgetElements = DomHelper.getChildElements(widgetsElement, Constants.DEFINITION_NS);
@@ -142,6 +152,9 @@
 	}
 	
 	public void addDefinition(WidgetDefinition definition) throws LibraryException {
+		if(definition == null)
+			return;
+		
 		if(definitions.containsKey(definition.getId()))
 			throw new LibraryException("Library already contains a widget with this ID!");
 		
@@ -158,6 +171,13 @@
             throw new CascadingException("Unknown kind of widget '" + widgetName + "' at " +
                                          DomHelper.getLocation(widgetDefinition), e);
         }
+        
+        String extend = widgetDefinition.getAttribute("extends");  
+        if(extend!=null && !"".equals(extend))
+        	context.setSuperDefinition(getDefinition(extend));
+        else
+        	context.setSuperDefinition(null);
+        
         return builder.buildWidgetDefinition(widgetDefinition,context);
     }
 	
@@ -170,21 +190,21 @@
 	 */
 	public class Dependency {
 		
-		private String sourceURI;
+		private String dependencySourceURI;
 		private Object shared;
 		
-		public Dependency(String sourceURI) throws Exception {
-			this.sourceURI = sourceURI;
+		public Dependency(String dependencySourceURI) throws Exception {
+			this.dependencySourceURI = dependencySourceURI;
 			
-			Library lib = manager.getLibrary(sourceURI);
+			Library lib = manager.getLibrary(this.dependencySourceURI,sourceURI);
 			this.shared = lib.shared;
 		}
 		
 		public boolean isValid() throws LibraryException {
 			try {
 				
-				if(manager.libraryInCache(sourceURI)) {
-					Library lib = manager.getLibrary(sourceURI);
+				if(manager.libraryInCache(dependencySourceURI,sourceURI)) {
+					Library lib = manager.getLibrary(dependencySourceURI,sourceURI);
 					
 					if(this.shared == lib.shared)
 						return true;

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManager.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManager.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManager.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManager.java Fri Sep  2 17:25:02 2005
@@ -30,9 +30,11 @@
 	String ROLE = LibraryManager.class.getName();
 	
 	Library getLibrary(String librarysource) throws Exception;
+	Library getLibrary(String librarysource, String relative) throws Exception;
 	Library getNewLibrary();
 	
 	boolean libraryInCache(String librarysource) throws Exception;
+	boolean libraryInCache(String librarysource, String relative) throws Exception;
 	
 	void debug(String msg);
 }

Modified: cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManagerImpl.java
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManagerImpl.java?rev=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManagerImpl.java (original)
+++ cocoon/gsoc/mpfingsthorn/forms/java/org/apache/cocoon/forms/formmodel/library/LibraryManagerImpl.java Fri Sep  2 17:25:02 2005
@@ -67,18 +67,22 @@
     }
     
     public boolean libraryInCache(String librarysource) throws Exception {
+    	return libraryInCache(librarysource,null);
+    }
+    
+    public boolean libraryInCache(String librarysource, String relative) throws Exception {
     	SourceResolver sourceResolver = null;
         Source source = null;
         
         if(getLogger().isDebugEnabled())
-        	getLogger().debug("Checking if library is in cache: '"+librarysource+"'");
+        	getLogger().debug("Checking if library is in cache: '"+librarysource+"' relative to '"+relative+"'");
 
         Library lib = null;
         boolean result = false;
         
         try {
             sourceResolver = (SourceResolver)serviceManager.lookup(SourceResolver.ROLE);
-            source = sourceResolver.resolveURI(librarysource);
+            source = sourceResolver.resolveURI(librarysource, relative, null);
             
             lib = (Library)this.cacheManager.get(source, PREFIX);
             
@@ -92,7 +96,7 @@
             	result = true;
         } catch(Exception e) {
         	if(getLogger().isErrorEnabled())
-            	getLogger().error("Problem getting library '"+librarysource+"'!",e);
+            	getLogger().error("Problem getting library '"+librarysource+"' relative to '"+relative+"'!",e);
         	throw e;
         } finally {
             if (source != null)
@@ -103,15 +107,19 @@
 
         if(getLogger().isDebugEnabled()) {
         	if(result)
-        		getLogger().debug("Library IS in cache : '"+librarysource+"'");
+        		getLogger().debug("Library IS in cache : '"+librarysource+"' relative to '"+relative+"'");
         	else
-        		getLogger().debug("Library IS NOT in cache : '"+librarysource+"'");
+        		getLogger().debug("Library IS NOT in cache : '"+librarysource+"' relative to '"+relative+"'");
         }
         
         return result;
     }
     
-	public Library getLibrary(String librarysource) throws Exception {
+    public Library getLibrary(String librarysource) throws Exception {
+    	return getLibrary(librarysource,null);
+    }
+    
+	public Library getLibrary(String librarysource, String relative) throws Exception {
 		SourceResolver sourceResolver = null;
         Source source = null;
         Document libraryDocument = null;
@@ -119,11 +127,11 @@
         Library lib = null;
         
         if(getLogger().isDebugEnabled())
-        	getLogger().debug("Getting library instance: '"+librarysource+"'");
+        	getLogger().debug("Getting library instance: '"+librarysource+"' relative to '"+relative+"'");
         
         try {
             sourceResolver = (SourceResolver)serviceManager.lookup(SourceResolver.ROLE);
-            source = sourceResolver.resolveURI(librarysource);
+            source = sourceResolver.resolveURI(librarysource, relative, null);
             
             lib = (Library)this.cacheManager.get(source, PREFIX);
             

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=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_binding.xml (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_binding.xml Fri Sep  2 17:25:02 2005
@@ -19,11 +19,11 @@
   xmlns:fd="http://apache.org/cocoon/forms/1.0#definition" 
   path="/data" >
   
-  <fb:import prefix="lib" uri="libraries/library_form1_binding.xml"/>
+  <fb:import prefix="lib" uri="../libraries/library_form1-second_binding.xml"/>
   
   <fb:new id="lib:class1"/>
   
-  <fb:expand id="lib:field2"/>
-  <fb:value id="field3" path="field3" extends="lib:field2"/>
+  <fb:expand id="lib:ext:field2"/>
+  <fb:value id="field3" path="field3" extends="lib:ext:field2"/>
   
 </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=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_model.xml (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_model.xml Fri Sep  2 17:25:02 2005
@@ -19,12 +19,12 @@
   xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
   
   <fd:widgets>
-    <fd:import prefix="lib" uri="libraries/library_form1.xml"/>
+    <fd:import prefix="lib" uri="../libraries/library_form1-second.xml"/>
     
     <fd:new id="lib:class1"/>
-    <fd:expand id="lib:field2"/>
+    <fd:expand id="lib:ext:field2"/>
     
-    <fd:field id="field3" extends="lib:field2">
+    <fd:field id="field3" extends="lib:ext:field2">
       <fd:datatype base="integer"/>
     </fd:field>
     

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=267351&r1=267350&r2=267351&view=diff
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_template.xml (original)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/forms/form1_template.xml Fri Sep  2 17:25:02 2005
@@ -23,6 +23,7 @@
         <fi:styling layout="columns"/>
         <fi:items>
           <ft:widget id="field1"/>
+          <ft:widget id="field1-2"/>
           <ft:widget id="field2"/>
           <ft:widget id="field3"/>
         </fi:items>

Added: cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second.xml
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second.xml?rev=267351&view=auto
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second.xml (added)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second.xml Fri Sep  2 17:25:02 2005
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<fd:library
+  xmlns:fd="http://apache.org/cocoon/forms/1.0#definition"
+  xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
+  <fd:widgets>
+    
+    <fd:import prefix="ext" uri="library_form1.xml"/>
+    
+    <fd:class id="class1" extends="ext:class1">
+      <fd:widgets>
+        <fd:field id="field1-2">
+          <fd:label>Field1-2:</fd:label>
+          <fd:datatype base="string"/>
+        </fd:field>
+      </fd:widgets>
+    </fd:class>
+    
+    <fd:expand id="ext:field2"/>
+    
+  </fd:widgets>
+</fd:library>
\ No newline at end of file

Propchange: cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second_binding.xml
URL: http://svn.apache.org/viewcvs/cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second_binding.xml?rev=267351&view=auto
==============================================================================
--- cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second_binding.xml (added)
+++ cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second_binding.xml Fri Sep  2 17:25:02 2005
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<fb:library
+  xmlns:fb="http://apache.org/cocoon/forms/1.0#binding" 
+  xmlns:fd="http://apache.org/cocoon/forms/1.0#definition" 
+  >
+  
+  <fb:import prefix="ext" uri="library_form1_binding.xml"/>
+  
+  <fb:class id="class1" extends="ext:class1">
+    <fb:value id="field1-2" path="field12"/>
+  </fb:class>
+  
+  <fb:expand id="ext:field2"/>
+  
+</fb:library>
\ No newline at end of file

Propchange: cocoon/gsoc/mpfingsthorn/forms/samples/library/libraries/library_form1-second_binding.xml
------------------------------------------------------------------------------
    svn:eol-style = native