-- ADD DESCRIPTION HERE -- ******************************************************************* * SECTION: Modified Files ******************************************************************* M src/java/com/sun/jsftemplating/handlers/ComponentHandlers.java M src/java/com/sun/jsftemplating/layout/descriptors/LayoutComponent.java M src/java/com/sun/jsftemplating/layout/descriptors/LayoutElementBase.java M src/java/com/sun/jsftemplating/layout/facelets/FaceletsLayoutDefinitionReader.java M src/java/com/sun/jsftemplating/util/LayoutElementUtil.java ******************************************************************* * SECTION: Diffs ******************************************************************* Index: src/java/com/sun/jsftemplating/handlers/ComponentHandlers.java =================================================================== RCS file: /cvs/jsftemplating/src/java/com/sun/jsftemplating/handlers/ComponentHandlers.java,v retrieving revision 1.9 diff -u -r1.9 ComponentHandlers.java --- src/java/com/sun/jsftemplating/handlers/ComponentHandlers.java 19 Apr 2007 01:20:34 -0000 1.9 +++ src/java/com/sun/jsftemplating/handlers/ComponentHandlers.java 16 May 2007 18:57:47 -0000 @@ -400,28 +400,6 @@ } /** - *
This method recurses through the {@link LayoutElement} tree to - * generate a String representation of its structure.
- */ - private static void dumpTree(LayoutElement elt, StringBuffer buf, String indent) { - // First add the current LayoutElement - String compInfo = ""; - if (elt instanceof LayoutComponent) { - LayoutComponent comp = (LayoutComponent) elt; - compInfo = " nested=" + comp.isNested() + ", facetChild=" + comp.isFacetChild(); - } - buf.append(indent + elt.getUnevaluatedId() + " (" + elt.getClass().getName() + ")" + compInfo + "\n"); - - // Children... - IteratorThis handler will print out the structure of a * {@link LayoutElement} tree from the given LayoutElement.
*/ @@ -444,7 +422,7 @@ // Create the buffer and populate it... StringBuffer buf = new StringBuffer("LayoutElement Tree:\n"); - dumpTree(elt, buf, " "); + LayoutElementUtil.dumpTree(elt, buf, " "); context.setOutputValue("value", buf.toString()); } Index: src/java/com/sun/jsftemplating/layout/descriptors/LayoutComponent.java =================================================================== RCS file: /cvs/jsftemplating/src/java/com/sun/jsftemplating/layout/descriptors/LayoutComponent.java,v retrieving revision 1.9 diff -u -r1.9 LayoutComponent.java --- src/java/com/sun/jsftemplating/layout/descriptors/LayoutComponent.java 11 Apr 2007 19:38:32 -0000 1.9 +++ src/java/com/sun/jsftemplating/layout/descriptors/LayoutComponent.java 16 May 2007 18:59:57 -0000 @@ -394,8 +394,7 @@ public void setNested(boolean value) { _nested = value; } - - + /** *Component type
*/ Index: src/java/com/sun/jsftemplating/layout/descriptors/LayoutElementBase.java =================================================================== RCS file: /cvs/jsftemplating/src/java/com/sun/jsftemplating/layout/descriptors/LayoutElementBase.java,v retrieving revision 1.13 diff -u -r1.13 LayoutElementBase.java --- src/java/com/sun/jsftemplating/layout/descriptors/LayoutElementBase.java 11 Apr 2007 18:40:06 -0000 1.13 +++ src/java/com/sun/jsftemplating/layout/descriptors/LayoutElementBase.java 16 May 2007 18:58:48 -0000 @@ -480,6 +480,13 @@ component.encodeEnd(context); } + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + LayoutElementUtil.dumpTree(this, buf, ""); + + return buf.toString(); + } /** * List of child LayoutElements (if, facet, UIComponents, etc.) Index: src/java/com/sun/jsftemplating/layout/facelets/FaceletsLayoutDefinitionReader.java =================================================================== RCS file: /cvs/jsftemplating/src/java/com/sun/jsftemplating/layout/facelets/FaceletsLayoutDefinitionReader.java,v retrieving revision 1.15 diff -u -r1.15 FaceletsLayoutDefinitionReader.java --- src/java/com/sun/jsftemplating/layout/facelets/FaceletsLayoutDefinitionReader.java 25 Apr 2007 20:58:14 -0000 1.15 +++ src/java/com/sun/jsftemplating/layout/facelets/FaceletsLayoutDefinitionReader.java 16 May 2007 19:03:05 -0000 @@ -27,6 +27,10 @@ import java.io.InputStream; import java.net.URL; +import javax.faces.FactoryFinder; +import javax.faces.application.Application; +import javax.faces.application.ApplicationFactory; +import javax.faces.context.FacesContext; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; @@ -45,18 +49,20 @@ public FaceletsLayoutDefinitionReader(String key, URL url) { InputStream is = null; + BufferedInputStream bs = null; try{ this.key = key; this.url = url; DocumentBuilder builder = DbFactory.getInstance(); builder.setErrorHandler(new ParsingErrorHandler()); - is = new BufferedInputStream(this.url.openStream()); - document = builder.parse(is); - is.close(); + is = this.url.openStream(); + bs = new BufferedInputStream(is); + document = builder.parse(bs); } catch (Exception e) { throw new LayoutDefinitionException(e); } finally { + Util.closeStream(bs); Util.closeStream(is); } } @@ -136,7 +142,56 @@ return abortProcessing; } + + private LayoutComposition processComposition(LayoutElement parent, NamedNodeMap attrs, String id, boolean trimming) { + if (trimming) { + parent = parent.getLayoutDefinition(); // parent to the LayoutDefinition + parent.getChildLayoutElements().clear(); // a ui:composition clears everything outside of it + } + LayoutComposition lc = new LayoutComposition(parent, id); + Node templateNode = attrs.getNamedItem("template"); + String template = (templateNode != null) ? templateNode.getNodeValue() : null; + lc.setTemplate(template); + + return lc; + } + + private LayoutComponent processComponent(LayoutElement parent, Node node, NamedNodeMap attrs, String id, boolean trimming) { + if (trimming) { + parent = parent.getLayoutDefinition(); // parent to the LayoutDefinition + parent.getChildLayoutElements().clear(); // a ui:composition clears everything outside of it + } + LayoutComponent lc = new LayoutComponent(parent, id, LayoutDefinitionManager.getGlobalComponentType("event")); + parent.addChildLayoutElement(lc); + LayoutComposition comp = processComposition(lc, attrs, id+"_lc", trimming); + + NodeList nodeList = node.getChildNodes(); + boolean abortChildProcessing = false; + for (int i = 0; i < nodeList.getLength() && (abortChildProcessing != true); i++) { + try { + abortChildProcessing = process(comp, nodeList.item(i), true); + } catch (IOException e) { + e.printStackTrace(); + } + } + lc.addChildLayoutElement(comp); + + return lc; + } + + private Application getApplication() { + ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder + .getFactory(FactoryFinder.APPLICATION_FACTORY); + return appFactory.getApplication(); + } + private Object getElValue(String el) { + FacesContext context = FacesContext.getCurrentInstance(); + return getApplication() + .evaluateExpressionGet(context, el, Object.class); + } + + private LayoutElement createComponent(LayoutElement parent, Node node, boolean nested) { LayoutElement element = null; String nodeName = node.getNodeName(); @@ -146,12 +201,9 @@ LayoutElementUtil.getGeneratedId(nodeName); if ("ui:composition".equals(nodeName)) { - parent = parent.getLayoutDefinition(); // parent to the LayoutDefinition - parent.getChildLayoutElements().clear(); // a ui:composition clears everything outside of it - LayoutComposition lc = new LayoutComposition(parent, id); - String template = attrs.getNamedItem("template").getNodeValue(); - lc.setTemplate(template); - element = lc; + element = processComposition(parent, attrs, id, true); + } else if ("ui:decorate".equals(nodeName)) { + element = processComposition(parent, attrs, id, false); } else if ("ui:define".equals(nodeName)) { String name = attrs.getNamedItem("name").getNodeValue(); element = new LayoutDefine(parent, name); @@ -161,14 +213,33 @@ String name = (nameAttr != null) ? nameAttr.getNodeValue() : null; li.setName(name); element = li; + // Let these be handled by the else below, and let's see what happens :) } else if ("ui:component".equals(nodeName)) { - } else if ("ui:debug".equals(nodeName)) { - } else if ("ui:decorate".equals(nodeName)) { - LayoutComposition lc = new LayoutComposition(parent, id, true); - String template = attrs.getNamedItem("template").getNodeValue(); - lc.setTemplate(template); - element = lc; + element = processComponent(parent, node, attrs, id, true); } else if ("ui:fragment".equals(nodeName)) { + element = processComponent(parent, node, attrs, id, false); + /* + Node bindingAttr = attrs.getNamedItem("binding"); + if (bindingAttr == null) { + throw new LayoutDefinitionException("ui:fragment requires a binding attribute"); + } + String bindingEl = bindingAttr.getNodeValue(); + Object obj = getElValue(bindingEl); + if (!(obj instanceof UIComponent)) { + throw new LayoutDefinitionException("Binding EL must return a UIComponent"); + } + UIComponent comp = (UIComponent) obj; + String family = comp.getFamily(); // TODO: is the correct? + System.out.println(LayoutDefinitionManager.getGlobalComponentTypes()); + ComponentType componentType = + LayoutDefinitionManager.getGlobalComponentType(family); + LayoutComponent lc = new LayoutComponent(parent, id, componentType); + addAttributesToComponent(lc, node); + lc.setFacetChild(false); + lc.setNested(nested); + element = lc; + */ + } else if ("ui:debug".equals(nodeName)) { } else if ("ui:include".equals(nodeName)) { } else if ("ui:param".equals(nodeName)) { } else if ("ui:remove".equals(nodeName)) { Index: src/java/com/sun/jsftemplating/util/LayoutElementUtil.java =================================================================== RCS file: /cvs/jsftemplating/src/java/com/sun/jsftemplating/util/LayoutElementUtil.java,v retrieving revision 1.5 diff -u -r1.5 LayoutElementUtil.java --- src/java/com/sun/jsftemplating/util/LayoutElementUtil.java 3 Apr 2007 19:08:39 -0000 1.5 +++ src/java/com/sun/jsftemplating/util/LayoutElementUtil.java 16 May 2007 18:57:35 -0000 @@ -26,6 +26,8 @@ import com.sun.jsftemplating.layout.descriptors.LayoutElement; import com.sun.jsftemplating.layout.descriptors.LayoutFacet; +import java.util.Iterator; + /** *This class is a utility class for misc {@link LayoutElement} related @@ -198,6 +200,28 @@ } /** + *
This method recurses through the {@link LayoutElement} tree to + * generate a String representation of its structure.
+ */ + public static void dumpTree(LayoutElement elt, StringBuffer buf, String indent) { + // First add the current LayoutElement + String compInfo = ""; + if (elt instanceof LayoutComponent) { + LayoutComponent comp = (LayoutComponent) elt; + compInfo = " nested=" + comp.isNested() + ", facetChild=" + comp.isFacetChild(); + } + buf.append(indent + elt.getUnevaluatedId() + " (" + elt.getClass().getName() + ")" + compInfo + "\n"); + + // Children... + IteratorThis value represents the maximum number that is contained in an * auto generated id. I intentionally did not make this final so that * if needed it can be tweaked at runtime. However, I do not think