package org.toobs.framework.pres.component; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Vector; import org.toobs.framework.exception.ParameterException; import org.toobs.framework.pres.component.config.Parameter; import org.toobs.framework.pres.componentlayout.config.DoItRef; import org.toobs.framework.pres.componentlayout.config.Section; import org.toobs.framework.pres.util.ParameterUtil; import org.toobs.framework.pres.util.PresConstants; import org.toobs.framework.transformpipeline.domain.IXMLTransformer; import org.toobs.framework.transformpipeline.domain.XMLTransformerException; import org.toobs.framework.transformpipeline.domain.XMLTransformerFactory; import org.toobs.framework.util.BetwixtUtil; import org.toobs.framework.util.Configuration; import org.toobs.framework.util.IRequest; @SuppressWarnings("unchecked") public class RuntimeLayout { private static final String XML_HEADER = "<RuntimeLayout>"; private static final String XML_FOOTER = "</RuntimeLayout>"; private static final String XML_CP_HEADER = "<ContentParams>"; private static final String XML_CP_FOOTER = "</ContentParams>"; private String id; private Map transforms = new HashMap(); private RuntimeLayoutConfig config; private String layoutXml; private DoItRef doItRef; private boolean useComponentScan; private boolean embedded; public RuntimeLayoutConfig getConfig() { return config; } public void setConfig(RuntimeLayoutConfig config) throws IOException { this.config = config; StringBuffer sb = new StringBuffer(); sb.append(XML_HEADER); Parameter[] contentParams = config.getAllContentParams(); if (contentParams.length > 0) { sb.append(XML_CP_HEADER); for (int c = 0; c < contentParams.length; c++) { sb.append(BetwixtUtil.toXml(contentParams[c], true, false, false, null, null)); } sb.append(XML_CP_FOOTER); } //sb.append(BetwixtUtil.toXml(config.getAllParams())); Section[] sections = config.getAllSections(); for (int s = 0; s < sections.length; s++) { sb.append(BetwixtUtil.toXml(sections[s], true, false, false, null, null)); } sb.append(XML_FOOTER); this.setLayoutXml(sb.toString()); } /* public ArrayList getTransforms() { return transforms; } public Transform[] getAllTransforms() { Transform[] allTransforms = new Transform[transforms.size()]; return (Transform[])transforms.toArray(allTransforms); } public void setTransforms(ArrayList transforms) { this.transforms = transforms; } public void addTransform(Transform transform) { addTransform(new Transform[] {transform}); } public void addTransform(Transform[] transform) { for (int i = 0; i < transform.length; i++) { transforms.add(transform[i]); } } */ public String getId() { return id; } public void setId(String id) { this.id = id; } public String getLayoutXml() { return layoutXml; } public void setLayoutXml(String layoutXml) { this.layoutXml = layoutXml; } public String render(IRequest request, boolean embedded) throws ComponentException, ParameterException { return this.render(request, embedded, false, "xhtml"); } public String render(IRequest request, boolean embedded, boolean skipUrlScan) throws ComponentException, ParameterException { return this.render(request, embedded, skipUrlScan, "xhtml"); } public String render(IRequest request, boolean embedded, boolean skipUrlScan, String contentType) throws ComponentException, ParameterException { IXMLTransformer xmlTransformer = null; StringBuffer outputString = new StringBuffer(); HashMap layoutParams = new HashMap(); Vector outputXML = new Vector(); try { Vector inputXSLs = new Vector(); Vector inputXMLs = new Vector(); Vector contentTransforms = (Vector) this.getTransforms().get(contentType); if (contentTransforms != null && contentTransforms.size() > 0) { Iterator it = contentTransforms.iterator(); while (it.hasNext()) { Transform transform = (Transform) it.next(); inputXSLs.add(transform.getTransformName()); //Fix the params using the param mapping for //this configuration. if(transform.getTransformParams() != null){ ParameterUtil.mapParameters("Transform:" + transform.getTransformName(), transform.getTransformParams().getParameter(), request.getParams(), layoutParams, this.id); } } } else { throw new ComponentException("Component Layout with id: " + this.id + " does not have a transform for content type: " + contentType); } /* for (int t = 0; t < transforms.size(); t++) { Transform trans = (Transform)transforms.get(t); inputXSLs.add(trans.getTransformName()); if (trans.getTransformParams() != null) { ParameterUtil.mapParameters("Transform:" + trans.getTransformName(), trans.getTransformParams().getParameter(), request.getParams(), layoutParams, this.id); } } */ if (!skipUrlScan) { if (embedded) { inputXSLs.add(PresConstants.XSL_URL_SCANNER_XML); xmlTransformer = XMLTransformerFactory.getInstance().getChainTransformer(XMLTransformerFactory.OUTPUT_FORMAT_XML); if (request.getParams().get("outputFormat") != null) { layoutParams.put("outputFormat", request.getParams().get("outputFormat")); } } else if (useComponentScan) { inputXSLs.add(PresConstants.XSL_URL_SCANNER_COMP); xmlTransformer = XMLTransformerFactory.getInstance().getChainTransformer(XMLTransformerFactory.OUTPUT_FORMAT_HTML); } else { inputXSLs.add(PresConstants.XSL_URL_SCANNER_LAYOUT); xmlTransformer = XMLTransformerFactory.getInstance().getChainTransformer(XMLTransformerFactory.OUTPUT_FORMAT_HTML); } } else { xmlTransformer = XMLTransformerFactory.getInstance().getDefaultTransformer(); } ParameterUtil.mapParameters("Layout:" + this.id, config.getAllParams(), request.getParams(), layoutParams, this.id); inputXMLs.add(this.layoutXml); layoutParams.put("context", Configuration.getInstance().getMainContext() + "/"); if (request.getParams().get("appContext") != null) { layoutParams.put("appContext", request.getParams().get("appContext")); } outputXML = xmlTransformer.transform(inputXSLs, inputXMLs, layoutParams); } catch (XMLTransformerException e) { throw new ComponentException(e); } for (int ox = 0; ox < outputXML.size(); ox++) { outputString.append((String) outputXML.get(ox)); } // Return return outputString.toString(); } public DoItRef getDoItRef() { return doItRef; } public void setDoItRef(DoItRef doItRef) { this.doItRef = doItRef; } public boolean isUseComponentScan() { return useComponentScan; } public void setUseComponentScan(boolean useComponentScan) { this.useComponentScan = useComponentScan; } public boolean isEmbedded() { return embedded; } public void setEmbedded(boolean embedded) { this.embedded = embedded; } public Map getTransforms() { return transforms; } public void setTransforms(Map transforms) { this.transforms = transforms; } }