Package org.codehaus.enunciate.modules.xml

Source Code of org.codehaus.enunciate.modules.xml.TestFullXMLAPI

/*
* Copyright 2006-2008 Web Cohesion
*
* Licensed 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.
*/

package org.codehaus.enunciate.modules.xml;

import com.sun.xml.xsom.*;
import static com.sun.xml.xsom.XSType.EXTENSION;
import static com.sun.xml.xsom.XSType.RESTRICTION;
import com.sun.xml.xsom.parser.XSOMParser;
import junit.framework.TestCase;
import static org.codehaus.enunciate.EnunciateTestUtil.getAllJavaFiles;
import static org.codehaus.enunciate.InAPTTestCase.getInAPTClasspath;
import org.codehaus.enunciate.config.EnunciateConfiguration;
import org.codehaus.enunciate.main.Enunciate;
import org.codehaus.enunciate.modules.DeploymentModule;
import org.codehaus.enunciate.modules.xml.config.SchemaConfig;
import org.codehaus.enunciate.modules.xml.config.WsdlConfig;
import org.codehaus.enunciate.contract.validation.BaseValidator;
import org.w3c.dom.Element;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import javax.wsdl.*;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.schema.Schema;
import javax.wsdl.extensions.soap.*;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import javax.xml.namespace.QName;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.util.*;

/**
* The full-API test case.
*
* @author Ryan Heaton
*/
public class TestFullXMLAPI extends TestCase {

  public static final String FULL_NAMESPACE = "http://enunciate.codehaus.org/samples/full";
  public static final String DATA_NAMESPACE = "http://enunciate.codehaus.org/samples/genealogy/data";
  public static final String CITE_NAMESPACE = "http://enunciate.codehaus.org/samples/genealogy/cite";
  public static final String RELATIONSHIP_NAMESPACE = "http://services.genealogy.samples.enunciate.codehaus.org/";

  /**
   * Tests the xml artifact generation against the "full" API.
   */
  public void testAgainstFullAPI() throws Exception {
    XMLDeploymentModule xmlModule = new XMLDeploymentModule();
    SchemaConfig schemaConfig = new SchemaConfig();
    schemaConfig.setNamespace(CITE_NAMESPACE);
    schemaConfig.setFile("cite.xsd");
    xmlModule.addSchemaConfig(schemaConfig);
    schemaConfig = new SchemaConfig();
    schemaConfig.setNamespace(DATA_NAMESPACE);
    schemaConfig.setFile("data.xsd");
    xmlModule.addSchemaConfig(schemaConfig);
    WsdlConfig wsdlConfig = new WsdlConfig();
    wsdlConfig.setNamespace(FULL_NAMESPACE);
    wsdlConfig.setFile("full.wsdl");
    xmlModule.addWsdlConfig(wsdlConfig);
    wsdlConfig = new WsdlConfig();
    wsdlConfig.setNamespace(RELATIONSHIP_NAMESPACE);
    wsdlConfig.setFile("relationship.wsdl");
    xmlModule.addWsdlConfig(wsdlConfig);

    EnunciateConfiguration config = new EnunciateConfiguration(Arrays.asList((DeploymentModule) xmlModule));
    config.setValidator(new BaseValidator());
    config.setDeploymentHost("www.thebestgenealogywebsite.com");
    config.setDeploymentContext("/genealogy");
    config.setDeploymentProtocol("https");
    config.putNamespace(CITE_NAMESPACE, "cite");
    config.putNamespace(DATA_NAMESPACE, "data");
    config.putNamespace(FULL_NAMESPACE, "full");
    config.putNamespace(null, "default");
    Enunciate enunciate = new Enunciate(getAllJavaFiles("full"));
    enunciate.setConfig(config);
    enunciate.setTarget(Enunciate.Target.GENERATE);
    enunciate.setRuntimeClasspath(getInAPTClasspath());
    enunciate.execute();

    final File dataSchemaFile = new File(enunciate.getGenerateDir(), "xml/data.xsd");
    final File citationSchemaFile = new File(enunciate.getGenerateDir(), "xml/cite.xsd");
    final File fullSchemaFile = new File(enunciate.getGenerateDir(), "xml/full.xsd");
    final File defaultSchemaFile = new File(enunciate.getGenerateDir(), "xml/default.xsd");
    File fullWsdlFile = new File(enunciate.getGenerateDir(), "xml/full.wsdl");
    File relationshipWsdlFile = new File(enunciate.getGenerateDir(), "xml/relationship.wsdl");

    assertTrue(dataSchemaFile.exists());
    assertTrue(citationSchemaFile.exists());
    assertTrue(fullWsdlFile.exists());
    assertTrue(relationshipWsdlFile.exists());

    //make sure the wsdl is built correctly
    WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
    Definition definition = wsdlReader.readWSDL(null, fullWsdlFile.toURI().toURL().toString());
    assertEquals(FULL_NAMESPACE, definition.getTargetNamespace());
    Types types = definition.getTypes();
    List extensibilityElements = types.getExtensibilityElements();
    assertEquals(1, extensibilityElements.size());
    ExtensibilityElement ee = (ExtensibilityElement) extensibilityElements.get(0);
    assertEquals(new QName(W3C_XML_SCHEMA_NS_URI, "schema"), ee.getElementType());
    Schema schema = (Schema) ee;
    Map imports = schema.getImports();
    assertEquals(3, imports.size());
    assertNotNull(imports.get(DATA_NAMESPACE));
    assertNotNull(imports.get(CITE_NAMESPACE));
    assertNotNull(imports.get(null));

    File tempSchemaFile = new File(dataSchemaFile.getParentFile(), "temp.xsd");
    FileOutputStream tempSchemaStream = new FileOutputStream(tempSchemaFile);
    TransformerFactory tFactory = TransformerFactory.newInstance();
    Transformer transformer = tFactory.newTransformer();
    Element schemaElement = schema.getElement();
    //these namespaces need to be explicitly added because the transformer won't see any references to them...
    schemaElement.setAttribute("xmlns:data", DATA_NAMESPACE);
    schemaElement.setAttribute("xmlns:cite", CITE_NAMESPACE);
    schemaElement.setAttribute("xmlns:full", FULL_NAMESPACE);

    //write out the wsdl schema to its xml form so we can parse it with XSOM...
    DOMSource source = new DOMSource(schemaElement);
    StreamResult result = new StreamResult(tempSchemaStream);
    transformer.transform(source, result);
    tempSchemaStream.close();

    //set up the XSOM Parser.
    XSOMParser parser = new XSOMParser();
    parser.setErrorHandler(new ThrowEverythingHandler()); //throw all errors and warnings.

    //make sure the schema included in the wsdl is correct.
    parser.parse(tempSchemaFile.toURI().toURL());
    XSSchemaSet schemaSet = parser.getResult();
    XSSchema wsdlSchema = schemaSet.getSchema(FULL_NAMESPACE);
    assertNotNull(wsdlSchema);

    //make sure the data schema is imported and correct.
    XSSchema dataSchema = schemaSet.getSchema(DATA_NAMESPACE);
    assertNotNull(dataSchema);
    assertDataSchemaStructure(dataSchema);

    //make sure the cite schema is imported and correct.
    XSSchema citeSchema = schemaSet.getSchema(CITE_NAMESPACE);
    assertNotNull(citeSchema);
    assertCiteSchemaStructure(citeSchema);

    //now verify the rest of the WSDL...
    assertWebServiceDefinition(definition);
  }

