Author: gvanmatre Date: Sat Mar 10 17:36:16 2007 New Revision: 516836 URL: http://svn.apache.org/viewvc?view=rev&rev=516836 Log:
This fix handles the different behavior of the UIViewRoot component between various versions of JSF. The problem was reported by Richard Eggert (SHALE-418). This also includes a typo in the Clay documentation (SHALE-411). Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/Clay.java shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/ClayContext.java shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/CreateComponentCommand.java shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java shale/framework/branches/SHALE_1_0_X/shale-clay/src/site/xdoc/index.xml shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/AssignViewRootTestCase.java shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/SymbolsTestCase.java Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/Clay.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/Clay.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/Clay.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/Clay.java Sat Mar 10 17:36:16 2007 @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.Map; import java.util.TreeMap; +import java.util.TreeSet; import javax.faces.component.UIComponent; import javax.faces.component.UIComponentBase; @@ -363,6 +364,7 @@ clayContext.setDisplayElement(getDisplayElementRoot()); clayContext.setJsfid(getJsfid()); clayContext.setFacesContext(getFacesContext()); + clayContext.setJspIds(new TreeSet()); Map symbolTable = new TreeMap(); symbolTable.putAll(getDisplayElementRoot().getSymbols()); Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/AssignChildrenCommand.java Sat Mar 10 17:36:16 2007 @@ -27,6 +27,7 @@ import org.apache.commons.chain.Catalog; import org.apache.commons.chain.Command; import org.apache.commons.chain.Context; +import org.apache.shale.clay.component.Clay; import org.apache.shale.clay.config.Globals; import org.apache.shale.clay.config.beans.ComponentBean; @@ -84,6 +85,7 @@ subContext.setParent(parent); subContext.setChild(null); subContext.setChildIndex(childIndex); + subContext.setJspIds(clayContext.getJspIds()); Catalog catalog = getCatalog(); Command command = catalog @@ -97,7 +99,27 @@ ++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--) { + UIComponent child = (UIComponent) parent.getChildren().get(i); + Long jspId = (Long) child.getAttributes().get( + Globals.CLAY_JSPID_ATTRIBUTE); + if (jspId != null + && !clayContext.getJspIds().contains(jspId)) { + parent.getChildren().remove(i); + child.setParent(null); + } + } + } + + return isFinal; } Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/ClayContext.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/ClayContext.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/ClayContext.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/ClayContext.java Sat Mar 10 17:36:16 2007 @@ -22,6 +22,7 @@ import java.util.Map; import java.util.TreeMap; +import java.util.TreeSet; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; @@ -297,5 +298,28 @@ */ public void setChildIndex(int index) { childIndex = index; + } + + /** + * <p>Each <code>displayElement</code> is given a unique id. This + * set represents each [EMAIL PROTECTED] ComponentBean} used in the page + * composition.</p> + */ + private TreeSet jspIds = null; + + /** + * @return the set that represents each <code>displayElement</code> used + * to build the target JSF sub componennt tree + */ + public TreeSet getJspIds() { + return jspIds; + } + + /** + * @param graph the set that represents each <code>displayElement</code> used + * to build the target JSF sub componennt tree + */ + public void setJspIds(TreeSet graph) { + jspIds = graph; } } Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/CreateComponentCommand.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/CreateComponentCommand.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/CreateComponentCommand.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/component/chain/CreateComponentCommand.java Sat Mar 10 17:36:16 2007 @@ -105,6 +105,9 @@ realizeSymbols(clayContext); UIComponent child = null; + Long jspId = new Long(displayElement.getJspId()); + clayContext.getJspIds().add(jspId); + String facetName = displayElement.getFacetName(); if (facetName != null) { facetName = replaceMnemonic(clayContext, facetName); @@ -113,17 +116,14 @@ child = parent.getFacet(displayElement.getFacetName()); } if (child == null) { - child = this.findComponentByJspId(parent, displayElement.getJspId()); + child = this.findComponentByJspId(parent, jspId); } - - String id = null; + // always burn an id; this is to support the early versions of myfaces & RI 1.1 + // the UIViewRoot didn't persist the sequence that is used by the call to createUniqueId + String id = facesContext.getViewRoot().createUniqueId(); if (child == null) { - id = displayElement.getId(); - - if (id == null) { - id = facesContext.getViewRoot().createUniqueId(); - } else { - id = replaceMnemonic(clayContext, id); + if (displayElement.getId() != null) { + id = replaceMnemonic(clayContext, displayElement.getId()); } } else { id = child.getId(); @@ -169,7 +169,7 @@ } child.setId(id); - child.getAttributes().put(Globals.CLAY_JSPID_ATTRIBUTE, displayElement.getJspId()); + child.getAttributes().put(Globals.CLAY_JSPID_ATTRIBUTE, jspId); if (facetName != null) { parent.getFacets().put(facetName, child); @@ -235,11 +235,11 @@ * @return the child <code>UIComponent</code> if a match is found; otherwise; * a <code>null</code> value. */ - private UIComponent findComponentByJspId(UIComponent parent, String id) { + private UIComponent findComponentByJspId(UIComponent parent, Long id) { Iterator ci = parent.getChildren().iterator(); while (ci.hasNext()) { UIComponent child = (UIComponent) ci.next(); - String jspId = (String) child.getAttributes().get(Globals.CLAY_JSPID_ATTRIBUTE); + Long jspId = (Long) child.getAttributes().get(Globals.CLAY_JSPID_ATTRIBUTE); if (jspId != null && jspId.equals(id)) { return child; } Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/ComponentBean.java Sat Mar 10 17:36:16 2007 @@ -79,16 +79,18 @@ /** * <p>Returns a unique id that will stick to the config bean. + * It represents its compositional relationship within the subtree. * This is clay's version of the <code>JspIdConsumer</code> * in JSP 2.1.</p> * * @return unique id for a view element */ - public String getJspId() { + public long getJspId() { if (jspId == -1) { jspId = generateId(); } - return Long.toString(jspId); + + return jspId; } /** Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/main/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java Sat Mar 10 17:36:16 2007 @@ -75,10 +75,6 @@ //loads the HTML template the first time and when file //has been modified watchDog.refresh(false); - } else { - //check to see if an existing html template - //needs reloaded - watchDog.refresh(false); } // returns the cached element Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/site/xdoc/index.xml URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/site/xdoc/index.xml?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/site/xdoc/index.xml (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/site/xdoc/index.xml Sat Mar 10 17:36:16 2007 @@ -353,7 +353,7 @@ </li> <li><p>The subtree can be formed using a Tapestry like HTML layout. The benefit of using HTML layout composition is that it allows you to use standard HTML tools. It also promotes - more rapped development as an HTML prototype can evolve into a dynamic web page. The + more rapid development as an HTML prototype can evolve into a dynamic web page. The HTML elements are bound to corresponding JSF components using a jsfid attribute. This attribute binds the HTML mock-up with a component declared in the Clay view configuration files. Some HTML elements, the such as the FORM element, have an implied mapping to a Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/AssignViewRootTestCase.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/AssignViewRootTestCase.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/AssignViewRootTestCase.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/AssignViewRootTestCase.java Sat Mar 10 17:36:16 2007 @@ -20,13 +20,16 @@ import java.util.Iterator; import java.util.Locale; +import javax.faces.FactoryFinder; import javax.faces.component.UIComponent; import javax.faces.context.ResponseWriter; +import javax.faces.render.RenderKitFactory; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.shale.clay.component.Clay; +import org.apache.shale.test.mock.MockRenderKit; public class AssignViewRootTestCase extends AbstractTestCaseConfig { @@ -51,6 +54,11 @@ public void testAssign1() throws Exception { + RenderKitFactory renderKitFactory = (RenderKitFactory) + FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); + renderKit = new MockRenderKit(); + renderKitFactory.addRenderKit("MY_KIT1", renderKit); + buildSubtree("/org/apache/shale/clay/config/viewroot1.html"); String renderKitId = facesContext.getViewRoot().getRenderKitId(); @@ -68,6 +76,11 @@ } public void testAssign2() throws Exception { + + RenderKitFactory renderKitFactory = (RenderKitFactory) + FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); + renderKit = new MockRenderKit(); + renderKitFactory.addRenderKit("MY_KIT2", renderKit); buildSubtree("/org/apache/shale/clay/config/viewroot2.html"); @@ -87,6 +100,11 @@ public void testAssign3() throws Exception { + RenderKitFactory renderKitFactory = (RenderKitFactory) + FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); + renderKit = new MockRenderKit(); + renderKitFactory.addRenderKit("MY_KIT3", renderKit); + buildSubtree("/org/apache/shale/clay/config/viewroot3.html"); String renderKitId = facesContext.getViewRoot().getRenderKitId(); @@ -108,6 +126,7 @@ clay.setId("test"); clay.setJsfid(jsfid); clay.setManagedBeanName("test"); + facesContext.getViewRoot().getChildren().add(0, clay); // builds a buffer to write the page to StringWriter writer = new StringWriter(); Modified: shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/SymbolsTestCase.java URL: http://svn.apache.org/viewvc/shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/SymbolsTestCase.java?view=diff&rev=516836&r1=516835&r2=516836 ============================================================================== --- shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/SymbolsTestCase.java (original) +++ shale/framework/branches/SHALE_1_0_X/shale-clay/src/test/java/org/apache/shale/clay/config/SymbolsTestCase.java Sat Mar 10 17:36:16 2007 @@ -19,6 +19,7 @@ import java.util.Iterator; import java.util.Map; import java.util.TreeMap; +import java.util.TreeSet; import javax.faces.component.UIComponent; @@ -368,6 +369,7 @@ clayContext.setParent(parent); clayContext.setDisplayElement(displayElement); clayContext.setSymbols(displayElement.getSymbols()); + clayContext.setJspIds(new TreeSet()); Command command = new CreateComponentCommand(); boolean isFinal = command.execute(clayContext); @@ -396,6 +398,7 @@ clayContext.setParent(parent); clayContext.setDisplayElement(displayElement); clayContext.setSymbols(displayElement.getSymbols()); + clayContext.setJspIds(new TreeSet()); command = new CreateComponentCommand(); try { @@ -422,6 +425,7 @@ clayContext.setParent(parent); clayContext.setDisplayElement(displayElement); clayContext.setSymbols(displayElement.getSymbols()); + clayContext.setJspIds(new TreeSet()); command = new CreateComponentCommand(); try {