Package nexj.core.rpc.xml

Source Code of nexj.core.rpc.xml.WSDLGeneratorTest

// Copyright 2010 NexJ Systems Inc. This software is licensed under the terms of the Eclipse Public License 1.0
package nexj.core.rpc.xml;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.namespace.QName;

import junit.framework.TestCase;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

import nexj.core.meta.Argument;
import nexj.core.meta.Event;
import nexj.core.meta.Metaclass;
import nexj.core.meta.Primitive;
import nexj.core.util.XMLUtil;
import nexj.core.util.XMLWriter;

public class WSDLGeneratorTest extends TestCase
{
   private static ArrayList/*<Metaclass>*/ s_metaList = new ArrayList/*<Metaclass>*/();
   static
   {
      Metaclass meta = new Metaclass("Test");
      Event typed = new Event("typed");
      Event untyped = new Event("untyped");
      Argument arg0 = new Argument("arg0");
      Argument arg1 = new Argument("arg1");
      Argument result = new Argument(null);

      arg0.setType(Primitive.INTEGER);
      arg1.setType(Primitive.STRING);
      arg1.setCollection(true);
      result.setType(Primitive.ANY);
      result.setCollection(true);
      typed.addArgument(arg0);
      typed.addArgument(arg1);
      typed.setResult(result);
      typed.setVarArg(true);
      untyped.addArgument(new Argument("arg0"));
      untyped.setStatic(true);
      meta.addEvent(typed);
      meta.addEvent(untyped);
      s_metaList.add(meta);
   }

   public void testGenerator() throws IOException
   {
      StringWriter writer = new StringWriter();
      WSDLGenerator gen = new WSDLGenerator(XMLHTTPServer.SOAP_ACTION_DEFAULT);

      gen.setCompatible(false);
      writer.getBuffer().setLength(0);
      gen.generate(new XMLWriter(writer), null, "baseURI");
      validateDocument(XMLUtil.parse(new StringReader(writer.toString())), "baseURI", null);

      writer.getBuffer().setLength(0);
      gen.generate(new XMLWriter(writer), null, null);
      validateDocument(XMLUtil.parse(new StringReader(writer.toString())), null, null);

      writer.getBuffer().setLength(0);
      gen.generate(new XMLWriter(writer), s_metaList.iterator(), null);
      validateDocument(XMLUtil.parse(new StringReader(writer.toString())), null, s_metaList);
   }

   /**
    * validate document
    * @param doc document to validate
    * @param sURI the location of the web service
    * @param metaList A list of metaclasses defined in schema.
    */
   private void validateDocument(Document doc, String sURI, List/*<Metaclass>*/ metaList)
   {
      assertNotNull(doc.getFirstChild()); // there is a definition generated
      assertEquals(1, doc.getChildNodes().getLength()); // only one definitions section

      // Check attributes for outer node
      Node definitions = doc.getFirstChild();
      assertEquals("definitions", definitions.getNodeName());
      assertEquals(7, definitions.getAttributes().getLength());
      assertEquals("http://schemas.xmlsoap.org/wsdl/",
                   XMLUtil.getStringAttr(definitions, XML.XML_NS));
      assertEquals(XML.NS_URI_TNS,
                   XMLUtil.getStringAttr(definitions, XML.XML_NS + ':' + XML.TNS_NS));
      assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                   XMLUtil.getStringAttr(definitions, XML.XML_NS + ':' + XML.ENC_NS));
      assertEquals("http://schemas.xmlsoap.org/wsdl/",
                   XMLUtil.getStringAttr(definitions, XML.XML_NS + ':' + XML.NS_TAG_WSDL));
      assertEquals(XML.NS_URI_WSDL_SOAP,
                   XMLUtil.getStringAttr(definitions, XML.XML_NS + ':' + XML.NS_TAG_WSDL_SOAP));
      assertEquals("http://www.w3.org/2001/XMLSchema",
                   XMLUtil.getStringAttr(definitions, XML.XML_NS + ":" + XML.XSD_NS));
      assertEquals(XML.NS_URI_TNS, XMLUtil.getStringAttr(definitions, "targetNamespace"));

      int nTagCount = 10;

      for (int i = 0, nCount = (metaList == null) ? 0 : metaList.size(); i < nCount; ++i)
      {
         Metaclass metaclass = (Metaclass)metaList.get(i);

         validateEventBinding(definitions, metaclass);
         validateEventPortType(definitions, metaclass);
         nTagCount += 2; // binding section and porttype section

         for (int k = 0, nEventCount = metaclass.getEventCount(); k < nEventCount; ++k)
         {
            validateEventMessages(definitions, metaclass.getEvent(k));
            nTagCount += 2; // for request/response message
         }
      }

      assertEquals(nTagCount, definitions.getChildNodes().getLength());

