You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tiles.apache.org by ap...@apache.org on 2008/06/29 18:24:19 UTC

svn commit: r672635 - in /tiles/framework/trunk: tiles-api/src/main/java/org/apache/tiles/ tiles-api/src/test/java/org/apache/tiles/ tiles-core/src/main/java/org/apache/tiles/context/ tiles-core/src/main/java/org/apache/tiles/definition/digester/ tiles...

Author: apetrelli
Date: Sun Jun 29 09:24:19 2008
New Revision: 672635

URL: http://svn.apache.org/viewvc?rev=672635&view=rev
Log:
TILES-83
Moved ListAttribute to tiles-api.
Now ListAttribute has a new "inherit" property and a "inherit" method to inherit from a parent list attribute.

Added:
    tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java   (contents, props changed)
      - copied, changed from r671310, tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ListAttribute.java
Removed:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ListAttribute.java
Modified:
    tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java
    tiles/framework/trunk/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java
    tiles/framework/trunk/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_2_1.dtd
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java

Modified: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java?rev=672635&r1=672634&r2=672635&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java (original)
+++ tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java Sun Jun 29 09:24:19 2008
@@ -29,6 +29,7 @@
 import java.util.Map;
 import java.util.Set;
 
+
 /**
  * Basic implementation for <code>AttributeContext</code>.
  *
@@ -225,14 +226,28 @@
             if (names != null && !names.isEmpty()) {
                 for (String name : names) {
                     Attribute attribute = parent.getCascadedAttribute(name);
-                    putAttribute(name, attribute, true);
+                    Attribute destAttribute = getCascadedAttribute(name);
+                    if (destAttribute == null) {
+                        putAttribute(name, attribute, true);
+                    } else if (attribute instanceof ListAttribute
+                            && destAttribute instanceof ListAttribute
+                            && ((ListAttribute) destAttribute).isInherit()) {
+                        ((ListAttribute) destAttribute).inherit((ListAttribute) attribute);
+                    }
                 }
             }
             names = parent.getLocalAttributeNames();
             if (names != null && !names.isEmpty()) {
                 for (String name : names) {
                     Attribute attribute = parent.getLocalAttribute(name);
-                    putAttribute(name, attribute, false);
+                    Attribute destAttribute = getLocalAttribute(name);
+                    if (destAttribute == null) {
+                        putAttribute(name, attribute, false);
+                    } else if (attribute instanceof ListAttribute
+                            && destAttribute instanceof ListAttribute
+                            && ((ListAttribute) destAttribute).isInherit()) {
+                        ((ListAttribute) destAttribute).inherit((ListAttribute) attribute);
+                    }
                 }
             }
         }
@@ -472,8 +487,14 @@
             }
             for (Map.Entry<String, Attribute> entry : source.entrySet()) {
                 String key = entry.getKey();
-                if (!destination.containsKey(key)) {
+                Attribute destAttribute = destination.get(key);
+                if (destAttribute == null) {
                     destination.put(key, entry.getValue());
+                } else if (destAttribute instanceof ListAttribute
+                        && entry.getValue() instanceof ListAttribute
+                        && ((ListAttribute) destAttribute).isInherit()) {
+                    ((ListAttribute) destAttribute)
+                            .inherit((ListAttribute) entry.getValue());
                 }
             }
         }

Copied: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java (from r671310, tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ListAttribute.java)
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java?p2=tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java&p1=tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ListAttribute.java&r1=671310&r2=672635&rev=672635&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ListAttribute.java (original)
+++ tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java Sun Jun 29 09:24:19 2008
@@ -18,9 +18,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tiles.context;
+package org.apache.tiles;
 
-import org.apache.tiles.Attribute;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -35,19 +34,19 @@
  * @version $Rev$ $Date$
  */
 public class ListAttribute extends Attribute {
+
     /**
-     * List.
-     * We declare a List to avoid cast.
-     * Parent "value" property points to the same list.
+     * If true, the attribute will put the elements of the attribute with the
+     * same name of the parent definition before the ones specified here. By
+     * default, it is 'false'.
      */
-    private List<Object> list;
+    private boolean inherit = false;
 
     /**
      * Constructor.
      */
     public ListAttribute() {
-        list = new ArrayList<Object>();
-        setValue(list);
+        setValue(new ArrayList<Object>());
     }
 
     /**
@@ -58,7 +57,6 @@
      */
     public ListAttribute(String name, List<Object> value) {
         super(name, value);
-        list = value;
     }
 
     /**
@@ -67,8 +65,9 @@
      *
      * @param element XmlAttribute to add.
      */
+    @SuppressWarnings("unchecked")
     public void add(Attribute element) {
-        list.add(element);
+        ((List<Object>) value).add(element);
     }
 
     /**
@@ -76,6 +75,7 @@
      *
      * @param value Object to add.
      */
+    @SuppressWarnings("unchecked")
     public void add(Object value) {
         //list.add( value );
         // To correct a bug in digester, we need to check the object type
@@ -83,7 +83,7 @@
         if (value instanceof Attribute) {
             add((Attribute) value);
         } else {
-            list.add(value);
+            ((List<Object>) this.value).add(value);
         }
     }
 
@@ -92,8 +92,44 @@
      *
      * @param value Object to add.
      */
+    @SuppressWarnings("unchecked")
     public void addObject(Object value) {
-    list.add(value);
-  }
+        ((List<Object>) this.value).add(value);
+    }
+
+    /**
+     * If true, the attribute will put the elements of the attribute with the
+     * same name of the parent definition before the ones specified here. By
+     * default, it is 'false'
+     *
+     * @param inherit The "inherit" value.
+     */
+    public void setInherit(boolean inherit) {
+        this.inherit = inherit;
+    }
+
+    /**
+     * If true, the attribute will put the elements of the attribute with the
+     * same name of the parent definition before the ones specified here. By
+     * default, it is 'false'
+     *
+     * @return inherit The "inherit" value.
+     */
+    public boolean isInherit() {
+        return inherit;
+    }
 
