Author: gvanmatre
Date: Fri Mar 30 17:13:39 2007
New Revision: 524333

URL: http://svn.apache.org/viewvc?view=rev&rev=524333
Log:
Added a new reserved clay configuration attribute to declare that a definition 
cannot be extended (SHALE-353).

Added:
    
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final-config.xml
   (with props)
    
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final.html
   (with props)
Modified:
    
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java
    
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignPropertiesCommand.java
    
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/Globals.java
    
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java
    
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
    
shale/framework/trunk/shale-clay/src/main/resources/org/apache/shale/clay/Bundle.properties
    
shale/framework/trunk/shale-clay/src/test/java/org/apache/shale/clay/config/ConfigTestCase.java

Modified: 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java?view=diff&rev=524333&r1=524332&r2=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java
 (original)
+++ 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java
 Fri Mar 30 17:13:39 2007
@@ -99,12 +99,12 @@
                 ++childIndex;
             }
         }
-        
+
         //clay manages its own subtree; components that
         //renders children still do not build their own
         //composition.  clay does both, build its own subtree
         //and renders its own children.
-        
+
         if (!(parent instanceof Clay)) {
             // remove any components not represented by the metadata graph
             for (int i = parent.getChildCount() - 1; i > -1; i--) {
@@ -118,8 +118,7 @@
                 }
             }
         }
-       
-        
+
         return isFinal;
     }
 

Modified: 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignPropertiesCommand.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignPropertiesCommand.java?view=diff&rev=524333&r1=524332&r2=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignPropertiesCommand.java
 (original)
+++ 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignPropertiesCommand.java
 Fri Mar 30 17:13:39 2007
@@ -94,6 +94,12 @@
                continue next;
             }
 
+            //skip past any assignments of the reserved attribute 
"org.apache.shale.clay.final"
+            //used to specify that a component definition cannot be extended.
+            if (a.getName().equals(Globals.CLAY_ALLOW_OVERRIDE_ATTRIBUTE)) {
+                continue next;
+            }
+
             Command command = null;
             //look for a command override in the customization catalog first
             if (customizationCatalog != null) {

Modified: 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/Globals.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/Globals.java?view=diff&rev=524333&r1=524332&r2=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/Globals.java
 (original)
+++ 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/Globals.java
 Fri Mar 30 17:13:39 2007
@@ -281,5 +281,14 @@
      * map.</p>
      */
     public static final String CLAY_JSPID_ATTRIBUTE = 
"org.apache.shale.clay.jspid";
+
+    /**
+     * <p>This constant is the name of a reserved [EMAIL PROTECTED] 
AttributeBean} name that is contained in
+     * a [EMAIL PROTECTED] ComponentBean}.  This attribute is used to specify 
that the component cannot be
+     * extended by an inheriting [EMAIL PROTECTED] ComponentBean}.  The value 
property is ignored in the
+     * [EMAIL PROTECTED] AttributeBean}.  The goal is to copy the behavior of 
the Java programming
+     * language applied to meta-data inheritance.</p>
+     */
+    public static final String CLAY_ALLOW_OVERRIDE_ATTRIBUTE = 
"org.apache.shale.clay.final";
 }
 

Modified: 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java?view=diff&rev=524333&r1=524332&r2=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java
 (original)
+++ 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java
 Fri Mar 30 17:13:39 2007