      validateTypes(definitions, metaList); // check type section
      validateMessageRequest(definitions); // check invoke-request message section
      validateMessageResponse(definitions); // check invoke-response message section
      validateMessageChangeRequest(definitions); // check change-request message section
      validateMessageReadRequest(definitions); // check read-request message section
      validateMessageChangeResponse(definitions); // check event-response message section
      validatePortType(definitions); // check portType section
      validateBinding(definitions); // check binding section
      validateService(definitions, sURI, metaList); // check service section
   }

   /**
    * validate binding section
    * @param parent the parent node
    */
   private void validateBinding(Node parent)
   {
      Node binding = XMLUtil.findChildElement(parent, "binding");
      assertNotNull(binding);

      assertEquals(2, binding.getAttributes().getLength());
      assertEquals("GenericServer", XMLUtil.getStringAttr(binding, "name"));
      assertEquals(XML.TNS_NS + ":Server", XMLUtil.getStringAttr(binding, "type"));
      assertEquals(4, binding.getChildNodes().getLength());

      Node tmpNode = XMLUtil.findChildElement(binding, "binding");
      assertNotNull(tmpNode);
      assertEquals(3, tmpNode.getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP, XMLUtil.getStringAttr(tmpNode, XML.XML_NS));
      assertEquals("document", XMLUtil.getStringAttr(tmpNode, "style"));
      assertEquals("http://schemas.xmlsoap.org/soap/http",
                   XMLUtil.getStringAttr(tmpNode, "transport"));
      assertFalse(tmpNode.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(binding, "operation", "name", "invoke");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(3, tmpNode.getChildNodes().getLength());
     
      Node tmpNode2 = XMLUtil.findChildElement(tmpNode, "operation");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP, XMLUtil.getStringAttr(tmpNode2, XML.XML_NS));
      assertEquals("Server#invoke", XMLUtil.getStringAttr(tmpNode2, "soapAction"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "input");
      assertNotNull(tmpNode2);
      assertFalse(tmpNode2.hasAttributes());
      assertEquals(1, tmpNode2.getChildNodes().getLength());
      assertEquals("body", tmpNode2.getFirstChild().getNodeName());
      assertEquals(3, tmpNode2.getFirstChild().getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP,
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), XML.XML_NS));
      assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "encodingStyle"));
      assertEquals("literal", XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "use"));
      assertFalse(tmpNode2.getFirstChild().hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "output");
      assertNotNull(tmpNode2);
      assertFalse(tmpNode2.hasAttributes());
      assertEquals(1, tmpNode2.getChildNodes().getLength());
      assertEquals("body", tmpNode2.getFirstChild().getNodeName());
      assertEquals(3, tmpNode2.getFirstChild().getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP,
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), XML.XML_NS));
      assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "encodingStyle"));
      assertEquals("literal", XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "use"));
      assertFalse(tmpNode2.getFirstChild().hasChildNodes());

      tmpNode = XMLUtil.findChildElement(binding, "operation", "name", "change");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(3, tmpNode.getChildNodes().getLength());
     
      tmpNode2 = XMLUtil.findChildElement(tmpNode, "operation");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP, XMLUtil.getStringAttr(tmpNode2, XML.XML_NS));
      assertEquals("Server#invoke", XMLUtil.getStringAttr(tmpNode2, "soapAction"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "input");
      assertNotNull(tmpNode2);
      assertFalse(tmpNode2.hasAttributes());
      assertEquals(1, tmpNode2.getChildNodes().getLength());
      assertEquals("body", tmpNode2.getFirstChild().getNodeName());
      assertEquals(3, tmpNode2.getFirstChild().getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP,
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), XML.XML_NS));
      assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "encodingStyle"));
      assertEquals("literal", XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "use"));
      assertFalse(tmpNode2.getFirstChild().hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "output");
      assertNotNull(tmpNode2);
      assertFalse(tmpNode2.hasAttributes());
      assertEquals(1, tmpNode2.getChildNodes().getLength());
      assertEquals("body", tmpNode2.getFirstChild().getNodeName());
      assertEquals(3, tmpNode2.getFirstChild().getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP,
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), XML.XML_NS));
      assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "encodingStyle"));
      assertEquals("literal", XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "use"));
      assertFalse(tmpNode2.getFirstChild().hasChildNodes());

      tmpNode = XMLUtil.findChildElement(binding, "operation", "name", "read");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(3, tmpNode.getChildNodes().getLength());
     
      tmpNode2 = XMLUtil.findChildElement(tmpNode, "operation");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP, XMLUtil.getStringAttr(tmpNode2, XML.XML_NS));
      assertEquals("Server#invoke", XMLUtil.getStringAttr(tmpNode2, "soapAction"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "input");
      assertNotNull(tmpNode2);
      assertFalse(tmpNode2.hasAttributes());
      assertEquals(1, tmpNode2.getChildNodes().getLength());
      assertEquals("body", tmpNode2.getFirstChild().getNodeName());
      assertEquals(3, tmpNode2.getFirstChild().getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP,
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), XML.XML_NS));
      assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "encodingStyle"));
      assertEquals("literal", XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "use"));
      assertFalse(tmpNode2.getFirstChild().hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "output");
      assertNotNull(tmpNode2);
      assertFalse(tmpNode2.hasAttributes());
      assertEquals(1, tmpNode2.getChildNodes().getLength());
      assertEquals("body", tmpNode2.getFirstChild().getNodeName());
      assertEquals(3, tmpNode2.getFirstChild().getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP,
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), XML.XML_NS));
      assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                   XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "encodingStyle"));
      assertEquals("literal", XMLUtil.getStringAttr(tmpNode2.getFirstChild(), "use"));
      assertFalse(tmpNode2.getFirstChild().hasChildNodes());
   }

   /**
    * @param parent The parent node.
    * @param meta The metaclass to validate bindings for.
    */
   private void validateEventBinding(Node parent, Metaclass meta)
   {
      String sClass = meta.getName();
      Node binding = XMLUtil.findChildElementByName(
         parent, "binding", sClass + WSDLGenerator.METACLASS_NAME_DELIMITER + "Server");

      assertNotNull(binding);
      assertEquals(2, binding.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + sClass + WSDLGenerator.METACLASS_NAME_DELIMITER + "Server",
                   XMLUtil.getStringAttr(binding, "type"));
      assertEquals(1 + meta.getEventCount(), binding.getChildNodes().getLength());

      Node tmpNode = XMLUtil.findChildElement(binding, "binding");
      assertNotNull(tmpNode);
      assertEquals(3, tmpNode.getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP, XMLUtil.getStringAttr(tmpNode, XML.XML_NS));
      assertEquals("document", XMLUtil.getStringAttr(tmpNode, "style"));
      assertEquals("http://schemas.xmlsoap.org/soap/http",
                   XMLUtil.getStringAttr(tmpNode, "transport"));
      assertFalse(tmpNode.hasChildNodes());

      for (int i = 0, nCount = meta.getEventCount(); i < nCount; ++i)
      {
         Event event = meta.getEvent(i);
         String sEvent = XSDGenerator.computeElementName(event);
         Node operation = XMLUtil.findChildElementByName(binding, "operation", sEvent);

         assertNotNull(operation);
         assertEquals(1, operation.getAttributes().getLength());
         assertEquals(3, operation.getChildNodes().getLength());

         tmpNode = XMLUtil.findChildElement(operation, "operation");
         assertNotNull(tmpNode);
         assertEquals(2, tmpNode.getAttributes().getLength());
         assertEquals(XML.NS_URI_WSDL_SOAP, XMLUtil.getStringAttr(tmpNode, XML.XML_NS));
         assertEquals("Server#invoke", XMLUtil.getStringAttr(tmpNode, "soapAction"));
         assertEquals(3, operation.getChildNodes().getLength());

         tmpNode = XMLUtil.findChildElement(operation, "input");
         assertNotNull(tmpNode);
         assertEquals(0, tmpNode.getAttributes().getLength());
         assertEquals(1, tmpNode.getChildNodes().getLength());
         assertEquals("body", tmpNode.getFirstChild().getNodeName());
         assertEquals(3, tmpNode.getFirstChild().getAttributes().getLength());
         assertEquals(XML.NS_URI_WSDL_SOAP,
                      XMLUtil.getStringAttr(tmpNode.getFirstChild(), XML.XML_NS));
         assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                      XMLUtil.getStringAttr(tmpNode.getFirstChild(), "encodingStyle"));
         assertEquals("literal", XMLUtil.getStringAttr(tmpNode.getFirstChild(), "use"));
         assertFalse(tmpNode.getFirstChild().hasChildNodes());

         tmpNode = XMLUtil.findChildElement(operation, "output");
         assertNotNull(tmpNode);
         assertEquals(0, tmpNode.getAttributes().getLength());
         assertEquals(1, tmpNode.getChildNodes().getLength());
         assertEquals("body", tmpNode.getFirstChild().getNodeName());
         assertEquals(3, tmpNode.getFirstChild().getAttributes().getLength());
         assertEquals(XML.NS_URI_WSDL_SOAP,
                      XMLUtil.getStringAttr(tmpNode.getFirstChild(), XML.XML_NS));
         assertEquals("http://schemas.xmlsoap.org/soap/encoding/",
                      XMLUtil.getStringAttr(tmpNode.getFirstChild(), "encodingStyle"));
         assertEquals("literal", XMLUtil.getStringAttr(tmpNode.getFirstChild(), "use"));
         assertFalse(tmpNode.getFirstChild().hasChildNodes());
      }
   }

   /**
    * @param parent The parent node.
    * @param event The event to validate messages for.
    */
   private void validateEventMessages(Node parent, Event event)
   {
      String sEvent = XSDGenerator.computeElementName(event);
      String sClass = event.getMetaclass().getName();
      Node node = XMLUtil.findChildElementByName(
         parent, "message", sClass + WSDLGenerator.METACLASS_NAME_DELIMITER + sEvent);

      assertNotNull(node);
      assertEquals(2, node.getAttributes().getLength());
      assertEquals(XML.NS_URI_TNS + '/' + sClass,
                   XMLUtil.getStringAttr(node, XML.XML_NS + ':' + sClass));
      assertEquals(1, node.getChildNodes().getLength());
      node = node.getFirstChild();
      assertEquals("part", node.getNodeName());
      assertEquals(2, node.getAttributes().getLength());
      assertEquals("parameters", XMLUtil.getStringAttr(node, "name"));
      assertEquals(sClass + ':' + sEvent, XMLUtil.getStringAttr(node, "element"));
      assertEquals(0, node.getChildNodes().getLength());

      sEvent += "_Response"; // the result message
      node = XMLUtil.findChildElementByName(
         parent, "message", sClass + WSDLGenerator.METACLASS_NAME_DELIMITER + sEvent);
      assertNotNull(node);
      assertEquals(2, node.getAttributes().getLength());
      assertEquals(XML.NS_URI_TNS + '/' + sClass,
                   XMLUtil.getStringAttr(node, XML.XML_NS + ':' + sClass));
      assertEquals(1, node.getChildNodes().getLength());
      node = node.getFirstChild();
      assertEquals("part", node.getNodeName());
      assertEquals(2, node.getAttributes().getLength());
      assertEquals("parameters", XMLUtil.getStringAttr(node, "name"));
      assertEquals(sClass + ':' + sEvent, XMLUtil.getStringAttr(node, "element"));
      assertEquals(0, node.getChildNodes().getLength());
   }

   /**
    * @param parent The parent node.
    * @param meta The metaclass to validate porttypes for.
    */
   private void validateEventPortType(Node parent, Metaclass meta)
   {
      String sClass = meta.getName();
      Node portType = XMLUtil.findChildElementByName(
         parent, "portType", sClass + WSDLGenerator.METACLASS_NAME_DELIMITER + "Server");

      assertNotNull(portType);
      assertEquals(1, portType.getAttributes().getLength());
      assertEquals(meta.getEventCount(), portType.getChildNodes().getLength());

      for (int i = 0, nCount = meta.getEventCount(); i < nCount; ++i)
      {
         Event event = meta.getEvent(i);
         String sEvent = XSDGenerator.computeElementName(event);
         String sType = XML.TNS_NS + ':' + sClass + WSDLGenerator.METACLASS_NAME_DELIMITER + sEvent;
         Node operation = XMLUtil.findChildElementByName(portType, "operation", sEvent);

         assertNotNull(operation);
         assertEquals(1, operation.getAttributes().getLength());
         assertEquals(2, operation.getChildNodes().getLength());

         Node node = XMLUtil.findChildElement(operation, "input");

         assertNotNull(node);
         assertEquals(1, node.getAttributes().getLength());
         assertEquals(sType, XMLUtil.getStringAttr(node, "message"));
         assertEquals(0, node.getChildNodes().getLength());

         node = XMLUtil.findChildElement(operation, "output");
         assertNotNull(node);
         assertEquals(1, node.getAttributes().getLength());
         assertEquals(sType + "_Response", XMLUtil.getStringAttr(node, "message"));
         assertEquals(0, node.getChildNodes().getLength());
      }
   }

   /**
    * validate message change-request section
    * @param parent the parent node
    */
   private void validateMessageChangeRequest(Node parent)
   {
      Node messageReq = XMLUtil.findChildElement(parent, "message", "name", "change-request");
      assertNotNull(messageReq);

      assertEquals(1, messageReq.getAttributes().getLength());
      assertEquals(1, messageReq.getChildNodes().getLength());

      assertEquals("part", messageReq.getFirstChild().getNodeName());
      assertEquals(2, messageReq.getFirstChild().getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Change-Request",
                   XMLUtil.getStringAttr(messageReq.getFirstChild(), "element"));
      assertEquals("parameters", XMLUtil.getStringAttr(messageReq.getFirstChild(), "name"));
      assertFalse(messageReq.getFirstChild().hasChildNodes());
   }

   /**
    * validate message change-response section
    * @param parent the parent node
    */
   private void validateMessageChangeResponse(Node parent)
   {
      Node messageReq = XMLUtil.findChildElement(parent, "message", "name", "change-response");
      assertNotNull(messageReq);

      assertEquals(1, messageReq.getAttributes().getLength());
      assertEquals(1, messageReq.getChildNodes().getLength());

      assertEquals("part", messageReq.getFirstChild().getNodeName());
      assertEquals(2, messageReq.getFirstChild().getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Change-Response",
                   XMLUtil.getStringAttr(messageReq.getFirstChild(), "element"));
      assertEquals("parameters", XMLUtil.getStringAttr(messageReq.getFirstChild(), "name"));
      assertFalse(messageReq.getFirstChild().hasChildNodes());
   }

   /**
    * validate message read-request section
    * @param parent the parent node
    */
   private void validateMessageReadRequest(Node parent)
   {
      Node messageReq = XMLUtil.findChildElement(parent, "message", "name", "read-request");
      assertNotNull(messageReq);

      assertEquals(1, messageReq.getAttributes().getLength());
      assertEquals(1, messageReq.getChildNodes().getLength());

      assertEquals("part", messageReq.getFirstChild().getNodeName());
      assertEquals(2, messageReq.getFirstChild().getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Read-Request",
                   XMLUtil.getStringAttr(messageReq.getFirstChild(), "element"));
      assertEquals("parameters", XMLUtil.getStringAttr(messageReq.getFirstChild(), "name"));
      assertFalse(messageReq.getFirstChild().hasChildNodes());
   }

   /**
    * validate message invoke-request section
    * @param parent the parent node
    */
   private void validateMessageRequest(Node parent)
   {
      Node messageReq = XMLUtil.findChildElement(parent, "message", "name", "invoke-request");
      assertNotNull(messageReq);

      assertEquals(1, messageReq.getAttributes().getLength());
      assertEquals(1, messageReq.getChildNodes().getLength());

      assertEquals("part", messageReq.getFirstChild().getNodeName());
      assertEquals(2, messageReq.getFirstChild().getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Request",
                   XMLUtil.getStringAttr(messageReq.getFirstChild(), "element"));
      assertEquals("request", XMLUtil.getStringAttr(messageReq.getFirstChild(), "name"));
      assertFalse(messageReq.getFirstChild().hasChildNodes());
   }

   /**
    * validate message invoke-response section
    * @param parent the parent node
    */
   private void validateMessageResponse(Node parent)
   {
      Node messageRsp = XMLUtil.findChildElement(parent, "message", "name", "invoke-response");
      assertNotNull(messageRsp);

      assertEquals(1, messageRsp.getAttributes().getLength());
      assertEquals(1, messageRsp.getChildNodes().getLength());

      assertEquals("part", messageRsp.getFirstChild().getNodeName());
      assertEquals(2, messageRsp.getFirstChild().getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Response",
                   XMLUtil.getStringAttr(messageRsp.getFirstChild(), "element"));
      assertEquals("response", XMLUtil.getStringAttr(messageRsp.getFirstChild(), "name"));
      assertFalse(messageRsp.getFirstChild().hasChildNodes());
   }

   /**
    * Validate the metaclass specific schema section.
    * @param schema The schema node to validate.
    * @param meta The metaclass to validate schema against.
    */
   private void validateMetaclassSchema(Node schema, Metaclass meta)
   {
      assertNotNull(schema);
      assertEquals("schema", schema.getNodeName());
      assertEquals(3, schema.getAttributes().getLength());
      assertEquals("http://www.w3.org/2001/XMLSchema", XMLUtil.getStringAttr(schema, XML.XML_NS));
      assertEquals("qualified", XMLUtil.getStringAttr(schema, "elementFormDefault"));
      assertEquals(XML.NS_URI_TNS + '/' + meta.getName(),
                   XMLUtil.getStringAttr(schema, "targetNamespace"));
      assertEquals(meta.getEventCount() * 2 + 1, schema.getChildNodes().getLength()); // +1 import

      Node node = XMLUtil.findChildElement(schema, "import");

      assertNotNull(node);
      assertEquals(1, node.getAttributes().getLength());
      assertEquals(XML.NS_URI_TNS, XMLUtil.getStringAttr(node, "namespace"));

      for (int i = 0, nCount = meta.getEventCount(); i < nCount; ++i)
      {
         Event event = meta.getEvent(i);
         String sEvent = XSDGenerator.computeElementName(event);
         Node element = XMLUtil.findChildElementByName(schema, sEvent); // request
         Node tmpNode;

         assertNotNull(element);
         assertEquals(1, element.getAttributes().getLength());
         assertEquals(1, element.getChildNodes().getLength());
         node = element.getFirstChild();
         assertEquals("complexType", node.getNodeName());
         assertEquals(0, node.getAttributes().getLength());
         assertEquals(1, node.getChildNodes().getLength());
         node = node.getFirstChild();
         assertEquals("sequence", node.getNodeName());
         assertEquals(0, node.getAttributes().getLength());

         if (event.isStatic()) // check "_instance" arg
         {
            assertEquals(event.getArgumentCount(), node.getChildNodes().getLength());
         }
         else
         {
            assertEquals(event.getArgumentCount() + 1, node.getChildNodes().getLength());
            tmpNode = XMLUtil.findChildElementByName(node, "_instance");
            assertNotNull(tmpNode);
            assertEquals(2, tmpNode.getAttributes().getLength());
            assertEquals(XML.TNS_NS + ':' + meta.getName(), XMLUtil.getStringAttr(tmpNode, "type"));
            assertEquals(0, tmpNode.getChildNodes().getLength());
         }

         for (int k = 0, nArgCount = event.getArgumentCount(); k < nArgCount; ++k) // for each arg
         {
            Argument arg = event.getArgument(k);
            QName type = XML.getQualifiedType(
               arg.getType(), event.isVarArg() && arg.isCollection() && k == nArgCount - 1);
            int nAttrCount = 2;

            tmpNode = XMLUtil.findChildElementByName(node, arg.getName());
            assertNotNull(tmpNode);
            assertEquals(type.getPrefix() + ':' + type.getLocalPart(),
                         XMLUtil.getStringAttr(tmpNode, "type"));

            if (!arg.isRequired())
            {
               assertEquals("0", XMLUtil.getStringAttr(tmpNode, "minOccurs"));
               ++nAttrCount;
            }

            if (arg.isCollection())
            {
               assertEquals("unbounded", XMLUtil.getStringAttr(tmpNode, "maxOccurs"));
               ++nAttrCount;
            }

            assertEquals(nAttrCount, tmpNode.getAttributes().getLength());
            assertEquals(0, tmpNode.getChildNodes().getLength());
         }

         Argument result = event.getResult();
         boolean bTyped = result != null;
         QName type = XML.getQualifiedType((bTyped) ? result.getType() : Primitive.ANY);
         int nAttrCount = 1;

         element = XMLUtil.findChildElementByName(schema, sEvent + "_Response"); // response
         assertNotNull(element);

         if (bTyped && result.isCollection() && !result.isRequired())
         {
            assertEquals("true", XMLUtil.getStringAttr(element, "nillable"));
            ++nAttrCount;
         }

         assertEquals(nAttrCount, element.getAttributes().getLength());
         assertEquals(1, element.getChildNodes().getLength());
         node = element.getFirstChild();
         assertEquals("complexType", node.getNodeName());
         assertEquals(0, node.getAttributes().getLength());
         assertEquals(1, node.getChildNodes().getLength());
         node = node.getFirstChild();
         assertEquals("sequence", node.getNodeName());
         assertEquals(0, node.getAttributes().getLength());
         assertEquals(1, node.getChildNodes().getLength());
         node = node.getFirstChild();
         nAttrCount = 2;
         assertEquals("element", node.getNodeName());
         assertEquals("item", XMLUtil.getStringAttr(node, "name"));
         assertEquals(type.getPrefix() + ':' + type.getLocalPart(),
                      XMLUtil.getStringAttr(node, "type"));

         if (!bTyped || result.isCollection())
         {
            assertEquals("true", XMLUtil.getStringAttr(node, "nillable"));
            ++nAttrCount;
         }

         if (bTyped && result.isCollection())
         {
            assertEquals("0", XMLUtil.getStringAttr(node, "minOccurs"));
            assertEquals("unbounded", XMLUtil.getStringAttr(node, "maxOccurs"));
            nAttrCount += 2;
         }

         assertEquals(nAttrCount, node.getAttributes().getLength());
         assertEquals(0, node.getChildNodes().getLength());
      }
   }

   /**
    * validate portType section
    * @param parent the parent node
    */
   private void validatePortType(Node parent)
   {
      Node portType = XMLUtil.findChildElement(parent, "portType");
      assertNotNull(portType);

      assertEquals(1, portType.getAttributes().getLength());
      assertEquals("Server", XMLUtil.getStringAttr(portType, "name"));
      assertEquals(3, portType.getChildNodes().getLength());

      Node tmpNode = XMLUtil.findChildElement(portType, "operation", "name", "invoke");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(2, tmpNode.getChildNodes().getLength());

      Node tmpNode2 = XMLUtil.findChildElement(tmpNode, "input");
      assertNotNull(tmpNode2);
      assertEquals(1, tmpNode2.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ":invoke-request", XMLUtil.getStringAttr(tmpNode2, "message"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "output");
      assertNotNull(tmpNode2);
      assertEquals(1, tmpNode2.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ":invoke-response", XMLUtil.getStringAttr(tmpNode2, "message"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(portType, "operation", "name", "change");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(2, tmpNode.getChildNodes().getLength());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "input");
      assertNotNull(tmpNode2);
      assertEquals(1, tmpNode2.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ":change-request", XMLUtil.getStringAttr(tmpNode2, "message"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "output");
      assertNotNull(tmpNode2);
      assertEquals(1, tmpNode2.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ":change-response", XMLUtil.getStringAttr(tmpNode2, "message"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(portType, "operation", "name", "read");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(2, tmpNode.getChildNodes().getLength());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "input");
      assertNotNull(tmpNode2);
      assertEquals(1, tmpNode2.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ":read-request", XMLUtil.getStringAttr(tmpNode2, "message"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode, "output");
      assertNotNull(tmpNode2);
      assertEquals(1, tmpNode2.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ":read-response", XMLUtil.getStringAttr(tmpNode2, "message"));
      assertFalse(tmpNode2.hasChildNodes());
   }

   /**
    * validate service section
    * @param parent the parent node
    * @param sURI the location of the web service
    * @param metaList A list of metaclasses defined in schema.
    */
   private void validateService(Node parent, String sURI, List/*<Metaclass>*/ metaList)
   {
      Node service = XMLUtil.findChildElement(parent, "service");
      int nServiceCount = 1;

      assertNotNull(service);
      assertEquals(1, service.getAttributes().getLength());
      assertEquals("GenericServer", XMLUtil.getStringAttr(service, "name"));

      Node port = XMLUtil.findChildElementByName(service, "port", "Server");

      assertNotNull(port);
      assertEquals(2, port.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ":GenericServer", XMLUtil.getStringAttr(port, "binding"));
      assertEquals(1, port.getChildNodes().getLength());
      assertEquals("address", port.getFirstChild().getNodeName());
      assertEquals(2, port.getFirstChild().getAttributes().getLength());
      assertEquals(XML.NS_URI_WSDL_SOAP, XMLUtil.getStringAttr(port.getFirstChild(), XML.XML_NS));
      assertEquals(sURI, XMLUtil.getStringAttr(port.getFirstChild(), "location"));
      assertEquals(0, port.getFirstChild().getChildNodes().getLength());

      for (int i = 0, nCount = (metaList == null) ? 0 : metaList.size(); i < nCount; ++i)
      {
         String sMeta = ((Metaclass)metaList.get(i)).getName();

         ++nServiceCount;
         port = XMLUtil.findChildElementByName(
            service, "port", sMeta + WSDLGenerator.METACLASS_NAME_DELIMITER + "Server");
         assertNotNull(port);
         assertEquals(2, port.getAttributes().getLength());
         assertEquals(XML.TNS_NS + ':' + sMeta + WSDLGenerator.METACLASS_NAME_DELIMITER + "Server",
                      XMLUtil.getStringAttr(port, "binding"));
         assertEquals(1, port.getChildNodes().getLength());
         assertEquals("address", port.getFirstChild().getNodeName());
         assertEquals(2, port.getFirstChild().getAttributes().getLength());
         assertEquals(XML.NS_URI_WSDL_SOAP,
                      XMLUtil.getStringAttr(port.getFirstChild(), XML.XML_NS));
         assertEquals(sURI, XMLUtil.getStringAttr(port.getFirstChild(), "location"));
         assertEquals(0, port.getFirstChild().getChildNodes().getLength());
      }

      assertEquals(nServiceCount, service.getChildNodes().getLength());
   }

   /**
    * Validate the TNS schema section.
    * @param schema The schema node to validate.
    */
   private void validateTNSSchema(Node schema)
   {
      assertNotNull(schema);
      assertEquals("schema", schema.getNodeName());
      assertEquals(3, schema.getAttributes().getLength());
      assertEquals("http://www.w3.org/2001/XMLSchema", XMLUtil.getStringAttr(schema, XML.XML_NS));
      assertEquals("qualified", XMLUtil.getStringAttr(schema, "elementFormDefault"));
      assertEquals(XML.NS_URI_TNS, XMLUtil.getStringAttr(schema, "targetNamespace"));

      Node tmpNode = XMLUtil.findChildElement(schema, "element", "name", XML.BASE_PREFIX + "Request");
      assertNotNull(tmpNode);
      assertEquals(2, tmpNode.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Request",
                   XMLUtil.getStringAttr(tmpNode, "type"));
      assertFalse(tmpNode.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(schema, "element", "name", XML.BASE_PREFIX + "Response");
      assertNotNull(tmpNode);
      assertEquals(2, tmpNode.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Response",
                   XMLUtil.getStringAttr(tmpNode, "type"));
      assertFalse(tmpNode.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(schema, "element", "name", XML.BASE_PREFIX + "Change-Request");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(1, tmpNode.getChildNodes().getLength());
      assertEquals("complexType", tmpNode.getChildNodes().item(0).getNodeName());
      assertFalse(tmpNode.getChildNodes().item(0).hasAttributes());
      assertEquals(1, tmpNode.getChildNodes().item(0).getChildNodes().getLength());
      assertEquals("sequence",
                   tmpNode.getChildNodes().item(0).getChildNodes().item(0).getNodeName());
      assertFalse(tmpNode.getChildNodes().item(0).getChildNodes().item(0).hasAttributes());
      assertEquals(2,
                   tmpNode
                      .getChildNodes()
                         .item(0)
                            .getChildNodes()
                               .item(0)
                                  .getChildNodes()
                                     .getLength());
     
      Node tmpNode2 =
         XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
                                  "element",
                                  "name",
                                  "objects");
      assertNotNull(tmpNode2);
      assertEquals(4, tmpNode2.getAttributes().getLength());
      assertEquals("0", XMLUtil.getStringAttr(tmpNode2, "minOccurs"));
      assertEquals("unbounded", XMLUtil.getStringAttr(tmpNode2, "maxOccurs"));
      assertEquals(XML.XSD_NS + ":anyType", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
                                          "element",
                                          "name",
                                          "attributes");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.XSD_NS + ":string", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(schema, "element", "name", XML.BASE_PREFIX + "Read-Request");
      assertNotNull(tmpNode);
      assertEquals(1, tmpNode.getAttributes().getLength());
      assertEquals(1, tmpNode.getChildNodes().getLength());
      assertEquals("complexType", tmpNode.getChildNodes().item(0).getNodeName());
      assertFalse(tmpNode.getChildNodes().item(0).hasAttributes());
      assertEquals(1, tmpNode.getChildNodes().item(0).getChildNodes().getLength());
      assertEquals("sequence",
                   tmpNode.getChildNodes().item(0).getChildNodes().item(0).getNodeName());
      assertFalse(tmpNode.getChildNodes().item(0).getChildNodes().item(0).hasAttributes());
      assertEquals(6,
                   tmpNode
                      .getChildNodes()
                         .item(0)
                            .getChildNodes()
                               .item(0)
                                  .getChildNodes()
                                     .getLength());
     
      tmpNode2 = XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
         "element",
         "name",
         "class");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.XSD_NS + ":string", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
                                          "element",
                                          "name",
                                          "attributes");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.XSD_NS + ":string", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
                                          "element",
                                          "name",
                                          "where");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.XSD_NS + ":string", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
                                          "element",
                                          "name",
                                          "orderBy");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.XSD_NS + ":string", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
                                          "element",
                                          "name",
                                          "count");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.XSD_NS + ":int", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode2 = XMLUtil.findChildElement(tmpNode.getChildNodes().item(0).getChildNodes().item(0),
                                          "element",
                                          "name",
                                          "offset");
      assertNotNull(tmpNode2);
      assertEquals(2, tmpNode2.getAttributes().getLength());
      assertEquals(XML.XSD_NS + ":int", XMLUtil.getStringAttr(tmpNode2, "type"));
      assertFalse(tmpNode2.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(schema, "element", "name", XML.BASE_PREFIX + "Change-Response");
      assertNotNull(tmpNode);
      assertEquals(2, tmpNode.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Collection",
                   XMLUtil.getStringAttr(tmpNode, "type"));
      assertFalse(tmpNode.hasChildNodes());

      tmpNode = XMLUtil.findChildElement(schema, "element", "name", XML.BASE_PREFIX + "Read-Response");
      assertNotNull(tmpNode);
      assertEquals(2, tmpNode.getAttributes().getLength());
      assertEquals(XML.TNS_NS + ':' + XML.BASE_PREFIX + "Collection",
                   XMLUtil.getStringAttr(tmpNode, "type"));
      assertFalse(tmpNode.hasChildNodes());
   }

   /**
    * validate types section
    * @param parent the parent node
    * @param metaList A list of metaclasses defined in schema.
    */
   private void validateTypes(Node parent, List/*<Metaclass>*/ metaList)
   {
      Node types = XMLUtil.findChildElement(parent, "types");

      assertNotNull(types);
      assertFalse(types.hasAttributes());
      assertEquals(1 + ((metaList == null) ? 0 : metaList.size()), // an extra section per metaclass
                   types.getChildNodes().getLength());

      validateTNSSchema(XMLUtil.findChildElement(types, "targetNamespace", XML.NS_URI_TNS, false));

      for (int i = 0, nCount = (metaList == null) ? 0 : metaList.size(); i < nCount; ++i)
      {
         Metaclass meta = (Metaclass)metaList.get(i);
         Node schema = XMLUtil.findChildElement(
            types, "targetNamespace", XML.NS_URI_TNS + '/' + meta.getName(), false);

         validateMetaclassSchema(schema, meta);
      }
   }
}
TOP

Related Classes of nexj.core.rpc.xml.WSDLGeneratorTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.