+    /**
+     * Inherits elements present in a "parent" list attribute. The elements will
+     * be put before the ones already present.
+     *
+     * @param parent The parent list attribute.
+     */
+    @SuppressWarnings("unchecked")
+    public void inherit(ListAttribute parent) {
+        List<Object> tempList = new ArrayList<Object>();
+        tempList.addAll((List<Object>) parent.value);
+        tempList.addAll((List<Object>) value);
+        setValue(tempList);
+    }
 }

Propchange: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Modified: tiles/framework/trunk/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java?rev=672635&r1=672634&r2=672635&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java (original)
+++ tiles/framework/trunk/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java Sun Jun 29 09:24:19 2008
@@ -23,6 +23,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -171,6 +172,43 @@
     }
 
     /**
+     * Tests {@link BasicAttributeContext#inherit(BasicAttributeContext)}
+     * testing inheritance between {@link ListAttribute} instances.
+     */
+    @SuppressWarnings("unchecked")
+    public void testInheritListAttribute() {
+        AttributeContext toCopy = new BasicAttributeContext();
+        ListAttribute parentListAttribute = new ListAttribute();
+        parentListAttribute.add("first");
+        toCopy.putAttribute("list", parentListAttribute);
+        AttributeContext context = new BasicAttributeContext();
+        ListAttribute listAttribute = new ListAttribute();
+        listAttribute.setInherit(true);
+        listAttribute.add("second");
+        context.putAttribute("list", listAttribute);
+        context.inherit(toCopy);
+        ListAttribute result = (ListAttribute) context.getAttribute("list");
+        assertNotNull("The attribute must exist", result);
+        List<Object> value = (List<Object>) result.getValue();
+        assertNotNull("The list must exist", value);
+        assertEquals("The size is not correct", 2, value.size());
+        assertEquals("The first element is not correct", "first", value.get(0));
+        assertEquals("The second element is not correct", "second", value.get(1));
+
+        context = new BasicAttributeContext();
+        listAttribute = new ListAttribute();
+        listAttribute.add("second");
+        context.putAttribute("list", listAttribute);
+        context.inherit(toCopy);
+        result = (ListAttribute) context.getAttribute("list");
+        assertNotNull("The attribute must exist", result);
+        value = (List<Object>) result.getValue();
+        assertNotNull("The list must exist", value);
+        assertEquals("The size is not correct", 1, value.size());
+        assertEquals("The second element is not correct", "second", value.get(0));
+    }
+
+    /**
      * Tests {@link BasicAttributeContext#inheritCascadedAttributes(AttributeContext)}.
      */
     public void testInherit() {

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java?rev=672635&r1=672634&r2=672635&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java Sun Jun 29 09:24:19 2008
@@ -31,7 +31,7 @@
 import org.apache.commons.digester.Rule;
 import org.apache.tiles.Attribute;
 import org.apache.tiles.Definition;
-import org.apache.tiles.context.ListAttribute;
+import org.apache.tiles.ListAttribute;
 import org.apache.tiles.definition.DefinitionsFactoryException;
 import org.apache.tiles.definition.DefinitionsReader;
 import org.xml.sax.Attributes;

Modified: tiles/framework/trunk/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_2_1.dtd
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_2_1.dtd?rev=672635&r1=672634&r2=672635&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_2_1.dtd (original)
+++ tiles/framework/trunk/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_2_1.dtd Sun Jun 29 09:24:19 2008
@@ -183,6 +183,12 @@
 @attr cascade        If true, the attribute will be cascaded to all inner
                      definitions. By default, cascade is false.
 -->
+<!ATTLIST put-list-attribute inherit          %Boolean;        #IMPLIED>
+<!--
+@attr inherit        If true, the attribute will put the elements of the attribute
+                     with the same name of the parent definition before the ones
+                     specified here. By default, it is 'false'.
+-->
 <!ATTLIST put-list-attribute cascade          %Boolean;        #IMPLIED>
 
 <!-- ========== Subordinate Elements ====================================== -->
@@ -234,6 +240,12 @@
      specified java classtype. This bean is initialized with appropriate nested
      <set-property>.
 -->     
+<!ATTLIST put-list-attribute inherit          %Boolean;        #IMPLIED>
+<!--
+@attr inherit        If true, the attribute will put the elements of the attribute
+                     with the same name of the parent definition before the ones
+                     specified here. By default, it is 'false'.
+-->
 <!ELEMENT bean (set-property*)>
 <!ATTLIST bean             id               ID              #IMPLIED>
 <!--

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java?rev=672635&r1=672634&r2=672635&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java Sun Jun 29 09:24:19 2008
@@ -34,7 +34,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.tiles.Attribute;
 import org.apache.tiles.Definition;
-import org.apache.tiles.context.ListAttribute;
+import org.apache.tiles.ListAttribute;
 import org.apache.tiles.definition.DefinitionsFactoryException;
 import org.apache.tiles.definition.DefinitionsReader;