Author: jleroux
Date: Tue May 31 16:48:09 2016
New Revision: 1746302

URL: http://svn.apache.org/viewvc?rev=1746302&view=rev
Log:
A slightly modified patch from James Yong for "Autocompletion for Compound 
Widget" https://issues.apache.org/jira/browse/OFBIZ-7061

1. The following xsd are duplicated to use namespaces
  site-conf.xsd     ->  site-conf-ns.xsd
  widget-form.xsd   ->  widget-form-ns.xsd
  widget-screen.xsd ->  widget-screen-ns.xsd
  widget-menu.xsd   ->  widget-menu-ns.xsd
  simple-methods.xsd->  simple-methods-ns.xsd
For example, in site-conf-ns.xsd, we have the following document level attribute
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
elementFormDefault="qualified" xmlns="http://ofbiz.apache.org/Site-Conf"; 
targetNamespace="http://ofbiz.apache.org/Site-Conf";>
instead of 
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
elementFormDefault="qualified">

2. The above schema are used into compound-widgets.xsd so that compound widgets 
use only one consolidated schema. 

3. Update ExampleCompoundWidgets.xml to use the new compound-widgets.xsd. For 
example
<compound-widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xmlns:sc="http://ofbiz.apache.org/Site-Conf";
        xmlns:sm="http://ofbiz.apache.org/Simple-Method";
        xmlns:wf="http://ofbiz.apache.org/Widget-Form";
        xmlns:wt="http://ofbiz.apache.org/Widget-Tree";
        xmlns:wm="http://ofbiz.apache.org/Widget-Menu";
        xmlns:ws="http://ofbiz.apache.org/Widget-Screen";
        
xsi:noNamespaceSchemaLocation="../../../../framework/widget/dtd/compound-widgets.xsd">
    
    <sc:site-conf>
        <sc:request-map uri="CompoundWidgets1">
            <sc:security https="true" auth="true"/>
            <sc:event type="simple" invoke="CompoundWidgetsFunc" 
path="component://example/widget/example/ExampleCompoundWidgets.xml"/>
            <sc:response name="success" type="view" value="CompoundWidgets1"/>
        </sc:request-map>
        <sc:request-map uri="CompoundWidgets2"><sc:security https="true" 
auth="true"/><sc:response name="success" type="view" 
value="CompoundWidgets2"/></sc:request-map>

        <sc:view-map name="CompoundWidgets1" type="screen" 
page="component://example/widget/example/ExampleCompoundWidgets.xml#CompoundWidgets1"/>
        <sc:view-map name="CompoundWidgets2" type="screen" 
page="component://example/widget/example/ExampleCompoundWidgets.xml#CompoundWidgets2"/>
    </sc:site-conf>
...... the rest

4. Change java code to support reading xml with namespace (i.e. xml for 
compound widgets)

jleroux: I simply replaced tabs by spaces in Java files and removed this 
commented out line 
  <compound-widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/compound-widgets.xsd";>
in ExampleCompoundWidgets.xml

We decided to duplicate the simple-methods.xsd rather than updating all 
concerned files. Else we would have to update the attributes at document level 
for rest of the controllers, menus, forms, simple methods and screens. For 
example, in controller.xml, we would have to change 
  xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/site-conf.xsd”
to 
  xmlns="http://ofbiz.apache.org/sc” 
xsi:schemaLocation="http://ofbiz.apache.org/dtds/site-conf-ns.xsd”>
But especially we would have to use the same syntax with namespaces prefixes 
than in ExampleCompoundWidgets.xml (see example above). This can be discussed 
because with auto-completion it's not a big deal, but could be overwhelming for 
existing custom projects...