@@ -401,6 +401,11 @@
      * @param bean converter assigned to this component
      */
     public void addConverter(ConverterBean bean) {
+        if (bean == null) {
+            converter = null;
+            return;
+        }
+
         if (bean.getJsfid() != null) {
             bean.setHasAParent(this);
             converter = bean;

Modified: 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java?view=diff&rev=524333&r1=524332&r2=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
 (original)
+++ 
shale/framework/trunk/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
 Fri Mar 30 17:13:39 2007
@@ -266,20 +266,19 @@
 
             try {
                 if (i > -1) {
-                   for (Enumeration ui = 
classloader.getResources(configFile.toString());
-                         ui.hasMoreElements();) {
-                       urls.add(ui.nextElement());
-                   }
+                    for (Enumeration ui = 
classloader.getResources(configFile.toString());
+                    ui.hasMoreElements();) {
+                        urls.add(ui.nextElement());
+                    }
                 } else {
-                   if(configFile!=null && 
!StringUtils.isEmpty(configFile.toString()))
-                   {
-                          URL url = context.getResource(configFile.toString());
-                          if (url == null) {
-                             throw new 
PageNotFoundException(messages.getMessage("file.notfound",
-                                     new Object[] {configFile.toString()}), 
configFile.toString());
-                          }
-                   urls.add(url);
-                   }
+                    if (configFile != null && 
!StringUtils.isEmpty(configFile.toString())) {
+                        URL url = context.getResource(configFile.toString());
+                        if (url == null) {
+                            throw new 
PageNotFoundException(messages.getMessage("file.notfound",
+                                    new Object[] {configFile.toString()}), 
configFile.toString());
+                        }
+                        urls.add(url);
+                    }
                 }
             } catch (IOException e) {
                 log.error(e);
@@ -489,6 +488,46 @@
 
             // assign the parent to a top-level display element
             b.setIsAParent(getTopLevelElement(b.getExtends()));
+
+            //if the parent contains the "org.apache.shale.clay.final"
+            //attribute, we ignore the inheritance by not allowing the parent
+            //generalization relationship
+
+            //however, we still allow aggregate "child" components to
+            //extend other components
+
+            if ((b.getIsAParent() != null)
+                    && (b.getIsAParent().getAttribute(
+                            Globals.CLAY_ALLOW_OVERRIDE_ATTRIBUTE) != null)) {
+
+                // if the bean is also a top-level component, just don't
+                // allow it to extend another topl-level component that is
+                // determined to be final
+                if (!(b instanceof InnerComponentBean)) {
+                    log.warn(messages.getMessage("override.allowed.warning",
+                            new Object[] {b.getJsfid(), 
b.getIsAParent().getJsfid()}));
+                    b.setIsAParent(null);
+                } else {
+                    log.warn(messages.getMessage("override.invalid.warning",
+                            new Object[] {b.getJsfid(), 
b.getIsAParent().getJsfid()}));
+
+                    // the bean is a inner component (element, validator,
+                    // converter, actionListener, valueChangeListener).
+                    // it can only extend a top-level component definition
+                    // marked as "final". Nothing can be overridden except
+                    // symbols.
+
+                    b.getChildren().clear();
+                    b.getAttributes().clear();
+                    b.getValidators().clear();
+                    b.setComponentType(null);
+                    b.setFacetName(null);
+                    b.addConverter(null);
+                    b.getActionListeners().clear();
+                    b.getValueChangeListeners().clear();
+                    b.setInheritanceFinal(false);
+                }
+            }
         }
 
         // resolve inheritance of nested components

Modified: 
shale/framework/trunk/shale-clay/src/main/resources/org/apache/shale/clay/Bundle.properties
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/main/resources/org/apache/shale/clay/Bundle.properties?view=diff&rev=524333&r1=524332&r2=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/main/resources/org/apache/shale/clay/Bundle.properties
 (original)
+++ 
shale/framework/trunk/shale-clay/src/main/resources/org/apache/shale/clay/Bundle.properties
 Fri Mar 30 17:13:39 2007
@@ -1,4 +1,4 @@
-# Resource Strings for Shale Framework
+# Resource Strings for Shale Framework
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -152,3 +152,7 @@
 template.encoding              = Using charset "{0}" loading template file 
"{1}".
 #org.apache.shale.clay.config.ClayTemplateParser
 template.encoding.notsupported = The charset override "{0}" is not supported.
+
+#org.apache.shale.clay.config.beans.ComponentBeanConfig
+override.allowed.warning=The component configuration definition identified 
with jsfid "{0}" cannot extend the top-level component definition "{1}" that 
has been declared final.
+override.invalid.warning=The inner component configuration definition "{0}" 
cannot override any attributes, elements, converter, and listeners of top-level 
component "{1}" because it that has been declared final.
\ No newline at end of file

Modified: 
shale/framework/trunk/shale-clay/src/test/java/org/apache/shale/clay/config/ConfigTestCase.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/test/java/org/apache/shale/clay/config/ConfigTestCase.java?view=diff&rev=524333&r1=524332&r2=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/test/java/org/apache/shale/clay/config/ConfigTestCase.java
 (original)
+++ 
shale/framework/trunk/shale-clay/src/test/java/org/apache/shale/clay/config/ConfigTestCase.java
 Fri Mar 30 17:13:39 2007
@@ -24,6 +24,8 @@
 import org.apache.shale.clay.config.beans.AttributeBean;
 import org.apache.shale.clay.config.beans.ComponentBean;
 import org.apache.shale.clay.config.beans.ElementBean;
+import org.apache.shale.clay.config.beans.ValidatorBean;
+import org.apache.shale.clay.config.beans.ValueChangeListenerBean;
 
 // Tests that the clay component metadata can be loaded and inheritance 
resolved.
 public class ConfigTestCase extends AbstractTestCaseConfig {
@@ -560,6 +562,96 @@
         
     } 
        
+    //test the allow override flag
+    public void testFinal() {
+        // loads the default and the final config file
+        loadConfigFile("/org/apache/shale/clay/config/final-config.xml");
+        
+        // top-level inheritance on a final component
+        // the extends will be ignored as if it didn't extend another 
definition
+        ComponentBean bean = standardConfigBean.getElement("zipOverrideFinal");
+        assertNotNull(bean);
+        assertEquals("none.provided", bean.getComponentType());
+        assertNull(bean.getId());        
+        assertNull(bean.getAttribute("value"));
+        assertNull("basesymbol", bean.getSymbol("basesymbol"));
+        assertEquals("mysymbol", "mysymbol", 
bean.getSymbol("mysymbol").getValue());
 
+        
+        // extending a top-level final component as an "element" will not 
allow you to 
+        // override anything but symbols.  All other overrides are ignored  
+        bean = standardConfigBean.getElement("testForm");
+        assertNotNull(bean);
+        
+        assertEquals(1, bean.getChildren().size());
+        
+        ElementBean childBean = (ElementBean) 
bean.getChildrenIterator().next();
+        assertNotNull(childBean);
+        checkElementExtendingFinal(childBean);
+        
+        // html nodes bound to a JSF component behave like nested "elements".
+        // when a html node is bound to a top-level final component, it can not
+        // override anything but the symbols
+        bean = 
htmlTemplateConfigBean.getElement("/org/apache/shale/clay/config/final.html"); 
+        assertNotNull(bean);
+        assertEquals(2, bean.getChildren().size());
+        Iterator ci = bean.getChildrenIterator();
+        // first node is a "\n" newline withing the template
+        ci.next();
+        
+        childBean = (ElementBean) ci.next();
+        assertNotNull(childBean);
+        checkElementExtendingFinal(childBean);
+       
+
+    }
+    
+    private void checkElementExtendingFinal(ElementBean childBean) {
     
+        assertEquals("componentType", "javax.faces.HtmlInputText", 
childBean.getComponentType());
+        assertEquals("id", "zip", childBean.getId());
+        
+        AttributeBean attr = childBean.getAttribute("maxlength");
+        assertNotNull("maxlength", attr);
+        assertEquals("maxlength", "9", attr.getValue());
+        
+        attr = childBean.getAttribute("size");
+        assertNotNull("size", attr);
+        assertEquals("size", "5", attr.getValue());
+        
+        attr = childBean.getAttribute("value");
+        assertNotNull("value", attr);
+        assertEquals("value", "[EMAIL PROTECTED]", attr.getValue());
+
+        attr = childBean.getAttribute("valueChangeListener");
+        assertNotNull("valueChangeListener", attr);
+        assertEquals("valueChangeListener", "[EMAIL PROTECTED]", 
attr.getValue());
+        
+        assertNotNull("converter", childBean.getConverter());
+        assertEquals("jsfid", "integerConverter", 
childBean.getConverter().getJsfid());
+        
+        assertEquals("validator", 1, childBean.getValidators().size());
+        ValidatorBean validator = (ValidatorBean) 
childBean.getValidatorIterator().next();
+        assertEquals("jsfid", "longRangeValidator", validator.getJsfid());
+
+        attr = validator.getAttribute("minimum");
+        assertNotNull("minimum", attr);
+        assertEquals("minimum", "80000", attr.getValue());
+
+        attr = validator.getAttribute("maximum");
+        assertNotNull("maximum", attr);
+        assertEquals("maximum", "80125", attr.getValue());
+
+        assertEquals("valueChangeListener", 1, 
childBean.getValueChangeListeners().size());
+
+        ValueChangeListenerBean listener = (ValueChangeListenerBean) 
childBean.getValueChangeListenerIterator().next();
+        assertNotNull("valueChangeListener", listener);
+        assertEquals("jsfid", "testValueChangeListener", listener.getJsfid());
+            
+        assertEquals("basesymbol", "basesymbol", 
childBean.getSymbol("basesymbol").getValue());
+        
+        // symbol overrides are allowed
+        assertEquals("mysymbol", "mysymbol", 
childBean.getSymbol("mysymbol").getValue());
+
+    }
 }

Added: 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final-config.xml
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final-config.xml?view=auto&rev=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final-config.xml
 (added)
+++ 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final-config.xml
 Fri Mar 30 17:13:39 2007
@@ -0,0 +1,82 @@
+<?xml version='1.0' encoding="UTF-8"?>
+
+  <!DOCTYPE view PUBLIC
+      "-//Apache Software Foundation//DTD Shale Clay View Configuration 
1.0//EN"
+      "http://shale.apache.org/dtds/clay-config_1_0.dtd";>
+
+<!-- ### clay:remove ### -->
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to you under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- ### /clay:remove ### -->
+<view>
+       <component jsfid="testActionListener" 
componentType="org.apache.shale.clay.config.TestActionListener"/>
+       <component jsfid="testValueChangeListener" 
componentType="org.apache.shale.clay.config.TestValueChangeListener"/>
+       <component jsfid="testValueChangeListener2" 
componentType="org.apache.shale.clay.config.TestValueChangeListener"/>
+                                                                       
+       <component jsfid="zip" id="zip" extends="inputText"> 
+       <attributes>
+             <set name="value" value="[EMAIL PROTECTED]" />
+                 <set name="maxlength" value="9" />
+                 <set name="size" value="5"/>
+                 <set name="valueChangeListener" value="[EMAIL PROTECTED]" />
+                 <set name="org.apache.shale.clay.final">
+                     <description>Declare this config final</description>
+             </set>
+               </attributes>
+               <symbols>
+            <set name="basesymbol" value="basesymbol" /> 
+               </symbols>     
+               
+       
+               <converter jsfid="integerConverter" />
+           <validator jsfid="longRangeValidator">
+                  <attributes>
+                     <set name="minimum" value="80000" />
+                         <set name="maximum" value="80125" />
+                   </attributes>       
+            </validator>
+                <valueChangeListener jsfid="testValueChangeListener" />
+       </component> 
+
+       <component jsfid="zipOverrideFinal" extends="zip" 
componentType="none.provided"> 
+        <description>Component config bean extends a component config that
+        is declared final.  Nothing should be inherited.  We need to provide a
+        component type since there will not be any inheritance.</description>
+        <symbols>
+            <set name="mysymbol" value="mysymbol" /> 
+               </symbols>     
+       </component> 
+   
+
+    <component jsfid="testForm" extends="form" >
+       <element renderId="1" jsfid="zip" id="nooverride">
+          <attributes>
+              <set name="value" value="test"/>
+                     <set name="maxlength" value="999" />
+                     <set name="size" value="555"/>
+                     <set name="valueChangeListener" value="[EMAIL PROTECTED]" 
/>
+          </attributes>
+          <symbols>
+              <set name="mysymbol" value="mysymbol" /> 
+                 </symbols>     
+          
+                <valueChangeListener jsfid="testValueChangeListener2" />  
+       </element>
+    
+    </component>
+                                       
+</view>

Propchange: 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final-config.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final.html
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final.html?view=auto&rev=524333
==============================================================================
--- 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final.html
 (added)
+++ 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final.html
 Fri Mar 30 17:13:39 2007
@@ -0,0 +1,19 @@
+<!-- ### clay:remove ### -->
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to you under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- ### /clay:remove ### -->
+<span jsfid="zip" value="test" maxlength="999" size="555" 
valueChangeListener="[EMAIL PROTECTED]" mysymbol="mysymbol" />
\ No newline at end of file

Propchange: 
shale/framework/trunk/shale-clay/src/test/resources/org/apache/shale/clay/config/final.html
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to