  protected void assertWebServiceDefinition(Definition definition) {
    assertDefinitionMessages(definition);
    assertPortTypes(definition);
    assertBindings(definition);
    assertServices(definition);
  }

  protected void assertServices(Definition definition) {
    Map services = definition.getServices();
    assertEquals(2, services.size());
    for (Object s : services.values()) {
      Service service = (Service) s;
      assertEquals(FULL_NAMESPACE, service.getQName().getNamespaceURI());
      String serviceName = service.getQName().getLocalPart();
      if ("PersonServiceService".equals(serviceName)) {
        Map ports = service.getPorts();
        assertEquals(1, ports.size());
        Port port = (Port) ports.values().iterator().next();
        assertEquals("PersonServicePort", port.getName());
        SOAPAddress address = (SOAPAddress) port.getExtensibilityElements().get(0);
        assertEquals("https://www.thebestgenealogywebsite.com/genealogy/soap/PersonServiceService", address.getLocationURI());

        assertEquals(definition.getBindings().get(new QName(FULL_NAMESPACE, "PersonServicePortBinding")), port.getBinding());
      }
      else if ("source-service".equals(serviceName)) {
        Map ports = service.getPorts();
        assertEquals(1, ports.size());
        Port port = (Port) ports.values().iterator().next();
        assertEquals("SourceServicePort", port.getName());
        SOAPAddress address = (SOAPAddress) port.getExtensibilityElements().get(0);
        assertEquals("https://www.thebestgenealogywebsite.com/genealogy/soap/source-service", address.getLocationURI());

        assertEquals(definition.getBindings().get(new QName(FULL_NAMESPACE, "SourceServicePortBinding")), port.getBinding());
      }
      else {
        fail("Unknown service: " + serviceName);
      }
    }
  }

