You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by gv...@apache.org on 2005/10/21 22:30:38 UTC
svn commit: r327264 - in /struts/shale/trunk/clay-plugin/src:
java/org/apache/shale/clay/ java/org/apache/shale/clay/config/
java/org/apache/shale/clay/config/beans/ test/org/apache/shale/clay/config/
Author: gvanmatre
Date: Fri Oct 21 13:30:22 2005
New Revision: 327264
URL: http://svn.apache.org/viewcvs?rev=327264&view=rev
Log:
Added a check for duplicate component ids within the same naming container. This lifting is done by the JSP tags in the RI.
Added:
struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate1.html
struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate2.html
Modified:
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/ClayTemplateParser.java
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java
struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/ConfigTestCase.java
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties?rev=327264&r1=327263&r2=327264&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties Fri Oct 21 13:30:22 2005
@@ -114,14 +114,16 @@
realizing.inheritance=Realizing heritage $:-<
realizing.inheritance.exception=Runtime exception caught realizing inheritance
resolve.inheritance.end=Inheritance resolved @:-)
-missing.componentType.exception=Missing componentType {0}
-circular.inheritance.exception=Circular inheritance detected {0}
-circular.composition.exception=Circular composition detected {0}
+missing.componentType.exception=Missing componentType {0}.
+duplicate.componentid.exception=A duplicate component id ({0}) was found within the same naming container ({1}).
+circular.inheritance.exception=Circular inheritance detected {0}.
+circular.composition.exception=Circular composition detected {0}.
circular.child.parent.same.exception=Circular association detected; an element ({0}) cannot be associated with ({1}). A component cannot be an inherited and composition parent to the same child.
circular.child.extends.same.parent.exception=Circular composition detected; contained element ({0}) cannot inherit from owning parent component ({1}).
jsfid.notfound=The component identified by jsfid {0} could not be found.
config.notloaded=ConfigBean is not loaded to handle a component identified by jsfid {0}.
file.notfound=Unable to find file {0}. If this is a full HTML or XML view, check your navigation rules.
+check.tree=Checking for duplicate component ids within a naming container ({0}) #:-<
#org.apache.shale.clay.config.beans.TemplateConfigBean
loading.template=Loading clay HTML template {0}
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/ClayTemplateParser.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/ClayTemplateParser.java?rev=327264&r1=327263&r2=327264&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/ClayTemplateParser.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/ClayTemplateParser.java Fri Oct 21 13:30:22 2005
@@ -126,6 +126,10 @@
buffer = null;
ri = null;
+ //verify there is not a duplicate component id within a naming
+ //container.
+ config.checkTree(root);
+
return root;
}
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java?rev=327264&r1=327263&r2=327264&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java Fri Oct 21 13:30:22 2005
@@ -355,6 +355,11 @@
throw e1;
}
+ //check to make sure that there is not a duplicate component id
+ //within the same naming container.
+ checkTree(b);
+
+
b = null;
e = null;
}
@@ -1164,5 +1169,85 @@
return wasDirty;
}
+
+ /**
+ * <p>A static string array of faces component types that are naming
+ * containers.</p>
+ */
+ protected static final String[] NAMING_CONTAINER_TYPES = {
+ "javax.faces.HtmlForm",
+ "javax.faces.HtmlDataTable",
+ "org.apache.shale.clay.component.Clay",
+ "org.apache.shale.Subview",
+ "javax.faces.NamingContainer"};
+
+ /**
+ * <p>Checks the <code>componentType</code> against the <code>NAMING_CONTAINER_TYPES</code>
+ * list to determine if it is a naming container. Component id's must be unique within a
+ * naming container. Returns a <code>true</code> value if the <code>componentType</code>
+ * is a naming container; otherwise, returns <code>false</code>.</p>
+ */
+ protected boolean isNamingContainer(String componentType) {
+ boolean flag = false;
+ for (int i = 0; i < NAMING_CONTAINER_TYPES.length; i++) {
+ if (NAMING_CONTAINER_TYPES[i].equals(componentType)) {
+ flag = true;
+ break;
+ }
+ }
+
+ return flag;
+ }
+
+
+ /**
+ * <p>Recursively walks the tree of component metadata verifying
+ * there is not a duplicate component id within a naming container.
+ * A root {@link ComponentBean} is passed as a single parameter.
+ * The overloaded <code>checkTree(List, ComponentBean)</code> is
+ * invoked to process components under a naming container.</p>
+ */
+ public void checkTree(ComponentBean b) {
+ if (log.isDebugEnabled())
+ log.debug(messages.getMessage("check.tree", new Object[] {b.getComponentType()}));
+
+ List componentIds = new ArrayList();
+ checkTree(componentIds, b);
+ componentIds.clear();
+ componentIds = null;
+ }
+
+
+ /**
+ * <p>Verifies there is not a duplicate component id within a naming container.
+ * A list of accumulating <code>componentIds</code> and a
+ * root {@link ComponentBean} is passed as parameters. A runtime
+ * exception is thrown if a duplicate id is encountered.</p>
+ */
+ protected void checkTree(List componentIds, ComponentBean b) {
+
+ //check fo duplicate component id's
+ String id = b.getId();
+ if (id != null) {
+ if (componentIds.contains(id)) {
+ throw new NullPointerException(messages.getMessage("duplicate.componentid.exception",
+ new Object[] {id, b}));
+ } else {
+ componentIds.add(id);
+ }
+ }
+
+ Iterator ci = b.getChildrenIterator();
+ while (ci.hasNext()) {
+ ComponentBean c = (ComponentBean) ci.next();
+ if (isNamingContainer(c.getComponentType())) {
+ checkTree(c);
+ } else {
+ checkTree(componentIds, c);
+ }
+ }
+
+ }
+
}
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java?rev=327264&r1=327263&r2=327264&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java Fri Oct 21 13:30:22 2005
@@ -107,5 +107,12 @@
* files were reloaded.</p>
*/
public boolean refresh(boolean forceReload);
+
+ /**
+ * <p>Verifies there is not a duplicate component id within a naming container.
+ * A root {@link ComponentBean} is passed as a single parameter.</p>
+ */
+ public void checkTree(ComponentBean b);
+
}
Modified: struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/ConfigTestCase.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/ConfigTestCase.java?rev=327264&r1=327263&r2=327264&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/ConfigTestCase.java (original)
+++ struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/ConfigTestCase.java Fri Oct 21 13:30:22 2005
@@ -606,4 +606,28 @@
}
+ // test duplicate id check
+ public void testDuplicateComponentIds() {
+
+ // loads the default and the custom address config file
+ loadConfigFile("org/apache/shale/clay/config/address-config.xml");
+
+ try {
+ ComponentBean bean = htmlTemplateConfigBean.getElement("org/apache/shale/clay/config/duplicate1.html");
+ assertTrue("Duplicate component check", false);
+ } catch (RuntimeException e) {
+ assertTrue(
+ "Duplicate component check",
+ e.getMessage().startsWith("A duplicate component id (street1) was found within the same naming container"));
+ }
+
+
+ ComponentBean bean = htmlTemplateConfigBean.getElement("org/apache/shale/clay/config/duplicate2.html");
+ assertNotNull("Duplicate component check", bean);
+
+
+ }
+
+
+
}
Added: struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate1.html
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate1.html?rev=327264&view=auto
==============================================================================
--- struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate1.html (added)
+++ struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate1.html Fri Oct 21 13:30:22 2005
@@ -0,0 +1,3 @@
+<input id=street1 value="#{managed-bean-name.street1}" type=text size=45>
+<input id=street1 value="#{managed-bean-name.street1}" type=text size=45>
+
Added: struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate2.html
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate2.html?rev=327264&view=auto
==============================================================================
--- struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate2.html (added)
+++ struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/config/duplicate2.html Fri Oct 21 13:30:22 2005
@@ -0,0 +1,10 @@
+<input id=street1 value="#{managed-bean-name.street1}" type=text size=45>
+<form>
+ <input id=street1 value="#{managed-bean-name.street1}" type=text size=45>
+ <span jsfid="clay" allowBody="true">
+ <input id=street1 value="#{managed-bean-name.street1}" type=text size=45>
+ </span>
+ <span jsfid="subview" allowBody="true">
+ <input id=street1 value="#{managed-bean-name.street1}" type=text size=45>
+ </span>
+</form>
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org