[jboss-svn-commits] JBL Code SVN: r25726 - in labs/jbossesb/trunk/product: rosetta/src/org/jboss/internal/soa/esb/webservice and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 19 04:43:10 EDT 2009


Author: beve
Date: 2009-03-19 04:43:09 -0400 (Thu, 19 Mar 2009)
New Revision: 25726

Modified:
   labs/jbossesb/trunk/product/build-distr.xml
   labs/jbossesb/trunk/product/ivy.xml
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java
   labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java
Log:
Work for https://jira.jboss.org/jira/browse/JBESB-2470 "Duplicate schema types in wsdl generated by EBWS"


Modified: labs/jbossesb/trunk/product/build-distr.xml
===================================================================
--- labs/jbossesb/trunk/product/build-distr.xml	2009-03-19 08:43:07 UTC (rev 25725)
+++ labs/jbossesb/trunk/product/build-distr.xml	2009-03-19 08:43:09 UTC (rev 25726)
@@ -138,6 +138,7 @@
 			<!-- Mina -->
             <fileset dir="${lib.dir}" includes="mina-*.jar"/>
             <fileset dir="${lib.dir}" includes="slf4j-*.jar"/>
+            <fileset dir="${lib.dir}" includes="xmlunit-*.jar"/>
         </copy>
     	<copy todir="${build.dir}/jbossesb.sar">
     		<fileset dir="${installation.files.dir}/jUDDI-registry" includes="juddi.war"/>

Modified: labs/jbossesb/trunk/product/ivy.xml
===================================================================
--- labs/jbossesb/trunk/product/ivy.xml	2009-03-19 08:43:07 UTC (rev 25725)
+++ labs/jbossesb/trunk/product/ivy.xml	2009-03-19 08:43:09 UTC (rev 25726)
@@ -78,5 +78,8 @@
         <dependency org="sun-jaxws" name="jaxws-tools" rev="2.1.1"/>
         <dependency org="sun-jaxws" name="jaxws-rt" rev="2.1.1"/>
         <dependency org="sun-jaxb" name="jaxb-xjc" rev="2.1.4"/>
+
+		<!-- xmlunit -->	
+        <dependency org="xmlunit" name="xmlunit" rev="1.2"/>
     </dependencies>
 </ivy-module>

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java	2009-03-19 08:43:07 UTC (rev 25725)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java	2009-03-19 08:43:09 UTC (rev 25726)
@@ -19,6 +19,7 @@
  */
 package org.jboss.internal.soa.esb.webservice;
 
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.security.AccessController;
@@ -52,7 +53,14 @@
 import javax.wsdl.extensions.soap.SOAPOperation;
 import javax.wsdl.factory.WSDLFactory;
 import javax.xml.namespace.QName;
+import javax.xml.transform.Result;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
 
+import org.custommonkey.xmlunit.XMLUnit;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.Service;
 import org.jboss.soa.esb.dom.YADOMUtil;
@@ -62,6 +70,7 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
 
 import com.ibm.wsdl.extensions.schema.SchemaImpl;
 import com.ibm.wsdl.extensions.soap.SOAPAddressImpl;
@@ -79,7 +88,7 @@
 	private static final QName WSAW_ACTION_QN = new QName(WSAW_NAMESPACE, "Action", WSAW_PREFIX) ;
 	private static final QName WSAW_USING_ADDRESSING_QN = new QName(WSAW_NAMESPACE, "UsingAddressing", WSAW_PREFIX) ;
 	private static WSDLFactory wsdlFactory ;
- 
+	
 	public static String generateWSDL(final WebserviceInfo serviceConfig, final ESBServiceEndpointInfo serviceInfo)
 			throws ConfigurationException {
 		final Definition def = getWSDLFactory().newDefinition() ;
@@ -95,6 +104,8 @@
 		// add types
 		Types types = def.createTypes();
 		def.setTypes(types);
+		
+		// Keeps track of schema types added to avoid duplicates.
 		Set<String> schemasAdded = new HashSet<String>(); 
 
 		Message reqMessage = null;
@@ -112,15 +123,8 @@
 						.getResourceAsStream(inXsd, ESBContractGenerator.class),
 						false, false);
 				if (doc != null) {
-				    /*
-            		String schemaNs = getSchemaNs(doc);
-            		if (schemaNs != null) {
-                		schemasAdded.add(schemaNs);
-            		}
-            		*/
-            		
 					reqMessage = addMessage(def, doc.getDocumentElement(),
-							serviceInfo.getRequestName(), "in", ++nsSuffixCounter);
+							serviceInfo.getRequestName(), "in", ++nsSuffixCounter, schemasAdded);
 				}
 			} catch (Exception e) {
 				throw new ConfigurationException("File defined in inXsd attribute '" + inXsd + "' not found in classpath.", e);
@@ -133,10 +137,8 @@
 						.getResourceAsStream(outXsd, ESBContractGenerator.class),
 						false, false);
 				if (doc != null) {
-            		//if (!schemasAdded.contains(getSchemaNs(doc))) {
-    					resMessage = addMessage(def, doc.getDocumentElement(),
-							serviceInfo.getResponseName(), "out", ++nsSuffixCounter);
-            		//}
+					resMessage = addMessage(def, doc.getDocumentElement(),
+						serviceInfo.getResponseName(), "out", ++nsSuffixCounter, schemasAdded);
 				}
 			} catch (Exception e) {
 				throw new ConfigurationException("File defined in outXsd attribute '" + outXsd + "' not found in classpath.", e);
@@ -153,10 +155,8 @@
 						.getResourceAsStream(xsd, ESBContractGenerator.class),
 						false, false);
 					if (doc != null) {
-                		//if (!schemasAdded.contains(getSchemaNs(doc))) {
-    						addFaultMessage(faultMessages, def, doc.getDocumentElement(),
-							serviceInfo.getFaultName(), "fault", ++nsSuffixCounter);
-                		//}
+						addFaultMessage(faultMessages, def, doc.getDocumentElement(),
+							serviceInfo.getFaultName(), "fault", ++nsSuffixCounter, schemasAdded);
 					}
 				}
 			} catch (Exception e) {
@@ -179,29 +179,47 @@
 		return sw.toString();
 	}
 	
