Author: jleroux Date: Wed Apr 13 15:38:16 2016 New Revision: 1738958 URL: http://svn.apache.org/viewvc?rev=1738958&view=rev Log: A combined patch from Adrian's, James Yong's and my work for "Add Support For Compound Screen Widget XML Files" - https://issues.apache.org/jira/browse/OFBIZ-4090 and "Add Example for Compound Screen Widget" - https://issues.apache.org/jira/browse/OFBIZ-6990
Adrian: This adds the ability to include screen widgets, form widgets, menu widgets, and simple methods in a single XML file. This approach could be used in situations where the widgets share a logical grouping - so they can be kept in one place. James: An example to test out Compound Screen Widget jlerouxc: here are the changes and tests globally # As James mentionned we no longer need *-v2.xsd files, I removed them from Adrian's patch # I created a compound-widgets.xsd based on Adrian's and James Yong's previous work. From Paul Foxworthy's comment in OFBIZ-4090, I decided to name the root compound-widgets (hence the file name). I arranged its elements in another way, see below with ExampleCompoundWidgets.xml # I slightly modified James Yong's ExampleCompoundScreenWidget.xml file and renamed it ExampleCompoundWidgets.xml. I added an "s" because there are several OFBiz widgets gathered in one place. For the modifications: I simply changed the names and arranged the elements in another way which I find better suited. I'm used to 1st create the query, then the menus, the screens and their forms. We rarely use widget-trees but it's there also. Finally the simple-method at end if any. The order is not enforced though, so everybody can use her/his own :) # I added a French label # I completed the widget-catalog.xml with this new entry and tested locally in Eclipse by reloading the XML catalog entries. I hope I did not miss nor mixed things, the local instance I used is a bit overcrowded with pending changes... Added: ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd (with props) ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml (with props) Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/SimpleMethod.java ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java ofbiz/trunk/framework/widget/dtd/widget-catalog.xml ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FormFactory.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/MenuFactory.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ScreenFactory.java ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml ofbiz/trunk/specialpurpose/example/widget/example/ExampleMenus.xml Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/SimpleMethod.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/SimpleMethod.java?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/SimpleMethod.java (original) +++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/SimpleMethod.java Wed Apr 13 15:38:16 2016 @@ -142,7 +142,12 @@ public final class SimpleMethod extends } catch (Exception e) { throw new MiniLangException("Could not read SimpleMethod XML document [" + xmlURL + "]: ", e); } - compileAllSimpleMethods(document.getDocumentElement(), simpleMethods, xmlURL.toString()); + Element rootElement = document.getDocumentElement(); + if (!"simple-methods".equalsIgnoreCase(rootElement.getTagName())) { + rootElement = UtilXml.firstChildElement(rootElement, "simple-methods"); + } + + compileAllSimpleMethods(rootElement, simpleMethods, xmlURL.toString()); if (MiniLangUtil.isDocumentAutoCorrected(document)) { MiniLangUtil.writeMiniLangDocument(xmlURL, document); } Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java (original) +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java Wed Apr 13 15:38:16 2016 @@ -159,6 +159,9 @@ public class ConfigXMLReader { try { Document document = UtilXml.readXmlDocument(location, true); Element rootElement = document.getDocumentElement(); + if (!"site-conf".equalsIgnoreCase(rootElement.getTagName())) { + rootElement = UtilXml.firstChildElement(rootElement, "site-conf"); + } if (Debug.verboseOn()) Debug.logVerbose("Loaded XML Config - " + location, module); return rootElement; Added: ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd?rev=1738958&view=auto ============================================================================== --- ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd (added) +++ ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd Wed Apr 13 15:38:16 2016 @@ -0,0 +1,15 @@ +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified"> + <xs:element name="compound-widgets"> + <xs:complexType> + <xs:all minOccurs="0" maxOccurs="1"> + <xs:element name="site-conf"/> + <xs:element name="menus"/> + <xs:element name="screens"/> + <xs:element name="trees"/> + <xs:element name="forms"/> + <xs:element name="simple-methods"/> + </xs:all> + </xs:complexType> + </xs:element> +</xs:schema> \ No newline at end of file Propchange: ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd ------------------------------------------------------------------------------ svn:mime-type = text/xsd Modified: ofbiz/trunk/framework/widget/dtd/widget-catalog.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-catalog.xml?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/dtd/widget-catalog.xml (original) +++ ofbiz/trunk/framework/widget/dtd/widget-catalog.xml Wed Apr 13 15:38:16 2016 @@ -31,4 +31,5 @@ under the License. <system systemId="http://ofbiz.apache.org/dtds/widget-menu.xsd" uri="widget-menu.xsd"/> <system systemId="http://ofbiz.apache.org/dtds/widget-screen.xsd" uri="widget-screen.xsd"/> <system systemId="http://ofbiz.apache.org/dtds/widget-tree.xsd" uri="widget-tree.xsd"/> + <system systemId="http://ofbiz.apache.org/dtds/compound-widgets.xsd" uri="compound-widgets.xsd"/> </catalog> Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FormFactory.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FormFactory.java?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FormFactory.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FormFactory.java Wed Apr 13 15:38:16 2016 @@ -103,6 +103,9 @@ public class FormFactory { if (formFileDoc != null) { // read document and construct ModelForm for each form element Element rootElement = formFileDoc.getDocumentElement(); + if (!"forms".equalsIgnoreCase(rootElement.getTagName())) { + rootElement = UtilXml.firstChildElement(rootElement, "forms"); + } List<? extends Element> formElements = UtilXml.childElementList(rootElement, "form"); for (Element formElement : formElements) { String formName = formElement.getAttribute("name"); @@ -119,7 +122,11 @@ public class FormFactory { } public static ModelForm createModelForm(Document formFileDoc, ModelReader entityModelReader, DispatchContext dispatchContext, String formLocation, String formName) { - Element formElement = UtilXml.firstChildElement(formFileDoc.getDocumentElement(), "form", "name", formName); + Element rootElement = formFileDoc.getDocumentElement(); + if (!"forms".equalsIgnoreCase(rootElement.getTagName())) { + rootElement = UtilXml.firstChildElement(rootElement, "forms"); + } + Element formElement = UtilXml.firstChildElement(rootElement, "form", "name", formName); return createModelForm(formElement, entityModelReader, dispatchContext, formLocation, formName); } Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/MenuFactory.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/MenuFactory.java?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/MenuFactory.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/MenuFactory.java Wed Apr 13 15:38:16 2016 @@ -79,6 +79,9 @@ public class MenuFactory { if (menuFileDoc != null) { // read document and construct ModelMenu for each menu element Element rootElement = menuFileDoc.getDocumentElement(); + if (!"menus".equalsIgnoreCase(rootElement.getTagName())) { + rootElement = UtilXml.firstChildElement(rootElement, "menus"); + } for (Element menuElement: UtilXml.childElementList(rootElement, "menu")){ ModelMenu modelMenu = new ModelMenu(menuElement, menuLocation); modelMenuMap.put(modelMenu.getName(), modelMenu); Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ScreenFactory.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ScreenFactory.java?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ScreenFactory.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ScreenFactory.java Wed Apr 13 15:38:16 2016 @@ -166,6 +166,9 @@ public class ScreenFactory { if (screenFileDoc != null) { // read document and construct ModelScreen for each screen element Element rootElement = screenFileDoc.getDocumentElement(); + if (!"screens".equalsIgnoreCase(rootElement.getTagName())) { + rootElement = UtilXml.firstChildElement(rootElement, "screens"); + } List<? extends Element> screenElements = UtilXml.childElementList(rootElement, "screen"); for (Element screenElement: screenElements) { ModelScreen modelScreen = new ModelScreen(screenElement, modelScreenMap, sourceLocation); Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml (original) +++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Wed Apr 13 15:38:16 2016 @@ -137,6 +137,10 @@ <value xml:lang="fr">Graphes</value> <value xml:lang="zh">ç»å¾æ ·ä¾</value> </property> + <property key="ExampleCompoundWidgets"> + <value xml:lang="en">Compound Screen Widget</value> + <value xml:lang="fr">Screen Widget composé</value> + </property> <property key="ExampleDashboard"> <value xml:lang="en">Dashboard</value> <value xml:lang="fr">Personnalisation des pages</value> Modified: ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml (original) +++ ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml Wed Apr 13 15:38:16 2016 @@ -25,6 +25,7 @@ under the License. elements found in the common-controller.xml file. --> <include location="component://common/webcommon/WEB-INF/common-controller.xml"/> <include location="component://common/webcommon/WEB-INF/portal-controller.xml"/> + <include location="component://example/widget/example/ExampleCompoundWidgets.xml"/> <description>Example Component Site Configuration File</description> Added: ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml?rev=1738958&view=auto ============================================================================== --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml (added) +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml Wed Apr 13 15:38:16 2016 @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +<!-- This document serves as an example for Compound Screen Widget feature --> +<compound-widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/compound-widgets.xsd"> + + <site-conf xmlns="http://ofbiz.apache.org/Site-Conf" xsi:schemaLocation="http://ofbiz.apache.org/Site-Conf http://ofbiz.apache.org/dtds/site-conf.xsd"> + <request-map uri="CompoundWidgets1"> + <security https="true" auth="true"/> + <event type="simple" invoke="CompoundWidgetsFunc" path="component://example/widget/example/ExampleCompoundWidgets.xml"/> + <response name="success" type="view" value="CompoundWidgets1"/> + </request-map> + <request-map uri="CompoundWidgets2"><security https="true" auth="true"/><response name="success" type="view" value="CompoundWidgets2"/></request-map> + + <view-map name="CompoundWidgets1" type="screen" page="component://example/widget/example/ExampleCompoundWidgets.xml#CompoundWidgets1"/> + <view-map name="CompoundWidgets2" type="screen" page="component://example/widget/example/ExampleCompoundWidgets.xml#CompoundWidgets2"/> + </site-conf> + + <menus xmlns="http://ofbiz.apache.org/Widget-Menu" xsi:schemaLocation="http://ofbiz.apache.org/Widget-Menu http://ofbiz.apache.org/dtds/widget-menu.xsd"> + <menu name="CompoundWidgetsMenu" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml"> + <menu-item name="Example1" title="${uiLabelMap.ExampleExample} 1"> + <link target="CompoundWidgets1"/> + </menu-item> + <menu-item name="Example2" title="${uiLabelMap.ExampleExample} 2"> + <link target="CompoundWidgets2"/> + </menu-item> + </menu> + </menus> + + <screens xmlns="http://ofbiz.apache.org/Widget-Screen" xsi:schemaLocation="http://ofbiz.apache.org/Widget-Screen http://ofbiz.apache.org/dtds/widget-screen.xsd"> + <screen name="CompoundWidgets1"> + <section> + <actions> + <set field="headerItem" value="ExampleCompoundWidgets" /> + <set field="tabButtonItem" value="Example1"/> + </actions> + <widgets> + <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}"> + <decorator-section name="pre-body"> + <include-menu name="CompoundWidgetsMenu" location="component://example/widget/example/ExampleCompoundWidgets.xml" /> + </decorator-section> + <decorator-section name="body"> + <section> + <widgets> + <container style="clear" /> + <label>Demo For Compound Screen Widget</label> + <include-form location="component://example/widget/example/ExampleCompoundWidgets.xml" name="CompoundWidgetsForm1"/> + </widgets> + </section> + </decorator-section> + </decorator-screen> + </widgets> + </section> + </screen> + + <screen name="CompoundWidgets2"> + <section> + <actions> + <set field="headerItem" value="ExampleCompoundWidgets" /> + <set field="tabButtonItem" value="Example2"/> + </actions> + <widgets> + <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}"> + <decorator-section name="pre-body"> + <include-menu name="CompoundWidgetsMenu" location="component://example/widget/example/ExampleCompoundWidgets.xml" /> + </decorator-section> + <decorator-section name="body"> + <section> + <widgets> + <container style="clear" /> + <label>Demo For Compound Screen Widget</label> + <include-form location="component://example/widget/example/ExampleCompoundWidgets.xml" name="CompoundWidgetsForm2"/> + </widgets> + </section> + </decorator-section> + </decorator-screen> + </widgets> + </section> + </screen> + </screens> + + <forms xmlns="http://ofbiz.apache.org/Widget-Form" xsi:schemaLocation="http://ofbiz.apache.org/Widget-Form http://ofbiz.apache.org/dtds/widget-form.xsd"> + <form name="CompoundWidgetsForm1"> + <field name="exampleName" title="${uiLabelMap.FormFieldTitle_exampleName} 1" required-field="true"><text /></field> + </form> + + <form name="CompoundWidgetsForm2"> + <field name="exampleName" title="${uiLabelMap.FormFieldTitle_exampleName} 2" required-field="true"><text /></field> + </form> + </forms> + + <simple-methods xmlns="http://ofbiz.apache.org/Simple-Method" xsi:schemaLocation="http://ofbiz.apache.org/Simple-Method http://ofbiz.apache.org/dtds/simple-methods.xsd"> + <simple-method method-name="CompoundWidgetsFunc"> + <log message="CompoundWidgetsFunc runs" level="info"/> + </simple-method> + </simple-methods> + +</compound-widgets> Propchange: ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Modified: ofbiz/trunk/specialpurpose/example/widget/example/ExampleMenus.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleMenus.xml?rev=1738958&r1=1738957&r2=1738958&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleMenus.xml (original) +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleMenus.xml Wed Apr 13 15:38:16 2016 @@ -48,6 +48,9 @@ under the License. <menu-item name="ExampleCompleteFop" title="${uiLabelMap.ContentFopFonts}"> <link target="fonts.pdf"/> </menu-item> + <menu-item name="ExampleCompoundWidgets" title="${uiLabelMap.ExampleCompoundWidgets}"> + <link target="CompoundWidgets1"/> + </menu-item> </menu> <menu name="EditExample" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">