You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ap...@apache.org on 2006/07/31 13:28:53 UTC

svn commit: r427075 - /struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinitionsImpl.java

Author: apetrelli
Date: Mon Jul 31 04:28:53 2006
New Revision: 427075

URL: http://svn.apache.org/viewvc?rev=427075&view=rev
Log:
[SB-26]
Applied a modified version of the patch: when base definitions are already resolved a re-resolution would throw an exception.

Modified:
    struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinitionsImpl.java

Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinitionsImpl.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinitionsImpl.java?rev=427075&r1=427074&r2=427075&view=diff
==============================================================================
--- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinitionsImpl.java (original)
+++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinitionsImpl.java Mon Jul 31 04:28:53 2006
@@ -79,7 +79,7 @@
      */
     public void addDefinitions(Map defsMap, Locale locale) throws NoSuchDefinitionException {
         localeSpecificDefinitions.put(locale, defsMap);
-        resolveAttributeDependencies();
+        resolveAttributeDependencies(locale);
         resolveInheritances(locale);
     }
     
@@ -157,13 +157,98 @@
             Iterator j = attributes.values().iterator();
             while (j.hasNext()) {
                 ComponentAttribute attr = (ComponentAttribute) j.next();
-                if (attr.getType() != null && 
-                    (attr.getType().equalsIgnoreCase("definition") ||
-                     attr.getType().equalsIgnoreCase("instance")) ) {
-                        ComponentDefinition subDef = this.getDefinition((String) attr.getValue());
+                if (attr.getType() != null) {
+                    if (attr.getType().equalsIgnoreCase("definition") ||
+                            attr.getType().equalsIgnoreCase("instance")) {
+                    	ComponentDefinition subDef =
+                                getDefinitionByAttribute(attr);
                         attr.setValue(subDef);
+                    }
+                } else {
+                    ComponentDefinition subDef = getDefinitionByAttribute(attr);
+                    if (subDef != null) {
+                        attr.setValue(subDef);
+                    }
                 }
             }
         }
+    }
+    
+    public void resolveAttributeDependencies(Locale locale) {
+        resolveAttributeDependencies(); // FIXME Is it necessary?
+        Map defsMap = (Map) localeSpecificDefinitions.get(locale);
+        if (defsMap == null) {
+            return;
+        }
+        
+        Iterator i = defsMap.values().iterator();
+        
+        while (i.hasNext()) {
+            ComponentDefinition def = (ComponentDefinition) i.next();
+            Map attributes = def.getAttributes();
+            Iterator j = attributes.values().iterator();
+            while (j.hasNext()) {
+                ComponentAttribute attr = (ComponentAttribute) j.next();
+                if (attr.getType() != null) {
+                    if (attr.getType().equalsIgnoreCase("definition") ||
+                            attr.getType().equalsIgnoreCase("instance")) {
+                        ComponentDefinition subDef = getDefinitionByAttribute(
+                                attr, locale);
+                        attr.setValue(subDef);
+                    }
+                } else {
+                    ComponentDefinition subDef = getDefinitionByAttribute(attr,
+                            locale);
+                    if (subDef != null) {
+                        attr.setValue(subDef);
+                    }
+                }
+            }
+        }
+    }
+    
+    /**
+     * Searches for a definition specified as an attribute.
+     * 
+     * @param attr The attribute to use.
+     * @return The required definition if found, otherwise it returns
+     * <code>null</code>.
+     */
+    private ComponentDefinition getDefinitionByAttribute(
+            ComponentAttribute attr) {
+        ComponentDefinition retValue;
+        
+        Object attrValue = attr.getValue();
+        if (attrValue instanceof ComponentDefinition) {
+            retValue = (ComponentDefinition) attrValue;
+        } else { // It must be a string
+            retValue = this.getDefinition((String) attr
+                    .getValue());
+        }
+        
+        return retValue;
+    }
+    
+    /**
+     * Searches for a definition specified as an attribute.
+     * 
+     * @param attr The attribute to use.
+     * @param locale The locale to search into.
+     * @return The required definition if found, otherwise it returns
+     * <code>null</code>.
+     */
+    private ComponentDefinition getDefinitionByAttribute(
+            ComponentAttribute attr, Locale locale) {
+        ComponentDefinition retValue;
+        
+        Object attrValue = attr.getValue();
+        if (attrValue instanceof ComponentDefinition) {
+            retValue = (ComponentDefinition) attrValue;
+        } else { // It must be a string
+            retValue = this.getDefinition((String) attr
+                    .getValue(), locale);
+        }
+        
+        return retValue;
     }
 }