-	/**
-	 * Extracts the 'targetNamespace' from the document element.
-	 * 
-	 * @param doc The document.
-	 * @return String The value of the 'targetNamespace' attribute or null if one does not exist.
-	 */
-	private static String getSchemaNs(final Document doc)
-	{
-	    final Element docElement = doc.getDocumentElement();
-		return YADOMUtil.getAttribute(docElement, "targetNamespace", null);
+	private static void addSchema(Types types, Element xsdElement, Set<String> schemasAdded) throws SAXException, IOException, TransformerException {
+	    if (add(xsdElement, schemasAdded))
+	    {
+    		SchemaImpl schemaImpl = new SchemaImpl();
+    		schemaImpl.setElement(xsdElement);
+    		schemaImpl.setElementType(XSD_QN);
+    		types.addExtensibilityElement(schemaImpl);
+	    }
 	}
 
-	private static void addSchema(Types types, Element xsdElement) {
-		SchemaImpl schemaImpl = new SchemaImpl();
-		schemaImpl.setElement(xsdElement);
-		schemaImpl.setElementType(XSD_QN);
-		types.addExtensibilityElement(schemaImpl);
-	}
+	private static boolean add(final Element schemaElement, final Set<String> schemasAdded) throws SAXException, IOException, TransformerException
+    {
+        TransformerFactory factory = TransformerFactory.newInstance();
+        Transformer transformer = factory.newTransformer();
+        StringWriter writer = new StringWriter();
+        Result result = new StreamResult(writer);
+        transformer.transform(new DOMSource(schemaElement), result);
+        String newType = writer.toString();
+        if (schemasAdded.size() == 0)
+        {
+            return schemasAdded.add(newType);
+        }
+        else
+        {
+            XMLUnit.setIgnoreWhitespace(true);
+            for (String existingType : schemasAdded)
+            {
+                if (!XMLUnit.compareXML(existingType, newType).identical())
+                {
+                    return schemasAdded.add(newType);
+                }
+            }
+        } 
+        
+        return false;
+    }
 
-	private static Message addMessage(Definition def, Element element, String msgName, String partName, int nsSuffixCounter) {
+    private static Message addMessage(Definition def, Element element, String msgName, String partName, int nsSuffixCounter, Set<String> schemasAdded) throws SAXException, IOException, TransformerException {
 		String schemaNs = YADOMUtil
 				.getAttribute(element, "targetNamespace", "");
-		addSchema(def.getTypes(), element);
+		addSchema(def.getTypes(), element, schemasAdded);
 		if (def.getNamespace(schemaNs) == null) {
 			def.addNamespace("ns" + nsSuffixCounter, schemaNs);
 		}
@@ -221,10 +239,10 @@
 
 	private static void addFaultMessage(final List<Message> faultMessages,
 			Definition def, Element element, String msgName, String partName,
-			int nsSuffixCounter) {
+			int nsSuffixCounter, Set<String> schemasAdded) throws SAXException, IOException, TransformerException {
 		String schemaNs = YADOMUtil
 				.getAttribute(element, "targetNamespace", "");
-		addSchema(def.getTypes(), element);
+		addSchema(def.getTypes(), element, schemasAdded);
 		if (def.getNamespace(schemaNs) == null) {
 			def.addNamespace("ns" + nsSuffixCounter, schemaNs);
 		}

Modified: labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java	2009-03-19 08:43:07 UTC (rev 25725)
+++ labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java	2009-03-19 08:43:09 UTC (rev 25726)
@@ -23,11 +23,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
-import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 import javax.wsdl.Binding;
 import javax.wsdl.Definition;
@@ -44,14 +40,8 @@
 import org.jboss.soa.esb.listeners.config.Generator;
 import org.jboss.soa.esb.listeners.config.WebserviceInfo;
 import org.jboss.soa.esb.util.ClassUtil;
-import org.jboss.util.xml.DOMUtils;
-import org.milyn.xml.DomUtils;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
-import com.ibm.wsdl.extensions.schema.SchemaImpl;
-
 public class ESBContractGeneratorUnitTest extends TestCase {
     public void testRequestResponseFault() throws Exception {
         executeTest("jbossesb_config_06.xml") ;
@@ -77,15 +67,16 @@
         executeTest("jbossesb_config_08.110.xml") ;
     }
     
-    /*
     public void testDuplicateSchemas() throws Exception {
         Definition def = executeTest("jbossesb_duplicate_schemas.xml") ;
         Types types = def.getTypes();
-        List schemas = types.getExtensibilityElements();
-        //assertEquals(1, schemas.size());
+        assertEquals(1, types.getExtensibilityElements().size());
+        
+        def = executeTest("jbossesb_duplicate_schemas2.xml") ;
+        types = def.getTypes();
+        assertEquals(2, types.getExtensibilityElements().size());
     }
-    */
-
+    
     @SuppressWarnings("unchecked")
     public void _testWSAExtensions110() throws Exception {
         final String targetNamespace = "http://soa.jboss.org/FirstServiceESB" ;




More information about the jboss-svn-commits mailing list