  protected void assertBindings(Definition definition) {
    Map bindings = definition.getBindings();
    assertEquals(2, bindings.size());
    for (Object b : bindings.values()) {
      Binding binding = (Binding) b;
      assertEquals(FULL_NAMESPACE, binding.getQName().getNamespaceURI());
      String bindingName = binding.getQName().getLocalPart();
      if ("PersonServicePortBinding".equals(bindingName)) {
        for (Object bo : binding.getBindingOperations()) {
          BindingOperation operation = (BindingOperation) bo;
          String operationName = operation.getName();
          if ("storePerson".equals(operationName)) {
            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
            assertEquals("", soapOp.getSoapActionURI());
            assertNull(soapOp.getStyle());

            SOAPBody soapBody = (SOAPBody) operation.getBindingInput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());
            soapBody = (SOAPBody) operation.getBindingOutput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());

            assertEquals(0, operation.getBindingFaults().size());
          }
          else if ("readPersons".equals(operationName)) {
            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
            assertEquals("", soapOp.getSoapActionURI());
            assertNull(soapOp.getStyle());

            SOAPBody soapBody = (SOAPBody) operation.getBindingInput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());
            soapBody = (SOAPBody) operation.getBindingOutput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());

            BindingFault bindingFault = (BindingFault) operation.getBindingFaults().values().iterator().next();
            SOAPFault soapFault = (SOAPFault) bindingFault.getExtensibilityElements().get(0);
            assertEquals("literal", soapFault.getUse());
          }
//          else if ("readFamily".equals(operationName)) {
//            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
//            assertEquals("", soapOp.getSoapActionURI());
//            assertEquals("document", soapOp.getStyle());
//
//            SOAPBody soapBody = (SOAPBody) operation.getBindingInput().getExtensibilityElements().get(0);
//            assertEquals("literal", soapBody.getUse());
//            soapBody = (SOAPBody) operation.getBindingOutput().getExtensibilityElements().get(0);
//            assertEquals("literal", soapBody.getUse());
//
//            BindingFault bindingFault = (BindingFault) operation.getBindingFaults().values().iterator().next();
//            SOAPFault soapFault = (SOAPFault) bindingFault.getExtensibilityElements().get(0);
//            assertEquals("literal", soapFault.getUse());
//          }
          else if ("deletePerson".equals(operationName)) {
            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
            assertEquals("", soapOp.getSoapActionURI());
            assertNull(soapOp.getStyle());

            SOAPBody soapBody = (SOAPBody) operation.getBindingInput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());
            soapBody = (SOAPBody) operation.getBindingOutput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());

            BindingFault bindingFault = (BindingFault) operation.getBindingFaults().values().iterator().next();
            SOAPFault soapFault = (SOAPFault) bindingFault.getExtensibilityElements().get(0);
            assertEquals("literal", soapFault.getUse());
          }
          else {
            fail("Unknown binding operation on PersonServicePortBinding: " + operationName);
          }

        }
      }
      else if ("SourceServicePortBinding".equals(bindingName)) {
        for (Object bo : binding.getBindingOperations()) {
          BindingOperation operation = (BindingOperation) bo;
          String operationName = operation.getName();
          if ("addSource".equals(operationName)) {
            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
            assertEquals("", soapOp.getSoapActionURI());
            assertNull(soapOp.getStyle());

            SOAPBody soapBody = (SOAPBody) operation.getBindingInput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());
            soapBody = (SOAPBody) operation.getBindingOutput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());

            assertEquals(0, operation.getBindingFaults().size());
          }
          else if ("getSource".equals(operationName)) {
            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
            assertEquals("", soapOp.getSoapActionURI());
            assertNull(soapOp.getStyle());

            SOAPBody soapBody = (SOAPBody) operation.getBindingInput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());
            soapBody = (SOAPBody) operation.getBindingOutput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());

            BindingFault bindingFault = (BindingFault) operation.getBindingFaults().values().iterator().next();
            SOAPFault soapFault = (SOAPFault) bindingFault.getExtensibilityElements().get(0);
            assertEquals("literal", soapFault.getUse());
          }
          else if ("addEvents".equals(operationName)) {
            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
            assertEquals("", soapOp.getSoapActionURI());
            assertNull(soapOp.getStyle());

            List inputEls = operation.getBindingInput().getExtensibilityElements();
            assertEquals(2, inputEls.size());
            SOAPHeader soapHeader = (SOAPHeader) inputEls.get(0);
            assertEquals(new QName(FULL_NAMESPACE, "SourceService.addEvents.contributorId"), soapHeader.getMessage());
            assertEquals("contributorId", soapHeader.getPart());
            SOAPBody soapBody = (SOAPBody) inputEls.get(1);

            assertEquals("literal", soapBody.getUse());
            List outputEls = operation.getBindingOutput().getExtensibilityElements();
            assertEquals(2, outputEls.size());
            soapHeader = (SOAPHeader) outputEls.get(0);
            assertEquals(new QName(FULL_NAMESPACE, "SourceService.addEvents.resultOfAddingEvents"), soapHeader.getMessage());
            assertEquals("return", soapHeader.getPart());
            soapBody = (SOAPBody) outputEls.get(1);
            assertEquals("literal", soapBody.getUse());

            BindingFault bindingFault = (BindingFault) operation.getBindingFaults().values().iterator().next();
            SOAPFault soapFault = (SOAPFault) bindingFault.getExtensibilityElements().get(0);
            assertEquals("literal", soapFault.getUse());
          }
          else if ("addInfoSet".equals(operationName)) {
            SOAPOperation soapOp = (SOAPOperation) operation.getExtensibilityElements().get(0);
            assertEquals("", soapOp.getSoapActionURI());
            assertEquals("rpc", soapOp.getStyle());

            SOAPBody soapBody = (SOAPBody) operation.getBindingInput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());
            soapBody = (SOAPBody) operation.getBindingOutput().getExtensibilityElements().get(0);
            assertEquals("literal", soapBody.getUse());

            BindingFault bindingFault = (BindingFault) operation.getBindingFaults().values().iterator().next();
            SOAPFault soapFault = (SOAPFault) bindingFault.getExtensibilityElements().get(0);
            assertEquals("literal", soapFault.getUse());
          }
          else {
            fail("Unknown binding operation on SourceServicePortBinding: " + operationName);
          }

        }
      }
      else {
        fail("Unknown binding: " + bindingName);
      }
    }
  }

  protected void assertPortTypes(Definition definition) {
    Map portTypes = definition.getPortTypes();
    assertEquals(2, portTypes.size());
    for (Object p : portTypes.values()) {
      PortType portType = (PortType) p;
      assertEquals(FULL_NAMESPACE, portType.getQName().getNamespaceURI());
      String portTypeName = portType.getQName().getLocalPart();
      if ("PersonService".equals(portTypeName)) {
        for (Object o : portType.getOperations()) {
          Operation operation = (Operation) o;
          String operationName = operation.getName();
          if ("storePerson".equals(operationName)) {
            Input input = operation.getInput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.storePerson")), input.getMessage());
            Output output = operation.getOutput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.storePersonResponse")), output.getMessage());
            Fault fault = operation.getFault("ServiceException");
            assertNull(fault);
          }
          else if ("readPersons".equals(operationName)) {
            Input input = operation.getInput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.readPersons")), input.getMessage());
            Output output = operation.getOutput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.readPersonsResponse")), output.getMessage());
            Fault fault = operation.getFault("ServiceException");
            assertNotNull(fault);
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "ServiceException")), fault.getMessage());
          }
//          else if ("readFamily".equals(operationName)) {
//            Input input = operation.getInput();
//            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.readFamily")), input.getMessage());
//            Output output = operation.getOutput();
//            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.readFamilyResponse")), output.getMessage());
//            Fault fault = operation.getFault("ServiceException");
//            assertNotNull(fault);
//            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "ServiceException")), fault.getMessage());
//          }
          else if ("deletePerson".equals(operationName)) {
            Input input = operation.getInput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.deletePerson")), input.getMessage());
            Output output = operation.getOutput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "PersonService.deletePersonResponse")), output.getMessage());
            Fault fault = operation.getFault("ServiceException");
            assertNotNull(fault);
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "ServiceException")), fault.getMessage());
          }
          else {
            fail("Unknown operation on PersonService: " + operationName);
          }
        }
      }
      else if ("source-service".equals(portTypeName)) {
        for (Object o : portType.getOperations()) {
          Operation operation = (Operation) o;
          String operationName = operation.getName();
          if ("addSource".equals(operationName)) {
            Input input = operation.getInput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "SourceService.addSource")), input.getMessage());
            Output output = operation.getOutput();
            assertNull(output);
            Fault fault = operation.getFault("ServiceException");
            assertNull(fault);
          }
          else if ("getSource".equals(operationName)) {
            Input input = operation.getInput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "SourceService.getSource")), input.getMessage());
            Output output = operation.getOutput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "SourceService.getSourceResponse")), output.getMessage());
            Fault fault = operation.getFault("ServiceException");
            assertNotNull(fault);
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "ServiceException")), fault.getMessage());
          }
          else if ("addInfoSet".equals(operationName)) {
            Input input = operation.getInput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "SourceService.addInfoSet")), input.getMessage());
            Output output = operation.getOutput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "SourceService.addInfoSetResponse")), output.getMessage());
            Fault fault = operation.getFault("ServiceException");
            assertNotNull(fault);
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "ServiceException")), fault.getMessage());
          }
          else if ("addEvents".equals(operationName)) {
            Input input = operation.getInput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "SourceService.addEvents")), input.getMessage());
            Output output = operation.getOutput();
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "SourceService.addEventsResponse")), output.getMessage());
            Fault fault = operation.getFault("ServiceException");
            assertNotNull(fault);
            assertEquals(definition.getMessage(new QName(FULL_NAMESPACE, "ServiceException")), fault.getMessage());
          }
          else {
            fail("Unknown operation on SourceService: " + operationName);
          }
        }
      }
      else {
        fail("Unknown port type: " + portTypeName);
      }
    }
  }

  protected void assertDefinitionMessages(Definition definition) {
    Map messages = definition.getMessages();
    assertEquals(17, messages.size()); //7 request messages, 6 response messages (because there is a one-way method), 2 header messages, and 2 exceptions
    for (Object m : messages.values()) {
      Message message = (Message) m;
      assertEquals(FULL_NAMESPACE, message.getQName().getNamespaceURI());
      String messageName = message.getQName().getLocalPart();
      if ("ServiceException".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("ServiceException");
        assertEquals(new QName(FULL_NAMESPACE, "ServiceException"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("UnknownSourceException".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("UnknownSourceException");
        assertEquals(new QName(FULL_NAMESPACE, "unknownSourceBean"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("PersonService.storePerson".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("person");
        assertEquals(new QName(FULL_NAMESPACE, "storePerson"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("PersonService.readPersons".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "readPersons"), part.getElementName());
        assertNull(part.getTypeName());
      }
//      else if ("PersonService.readFamily".equals(messageName)) {
//        assertEquals(1, message.getParts().size());
//        Part part = message.getPart("readFamily");
//        assertEquals(new QName(FULL_NAMESPACE, "readFamily"), part.getElementName());
//        assertNull(part.getTypeName());
//      }
      else if ("PersonService.deletePerson".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "deletePerson"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("PersonService.storePersonResponse".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("return");
        assertEquals(new QName(FULL_NAMESPACE, "storePersonResponse"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("PersonService.readPersonsResponse".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "readPersonsResponse"), part.getElementName());
        assertNull(part.getTypeName());
      }
//      else if ("PersonService.readFamilyResponse".equals(messageName)) {
//        assertEquals(1, message.getParts().size());
//        Part part = message.getPart("readFamilyResponse");
//        assertEquals(new QName(FULL_NAMESPACE, "readFamilyResponse"), part.getElementName());
//        assertNull(part.getTypeName());
//      }
      else if ("PersonService.deletePersonResponse".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "deletePersonResponse"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("SourceService.addSource".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "addSource"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("SourceService.getSource".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "getSource"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("SourceService.addEvents".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "addEvents"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("SourceService.addEvents.contributorId".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("contributorId");
        assertEquals(new QName(FULL_NAMESPACE, "contributorId"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("SourceService.addInfoSet".equals(messageName)) {
        assertEquals(2, message.getParts().size());
        Part part = message.getPart("sourceId");
        assertNull(part.getElementName());
        assertEquals(new QName(W3C_XML_SCHEMA_NS_URI, "string"), part.getTypeName());
        part = message.getPart("infoSet");
        assertNull(part.getElementName());
        assertEquals(new QName(CITE_NAMESPACE, "infoSet"), part.getTypeName());
      }
      else if ("SourceService.getSourceResponse".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "getSourceResponse"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("SourceService.addInfoSetResponse".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("return");
        assertNull(part.getElementName());
        assertEquals(new QName(W3C_XML_SCHEMA_NS_URI, "string"), part.getTypeName());
      }
      else if ("SourceService.addEventsResponse".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("parameters");
        assertEquals(new QName(FULL_NAMESPACE, "addEventsResponse"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else if ("SourceService.addEvents.resultOfAddingEvents".equals(messageName)) {
        assertEquals(1, message.getParts().size());
        Part part = message.getPart("return");
        assertEquals(new QName(FULL_NAMESPACE, "resultOfAddingEvents"), part.getElementName());
        assertNull(part.getTypeName());
      }
      else {
        fail("Unknown web message: " + messageName);
      }
    }
  }

  protected void assertCiteSchemaStructure(XSSchema citeSchema) {
    Map<String, XSElementDecl> rootElements = citeSchema.getElementDecls();
    assertEquals(3, rootElements.size());
    XSElementDecl contributorElement = rootElements.get("contributor");
    assertContributorElement(contributorElement);
    XSElementDecl sourceElement = rootElements.get("source");
    assertSourceElement(sourceElement);
    XSElementDecl repositoryElement = rootElements.get("repository");
    assertRepositoryElement(repositoryElement);

    Map<String, XSSimpleType> simpleTypes = citeSchema.getSimpleTypes();
    assertEquals(1, simpleTypes.size());
    XSSimpleType emailType = simpleTypes.get("EMail");
    assertNotNull(emailType);
    assertEmailType(emailType);

    Map<String, XSComplexType> complexTypes = citeSchema.getComplexTypes();
    assertEquals(5, complexTypes.size());
    XSComplexType contributorType = complexTypes.get("contributor");
    assertNotNull(contributorType);
    assertContributorType(contributorType);
    XSComplexType infosetType = complexTypes.get("infoSet");
    assertNotNull(infosetType);
    assertInfosetType(infosetType);
    XSComplexType repositoryType = complexTypes.get("repository");
    assertNotNull(repositoryType);
    assertRepositoryType(repositoryType);
    XSComplexType sourceType = complexTypes.get("source");
    assertNotNull(sourceType);
    assertSourceType(sourceType);
    XSComplexType noteType = complexTypes.get("note");
    assertNotNull(noteType);
    assertNoteType(noteType);
  }

  protected void assertEmailType(XSSimpleType emailType) {
    assertTrue(emailType.isRestriction());
    XSRestrictionSimpleType restriction = emailType.asRestriction();
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", restriction.getSimpleBaseType());
    assertEquals(0, restriction.getDeclaredFacets().size());
  }

  protected void assertContributorElement(XSElementDecl contributorElement) {
    assertEquals("contributor", contributorElement.getName());
    XSType personType = contributorElement.getType();
    assertEquals("contributor", personType.getName());
    assertEquals(CITE_NAMESPACE, personType.getTargetNamespace());
  }

  protected void assertSourceElement(XSElementDecl sourceElement) {
    assertEquals("source", sourceElement.getName());
    XSType personType = sourceElement.getType();
    assertEquals("source", personType.getName());
    assertEquals(CITE_NAMESPACE, personType.getTargetNamespace());
  }

  protected void assertRepositoryElement(XSElementDecl repositoryElement) {
    assertEquals("repository", repositoryElement.getName());
    XSType personType = repositoryElement.getType();
    assertEquals("repository", personType.getName());
    assertEquals(CITE_NAMESPACE, personType.getTargetNamespace());
  }

  protected void assertDataSchemaStructure(XSSchema dataSchema) {
    Map<String, XSElementDecl> rootElements = dataSchema.getElementDecls();
    assertEquals(1, rootElements.size());
    XSElementDecl personElement = rootElements.values().iterator().next();
    assertPersonRootElement(personElement);

    Map<String, XSSimpleType> simpleTypes = dataSchema.getSimpleTypes();
    assertEquals(3, simpleTypes.size());
    XSSimpleType eventTypeType = simpleTypes.get("eventType");
    assertNotNull(eventTypeType);
    assertEventTypeType(eventTypeType);
    XSSimpleType factTypeType = simpleTypes.get("factType");
    assertNotNull(factTypeType);
    assertFactTypeType(factTypeType);
    XSSimpleType genderTypeType = simpleTypes.get("genderType");
    assertNotNull(genderTypeType);
    assertGenderTypeType(genderTypeType);

    Map<String, XSComplexType> complexTypes = dataSchema.getComplexTypes();
    assertEquals(8, complexTypes.size());
    XSComplexType assertionType = complexTypes.get("assertion");
    assertNotNull(assertionType);
    assertAssertionType(assertionType);
    XSComplexType occurringAssertionType = complexTypes.get("occurringAssertion");
    assertNotNull(occurringAssertionType);
    assertOccurringAssertionType(occurringAssertionType);
    XSComplexType eventType = complexTypes.get("event");
    assertNotNull(eventType);
    assertEventType(eventType);
    XSComplexType factType = complexTypes.get("fact");
    assertNotNull(factType);
    assertFactType(factType);
    XSComplexType genderType = complexTypes.get("gender");
    assertNotNull(genderType);
    assertGenderType(genderType);
    XSComplexType nameType = complexTypes.get("name");
    assertNotNull(nameType);
    assertNameType(nameType);
    XSComplexType relationshipType = complexTypes.get("relationship");
    assertNotNull(relationshipType);
    assertRelationshipType(relationshipType);
    XSComplexType personType = complexTypes.get("person");
    assertNotNull(personType);
    assertPersonType(personType);
  }

  protected void assertEventType(XSComplexType eventType) {
    assertEquals("event", eventType.getName());
    assertFalse(eventType.isAbstract());
    assertQNameEquals(DATA_NAMESPACE, "occurringAssertion", eventType.getBaseType());
    assertEquals(EXTENSION, eventType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = eventType.getAttributeUses();
    assertEquals(2, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("type".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(DATA_NAMESPACE, "eventType", attributeDecl.getType());
      }
      else if ("id".equals(attributeName)) {
        //fall through...
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = eventType.getExplicitContent();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(1, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("description".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertContributorType(XSComplexType contributorType) {
    assertEquals("contributor", contributorType.getName());
    assertFalse(contributorType.isAbstract());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "anyType", contributorType.getBaseType());
    assertEquals(RESTRICTION, contributorType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = contributorType.getAttributeUses();
    assertEquals(1, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("id".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "ID", attributeDecl.getType());
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = contributorType.getContentType();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(2, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("contactName".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else if ("emails".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        XSType emailListType = elementDecl.getType();
        assertEmailListType(emailListType);
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertRepositoryType(XSComplexType repositoryType) {
    assertEquals("repository", repositoryType.getName());
    assertFalse(repositoryType.isAbstract());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "anyType", repositoryType.getBaseType());
    assertEquals(RESTRICTION, repositoryType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = repositoryType.getAttributeUses();
    assertEquals(1, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("id".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "ID", attributeDecl.getType());
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = repositoryType.getContentType();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(2, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("location".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else if ("email".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(CITE_NAMESPACE, "EMail", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertSourceType(XSComplexType sourceType) {
    assertEquals("source", sourceType.getName());
    assertFalse(sourceType.isAbstract());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "anyType", sourceType.getBaseType());
    assertEquals(RESTRICTION, sourceType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = sourceType.getAttributeUses();
    assertEquals(1, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("id".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "ID", attributeDecl.getType());
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = sourceType.getContentType();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(4, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("title".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else if ("link".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else if ("infoSets".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.valueOf(XSParticle.UNBOUNDED), childElement.getMaxOccurs());
        assertQNameEquals(CITE_NAMESPACE, "infoSet", elementDecl.getType());
      }
      else if ("repository".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertSame(sourceType.getOwnerSchema().getElementDecls().get("repository"), elementDecl);
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertNoteType(XSComplexType noteType) {
    assertEquals("note", noteType.getName());
    assertFalse(noteType.isAbstract());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "anyType", noteType.getBaseType());
    assertEquals(RESTRICTION, noteType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = noteType.getAttributeUses();
    assertEquals(0, attributes.size());

    XSContentType contentType = noteType.getContentType();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(1, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("text".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertInfosetType(XSComplexType infosetType) {
    assertEquals("infoSet", infosetType.getName());
    assertFalse(infosetType.isAbstract());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "anyType", infosetType.getBaseType());
    assertEquals(RESTRICTION, infosetType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = infosetType.getAttributeUses();
    assertEquals(1, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("id".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "ID", attributeDecl.getType());
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = infosetType.getContentType();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(4, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("inferences".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.valueOf(XSParticle.UNBOUNDED), childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "IDREF", elementDecl.getType());
      }
      else if ("contributor".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertSame(infosetType.getOwnerSchema().getElementDecls().get("contributor"), elementDecl);
      }
      else if ("source".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "IDREF", elementDecl.getType());
      }
      else if ("sourceReference".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertPersonType(XSComplexType personType) {
    assertEquals("person", personType.getName());
    assertFalse(personType.isAbstract());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "anyType", personType.getBaseType());
    assertEquals(RESTRICTION, personType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = personType.getAttributeUses();
    assertEquals(1, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("id".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "ID", attributeDecl.getType());
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = personType.getContentType();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(7, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("gender".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(DATA_NAMESPACE, "gender", elementDecl.getType());
      }
      else if ("names".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.valueOf(XSParticle.UNBOUNDED), childElement.getMaxOccurs());
        assertQNameEquals(DATA_NAMESPACE, "name", elementDecl.getType());
      }
      else if ("events".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.valueOf(XSParticle.UNBOUNDED), childElement.getMaxOccurs());
        assertQNameEquals(DATA_NAMESPACE, "event", elementDecl.getType());
      }
      else if ("facts".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.valueOf(XSParticle.UNBOUNDED), childElement.getMaxOccurs());
        assertQNameEquals(DATA_NAMESPACE, "fact", elementDecl.getType());
      }
      else if ("relationships".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.valueOf(XSParticle.UNBOUNDED), childElement.getMaxOccurs());
        assertQNameEquals(DATA_NAMESPACE, "relationship", elementDecl.getType());
      }
      else if ("picture".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "base64Binary", elementDecl.getType());
      }
      else if ("notes".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertNoteAnonymousType(elementDecl);
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertNoteAnonymousType(XSElementDecl elementDecl) {
    XSType noteType = elementDecl.getType();
    assertTrue(noteType.isComplexType());
    XSParticle particle = noteType.asComplexType().getContentType().asParticle();
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(1, childElements.length);
    XSElementDecl entryElement = childElements[0].getTerm().asElementDecl();
    assertEquals("entry", entryElement.getName());
    assertEquals(BigInteger.ZERO, childElements[0].getMinOccurs());
    assertEquals(BigInteger.valueOf(XSParticle.UNBOUNDED), childElements[0].getMaxOccurs());

    particle = entryElement.getType().asComplexType().getContentType().asParticle();
    assertTrue(particle.getTerm().isModelGroup());
    modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    childElements = modelGroup.getChildren();
    assertEquals(2, childElements.length);
    XSElementDecl keyElement = childElements[0].getTerm().asElementDecl();
    assertEquals("key", keyElement.getName());
    assertEquals(BigInteger.ONE, childElements[0].getMinOccurs());
    assertEquals(BigInteger.ONE, childElements[0].getMaxOccurs());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", keyElement.getType());

    XSElementDecl valueElement = childElements[1].getTerm().asElementDecl();
    assertEquals("value", valueElement.getName());
    assertEquals(BigInteger.ONE, childElements[1].getMinOccurs());
    assertEquals(BigInteger.ONE, childElements[1].getMaxOccurs());
    assertQNameEquals(CITE_NAMESPACE, "note", valueElement.getType());
  }

  protected void assertRelationshipType(XSComplexType relationshipType) {
    assertEquals("relationship", relationshipType.getName());
    assertFalse(relationshipType.isAbstract());
    assertQNameEquals(DATA_NAMESPACE, "assertion", relationshipType.getBaseType());
    assertEquals(EXTENSION, relationshipType.getDerivationMethod());
    assertEquals(1, relationshipType.getAttributeUses().size());

    XSContentType contentType = relationshipType.getExplicitContent();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(3, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("type".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        XSType relationshipTypeType = elementDecl.getType();
        assertRelationshipTypeType(relationshipTypeType);
      }
      else if ("sourcePersonName".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(DATA_NAMESPACE, "name", elementDecl.getType());
      }
      else if ("targetPersonName".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(DATA_NAMESPACE, "name", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertNameType(XSComplexType nameType) {
    assertEquals("name", nameType.getName());
    assertFalse(nameType.isAbstract());
    assertQNameEquals(DATA_NAMESPACE, "assertion", nameType.getBaseType());
    assertEquals(EXTENSION, nameType.getDerivationMethod());
    assertEquals(1, nameType.getAttributeUses().size());

    XSContentType contentType = nameType.getExplicitContent();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(1, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("value".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertGenderType(XSComplexType genderType) {
    assertEquals("gender", genderType.getName());
    assertFalse(genderType.isAbstract());
    assertQNameEquals(DATA_NAMESPACE, "assertion", genderType.getBaseType());
    assertEquals(EXTENSION, genderType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = genderType.getAttributeUses();
    assertEquals(2, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("type".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(DATA_NAMESPACE, "genderType", attributeDecl.getType());
      }
      else if ("id".equals(attributeName)) {
        //fall through...
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = genderType.getExplicitContent();
    assertSame(contentType, contentType.asEmpty());
  }

  protected void assertFactType(XSComplexType factType) {
    assertEquals("fact", factType.getName());
    assertFalse(factType.isAbstract());
    assertQNameEquals(DATA_NAMESPACE, "occurringAssertion", factType.getBaseType());
    assertEquals(EXTENSION, factType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = factType.getAttributeUses();
    assertEquals(2, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("type".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(DATA_NAMESPACE, "factType", attributeDecl.getType());
      }
      else if ("id".equals(attributeName)) {
        //fall through...
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = factType.getExplicitContent();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(2, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("description".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else if ("value".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertAssertionType(XSComplexType assertionType) {
    assertEquals("assertion", assertionType.getName());
    assertTrue(assertionType.isAbstract());
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "anyType", assertionType.getBaseType());
    assertEquals(RESTRICTION, assertionType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = assertionType.getAttributeUses();
    assertEquals(1, attributes.size());
    for (XSAttributeUse attribute : attributes) {
      XSAttributeDecl attributeDecl = attribute.getDecl();
      String attributeName = attributeDecl.getName();
      if ("id".equals(attributeName)) {
        assertFalse(attribute.isRequired());
        assertNull(attributeDecl.getDefaultValue());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "ID", attributeDecl.getType());
      }
      else {
        fail("Unknown attribute: " + attributeName);
      }
    }

    XSContentType contentType = assertionType.getContentType();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(2, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("note".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else if ("infoSet".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "IDREF", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertOccurringAssertionType(XSComplexType assertionType) {
    assertEquals("occurringAssertion", assertionType.getName());
    assertTrue(assertionType.isAbstract());
    assertQNameEquals(DATA_NAMESPACE, "assertion", assertionType.getBaseType());
    assertEquals(EXTENSION, assertionType.getDerivationMethod());

    Collection<? extends XSAttributeUse> attributes = assertionType.getAttributeUses();
    assertEquals(1, attributes.size());

    XSContentType contentType = assertionType.getExplicitContent();
    XSParticle particle = contentType.asParticle();
    assertNotNull(particle);
    assertTrue(particle.getTerm().isModelGroup());
    XSModelGroup modelGroup = particle.getTerm().asModelGroup();
    assertEquals(XSModelGroup.Compositor.SEQUENCE, modelGroup.getCompositor());
    XSParticle[] childElements = modelGroup.getChildren();
    assertEquals(2, childElements.length);
    for (XSParticle childElement : childElements) {
      assertTrue(childElement.getTerm().isElementDecl());
      XSElementDecl elementDecl = childElement.getTerm().asElementDecl();
      String childElementName = elementDecl.getName();
      if ("date".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "dateTime", elementDecl.getType());
      }
      else if ("place".equals(childElementName)) {
        assertEquals(BigInteger.ZERO, childElement.getMinOccurs());
        assertEquals(BigInteger.ONE, childElement.getMaxOccurs());
        assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", elementDecl.getType());
      }
      else {
        fail("Unknown child element: " + childElementName);
      }
    }
  }

  protected void assertGenderTypeType(XSSimpleType genderTypeType) {
    assertEquals("genderType", genderTypeType.getName());
    assertTrue(genderTypeType.isRestriction());
    XSRestrictionSimpleType restriction = genderTypeType.asRestriction();
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", restriction.getSimpleBaseType());

    //test all the facets of the enumeration...
    HashSet<String> enums = new HashSet<String>(Arrays.asList("m", "f"));
    List<XSFacet> facets = restriction.getDeclaredFacets(XSFacet.FACET_ENUMERATION);
    assertEquals(enums.size(), facets.size());
    for (XSFacet facet : facets) {
      assertTrue(enums.remove(facet.getValue().toString()));
    }
    assertTrue(enums.isEmpty());
  }

  protected void assertFactTypeType(XSSimpleType factTypeType) {
    assertEquals("factType", factTypeType.getName());
    assertTrue(factTypeType.isRestriction());
    XSRestrictionSimpleType restriction = factTypeType.asRestriction();
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", restriction.getSimpleBaseType());

    //test all the facets of the enumeration...
    HashSet<String> enums = new HashSet<String>(Arrays.asList("occupation", "possessions", "race", "nation_of_origin", "physical_description"));
    List<XSFacet> facets = restriction.getDeclaredFacets(XSFacet.FACET_ENUMERATION);
    assertEquals(enums.size(), facets.size());
    for (XSFacet facet : facets) {
      assertTrue(enums.remove(facet.getValue().toString()));
    }
    assertTrue(enums.isEmpty());
  }

  protected void assertEventTypeType(XSSimpleType eventTypeType) {
    assertEquals("eventType", eventTypeType.getName());
    assertTrue(eventTypeType.isRestriction());
    XSRestrictionSimpleType restriction = eventTypeType.asRestriction();
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", restriction.getSimpleBaseType());

    //test all the facets of the enumeration...
    HashSet<String> enums = new HashSet<String>(Arrays.asList("birth", "christening", "marriage", "death", "burial"));
    List<XSFacet> facets = restriction.getDeclaredFacets(XSFacet.FACET_ENUMERATION);
    assertEquals(enums.size(), facets.size());
    for (XSFacet facet : facets) {
      assertTrue(enums.remove(facet.getValue().toString()));
    }
    assertTrue(enums.isEmpty());
  }

  protected void assertRelationshipTypeType(XSType relationshipTypeType) {
    assertTrue(relationshipTypeType.isLocal());
    assertTrue(relationshipTypeType.isSimpleType());
    XSSimpleType asSimpleType = relationshipTypeType.asSimpleType();
    assertTrue(asSimpleType.isRestriction());
    XSRestrictionSimpleType restriction = asSimpleType.asRestriction();
    assertQNameEquals(W3C_XML_SCHEMA_NS_URI, "string", restriction.getSimpleBaseType());

    //test all the facets of the enumeration...
    HashSet<String> enums = new HashSet<String>(Arrays.asList("spouse", "parent", "child"));
    List<XSFacet> facets = restriction.getDeclaredFacets(XSFacet.FACET_ENUMERATION);
    assertEquals(enums.size(), facets.size());
    for (XSFacet facet : facets) {
      assertTrue(enums.remove(facet.getValue().toString()));
    }
    assertTrue(enums.isEmpty());
  }

  protected void assertEmailListType(XSType emailListType) {
    assertFalse(emailListType.isGlobal());
    assertTrue(emailListType.isSimpleType());
    XSSimpleType asSimpleType = emailListType.asSimpleType();
    assertTrue(asSimpleType.isList());
    XSListSimpleType listType = asSimpleType.asList();
    assertQNameEquals(CITE_NAMESPACE, "EMail", listType.getItemType());
  }

  protected void assertPersonRootElement(XSElementDecl personElement) {
    assertEquals("person", personElement.getName());
    XSType personType = personElement.getType();
    assertEquals("person", personType.getName());
    assertEquals(DATA_NAMESPACE, personType.getTargetNamespace());
  }

  public static void assertQNameEquals(String targetNamespace, String name, XSDeclaration declaration) {
    assertEquals(new QName(targetNamespace, name), getQName(declaration));
  }

  public static QName getQName(XSDeclaration declaration) {
    return new QName(declaration.getTargetNamespace(), declaration.getName());
  }

  private static class ThrowEverythingHandler implements ErrorHandler {

    public void warning(SAXParseException exception) throws SAXException {
      throw new SAXException(exception);
    }

    public void error(SAXParseException exception) throws SAXException {
      throw new SAXException(exception);
    }

    public void fatalError(SAXParseException exception) throws SAXException {
      throw new SAXException(exception);
    }
  }

}
TOP

Related Classes of org.codehaus.enunciate.modules.xml.TestFullXMLAPI

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.