From: Jonathan O. <os...@us...> - 2008-09-11 19:50:12
|
Update of /cvsroot/dlsciences/dlese-tools-project/src/org/dlese/dpc/schemedit/autoform/mde In directory sc8-pr-cvs12.sourceforge.net:/tmp/cvs-serv21033 Added Files: MdeAny.java MdeRepeatingDerivedContentModel.java MdeRepeatingDerivedTextOnlyModel.java Log Message: Added classes for previously unsupported schema constructs --- NEW FILE: MdeAny.java --- /** * Copyright 2002, 2003 DLESE Program Center/University Corporation for * Atmospheric Research (UCAR), P.O. Box 3000, Boulder, CO 80307, * su...@dl....<p> * * This file is part of the DLESE Tools Project.<p> * * The DLESE Tools Project is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at your * option) any later version.<p> * * The DLESE Tools Project is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details.<p> * * You should have received a copy of the GNU General Public License along with * The DLESE System; if not, write to the Free Software Foundation, Inc., 59 * Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.dlese.dpc.schemedit.autoform.mde; import org.dlese.dpc.schemedit.autoform.*; import org.dlese.dpc.schemedit.SchemEditUtils; import org.dlese.dpc.xml.*; import org.dlese.dpc.xml.schema.*; import org.dlese.dpc.xml.schema.compositor.InlineCompositor; import java.util.*; import org.dom4j.Node; import org.dom4j.Attribute; import org.dom4j.Element; /** * Renders an ANY node.<P> * * NOTE: this class is not used and should be considered as a stub only - it * may not even represent the correct approach to handling "any" nodes. * * @author ostwald<p> * * */ public class MdeAny extends MdeNode { /** Description of the Field */ private static boolean debug = true; /** * Constructor for the MdeAny object * * @param renderer NOT YET DOCUMENTED */ public MdeAny(RendererImpl renderer) { super(renderer); } /** NOT YET DOCUMENTED */ public void render() { if (isEditMode()) { render_edit_mode(); } else { render_display_mode(); } } /** NOT YET DOCUMENTED */ private void render_display_mode() { attachElementId(parent); Element box = getDiv() // attribute .addAttribute("id", "${id}_box"); parent.add(box); // create fieldElement (containing input element) // first set typeDef to validating TypeDef - WHY IS THIS NECESSARY? Element fieldElement = getInputElement(); // join label and field elements as table Element renderedField = getRenderedNoLabelField(fieldElement); box.add(renderedField); } /** NOT YET DOCUMENTED */ private void render_edit_mode() { Element parentExists = rhelper.parentNodeExistsTest(xpath); parent.add(parentExists); attachElementId(parentExists); // create box Element box = null; if (this.getLevel() > 1) box = getDiv(); else box = df.createElement("div"); // Element box = getDiv() // attribute box.addAttribute("id", "${id}_box"); embedDebugInfo(box, "any"); // this.attachElementDebugInfo(box, "attribute box (" + this.getLevel() + ")", "pink"); // attach box parentExists.add(box); Element fieldElement = this.renderer.getTextAreaInput(xpath); // join label and field elements as table Element renderedField = getRenderedNoLabelField(fieldElement); box.add(renderedField); } /** * Gets the renderedNoLabelField attribute of the MdeAny object * * @param action NOT YET DOCUMENTED * @return The renderedNoLabelField value */ protected Element getRenderedNoLabelField(Element action) { Element table = df.createElement("table") .addAttribute("class", "no-input-field-table"); Element row = table.addElement("tr") .addAttribute("class", "form-row"); Element labelCell = row.addElement("td"); rhelper.attachToolHelp(labelCell, xpath); if (getLevel() > 0) { labelCell.addAttribute("class", "label-cell"); } // labelCell.add(label.getElement()); if (action != null) { Element controllerCell = row.addElement("td") .addAttribute("class", "action-box"); controllerCell.add(action); } if (this.schemaNode.isRecursive()) attachElementDebugInfo(table, "RECURSIVE", "blue"); return table; } /** * Sets the debug attribute of the MdeAny class * * @param verbose The new debug value */ public static void setDebug(boolean verbose) { debug = verbose; } /** * NOT YET DOCUMENTED * * @param s NOT YET DOCUMENTED */ protected void prtln(String s) { String prefix = "MdeAny"; if (debug) { SchemEditUtils.prtln(s, prefix); } } } --- NEW FILE: MdeRepeatingDerivedContentModel.java --- /** * Copyright 2002, 2003 DLESE Program Center/University Corporation for Atmospheric Research (UCAR), P.O. Box * 3000, Boulder, CO 80307, su...@dl....<p> * * This file is part of the DLESE Tools Project.<p> * * The DLESE Tools Project is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version.<p> * * The DLESE Tools Project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details.<p> * * You should have received a copy of the GNU General Public License along with The DLESE System; if not, * write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.dlese.dpc.schemedit.autoform.mde; import org.dlese.dpc.schemedit.autoform.*; import org.dlese.dpc.schemedit.SchemEditUtils; import org.dlese.dpc.xml.*; import org.dlese.dpc.xml.schema.*; import org.dlese.dpc.xml.schema.compositor.InlineCompositor; import org.dlese.dpc.util.Files; import org.dlese.dpc.util.strings.FindAndReplace; import java.util.*; import org.dom4j.Node; import org.dom4j.Attribute; import org.dom4j.Element; /** * Render MetadataEditor inputs for all complexType elements at a given xpath, as well as a controller for adding a sibling. * * @author ostwald<p> * */ public class MdeRepeatingDerivedContentModel extends MdeRepeatingNode { /** Description of the Field */ private static boolean debug = false; String indexId; String siblingPath; String itemPath; ComplexType complexTypeDef; boolean indexRepeatingContentLabels = true; public MdeRepeatingDerivedContentModel (RendererImpl renderer) { super(renderer); // prtln ("initialized MdeRepeatingDerivedContentModel (" + xpath + ")"); siblingPath = XPathUtils.getSiblingXPath(xpath); indexId = RendererHelper.encodeIndexId(siblingPath); itemPath = siblingPath + "_${" + indexId + "+1}_"; complexTypeDef = (ComplexType) typeDef; } /** * Identical to SimpleJspRenderer.renderRepeatingElement, but adds a controller * for deleting items` */ public void render() { prtln("\nrender() with " + xpath); // prtln ("mode: " + getMode()); Element repeatingItemsBox = df.createElement("div"); this.embedDebugInfo (repeatingItemsBox, "MdeRepeatingDerivedContentModel - repeatingItemsBox"); Element iteration = null; // attachElementDebugInfo(repeatingItemsBox, "repeating Derived Model Box (" + xpath + ")", "blue"); if (isEditMode()) { // we don't want to show anything here if the parent doesn't exist! Element parentExists = rhelper.parentNodeExistsTest(xpath); parent.add (parentExists); parentExists.add (repeatingItemsBox); if (!sh.isRepeatingComplexSingleton(normalizedXPath)) { prtln ("\t calling emptyRepeatingElement()"); repeatingItemsBox.add (emptyRepeatingElement()); } Element hasMemberTest = rhelper.nodeHasMembersTest (xpath); repeatingItemsBox.add (hasMemberTest); iteration = getIteration(itemPath, siblingPath, indexId); insertRepeatingDisplaySetup(iteration); hasMemberTest.add (iteration); Element siblingController = newSiblingController(); repeatingItemsBox.add (siblingController); } else { parent.add (repeatingItemsBox); iteration = getIteration(itemPath, siblingPath, indexId); repeatingItemsBox.add (iteration); } // attach repeatingContent as child of the iteration, so each item is displayed Element repeatingContent = getRepeatingContent(); if (repeatingContent != null) iteration.add(repeatingContent); } protected Element getRepeatingContent() { // prtln ("getRepeatingContent() with itemPath: " + itemPath); Element repeatingContent = getRepeatingContentBox (itemPath); Label label; if (indexRepeatingContentLabels) { label = renderer.getComplexTypeLabel(xpath, itemPath, indexId); } else { label = renderer.getComplexTypeLabel(xpath); } String elementName = XPathUtils.getNodeName(this.siblingPath); Element controller = renderer.getDeleteController(itemPath, elementName); repeatingContent.add(getRenderedNoInputField(label, controller)); Element subElementsBox = repeatingContent.addElement("div"); subElementsBox.addAttribute("id", "${id}"); if (getLevel() > 0 && isEditMode()) { subElementsBox.addAttribute("style", "display:${"+formBeanName+".collapseBean.displayState};"); // this.attachElementDebugInfo(subElementsBox, "subElementsBox: id=${id}", "green"); } Element complexContent = complexTypeDef.getComplexContent(); Element extension = complexTypeDef.getExtensionElement(); Element restriction = complexTypeDef.getRestrictionElement(); Renderer modelRender = newRenderer (itemPath, subElementsBox); // this.renderer.parent = subElementsBox; // parent = subElementsBox; if (extension != null) { GlobalDef extnType = complexTypeDef.getExtensionType(); if (extnType == null) { prtln("ERROR: renderDerivedContentModel() could not find extension base type"); return null; } modelRender.renderSubElements(extnType); modelRender.renderSubElements(extension.elements()); } else if (restriction != null) { modelRender.renderSubElements(restriction.elements()); } return repeatingContent; } public static void setDebug(boolean bool) { debug = bool; } protected void prtln (String s) { String prefix = "MdeRepeatingDerivedContentModel"; if (debug) { SchemEditUtils.prtln (s, prefix); } } } --- NEW FILE: MdeRepeatingDerivedTextOnlyModel.java --- /** * Copyright 2002, 2003 DLESE Program Center/University Corporation for Atmospheric Research (UCAR), P.O. Box * 3000, Boulder, CO 80307, su...@dl....<p> * * This file is part of the DLESE Tools Project.<p> * * The DLESE Tools Project is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version.<p> * * The DLESE Tools Project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details.<p> * * You should have received a copy of the GNU General Public License along with The DLESE System; if not, * write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.dlese.dpc.schemedit.autoform.mde; import org.dlese.dpc.schemedit.autoform.*; import org.dlese.dpc.schemedit.SchemEditUtils; import org.dlese.dpc.xml.*; import org.dlese.dpc.xml.schema.*; import org.dlese.dpc.xml.schema.compositor.InlineCompositor; import org.dlese.dpc.util.Files; import org.dlese.dpc.util.strings.FindAndReplace; import java.util.*; import org.dom4j.Node; import org.dom4j.Attribute; import org.dom4j.Element; /** * Render MetadataEditor inputs for all complexType elements at a given xpath, as well as a controller for adding a sibling. * * @author ostwald<p> * */ public class MdeRepeatingDerivedTextOnlyModel extends MdeRepeatingNode { /** Description of the Field */ private static boolean debug = false; String indexId; String siblingPath; String itemPath; ComplexType complexTypeDef; boolean indexRepeatingContentLabels = true; public MdeRepeatingDerivedTextOnlyModel (RendererImpl renderer) { super(renderer); // prtln ("initialized MdeRepeatingDerivedTextOnlyModel (" + xpath + ")"); siblingPath = XPathUtils.getSiblingXPath(xpath); indexId = RendererHelper.encodeIndexId(siblingPath); itemPath = siblingPath + "_${" + indexId + "+1}_"; complexTypeDef = (ComplexType) typeDef; } /** * Identical to SimpleJspRenderer.renderRepeatingElement, but adds a controller * for deleting items` */ public void render() { prtln("\nrender() with " + xpath); // prtln ("mode: " + getMode()); Element repeatingItemsBox = df.createElement("div"); this.embedDebugInfo (repeatingItemsBox, "MdeRepeatingDerivedTextOnlyModel - repeatingItemsBox"); Element iteration = null; attachElementDebugInfo(repeatingItemsBox, "repeating Derived Text Only Box (" + xpath + ")", "blue"); if (isEditMode()) { // we don't want to show anything here if the parent doesn't exist! Element parentExists = rhelper.parentNodeExistsTest(xpath); parent.add (parentExists); parentExists.add (repeatingItemsBox); if (!sh.isRepeatingComplexSingleton(normalizedXPath)) { repeatingItemsBox.add (emptyRepeatingElement()); } Element hasMemberTest = rhelper.nodeHasMembersTest (itemPath); repeatingItemsBox.add (hasMemberTest); iteration = getIteration(itemPath, siblingPath, indexId); prtln (Dom4jUtils.prettyPrint(iteration)); insertRepeatingDisplaySetup(iteration); hasMemberTest.add (iteration); Element siblingController = newSiblingController(); repeatingItemsBox.add (siblingController); } else { parent.add (repeatingItemsBox); iteration = getIteration(itemPath, siblingPath, indexId); repeatingItemsBox.add (iteration); } // attach repeatingContent as child of the iteration, so each item is displayed Element repeatingContent = getRepeatingContent(); if (repeatingContent != null) iteration.add(repeatingContent); } protected Element getRepeatingContent() { // prtln ("getRepeatingContent() with itemPath: " + itemPath); Element repeatingContent = getRepeatingContentBox (itemPath); this.attachElementDebugInfo(repeatingContent, "getRepeatingContentBox", "pink"); Label label; if (indexRepeatingContentLabels) { label = renderer.getComplexTypeLabel(xpath, itemPath, indexId); } else { label = renderer.getComplexTypeLabel(xpath); } String elementName = XPathUtils.getNodeName(this.siblingPath); Element controller = renderer.getDeleteController(itemPath, elementName); repeatingContent.add(getRenderedNoInputField(label, controller)); // Element simpleContentBox = repeatingContent.addElement("div"); Element simpleContentBox = this.getDiv(); repeatingContent.add (simpleContentBox); simpleContentBox.addAttribute("id", "${id}"); if (getLevel() > 0 && isEditMode()) { simpleContentBox.addAttribute("style", "display:${"+formBeanName+".collapseBean.displayState};"); this.attachElementDebugInfo(simpleContentBox, "simpleContentBox: id=${id}", "green"); } parent = simpleContentBox; renderTextExtensionElement(); // render extensionElement children - all of which must be attributes Iterator extnIterator = complexTypeDef.getExtensionElement().elementIterator(); while (extnIterator.hasNext()) { Element attElement = (Element) extnIterator.next(); String attElementName = attElement.getName(); // make sure attElement defines an attribute! if (attElementName.equals ("attribute")) { String attName = attElement.attributeValue("name"); // if we don't have a attName, check to see if the element is a reference, and // treat a reference the same as we would a named element if (attName == null) { attName = attElement.attributeValue("ref"); } String attPath = itemPath + "/@" + getQualifiedAttributeName(attName, attElement, complexTypeDef); newRenderer(attPath, parent).renderAttribute(); } else if (attElementName.equals ("attributeGroup")) { prtln ("Attribute Group"); String attName = attElement.attributeValue("name"); // if we don't have a attName, check to see if the element is a reference, and // treat a reference the same as we would a named element if (attName == null) { attName = attElement.attributeValue("ref"); } GlobalDef globalDef = typeDef.getSchemaReader().getGlobalDef (attName); AttributeGroup attrGroup = (AttributeGroup) globalDef; for (Iterator a=attrGroup.getAttributes().iterator();a.hasNext();) { Element attrElement = (Element)a.next(); String attrType = attrElement.getName(); String attrName = attrElement.attributeValue("name"); // if we don't have a childName, check to see if the element is a reference, and // treat a reference the same as we would a named element if (attrName == null) { attrName = attrElement.attributeValue("ref"); } String attPath = itemPath + "/@" + getQualifiedAttributeName(attrName, attrElement, complexTypeDef); newRenderer(attPath, parent).renderAttribute(); } } else { prtln("WARNING: renderSimpleContent() expected attribute or attributeGroup but found: " + attElementName); continue; } } return repeatingContent; } public static void setDebug(boolean bool) { debug = bool; } protected void prtln (String s) { String prefix = "MdeRepeatingDerivedTextOnlyModel"; if (debug) { SchemEditUtils.prtln (s, prefix); } } protected void renderTextExtensionElement() { prtln ("renderTextExtensionElement \n\t (" + itemPath + ") \n\t level: " + getLevel()); String extensionTypeName = getQualifiedElementName(complexTypeDef.getExtensionBase(), complexTypeDef); // prtln(" ... extension Base Type: " + extensionTypeName); // special handling for xsd:string types (kludge to support dlese convention) if (extensionTypeName.equals("xsd:string") && getLevel() > 1 && !renderer.showXsdStringElement(itemPath)) { // prtln ("... skipping render for " + extensionTypeName); return; } else { String extnTypeName = getQualifiedElementName(complexTypeDef.getExtensionBase(), complexTypeDef); GlobalDef extnType = complexTypeDef.getSchemaReader().getGlobalDef(extnTypeName); newRenderer(itemPath, parent, extnType).renderNode(); } } } |