Author: ema
Date: Sun Dec 24 18:51:46 2006
New Revision: 490101

URL: http://svn.apache.org/viewvc?view=rev&rev=490101
Log:
[CXF-306] Added parser and test case for jaxb binding nested in jaxws binding.


Modified:
    
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customiztion/CustomizationParser.java
    
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilder.java
    
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilderTest.java
    
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/binding2.xml
    
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/hello_world.wsdl

Modified: 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customiztion/CustomizationParser.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customiztion/CustomizationParser.java?view=diff&rev=490101&r1=490100&r2=490101
==============================================================================
--- 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customiztion/CustomizationParser.java
 (original)
+++ 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customiztion/CustomizationParser.java
 Sun Dec 24 18:51:46 2006
@@ -35,6 +35,8 @@
 import javax.wsdl.Operation;
 import javax.wsdl.PortType;
 import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.schema.Schema;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
@@ -88,6 +90,8 @@
 
     private Element handlerChains;
     private Element wsdlNode;;
+    
+    private Element customizedWSDLNode;
 
     private CustomizationParser() {
 
@@ -136,7 +140,13 @@
         for (URI wsdlUri : jaxwsBindings.keySet()) {
             Element element = jaxwsBindings.get(wsdlUri);
             definition = getWSDlDefinition(wsdlUri.toString());
-            wsdlNode = getTargetNode(wsdlUri);
+            URI uri = null;
+            try {
+                uri = new URI(definition.getDocumentBaseURI());
+            } catch (URISyntaxException e1) {
+                //ignore
+            }
+            wsdlNode = getTargetNode(uri);
             buildTargetNodeMap(element, "");
         }
 
@@ -144,11 +154,13 @@
     }
 
     public Element getTargetNode(URI wsdlLoc) {
+
         Document doc = null;
         try {
             File file = new File(wsdlLoc);
             java.io.InputStream ins = new java.io.FileInputStream(file);
             doc = DOMUtils.readXml(ins);
+            
         } catch (SAXException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
@@ -205,7 +217,7 @@
         if (isJAXWSParameter(bindings) && bindings.getAttribute("part") != 
null) {
             String partExpression = "//" + bindings.getAttribute("part");
             try {
-                Node node = evaluateBindingsNode(partExpression);
+                Node node = evaluateBindingsNode(wsdlNode, partExpression);
 
                 if ("part".equals(node.getLocalName())) {
                     JAXWSBinding jaxwsBinding = 
bindingsParser.parse(PortType.class, bindings,
@@ -220,23 +232,64 @@
         }
 
         if (isJAXWSBindings(bindings) && bindings.getAttributeNode("node") != 
null) {
-
             expression = expression + "/" + bindings.getAttribute("node");
             try {
-                Node node = evaluateBindingsNode(expression);
-
-                if ("portType".equals(node.getLocalName())) {
+                Node node = null;
+                boolean nestedJaxb = nestedJaxbBinding(bindings);              
 
+                if (nestedJaxb) {
+                    customizedWSDLNode = 
+                        customizedWSDLNode == null ? 
getNodeInDefinition(definition) : customizedWSDLNode;
+                    node = evaluateBindingsNode(customizedWSDLNode, 
expression);
+                } else {
+                    node = evaluateBindingsNode(wsdlNode, expression);
+                }
+                if (node != null && "portType".equals(node.getLocalName()) && 
!nestedJaxb) {
                     JAXWSBinding jaxwsBinding = 
bindingsParser.parse(PortType.class, bindings,
                                                                      
getTargetNamspace(node));
                     addJAXWSBindingMap(portTypeBindingMap, node, jaxwsBinding);
                 }
 
-                if ("operation".equals(node.getLocalName())) {
+                if (node != null && "operation".equals(node.getLocalName()) && 
!nestedJaxb) {
                     JAXWSBinding jaxwsBinding = 
bindingsParser.parse(Operation.class, bindings,
                                                                      
getTargetNamspace(node));
                     addJAXWSBindingMap(opertaionBindingMap, node, 
jaxwsBinding);
                 }
 
+                if (node != null && nestedJaxb) {
+                    // append xmlns:jaxb and jaxb:version attribute for schema
+                    Node schemaNode = getSchemaNode(node);
+                    Element schemaElement = (Element)schemaNode;
+                    
+                    String jaxbPrefix = 
schemaElement.lookupPrefix(ToolConstants.NS_JAXB_BINDINGS);
+                    if (jaxbPrefix == null) {
+                        schemaElement.setAttribute("xmlns:jaxb", 
ToolConstants.NS_JAXB_BINDINGS);
+                        schemaElement.setAttribute("jaxb:version", "2.0");
+                    }
+
+                    // append jaxb appinfo for value node
+                    Element annoElement = 
node.getOwnerDocument().createElementNS(ToolConstants.SCHEMA_URI,
+                                                                               
   "annotation");
+                    Element appinfoEle = 
node.getOwnerDocument().createElementNS(ToolConstants.SCHEMA_URI,
+                                                                               
  "appinfo");
+
+                    annoElement.appendChild(appinfoEle);
+
+                    NodeList jxbBinds = getJaxbBindingNode((Element)bindings);
+
+                    for (int l = 0; l < jxbBinds.getLength(); l++) {
+                        Node jaxbBindingNode = jxbBinds.item(l);
+                        Node cloneNode = 
ProcessorUtil.cloneNode(node.getOwnerDocument(), jaxbBindingNode,
+                                                                 true);
+                        appinfoEle.appendChild(cloneNode);
+                    }
+
+                    if (node.getChildNodes().getLength() > 0) {
+                        node.insertBefore(annoElement, 
node.getChildNodes().item(0));
+                    } else {
+                        node.appendChild(annoElement);
+                    }
+                }
+
             } catch (WSDLException we) {
                 Message msg = new Message("PARSE_BINDINGFILE_EXCEPTION", LOG);
                 throw new ToolException(msg, we);
@@ -248,6 +301,33 @@
             buildTargetNodeMap(children[i], expression);
         }
     }
+    @SuppressWarnings("unchecked")
+    private Element getNodeInDefinition(Definition def) {
+        List<ExtensibilityElement> extList = 
def.getTypes().getExtensibilityElements();
+        for (ExtensibilityElement ele : extList) {
+            if (ele instanceof Schema) {
+                Schema schema = (Schema)ele;
+                Element element = schema.getElement();
+                Element target = 
element.getOwnerDocument().getDocumentElement();
+                return target;
+            }
+        }
+        return null;
+    }
+    
+    private Node getSchemaNode(Node node) {
+        if (!"schema".equals(node.getLocalName())) {
+            while (node.getParentNode() != null) {
+                node = node.getParentNode();
+
+                if ("schema".equals(node.getLocalName())) {
+                    return node;
+                }
+            }
+            return null;
+        }
+        return node;
+    }
 
     @SuppressWarnings("unchecked")
     public Definition getWSDlDefinition(String baseUrl) {
@@ -409,8 +489,8 @@
         }
     }
 
-    private Node evaluateBindingsNode(String expression) throws WSDLException {
-        Node node = evaluateXPathNode(wsdlNode, expression, new 
javax.xml.namespace.NamespaceContext() {
+    private Node evaluateBindingsNode(Node targetNode, String expression) 
throws WSDLException {
+        Node node = evaluateXPathNode(targetNode, expression, new 
javax.xml.namespace.NamespaceContext() {
             public String getNamespaceURI(String prefix) {
                 return definition.getNamespace(prefix);
             }
@@ -507,6 +587,20 @@
                && "bindings".equals(bindings.getLocalName());
     }
 
+    private boolean nestedJaxbBinding(Element bindings) {
+        NodeList nodeList = 
bindings.getElementsByTagNameNS(ToolConstants.NS_JAXB_BINDINGS, "bindings");
+        if (nodeList.getLength() == 1) {
+            return true;
+        }
+        return false;
+    }
+
+    private NodeList getJaxbBindingNode(Element bindings) {
+        NodeList nodeList = 
bindings.getElementsByTagNameNS(ToolConstants.NS_JAXB_BINDINGS, "bindings");
+        return nodeList.item(0).getChildNodes();       
+    }
+
+
     public Map<String, JAXWSBinding> getDefinitionBindingMap() {
         return this.definitionBindingMap;
     }
@@ -522,5 +616,13 @@
     public Map<QName, JAXWSBinding> getPartBindingMap() {
         return this.partBindingMap;
     }
-
+    
+    public Element getCustomizedWSDLElement() {
+        if (this.customizedWSDLNode == null) {
+            customizedWSDLNode = this.wsdlNode;
+        }
+        return customizedWSDLNode;
+        
+    }
+    
 }

Modified: 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilder.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilder.java?view=diff&rev=490101&r1=490100&r2=490101
==============================================================================
--- 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilder.java
 (original)
+++ 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilder.java
 Sun Dec 24 18:51:46 2006
@@ -33,7 +33,9 @@
 
 import javax.wsdl.PortType;
 import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.xml.WSDLReader;
 
+import org.apache.cxf.common.i18n.Message;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.tools.common.ToolConstants;
 import org.apache.cxf.tools.common.ToolException;
@@ -51,6 +53,8 @@
     protected static final Logger LOG = 
LogUtils.getL7dLogger(JAXWSDefinitionBuilder.class);
     protected CustomizationParser cusParser;
     
+    private WSDLReader reader;
+    
     public JAXWSDefinitionBuilder() {
     }
     
@@ -65,6 +69,8 @@
 
         registerJaxwsExtension(registry);
         Definition wsdlDefinition = builder.build(wsdlURL);
+        
+        reader = builder.getWSDLReader();
 
         context.put(ToolConstants.WSDL_DEFINITION, wsdlDefinition);
         context.put(ToolConstants.IMPORTED_DEFINITION, 
builder.getImportedDefinitions());
@@ -137,6 +143,20 @@
     public CustomizationParser getCustomizationParer() {
         return cusParser;
     }
+    
+    public Definition getCustomizedDefinition() {
+        try {
+
+            Definition def = 
reader.readWSDL(cusParser.getCustomizedWSDLElement().getBaseURI(), cusParser
+                .getCustomizedWSDLElement());
+            return def;
+        } catch (Exception we) {
+            Message msg = new Message("FAIL_TO_CREATE_WSDL_DEFINITION", LOG, 
cusParser
+                .getCustomizedWSDLElement().getBaseURI());
+            throw new RuntimeException(msg.toString(), we);
+        }
+    }
+    
 
     public boolean validate(Definition def) throws ToolException {
         if (context.optionSet(ToolConstants.CFG_VALIDATE_WSDL)) {

Modified: 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilderTest.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilderTest.java?view=diff&rev=490101&r1=490100&r2=490101
==============================================================================
--- 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilderTest.java
 (original)
+++ 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/JAXWSDefinitionBuilderTest.java
 Sun Dec 24 18:51:46 2006
@@ -30,8 +30,11 @@
 import javax.wsdl.Port;
 import javax.wsdl.Service;
 import javax.wsdl.extensions.http.HTTPAddress;
+import javax.wsdl.extensions.schema.Schema;
 import javax.xml.namespace.QName;
 
+import org.w3c.dom.Element;
+
 import junit.framework.TestCase;
 
 import org.apache.cxf.bindings.xformat.XMLBindingMessageFormat;
@@ -127,31 +130,35 @@
         assertEquals("Package customiztion for definition is not correct", 
"com.foo", jaxwsBinding
             .getPackage());
 
-        
         QName qn = new QName(def.getTargetNamespace(), "Greeter");
         jaxwsBinding = parser.getPortTypeBindingMap().get(qn);
         assertNotNull("JAXWSBinding for PortType is null", jaxwsBinding);
-        assertTrue("AsynMapping customiztion for PortType is not true", 
-                   jaxwsBinding.isEnableAsyncMapping());
+        assertTrue("AsynMapping customiztion for PortType is not true", 
jaxwsBinding.isEnableAsyncMapping());
 
         qn = new QName(def.getTargetNamespace(), "greetMeOneWay");
         jaxwsBinding = parser.getOperationBindingMap().get(qn);
-        
+
         assertNotNull("JAXWSBinding for Operation is null", jaxwsBinding);
-        assertEquals("Method name customiztion for operation is not correct", 
-                     "echoMeOneWay", jaxwsBinding.getMethodName());
+        assertEquals("Method name customiztion for operation is not correct", 
"echoMeOneWay", jaxwsBinding
+            .getMethodName());
 
         qn = new QName(def.getTargetNamespace(), "in");
         jaxwsBinding = parser.getPartBindingMap().get(qn);
-       
-        assertEquals("Parameter name customiztion for part is not correct", 
-                     "num1", jaxwsBinding.getJaxwsPara().getName());
 
-        // System.out.println("----size ---- " +
-        // parser.getDefinitionBindingMap().size());
+        assertEquals("Parameter name customiztion for part is not correct", 
"num1", jaxwsBinding
+            .getJaxwsPara().getName());
+
+        Definition cusDef = builder.getCustomizedDefinition();
+
+        Schema schema = 
(Schema)cusDef.getTypes().getExtensibilityElements().iterator().next();
+
+        Element appinfoElement = (Element)schema.getElement()
+            .getElementsByTagNameNS(ToolConstants.SCHEMA_URI, 
"appinfo").item(0);
+
+        assertNotNull("Appinfo element does not  be append to schema element", 
appinfoElement);
 
-        // CustomizationParser cusParser = CustomizationParser.getInstance();
-        // cusParser.parse(env);
+        assertNotNull("typesafeEnum element does not  be append to schema 
element", appinfoElement
+            .getElementsByTagName("jaxb:typesafeEnumClass").item(0));
 
     }
 }

Modified: 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/binding2.xml
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/binding2.xml?view=diff&rev=490101&r1=490100&r2=490101
==============================================================================
--- 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/binding2.xml
 (original)
+++ 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/binding2.xml
 Sun Dec 24 18:51:46 2006
@@ -33,10 +33,9 @@
                </jaxws:bindings>
        </jaxws:bindings>
 
-       <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema">
-               <jaxb:bindings version="2.0"
-                       node="xsd:[EMAIL 
PROTECTED]'CreateProcess']/xsd:complexType/xsd:sequence/xsd:[EMAIL 
PROTECTED]'MyProcess']/xsd:simpleType">
-                       <jaxb:typesafeEnumClass name="MyProcess">
+       <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema/xsd:[EMAIL 
PROTECTED]'CreateProcess']/xsd:complexType/xsd:sequence/xsd:[EMAIL 
PROTECTED]'MyProcess']/xsd:simpleType">
+               <jaxb:bindings>
+                  <jaxb:typesafeEnumClass name="MyProcess">
                                <jaxb:typesafeEnumMember name="BLUE" 
value="BLUE" />
                                <jaxb:typesafeEnumMember name="RED" value="RED" 
/>
                                <jaxb:typesafeEnumMember name="GREEN" 
value="GREEN" />

Modified: 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/hello_world.wsdl
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/hello_world.wsdl?view=diff&rev=490101&r1=490100&r2=490101
==============================================================================
--- 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/hello_world.wsdl
 (original)
+++ 
incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/test/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/wsdl11/hello_world.wsdl
 Sun Dec 24 18:51:46 2006
@@ -26,7 +26,7 @@
        targetNamespace="http://apache.org/hello_world_soap_http";
        name="HelloWorld">
        <wsdl:types>
-               <schema elementFormDefault="qualified"
+               <xsd:schema elementFormDefault="qualified"
                        
targetNamespace="http://apache.org/hello_world_soap_http/types";
                        xmlns="http://www.w3.org/2001/XMLSchema";>
                        <element name="CreateProcess">
@@ -45,7 +45,7 @@
                                </complexType>
                        </element>
                        
-               </schema>
+               </xsd:schema>
        </wsdl:types>
 
        <wsdl:message name="greetMeOneWayRequest">


Reply via email to