James mentionned that "the schema location at compound-widgets.xsd is relative 
to the project...". I don't see any problems with that. We can keep as is as 
long as we maintain the relation (ie if the main XSDs are moved). Moreover with 
the previous addition of compound-widgets.xsd in widget-catalog.xml it seems 
all things work correctly (eg w/o the new *-ns.xsd yet committed, the 
auto-completion works well in ExampleCompoundWidgets.xml



Added:
    ofbiz/trunk/framework/minilang/dtd/simple-methods-ns.xsd   (with props)
    ofbiz/trunk/framework/webapp/dtd/site-conf-ns.xsd   (with props)
    ofbiz/trunk/framework/widget/dtd/widget-form-ns.xsd   (with props)
    ofbiz/trunk/framework/widget/dtd/widget-menu-ns.xsd   (with props)
    ofbiz/trunk/framework/widget/dtd/widget-screen-ns.xsd   (with props)
    ofbiz/trunk/framework/widget/dtd/widget-tree-ns.xsd   (with props)
Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/SimpleMethod.java
    
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Log.java
    ofbiz/trunk/framework/widget/dtd/compound-widgets.xsd
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetFactory.java
    
ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/AbstractModelAction.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FieldInfo.java
    
ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormFieldBuilder.java
    ofbiz/trunk/specialpurpose/example/widget/example/ExampleCompoundWidgets.xml

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java?rev=1746302&r1=1746301&r2=1746302&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java Tue May 31 
16:48:09 2016
@@ -59,6 +59,7 @@ import org.w3c.dom.DOMConfiguration;
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.bootstrap.DOMImplementationRegistry;
 import org.w3c.dom.ls.DOMImplementationLS;
@@ -690,10 +691,10 @@ public class UtilXml {
 
         if (node != null) {
             do {
+                String nodeName = UtilXml.getNodeNameIgnorePrefix(node);
                 if (node.getNodeType() == Node.ELEMENT_NODE && 
(childElementName == null ||
-                        childElementName.equals(node.getNodeName()))) {
+                    childElementName.equals(nodeName))) {
                     Element childElement = (Element) node;
-
                     elements.add(childElement);
                 }
             } while ((node = node.getNextSibling()) != null);
@@ -814,8 +815,12 @@ public class UtilXml {
 
         if (node != null) {
             do {
+                String nodeName = node.getLocalName();
+                if (nodeName == null){
+                    nodeName = UtilXml.getNodeNameIgnorePrefix(node);
+                }
                 if (node.getNodeType() == Node.ELEMENT_NODE && 
(childElementName == null ||
-                        childElementName.equals(node.getLocalName() != null ? 
node.getLocalName() : node.getNodeName()))) {
+                    childElementName.equals(nodeName))) {
                     Element childElement = (Element) node;
                     return childElement;
                 }
@@ -1147,5 +1152,59 @@ public class UtilXml {
             throw new UnsupportedOperationException();
         }
     }
+    
+    /**
+     * get node name without any prefix
+     * @param node
+     * @return
+     */
+    public static String getNodeNameIgnorePrefix(Node node){
+        if (node==null) return null;
+        String nodeName = node.getNodeName();
+        if (nodeName.contains(":")){
+            // remove any possible prefix
+            nodeName = nodeName.split(":")[1];
+        }
+        return nodeName;
+    }
+    
+    /**
+     * get tag name without any prefix
+     * @param node
+     * @return
+     */
+    public static String getTagNameIgnorePrefix(Element element){
+        if (element==null) return null;
+        String tagName = element.getTagName();
+        if (tagName.contains(":")){
+            // remove any possible prefix
+            tagName = tagName.split(":")[1];
+        }
+        return tagName;
+    }
+    
+    /**
+     * get attribute value ignoring prefix in attribute name
+     * @param node
+     * @return
+     */
+    public static String getAttributeValueIgnorePrefix(Element element, String 
attributeName){
+        if (element==null) return "";
+        
+        NamedNodeMap attributes = element.getAttributes();
+        if (attributes != null){
+            for (int i = 0, size = attributes.getLength(); i < size; i++)
+            {
+                Node node = attributes.item(i);
+                if (node.getNodeType() == Node.ATTRIBUTE_NODE){
+                    String nodeName = UtilXml.getNodeNameIgnorePrefix(node);
+                    if (nodeName.equals(attributeName)){
+                        return node.getNodeValue();
+                    }
+                }
+            }
+        }
+        return "";
+    }
 
 }


Reply via email to