You are viewing a plain text version of this content. The canonical link for it is here.
Posted to woden-dev@ws.apache.org by sa...@apache.org on 2009/09/01 07:49:07 UTC

svn commit: r809831 [8/10] - in /webservices/woden/trunk/java/woden-commons: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/woden/ src/main/java/org/apache/woden/internal/ src/main/java/org/apache...

Added: webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/extensions/soap/SOAPModuleImpl.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/extensions/soap/SOAPModuleImpl.java?rev=809831&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/extensions/soap/SOAPModuleImpl.java (added)
+++ webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/extensions/soap/SOAPModuleImpl.java Tue Sep  1 05:49:02 2009
@@ -0,0 +1,236 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.woden.internal.wsdl20.extensions.soap;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Vector;
+
+import javax.xml.namespace.QName;
+
+import org.apache.woden.internal.wsdl20.extensions.AttributeExtensibleImpl;
+import org.apache.woden.internal.wsdl20.extensions.ElementExtensibleImpl;
+import org.apache.woden.wsdl20.WSDLComponent;
+import org.apache.woden.wsdl20.extensions.ExtensionElement;
+import org.apache.woden.wsdl20.extensions.soap.SOAPModule;
+import org.apache.woden.wsdl20.extensions.soap.SOAPModuleElement;
+import org.apache.woden.wsdl20.xml.DocumentationElement;
+import org.apache.woden.wsdl20.xml.WSDLElement;
+import org.apache.woden.xml.XMLAttr;
+
+/**
+ * This class represents the SOAPModule Component and the <wsoap:module> 
+ * extension element that can appear within a Binding, Binding Fault, 
+ * Binding Operation, Binding Fault Reference or Binding Message Reference.
+ * 
+ * @author jkaputin@apache.org
+ */
+public class SOAPModuleImpl implements SOAPModule, SOAPModuleElement 
+{
+    private WSDLElement fParent = null;
+    private List fDocumentationElements = new Vector();
+    private QName fExtElementType = null;
+    private Boolean fRequired = null;
+    private AttributeExtensibleImpl fAttrExt = new AttributeExtensibleImpl();
+    private ElementExtensibleImpl fElemExt = new ElementExtensibleImpl();
+    private URI fRef = null;
+    
+
+    /* ***********************************************************************
+     *  Component model methods (SOAPModule interface), shared with Element model
+     * ***********************************************************************/
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModule#getRef()
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModuleElement#getRef()
+     */
+    public URI getRef() {
+        return fRef;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModule#isRequired()
+     * @see org.apache.woden.wsdl20.extensions.ExtensionElement#isRequired()
+     */
+    public Boolean isRequired() {
+        return fRequired;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModule#getParent()
+     */
+    public WSDLComponent getParent() {
+        return (WSDLComponent)fParent;
+    }
+    
+    /* 
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModule#toElement()
+     */
+    public SOAPModuleElement toElement() {
+        return this;
+    }
+    
+
+    /* ***********************************************************************
+     *  Element model-only methods (SOAPModuleElement interface)
+     * ***********************************************************************/
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModuleElement#setRef(java.net.URI)
+     */
+    public void setRef(URI uri) {
+        fRef = uri;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModuleElement#setParentElement(org.apache.woden.wsdl20.xml.WSDLElement)
+     */
+    public void setParentElement(WSDLElement wsdlEl) {
+        fParent = wsdlEl;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModuleElement#getParentElement()
+     */
+    public WSDLElement getParentElement() {
+        return fParent;
+    }
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModuleElement#addDocumentationElement(org.apache.woden.wsdl20.xml.DocumentationElement)
+     */
+    public void addDocumentationElement(DocumentationElement docEl) 
+    {
+        if(docEl != null) {
+            fDocumentationElements.add(docEl);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.soap.SOAPModuleElement#getDocumentationElements()
+     */
+    public DocumentationElement[] getDocumentationElements() 
+    {
+        DocumentationElement[] array = new DocumentationElement[fDocumentationElements.size()];
+        fDocumentationElements.toArray(array);
+        return array;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ExtensionElement#setElementQName(javax.xml.namespace.QName)
+     */
+    public void setExtensionType(QName qname) {
+        fExtElementType = qname;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ExtensionElement#getElementQName()
+     */
+    public QName getExtensionType() {
+        return fExtElementType;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ExtensionElement#setRequired(java.lang.Boolean)
+     */
+    public void setRequired(Boolean required) {
+        fRequired = required;
+    }
+    
+    /* ***********************************************************************
+     *  Extensibility methods
+     * ***********************************************************************/
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.AttributeExtensible#setExtensionAttribute(javax.xml.namespace.QName, org.apache.woden.xml.XMLAttr)
+     */
+    public void setExtensionAttribute(QName attrType, XMLAttr attr) 
+    {
+        fAttrExt.setExtensionAttribute(attrType, attr);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.AttributeExtensible#getExtensionAttribute(javax.xml.namespace.QName)
+     */
+    public XMLAttr getExtensionAttribute(QName attrType) 
+    {
+        return fAttrExt.getExtensionAttribute(attrType);
+    }
+
+    /* (non-Javadoc)
+     */
+    public XMLAttr[] getExtensionAttributesForNamespace(URI namespace) 
+    {
+        return fAttrExt.getExtensionAttributesForNamespace(namespace);
+    }
+    
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.AttributeExtensible#getExtensionAttributes()
+     */
+    public XMLAttr[] getExtensionAttributes() 
+    {
+        return fAttrExt.getExtensionAttributes();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.AttributeExtensible#hasExtensionAttributesForNamespace(java.net.URI)
+     */
+    public boolean hasExtensionAttributesForNamespace(URI namespace) 
+    {
+        return fAttrExt.hasExtensionAttributesForNamespace(namespace);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ElementExtensible#addExtensionElement(org.apache.woden.wsdl20.extensions.ExtensionElement)
+     */
+    public void addExtensionElement(ExtensionElement extEl) 
+    {
+        fElemExt.addExtensionElement(extEl);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ElementExtensible#removeExtensionElement(org.apache.woden.wsdl20.extensions.ExtensionElement)
+     */
+    public void removeExtensionElement(ExtensionElement extEl) 
+    {
+        fElemExt.removeExtensionElement(extEl);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ElementExtensible#getExtensionElements()
+     */
+    public ExtensionElement[] getExtensionElements() 
+    {
+        return fElemExt.getExtensionElements();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ElementExtensible#getExtensionElementsOfType(javax.xml.namespace.QName)
+     */
+    public ExtensionElement[] getExtensionElementsOfType(QName extType) 
+    {
+        return fElemExt.getExtensionElementsOfType(extType);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.extensions.ElementExtensible#hasExtensionElementsForNamespace(java.net.URI)
+     */
+    public boolean hasExtensionElementsForNamespace(URI namespace) 
+    {
+        return fElemExt.hasExtensionElementsForNamespace(namespace);
+    }
+
+}

Added: webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLComponentValidator.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLComponentValidator.java?rev=809831&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLComponentValidator.java (added)
+++ webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLComponentValidator.java Tue Sep  1 05:49:02 2009
@@ -0,0 +1,890 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.woden.internal.wsdl20.validation;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.woden.ErrorReporter;
+import org.apache.woden.WSDLException;
+import org.apache.woden.internal.ErrorLocatorImpl;
+import org.apache.woden.internal.wsdl20.Constants;
+import org.apache.woden.types.NCName;
+import org.apache.woden.wsdl20.Binding;
+import org.apache.woden.wsdl20.BindingFault;
+import org.apache.woden.wsdl20.BindingFaultReference;
+import org.apache.woden.wsdl20.BindingMessageReference;
+import org.apache.woden.wsdl20.BindingOperation;
+import org.apache.woden.wsdl20.Description;
+import org.apache.woden.wsdl20.Endpoint;
+import org.apache.woden.wsdl20.Interface;
+import org.apache.woden.wsdl20.InterfaceFault;
+import org.apache.woden.wsdl20.InterfaceFaultReference;
+import org.apache.woden.wsdl20.InterfaceMessageReference;
+import org.apache.woden.wsdl20.InterfaceOperation;
+import org.apache.woden.wsdl20.Service;
+import org.apache.woden.wsdl20.WSDLComponent;
+
+/**
+ * The WSDL component validator can validate a WSDL 2.0 component model
+ * against the assertions defined in the WSDL 2.0 specification. The
+ * WSDL 2.0 component assertions are currently available in the
+ * non-normative version of the WSDL 2.0 specification and can be viewed at
+ * http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html?content-type=text/html;%20charset=utf-8#assertionsummary
+ */
+public class WSDLComponentValidator 
+{
+  /**
+   * Validate the WSDL 2.0 component model described by the
+   * description component.
+   * 
+   * @param desc The description component of the WSDL 2.0 component model.
+   * @param errorReporter An error reporter to be used for reporting errors found with the model.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the WSDL 2.0 component model.
+   */
+  public void validate(Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+    validateInterfaces(desc.getInterfaces(), errorReporter);
+    validateBindings(desc.getBindings(), desc, errorReporter);
+    validateServices(desc.getServices(), desc, errorReporter);	
+  }
+	
+  /**
+   * Validate the interfaces in the WSDL component model.
+   * 
+   * @param interfaces The interfaces in the WSDL component model.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the interface components.
+   */
+  protected void validateInterfaces(Interface[] interfaces, ErrorReporter errorReporter) throws WSDLException
+  {
+	testAssertionInterface1010(interfaces, errorReporter);
+	  
+	int numInterfaces = interfaces.length;
+	for(int i = 0; i < numInterfaces; i++)
+	{
+      Interface interfac = interfaces[i];
+      
+	  testAssertionInterface1009(interfac, errorReporter);
+	  
+	  validateInterfaceOperations(interfac, interfac.getInterfaceOperations(), errorReporter);
+	}
+  }
+  
+  /**
+   * Validate the interface operations in the WSDL component model.
+   * 
+   * @param interfac The interface that contains the interface operations.
+   * @param interfaceOperations An array of the interface operations.
+   * @param errorReporter An error reporter.
+   * @throws WSDLException
+   */
+  protected void validateInterfaceOperations(Interface interfac, InterfaceOperation[] interfaceOperations, ErrorReporter errorReporter) throws WSDLException
+  {
+	int numInterfaceOperations = interfaceOperations.length;
+	for(int j = 0; j < numInterfaceOperations; j++)
+	{
+      InterfaceOperation interfaceOperation = interfaceOperations[j];
+		
+      testAssertionMEP1022(interfaceOperation.getMessageExchangePattern(), errorReporter);
+		
+      validateInterfaceMessageReferences(interfaceOperation.getInterfaceMessageReferences(), errorReporter);
+		
+      validateInterfaceFaultReferences(interfaceOperation.getInterfaceFaultReferences(), errorReporter);
+    }
+  }
+  
+  /**
+   * Validate the interface message references in the WSDL component model.
+   * 
+   * @param messageReferences An array containing the interface message references.
+   * @param errorReporter An error reporter.
+   * @throws WSDLException
+   */
+  protected void validateInterfaceMessageReferences(InterfaceMessageReference[] messageReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+    testAssertionInterfaceMessageReference1029(messageReferences, errorReporter);
+		
+    int numMessageReferences = messageReferences.length;
+    for(int k = 0; k < numMessageReferences; k++)
+    {
+      InterfaceMessageReference messageReference = messageReferences[k];
+		  
+      testAssertionInterfaceMessageReference1028(messageReference, errorReporter);
+    }
+  }
+  
+  /**
+   * Validate the interface fault references in the WSDL component model.
+   * 
+   * @param faultReferences An array containing the interface fault references.
+   * @param errorReporter An error reporter.
+   * @throws WSDLException
+   */
+  protected void validateInterfaceFaultReferences(InterfaceFaultReference[] faultReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+	testAssertionInterfaceFaultReference1039(faultReferences, errorReporter);
+		
+//    int numFaultReferences = faultReferences.length;
+//    for(int k = 0; k < numFaultReferences; k++)
+//    {
+//      InterfaceFaultReference faultReference = faultReferences[k];
+//      //TODO check if any validation is required here
+//    }
+  }
+  
+  /**
+   * Validate the bindings in the WSDL component model.
+   * 
+   * @param bindings The bindings in the WSDL component model.
+   * @param desc The WSDL 2.0 description component.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the binding components.
+   */
+  protected void validateBindings(Binding[] bindings, Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+	  testAssertionBinding1049(bindings, errorReporter);
+	  
+	  int numBindings = bindings.length;
+	  for(int i = 0; i < numBindings; i++)
+	  {
+		  Binding binding = bindings[i];
+		  testAssertionBinding1044(binding, errorReporter);
+		  testAssertionBinding1045(binding, errorReporter);
+		  testAssertionBinding1048(binding, errorReporter);
+		  
+		  validateBindingOperations(binding.getBindingOperations(), desc, errorReporter);
+		  
+		  validateBindingFaults(binding.getBindingFaults(), desc, errorReporter);
+	  }
+  }
+  
+  /**
+   * Validate the binding operations in the WSDL component model.
+   *  
+   * @param bindingOperations The bindings operations in the WSDL component model.
+   * @param desc The WSDL 2.0 description component.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the binding operation components.
+   */
+  protected void validateBindingOperations(BindingOperation[] bindingOperations, Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+	  testAssertionBindingOperation1051(bindingOperations, errorReporter);
+	  
+	  int numBindingOperations = bindingOperations.length;
+	  for(int i = 0; i < numBindingOperations; i++)
+	  {
+		  BindingOperation bindingOperation = bindingOperations[i];
+		  validateBindingMessageReferences(bindingOperation.getBindingMessageReferences(), desc, errorReporter);
+		  validateBindingFaultReferences(bindingOperation.getBindingFaultReferences(), desc, errorReporter);
+	  }
+	  
+  }
+  
+  /**
+   * Validate the binding message references in the WSDL component model.
+   * 
+   * @param bindingMessageReferences The bindings message references in the WSDL component model.
+   * @param desc The WSDL 2.0 description component.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the binding message reference components.
+   */
+  protected void validateBindingMessageReferences(BindingMessageReference[] bindingMessageReferences, Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+	  testAssertionBindingMessageReference1052(bindingMessageReferences, errorReporter);
+	  
+	  int numBindingMessageReferences = bindingMessageReferences.length;
+	  
+	  for(int i = 0; i < numBindingMessageReferences; i++)
+	  {
+		BindingMessageReference bindingMessageReference = bindingMessageReferences[i];
+        //TODO check if any validation is required here
+	  }
+  }
+  
+  /**
+   * Validate the binding fault references in the WSDL component model.
+   * 
+   * @param bindingFaultReferences The bindings fault references in the WSDL component model.
+   * @param desc The WSDL 2.0 description component.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the binding fault reference components.
+   */
+  protected void validateBindingFaultReferences(BindingFaultReference[] bindingFaultReferences, Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+	  testAssertionBindingFaultReference1055(bindingFaultReferences, errorReporter);
+	  
+	  int numBindingFaultReferences = bindingFaultReferences.length;
+	  for(int i = 0; i < numBindingFaultReferences; i++)
+	  {
+		BindingFaultReference bindingFaultReference = bindingFaultReferences[i];
+	    testAssertionBindingFaultReference1059(bindingFaultReference, errorReporter);
+	  }
+  }
+  
+  /**
+   * Validate the binding faults in the WSDL component model.
+   * 
+   * @param bindingFaults The bindings faults in the WSDL component model.
+   * @param desc The WSDL 2.0 description component.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the binding fault components.
+   */
+  protected void validateBindingFaults(BindingFault[] bindingFaults, Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+	testAssertionBindingFault1050(bindingFaults, errorReporter);
+	
+	int numBindingFaults = bindingFaults.length;
+	
+	for(int i = 0; i < numBindingFaults; i++)
+	{
+	  BindingFault bindingFault = bindingFaults[i];
+      //TODO check if any validation is required here
+	}
+  }
+  
+  /**
+   * Validate the services in the WSDL component model.
+   * 
+   * @param services The services in the WSDL component model.
+   * @param desc The WSDL 2.0 description component.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the service components.
+   */
+  protected void validateServices(Service[] services, Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+	  testAssertionService1060(services, errorReporter);
+	  
+	  int numServices = services.length;
+	  for(int i = 0; i < numServices; i++)
+	  {
+		  Service service = services[i];
+		  
+		  validateEndpoints(service.getEndpoints(), desc, errorReporter);
+	  }
+  }
+  
+  /**
+   * Validate the endpoints in a service component in the WSDL component model.
+   * 
+   * @param endpoints The endpoints in a service in the WSDL component model.
+   * @param desc The WSDL 2.0 description component.
+   * @param errorReporter An error reporter to be used for reporting errors.
+   * @throws WSDLException A WSDLException is thrown if a problem occurs while validating the endpoint components.
+   */
+  protected void  validateEndpoints(Endpoint[] endpoints, Description desc, ErrorReporter errorReporter) throws WSDLException
+  {
+	  int numEndpoints = endpoints.length;
+	  for(int i = 0; i < numEndpoints; i++)
+	  {
+		  Endpoint endpoint = endpoints[i];
+		  testAssertionEndpoint1061(endpoint, errorReporter);
+		  testAssertionEndpoint1062(endpoint, errorReporter);
+	  }
+  }
+  
+  /**
+   * Test assertion Interface-1009. An interface cannot appear, either directly or indirectly,
+   * in the list of interfaces it extends.
+   * 
+   * @param interfac The interface to check.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionInterface1009(Interface interfac, ErrorReporter errorReporter) throws WSDLException
+  {
+	Interface[] extendedInterfaces = interfac.getExtendedInterfaces();
+	Interface extendedInterface = containsInterface(interfac, extendedInterfaces);
+	if(extendedInterface != null)
+	{
+	  errorReporter.reportError(new ErrorLocatorImpl(), "Interface-1009", new Object[]{extendedInterface.getName()}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+	}
+	return true;
+  }
+	
+  /**
+   * Helper method for testAssertionInterface0027.
+   * Check whether the specified interface is in the array of provided
+   * interfaces or in an array of interfaces one of the interfaces extends.
+   * 
+   * @param interfac The interface to check for.
+   * @param extendedInterfaces An array of extened interfaces to check for this interface.
+   * @return The interface that is equal to or extends this interface, or null if the interface is not contained.
+   */
+  private Interface containsInterface(Interface interfac, Interface[] extendedInterfaces)
+  {
+	int numExtInterfaces = extendedInterfaces.length;
+	for(int i = 0; i < numExtInterfaces; i++)
+	{
+	  if(interfac.equals(extendedInterfaces[i]))
+	    return extendedInterfaces[i];
+	  else if(containsInterface(interfac, extendedInterfaces[i].getExtendedInterfaces()) != null)
+		return extendedInterfaces[i];
+	}
+	return null;
+  }
+  
+  /**
+   * Test assertion Interface-1010. An interface must have a unique name out of all the interfaces
+   * in the description component.
+   * 
+   * @param interfaces The interfaces in the description component.
+   * @param errorReporter The error reporter.
+   * @return True if all the interfaces have unique names, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionInterface1010(Interface[] interfaces, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean duplicateFound = false;
+	List names = new ArrayList();
+	int numInterfaces = interfaces.length;
+	for(int i = 0; i < numInterfaces; i++)
+	{
+	  QName name = interfaces[i].getName();
+      if(name == null)
+        continue;
+	  if(names.contains(name))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "Interface-1010", new Object[]{name}, ErrorReporter.SEVERITY_ERROR);
+		duplicateFound = true;
+	  }
+	  else
+	  {
+		names.add(name);
+	  }
+	}
+	return !duplicateFound;
+  }
+  
+  /**
+   * Test assertion MEP-1022. A message exchange pattern must be an absolute IRI.
+   * 
+   * @param pattern The message exchange pattern to check.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionMEP1022(URI pattern, ErrorReporter errorReporter) throws WSDLException
+  {
+	if(!pattern.isAbsolute())
+	{
+	  errorReporter.reportError(new ErrorLocatorImpl(), "MEP-1022", new Object[]{pattern}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion InterfaceMessageReference-1028. When the {message content model} property 
+   * has the value #any or #none the {element declaration} property MUST be empty.
+   * 
+   * @param messageReference The interface message reference to check the message content model and element declarations.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionInterfaceMessageReference1028(InterfaceMessageReference messageReference, ErrorReporter errorReporter) throws WSDLException
+  {
+	String messContentModel = messageReference.getMessageContentModel();
+	if((messContentModel.equals(Constants.NMTOKEN_ANY) || messContentModel.equals(Constants.NMTOKEN_NONE)) 
+		&& messageReference.getElementDeclaration() != null)
+	{
+	  errorReporter.reportError(new ErrorLocatorImpl(), "InterfaceMessageReference-1028", new Object[]{}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion InterfaceMessageReference-1029. For each Interface Message Reference 
+   * component in the {interface message references} property of an Interface Operation 
+   * component, its {message label} property MUST be unique.
+   * 
+   * @param messageReferences The message references to check for duplicate names.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionInterfaceMessageReference1029(InterfaceMessageReference[] messageReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+	List messageLabels = new ArrayList();
+	int numMessageReferences = messageReferences.length;
+	for(int i = 0; i < numMessageReferences; i++)
+	{
+	  NCName messageLabel = messageReferences[i].getMessageLabel();
+      if(messageLabel == null)
+          continue;
+	  if(messageLabels.contains(messageLabel))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "InterfaceMessageReference-1029", new Object[]{messageLabel}, ErrorReporter.SEVERITY_ERROR);
+		return false;
+	  }
+	  else
+	  {
+		messageLabels.add(messageLabel);
+	  }
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion InterfaceFaultReference-1039. For each Interface Fault Reference 
+   * component in the {interface fault references} property of an Interface Operation 
+   * component, the combination of its {interface fault} and {message label} properties 
+   * MUST be unique.
+   * 
+   * @param faultReferences The fault references to check for duplicate fault/message label pairs.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionInterfaceFaultReference1039(InterfaceFaultReference[] faultReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+	Hashtable identifiers = new Hashtable();
+	
+	int numFaultReferences = faultReferences.length;
+	for(int i = 0; i < numFaultReferences; i++)
+	{
+	  InterfaceFault fault = faultReferences[i].getInterfaceFault();
+	  NCName messageLabel = faultReferences[i].getMessageLabel();
+      if(fault == null || messageLabel == null)
+    	continue;
+	  List messageLabels = (List)identifiers.get(fault);
+	  if(messageLabels != null && messageLabels.contains(messageLabel))
+	  {
+	    errorReporter.reportError(new ErrorLocatorImpl(), "InterfaceFaultReference-1039", new Object[]{fault, messageLabel}, ErrorReporter.SEVERITY_ERROR);
+		return false;
+      }
+	  else
+	  {
+		if(messageLabels == null)
+		  messageLabels = new ArrayList();
+		messageLabels.add(messageLabel);
+		identifiers.put(fault, messageLabels);
+	  }
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion Binding-1044. If a Binding component specifies any 
+   * operation-specific binding details (by including Binding Operation 
+   * components) or any fault binding details (by including Binding Fault 
+   * components) then it MUST specify an interface the Binding  component 
+   * applies to, so as to indicate which interface the operations come from.
+   * 
+   * @param binding The binding for which to check the contstraint.
+   * @param errorReporter The error Reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBinding1044(Binding binding, ErrorReporter errorReporter) throws WSDLException
+  {
+	BindingOperation[] bindingOperations = binding.getBindingOperations();
+	BindingFault[] bindingFaults = binding.getBindingFaults();
+	Interface bindingInterface = binding.getInterface();
+	if(((bindingOperations != null && bindingOperations.length > 0) || 
+		(bindingFaults != null && bindingFaults.length > 0)) && 
+		 bindingInterface == null)
+	{
+	  errorReporter.reportError(new ErrorLocatorImpl(), "Binding-1044", new Object[]{}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+	}
+    return true;
+  }
+  
+  /**
+   * Test assertion Binding-1045. A Binding component that defines bindings 
+   * for an Interface component MUST define bindings for all the operations 
+   * of that Interface component.
+   * 
+   * @param binding The binding of which to check the binding operations.
+   * @param errorReporter The error reporter.
+   * @return True if the all the operations specified on the interface have bindings defined, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBinding1045(Binding binding, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean allInterfaceOperationsHaveBinding = true;
+    QName bindingQN = binding.getName();
+	String bindingName = bindingQN != null ? bindingQN.getLocalPart() : null;
+	
+	Interface interfac = binding.getInterface();
+	if(interfac == null)
+	  return true;
+	
+	BindingOperation[] bindingOperations = binding.getBindingOperations();
+	int numBindingOperations = bindingOperations.length;
+	List usedInterfaceOperationList = new ArrayList();
+	for(int i = 0; i < numBindingOperations; i++)
+	{
+	  InterfaceOperation io = bindingOperations[i].getInterfaceOperation();
+	  if(io != null)
+		usedInterfaceOperationList.add(io);
+	}
+    // Check the interface operations.
+	if(!checkAllInterfaceOperationsHaveBinding(bindingName, interfac, usedInterfaceOperationList, errorReporter))
+	  allInterfaceOperationsHaveBinding = false;
+	
+	Interface[] extendedInterfaces = interfac.getExtendedInterfaces();
+	if(extendedInterfaces != null)
+	{
+	  int numExtendedInterfaces = extendedInterfaces.length;
+	  for(int i = 0; i < numExtendedInterfaces; i++)
+  	  {
+	    if(!checkAllInterfaceOperationsHaveBinding(bindingName, extendedInterfaces[i], usedInterfaceOperationList, errorReporter))
+	      allInterfaceOperationsHaveBinding = false;
+	  }
+	}
+	
+    return allInterfaceOperationsHaveBinding;
+  }
+  
+  /**
+   * Helper method for testAssertionBinding0055. This method checks that
+   * each interface operation in the provided interface has a binding 
+   * defined.
+   * 
+   * @param bindingName The name of the binding. Used in error reporting.
+   * @param interfac The interface of which to check the operations.
+   * @param usedInterfaceOperations A list of interface operations that have bindings specified.
+   * @param errorReporter The error reporter.
+   * @return True if all the interface operations have bindings defined, false otherwise.
+   * @throws WSDLException
+   */
+  private boolean checkAllInterfaceOperationsHaveBinding(String bindingName, Interface interfac, List usedInterfaceOperations, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean allInterfaceOperationsHaveBinding = true;
+	InterfaceOperation[] interfaceOperations = interfac.getInterfaceOperations();
+	if(interfaceOperations == null)
+	  return true;
+	
+	int numInterfaceOperations = interfaceOperations.length;
+	
+	// Check the interface operations.
+	for(int i = 0; i < numInterfaceOperations; i++)
+	{
+	  if(!usedInterfaceOperations.contains(interfaceOperations[i]))
+	  {
+	    errorReporter.reportError(new ErrorLocatorImpl(), "Binding-1045", new Object[]{bindingName, interfaceOperations[i].getName()}, ErrorReporter.SEVERITY_ERROR);
+		allInterfaceOperationsHaveBinding = false;
+	  }
+    }
+	return allInterfaceOperationsHaveBinding;
+  }
+  
+  /**
+   * Test assertion Binding-1048. The binding type xs:anyURI MUST be an 
+   * absolute IRI as defined by [IETF RFC 3987].
+   * 
+   * @param binding The binding of which to check the type.
+   * @param errorReporter The error reporter.
+   * @return True if the type is absolute, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBinding1048(Binding binding, ErrorReporter errorReporter) throws WSDLException
+  {
+	URI type = binding.getType();
+    if(type != null && !type.isAbsolute())
+    {
+      errorReporter.reportError(new ErrorLocatorImpl(), "Binding-1048", new Object[]{type}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+    }
+    return true;
+  }
+  
+  /**
+   * Test assertion Binding-1049. For each Binding component in the {bindings} property of a 
+   * Description component, the {name} property MUST be unique.
+   * 
+   * @param bindings The bindings in the description component.
+   * @param errorReporter The error reporter.
+   * @return True if the all the bindings have unique names, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBinding1049(Binding[] bindings, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean duplicateFound = false;
+	List names = new ArrayList();
+	int numBindings = bindings.length;
+	for(int i = 0; i < numBindings; i++)
+	{
+	  QName name = bindings[i].getName();
+      if(name == null)
+        continue;
+	  if(names.contains(name))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "Binding-1049", new Object[]{name}, ErrorReporter.SEVERITY_ERROR);
+		duplicateFound = true;
+	  }
+	  else
+	  {
+		names.add(name);
+	  }
+	}
+	return !duplicateFound;
+  }
+  
+  /**
+   * Test assertion BindingFault-1050. For each Binding Fault component in the 
+   * {binding faults} property of a Binding component, the {interface fault} 
+   * property MUST be unique.
+   * 
+   * @param bindingFaults The binding faults in the description component.
+   * @param errorReporter The error reporter.
+   * @return True if the all the bindings have unique names, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBindingFault1050(BindingFault[] bindingFaults, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean duplicateFound = false;
+	List usedInterfaceFaults = new ArrayList();
+	int numBindingFaults = bindingFaults.length;
+	for(int i = 0; i < numBindingFaults; i++)
+	{
+	  InterfaceFault interfaceFault = bindingFaults[i].getInterfaceFault();
+	  if(interfaceFault == null) 
+	    continue;
+	  if(usedInterfaceFaults.contains(interfaceFault))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "BindingFault-1050", new Object[]{}, ErrorReporter.SEVERITY_ERROR);
+		duplicateFound = true;
+	  }
+	  else
+	  {
+		usedInterfaceFaults.add(interfaceFault);
+	  }
+	}
+	return !duplicateFound;
+  }
+  
+  /**
+   * Test assertion BindingOperation-1051. For each Binding Operation component 
+   * in the {binding operations} property of a Binding component, the {interface 
+   * operation} property MUST be unique.
+   * 
+   * @param bindingOperations The binding operations to check for unique interface operations.
+   * @param errorReporter The error reporter.
+   * @return True if the all the binding operations have specified unique interface operations, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBindingOperation1051(BindingOperation[] bindingOperations, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean duplicateFound = false;
+	List specifiedInterfaceOperations = new ArrayList();
+	int numBindingOperations = bindingOperations.length;
+	for(int i = 0; i < numBindingOperations; i++)
+	{
+	  InterfaceOperation interfaceOperation = bindingOperations[i].getInterfaceOperation();
+	  if(interfaceOperation == null)
+	    continue;
+	  if(specifiedInterfaceOperations.contains(interfaceOperation))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "BindingOperation-1051", new Object[]{interfaceOperation.getName()}, ErrorReporter.SEVERITY_ERROR);
+		duplicateFound = true;
+	  }
+	  else
+	  {
+		specifiedInterfaceOperations.add(interfaceOperation);
+	  }
+	}
+	return !duplicateFound;
+  }
+  
+  /**
+   * Test assertion BindingMessageReference-1052. For each Binding Message 
+   * Reference component in the {binding message references} property of a 
+   * Binding Operation component, the {interface message reference} property 
+   * MUST be unique.
+   * 
+   * @param bindingMessageReferences The binding message references to check for unique interface message references.
+   * @param errorReporter The error reporter.
+   * @return True if the all the binding message references have specified unique interface message references, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBindingMessageReference1052(BindingMessageReference[] bindingMessageReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean duplicateFound = false;
+	List specifiedInterfaceMessageReferences = new ArrayList();
+	int numBindingMessageReferences = bindingMessageReferences.length;
+	for(int i = 0; i < numBindingMessageReferences; i++)
+	{
+	  InterfaceMessageReference interfaceMessageReference = bindingMessageReferences[i].getInterfaceMessageReference();
+	  if(interfaceMessageReference == null)
+	    continue;
+	  if(specifiedInterfaceMessageReferences.contains(interfaceMessageReference))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "BindingMessageReference-1052", new Object[]{interfaceMessageReference.getMessageLabel()}, ErrorReporter.SEVERITY_ERROR);
+		duplicateFound = true;
+	  }
+	  else
+	  {
+		specifiedInterfaceMessageReferences.add(interfaceMessageReference);
+	  }
+	}
+	return !duplicateFound;
+  }
+  
+  /**
+   * Test assertion BindingFaultReference-1055. For each Binding Fault Reference 
+   * component in the {binding fault references} property of a Binding Operation 
+   * component, the {interface fault reference} property MUST be unique.
+   * 
+   * @param bindingFaultReferences The binding fault references to check for unique interface fault references.
+   * @param errorReporter The error reporter.
+   * @return True if the all the binding fault references have specified unique interface fault references, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBindingFaultReference1055(BindingFaultReference[] bindingFaultReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean duplicateFound = false;
+	List specifiedInterfaceFaultReferences = new ArrayList();
+	int numBindingFaultReferences = bindingFaultReferences.length;
+	for(int i = 0; i < numBindingFaultReferences; i++)
+	{
+	  InterfaceFaultReference interfaceFaultReference = bindingFaultReferences[i].getInterfaceFaultReference();
+	  if(interfaceFaultReference == null)
+	    continue;
+	  if(specifiedInterfaceFaultReferences.contains(interfaceFaultReference))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "BindingFaultReference-1055", new Object[]{interfaceFaultReference.getMessageLabel()}, ErrorReporter.SEVERITY_ERROR);
+		duplicateFound = true;
+	  }
+	  else
+	  {
+		specifiedInterfaceFaultReferences.add(interfaceFaultReference);
+	  }
+	}
+	return !duplicateFound;
+  }
+  
+  /**
+   * Test assertion BindingFaultReference-1059. There MUST be an Interface Fault 
+   * Reference component in the {interface fault references} of the Interface 
+   * Operation being bound with {message label} equal to the effective message 
+   * label and with {interface fault} equal to an Interface Fault component with 
+   * {name} equal to the actual value of the ref attribute information item.
+   * 
+   * @param bindingFaultReference The binding fault reference to check if the specified interface fault reference exists.
+   * @param errorReporter The error reporter.
+   * @return True if the binding fault reference specifies a valid interface fault reference, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionBindingFaultReference1059(BindingFaultReference bindingFaultReference, ErrorReporter errorReporter) throws WSDLException
+  {
+	InterfaceFaultReference interfaceFaultReference = bindingFaultReference.getInterfaceFaultReference();
+	if(interfaceFaultReference == null)
+	{
+	  errorReporter.reportError(new ErrorLocatorImpl(), "BindingFaultReference-1059", new Object[]{}, ErrorReporter.SEVERITY_ERROR);
+      return false;
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion Service-1060. For each Service  component in the {services} property 
+   * of a Description component, the {name} property MUST be unique.
+   * 
+   * @param services An array containing all the services in the description component.
+   * @param errorReporter The error reporter.
+   * @return True if all services contain unique names, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionService1060(Service[] services, ErrorReporter errorReporter) throws WSDLException
+  {
+	List names = new ArrayList();
+	int numServices = services.length;
+	for(int i = 0; i < numServices; i++)
+	{
+	  QName name = services[i].getName();
+      if(name == null)
+        continue;
+	  if(names.contains(name))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "Service-1060", new Object[]{name}, ErrorReporter.SEVERITY_ERROR);
+		return false;
+	  }
+	  else
+	  {
+		names.add(name);
+	  }
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion Endpoint-1061. This xs:anyURI MUST be an absolute IRI as 
+   * defined by [IETF RFC 3987]. This xs:anyURI refers to the address IRI.
+   * 
+   * @param endpoint The endpoint of which the address should be checked.
+   * @param errorReporter The error reporter.
+   * @return True if the address IRI is absolute, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionEndpoint1061(Endpoint endpoint, ErrorReporter errorReporter) throws WSDLException
+  {
+	URI address = endpoint.getAddress();
+    if(address != null && !address.isAbsolute())
+    {
+      errorReporter.reportError(new ErrorLocatorImpl(), "Endpoint-1061", new Object[]{address}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+    }
+    return true;
+  }
+  
+  /**
+   * Test assertion Endpoint-1062. For each Endpoint component in the {endpoints} property 
+   * of a Service component, the {binding} property MUST either be a Binding component with 
+   * an unspecified {interface} property or a Binding component with an {interface} property 
+   * equal to the {interface} property of the Service component.
+   * 
+   * @param endpoint The endpoint of which the binding should be checked.
+   * @param errorReporter The error reporter.
+   * @return True if the binding specified the interface specified by the service or no interface, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionEndpoint1062(Endpoint endpoint, ErrorReporter errorReporter) throws WSDLException
+  {
+	Binding binding = endpoint.getBinding();
+	// If no binding has been specified this assertion does not apply.
+	if(binding == null)
+	  return true;
+	
+	Interface bindingInterface = binding.getInterface();
+	WSDLComponent parent = endpoint.getParent();
+	if(parent != null)
+	{
+	  Service service = (Service)parent;
+	  Interface serviceInterface = service.getInterface();
+	  
+	  // If an interface hasn't been specified on the service this assertion doesn't apply.
+	  // If the binding interface is null this assertion passes.
+	  if(serviceInterface != null && bindingInterface != null && !serviceInterface.equals(bindingInterface))
+	  {
+		errorReporter.reportError(new ErrorLocatorImpl(), "Endpoint-1062", new Object[]{binding, bindingInterface, serviceInterface}, ErrorReporter.SEVERITY_ERROR);
+		return false;  
+	  }
+	}
+	return true;
+  }
+}

Added: webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLDocumentValidator.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLDocumentValidator.java?rev=809831&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLDocumentValidator.java (added)
+++ webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLDocumentValidator.java Tue Sep  1 05:49:02 2009
@@ -0,0 +1,512 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.woden.internal.wsdl20.validation;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.woden.ErrorReporter;
+import org.apache.woden.WSDLException;
+import org.apache.woden.internal.ErrorLocatorImpl;
+import org.apache.woden.internal.wsdl20.Constants;
+import org.apache.woden.schema.ImportedSchema;
+import org.apache.woden.schema.InlinedSchema;
+import org.apache.woden.schema.Schema;
+import org.apache.woden.wsdl20.xml.DescriptionElement;
+import org.apache.woden.wsdl20.xml.ImportElement;
+import org.apache.woden.wsdl20.xml.InterfaceElement;
+import org.apache.woden.wsdl20.xml.InterfaceFaultElement;
+import org.apache.woden.wsdl20.xml.InterfaceFaultReferenceElement;
+import org.apache.woden.wsdl20.xml.InterfaceMessageReferenceElement;
+import org.apache.woden.wsdl20.xml.InterfaceOperationElement;
+import org.apache.woden.wsdl20.xml.TypesElement;
+import org.apache.ws.commons.schema.XmlSchema;
+import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaObjectTable;
+
+/**
+ * The WSDL document validator validates a WSDL XML model against the
+ * document assertions specified in the WSDL 2.0 specification.
+ */
+public class WSDLDocumentValidator 
+{
+  /**
+   * Validate the document representation of the WSDL document against
+   * the WSDL 2.0 specification.
+   * 
+   * @param descElement The WSDL 2.0 XML model description element.
+   * @param errorReporter The error reporter to use for any errors.
+   * @return True if the WSDL document representation is valid, false otherwise.
+   * @throws WSDLException
+   */
+  public boolean validate(DescriptionElement descElement, ErrorReporter errorReporter) throws WSDLException
+  {
+    boolean isValid = true;
+    
+    // Test the description element.
+    isValid = testAssertionDescription1006(descElement, errorReporter);
+    
+    // Test the import elements.
+    ImportElement[] imports = descElement.getImportElements();
+    int numImports = imports.length;
+    for(int i = 0; i < numImports; i++)
+    {
+      // TODO: Implement methods once import elements are supported.
+//	  if(!testAssertionImport0001(imports[i], errorReporter))
+//		isValid = false;
+//	  if(!testAssertionImport0003(imports[i], errorReporter))
+//		isValid = false;
+    }
+	if(!validateTypes(descElement.getTypesElement(), errorReporter))
+	  isValid = false;
+	
+	if(!validateInterfaces(descElement, descElement.getInterfaceElements(), errorReporter))
+	  isValid = false;
+
+		// 1. Call the validators for specific namespaces
+		//    - Does this need to be broken up into XML specific and compoent model?
+		// 2. Call post validators
+	//	validateTypes(descElement.getTypesElement(), errorReporter);
+//		Description descComponent = descElement.getDescriptionComponent();
+//		validateInterfaces(descComponent.getInterfaces(), errorReporter);
+//		
+		// TODO: validate bindings, services, and extension elements
+	  
+    return isValid;
+  }
+	
+  /**
+   * Validate the contents of the types element. This method runs the assertion
+   * tests for inline and imported types.
+   * 
+   * @param types The types element of which to validate the contents.
+   * @param errorReporter The error reporter.
+   * @return True if all the types related assertions pass, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean validateTypes(TypesElement types, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean isValid = true;
+	
+	// If there is no types element all types assertions are true.
+	if(types == null)
+	  return true;
+	
+	// Test imported schema assertions.
+	ImportedSchema[] importedSchemas = types.getImportedSchemas();
+	int numImportedSchemas = importedSchemas.length;
+	for(int i = 0; i < numImportedSchemas; i++)
+	{
+	  ImportedSchema schema = (ImportedSchema)importedSchemas[i];
+		
+	  if(!testAssertionSchema1069(schema, errorReporter))
+		isValid = false;
+		
+	  if(!testAssertionSchema1070(schema, errorReporter))
+		isValid = false;
+		  
+	}
+	
+	// Test inlined schema assertions.
+	InlinedSchema[] inlinedSchemas = types.getInlinedSchemas();
+	if(!testAssertionSchema1073(inlinedSchemas, errorReporter))
+	  isValid = false;
+	return isValid;
+  }
+  
+  /**
+   * Validate the contents of the interface element. This method runs the assertion
+   * tests for interface element components.
+   * 
+   * @param interfaces An array of interface elements for which to validate the contents.
+   * @param errorReporter The error reporter.
+   * @return True if all the interface related assertions pass, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean validateInterfaces(DescriptionElement descElement, InterfaceElement[] interfaces, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean isValid = true;
+	
+	int numInterfaceElements = interfaces.length;
+	for(int i = 0; i < numInterfaceElements; i++)
+	{
+	  InterfaceElement interfaceElem = interfaces[i];
+	  
+	  if(!testAssertionInterface1012(interfaceElem, errorReporter))
+		isValid = false;
+	  
+	  if(!validateInterfaceFaults(descElement, interfaceElem.getInterfaceFaultElements(), errorReporter))
+	    isValid = false;
+	  
+	  if(!validateInterfaceOperations(descElement, interfaceElem.getInterfaceOperationElements(), errorReporter))
+		isValid = false;
+	}
+	
+	return isValid;
+  }
+  
+  /**
+   * Validate the InterfaceFault elements.
+   * 
+   * @param descElement The root description element.
+   * @param faultElements An array of fault elements.
+   * @param errorReporter An error reporter.
+   * @return True if the interface fault elements are all valid, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean validateInterfaceFaults(DescriptionElement descElement, InterfaceFaultElement[] faultElements, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean isValid = true;
+	int numFaultElements = faultElements.length;
+	for(int j = 0; j < numFaultElements; j++)
+	{
+	  InterfaceFaultElement faultElement = faultElements[j];
+	  if(!testAssertionSchema1066(descElement, faultElement.getElement().getQName(), errorReporter))
+	    isValid = false;
+	  }  
+	return isValid;
+  }
+  
+  /**
+   * Validate the InterfaceOperation elements.
+   * 
+   * @param descElement The root description element.
+   * @param interfaceOperations An array of interface operation elements.
+   * @param errorReporter An error reporter.
+   * @return True if the interface operation elements are all valid, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean validateInterfaceOperations(DescriptionElement descElement, InterfaceOperationElement[] interfaceOperations, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean isValid = true;
+	int numInterfaceOperations = interfaceOperations.length;
+	for(int j = 0; j < numInterfaceOperations; j++)
+	{
+	  InterfaceOperationElement interfaceOperation = interfaceOperations[j];
+	  
+	  if(!validateInterfaceMessageReferences(descElement, interfaceOperation.getInterfaceMessageReferenceElements(), errorReporter))
+		isValid = false;
+	  
+	  if(!validateInterfaceFaultReferences(descElement, interfaceOperation.getInterfaceFaultReferenceElements(), errorReporter))
+			isValid = false;
+	}
+    return isValid;
+  }
+  
+  /**
+   * Validate the InterfaceMessageReference elements.
+   * 
+   * @param descElement The root description element.
+   * @param messageReferences An array of interface message reference elements.
+   * @param errorReporter An error reporter.
+   * @return True if the interface message reference elements are all valid, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean validateInterfaceMessageReferences(DescriptionElement descElement, InterfaceMessageReferenceElement[] messageReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean isValid = true;
+    //WODEN-149 removed assertion Schema-0020 from this method. InterfaceMessageReference assertions to be implemented.
+	return isValid;
+  }
+  
+   /**
+     * Validate the InterfaceFaultReference elements.
+     * 
+     * @param descElement The root description element.
+     * @param faultReferences An array of interface fault reference elements.
+     * @param errorReporter An error reporter.
+     * @return True if the interface fault reference elements are all valid, false otherwise.
+     * @throws WSDLException
+     */
+  protected boolean validateInterfaceFaultReferences(DescriptionElement descElement, InterfaceFaultReferenceElement[] faultReferences, ErrorReporter errorReporter) throws WSDLException
+  {
+     boolean isValid = true;
+     
+     int numFaultReferences = faultReferences.length;
+     for(int k = 0; k < numFaultReferences; k++)
+     {
+        InterfaceFaultReferenceElement faultReference = faultReferences[k];
+        if(!testAssertionQNameResolution1064ForInterfaceFaultReference(faultReference, errorReporter))
+          isValid = false;
+     }
+     
+     return isValid;
+  }
+  
+  /**
+   * Test assertion Description-1006. Tests whether the target namespace
+   * specified is an absolute IRI.
+   * 
+   * @param descElement The description element for which to check the target namespace.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionDescription1006(DescriptionElement descElement, ErrorReporter errorReporter) throws WSDLException
+  {
+    URI targetNS = descElement.getTargetNamespace();
+    if(!targetNS.isAbsolute())
+    {
+      errorReporter.reportError(new ErrorLocatorImpl(), "Description-1006", new Object[]{targetNS}, ErrorReporter.SEVERITY_ERROR);
+      return false;
+	}
+    return true;
+  }
+
+  /**
+   * Test assertion Schema-1069. An imported schema must contain a
+   * target namespace.
+   * 
+   * @param schema The imported schema to check.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionSchema1069(ImportedSchema schema, ErrorReporter errorReporter) throws WSDLException
+  {
+	XmlSchema schemaDef = schema.getSchemaDefinition();
+	// The assertion is true if the schema definition is not available.
+	// Problems locating the schema will be reported elseware and are
+	// not part of this assertion.
+	if(schemaDef == null)
+	  return true;
+	
+	String targetNS = schemaDef.getTargetNamespace();
+	if(targetNS == null || targetNS.equals(""))
+	{
+	  errorReporter.reportError(new ErrorLocatorImpl(), "Schema-1069", new Object[]{schema.getSchemaLocation()}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion Schema-1070. An imported schema must specify the
+   * same target namespace as the import element.
+   * 
+   * @param schema The imported schema to check.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionSchema1070(ImportedSchema schema, ErrorReporter errorReporter) throws WSDLException
+  {
+	XmlSchema schemaDef = schema.getSchemaDefinition();
+    // The assertion is true if the schema definition is not available.
+	// Problems locating the schema will be reported elseware and are
+	// not part of this assertion.
+	if(schemaDef == null)
+	  return true;
+	
+	String importedSchemaTargetNS = schemaDef.getTargetNamespace();
+	String specifiedTargetNS = schema.getNamespace().toString();
+	if(specifiedTargetNS != null && !specifiedTargetNS.equals(importedSchemaTargetNS))
+	{
+	  errorReporter.reportError(new ErrorLocatorImpl(), "Schema-1070", new Object[]{specifiedTargetNS}, ErrorReporter.SEVERITY_ERROR);
+	  return false;
+	}
+	return true;
+  }
+  
+  /**
+   * Test assertion Schema-1073. Inlined XML Schemas must not define
+   * an element that has already been defined by another inline schema
+   * with the same target namespace.
+   * 
+   * @param schema An array containing all the inline schemas in the order in which they are defined.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionSchema1073(InlinedSchema[] schema, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean isValid = true;
+	int numInlineSchemas = schema.length;
+	Hashtable schemas = new Hashtable();
+	for(int i = 0; i < numInlineSchemas; i++)
+	{
+	  InlinedSchema iSchema = schema[i];
+	  URI iSchemaNs = iSchema.getNamespace();
+	  // If the namespace isn't defined this assertion doesn't apply.
+	  if(iSchemaNs == null)
+		continue;
+	  String ns = iSchemaNs.toString();
+	  
+	  if(schemas.containsKey(ns))
+	  {
+		List schemaList = (List)schemas.get(ns);
+		XmlSchemaObjectTable elements = iSchema.getSchemaDefinition().getElements();
+		Iterator elementNames = elements.getNames();
+		while(elementNames.hasNext())
+		{
+		  QName elementName = (QName)elementNames.next();
+		  Iterator otherInlineSchemas = schemaList.iterator();
+		  while(otherInlineSchemas.hasNext())
+		  {
+			if(((InlinedSchema)otherInlineSchemas.next()).getSchemaDefinition().getElementByName(elementName) != null)
+			{
+			  // Duplicate element defined.
+			  errorReporter.reportError(new ErrorLocatorImpl(), "Schema-1073", new Object[]{elementName, ns}, ErrorReporter.SEVERITY_ERROR);
+			  isValid = false;
+			}
+		  }
+		
+		}
+		
+		XmlSchemaObjectTable types = iSchema.getSchemaDefinition().getSchemaTypes();
+		Iterator typeNames = types.getNames();
+		while(typeNames.hasNext())
+		{
+		  QName typeName = (QName)typeNames.next();
+		  Iterator otherInlineSchemas = schemaList.iterator();
+		  while(otherInlineSchemas.hasNext())
+		  {
+		    if(((InlinedSchema)otherInlineSchemas.next()).getSchemaDefinition().getTypeByName(typeName) != null)
+		    {
+			  // Duplicate type defined.
+			  errorReporter.reportError(new ErrorLocatorImpl(), "Schema-1073b", new Object[]{typeName, ns}, ErrorReporter.SEVERITY_ERROR);
+			  isValid = false;
+		    }
+		  }
+			
+		}
+		  //Check if another element has been defined.
+		  //check if another type has been defined.
+		  //add to the existing list of schemas
+		schemaList.add(iSchema);
+	  }
+	  else
+	  {
+		List schemaList = new ArrayList();
+		schemaList.add(iSchema);
+		schemas.put(ns, schemaList);
+	  }
+		 
+	}
+	return isValid;
+  }
+  
+  /**
+   * Test assertion Interface-1012. All style defaults specified on an interface
+   * element must be absolute.
+   * 
+   * @param interfaceElem The interface element to check the style default list.
+   * @param errorReporter The error reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionInterface1012(InterfaceElement interfaceElem, ErrorReporter errorReporter) throws WSDLException
+  {
+	boolean isValid = true;
+	
+	URI[] styleDefaults = interfaceElem.getStyleDefault();
+	int numStyleDefaults = styleDefaults.length;
+	for(int i = 0; i < numStyleDefaults; i++)
+	{
+	  if(!styleDefaults[i].isAbsolute())
+	  {
+	    errorReporter.reportError(new ErrorLocatorImpl(), "Interface-1012", new Object[]{styleDefaults[i].toString()}, ErrorReporter.SEVERITY_ERROR);
+	    isValid = false;
+	  }
+	}
+	return isValid;
+  }
+  
+  /**
+   * Test assertion Schema-1066. References to XML schema components must only refer
+   * to elements and types in namespaces that have been imported or inlined or that
+   * are part of the XML schema namespace.
+   * 
+   * @param descElement The description element of the document.
+   * @param namespace Check this namespace to see if it has been defined.
+   * @param errorReporter The error Reporter.
+   * @return True if the assertion passes, false otherwise.
+   * @throws WSDLException
+   */
+  protected boolean testAssertionSchema1066(DescriptionElement descElement, QName qualifiedName, ErrorReporter errorReporter) throws WSDLException
+  {
+	// If the qualifiedName is null it can't be checked.
+    if(qualifiedName != null && !qualifiedName.getNamespaceURI().equals(Constants.TYPE_XSD_2001))
+    {
+      //Get the namespace and the local name from the qualified name.
+      String namespace = qualifiedName.getNamespaceURI();
+	  String localname = qualifiedName.getLocalPart();    	
+
+      TypesElement types = descElement.getTypesElement();
+      if(types == null)
+      {
+    	errorReporter.reportError(new ErrorLocatorImpl(), "Schema-1066", new Object[]{localname, namespace}, ErrorReporter.SEVERITY_ERROR);
+        return false;
+      }
+      Schema[] schemas = types.getSchemas();
+      int numSchemas = schemas.length;
+      boolean schemaNotFound = true;
+      // TODO: This linear search should be improved for performance.
+      for(int i = 0; i < numSchemas; i++)
+      {
+    	URI schemaNs = schemas[i].getNamespace();
+    	// If the schema namespace is null continue to the next one. This is not the
+    	// schema we're looking for.
+    	if(schemaNs == null)
+    	  continue;
+    	if(schemaNs.toString().equals(namespace))
+    	{
+          schemaNotFound = false;
+    	  break;
+    	}
+      }
+      if(schemaNotFound)
+      {
+        errorReporter.reportError(new ErrorLocatorImpl(), "Schema-1066", new Object[]{localname, namespace}, ErrorReporter.SEVERITY_ERROR);
+      	return false;
+      } 
+    }
+    return true;
+  }
+  
+  /**
+   * Test assertion QName-resolution-1064 for an InterfaceFaultReference element. \
+   * A Description component must not contain broken QName references.
+   * 
+   * @param faultReference The interface fault reference to check for a broken reference.
+   * @param errorReporter An error reporter.
+   * @return True if the assertion passes, false otherwise. 
+   * @throws WSDLException
+   */
+  protected boolean testAssertionQNameResolution1064ForInterfaceFaultReference(InterfaceFaultReferenceElement faultReference, ErrorReporter errorReporter) throws WSDLException
+  {
+	QName ref = faultReference.getRef();
+	if(ref != null)
+	{
+	  InterfaceFaultElement fault = faultReference.getInterfaceFaultElement();
+	  if(fault == null)
+	  {
+	    errorReporter.reportError(new ErrorLocatorImpl(), 
+	            "QName-resolution-1064", 
+	            new Object[]{ref.toString(), "interface fault reference", "interface fault"}, 
+	            ErrorReporter.SEVERITY_ERROR);
+	    return false;
+	  }
+	}
+	return true;
+  }
+}

Added: webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLValidator.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLValidator.java?rev=809831&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLValidator.java (added)
+++ webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WSDLValidator.java Tue Sep  1 05:49:02 2009
@@ -0,0 +1,179 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.woden.internal.wsdl20.validation;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.woden.WSDLException;
+import org.apache.woden.internal.WSDLContext;
+import org.apache.woden.internal.wsdl20.assertions.Description1001;
+import org.apache.woden.internal.wsdl20.assertions.Description1002;
+import org.apache.woden.internal.wsdl20.assertions.Interface1009;
+import org.apache.woden.internal.wsdl20.assertions.Interface1010;
+import org.apache.woden.wsdl20.Description;
+import org.apache.woden.wsdl20.Interface;
+import org.apache.woden.wsdl20.validation.Assertion;
+import org.apache.woden.wsdl20.validation.WodenContext;
+import org.apache.woden.wsdl20.validation.AssertionInfo;
+import org.apache.woden.wsdl20.xml.DescriptionElement;
+
+/**
+ * Validates a WSDL 2.0 Description component by walking the component model
+ * <i>tree</i> and checking the relevant assertions for each component.
+ * <p>
+ * TODO add dependency checking for prereq assertions<br>
+ * TODO decide if a return value is needed indicating the result (boolean or err/warn/OK)
+ * 
+ * @author John Kaputin (jkaputin@apache.org)
+ *
+ */
+public class WSDLValidator {
+    
+    private WSDLContext fWsdlCtx;
+    private WodenContext fWodenCtx;
+    
+    //not needed? ... private Map fAssertions;    //map of assertion id string -> AssertionInfo
+    
+    private Map fWsdlAsserts;   //map of target Class -> list of WSDL 2.0 Assertions
+    private Map fExtAsserts;    //map of target Class -> list of extension Assertions
+    
+    public void validate(Description description, WSDLContext wsdlContext) throws WSDLException {
+        int len = 0;
+        this.fWsdlCtx = wsdlContext;
+        this.fWodenCtx = new WodenContextImpl(fWsdlCtx.errorReporter, fWsdlCtx.uriResolver);
+               
+        //setup the WSDL 2.0 assertions
+        //TODO do this once per wsdl reader object, not per document
+        setupWSDLAssertions();
+        
+        //setup the extension assertions. 
+        //TODO check - must be done per document in case ext reg has changed
+        setupExtensionAssertions();
+        
+        //walk the parts of the xml tree not represented in the component model, calling checkAssertions
+        //method for each element.
+        // - i.e. description(s), import, include, types, documentation?
+        
+        DescriptionElement descElem = description.toElement();
+        
+        checkAssertions(DescriptionElement.class, descElem);
+        
+        //check assertions for the Description component
+        
+        checkAssertions(Description.class, description);
+        
+        //walk the top-level component trees, calling checkAssertions for each component and for each 
+        //component.toElement().
+        
+        Interface[] intfaces = description.getInterfaces();
+        len = intfaces.length;
+        for(int i=0; i<len; i++) {
+            checkAssertions(Interface.class, intfaces[i]);
+        }
+        
+    }
+    
+    /*
+     * Invoke the validate() method on each assertion mapped to the target WSDL 2.0 object.
+     * This object will be a WSDLComponent or a WSDLElement. 
+     * Note: with the outstanding API review issue about merging the two WSDL models, might be
+     * able to change the Object paramater to a Woden-specific type.
+     */
+    private void checkAssertions(Class targetClass, Object target) throws WSDLException {
+        
+        Assertion a = null;
+        
+        //Check WSDL 2.0 assertions
+        List wsdlAsserts = (List)fWsdlAsserts.get(targetClass);
+        if (wsdlAsserts != null) {
+            for (Iterator i = wsdlAsserts.iterator(); i.hasNext();) {
+                a = (Assertion) i.next();
+                a.validate(target, fWodenCtx);
+            }
+        }
+        //Check extension assertions (get them from ExtensionRegistry)
+        List extAsserts = (List)fExtAsserts.get(targetClass);
+        if (extAsserts != null) {
+            for (Iterator i = extAsserts.iterator(); i.hasNext();) {
+                a = (Assertion) i.next();
+                a.validate(target, fWodenCtx);
+            }
+        }
+        
+    }
+    
+    private void setupWSDLAssertions() {
+        
+        /* This map of WSDL 2.0 assertions might not be needed
+         * 
+        fAssertions.put("Description-1001".intern(), 
+                new AssertionInfo(new Description1001(), DescriptionElement.class));
+        fAssertions.put("Description-1002".intern(), 
+                new AssertionInfo(new Description1002(), DescriptionElement.class));
+        fAssertions.put("Description-1003".intern(), 
+                new AssertionInfo(new Description1003(), DescriptionElement.class));
+        fAssertions.put(Interface1009.ID, 
+                new AssertionInfo(new Interface1009(), Interface.class));
+        fAssertions.put(Interface1010.ID, 
+                new AssertionInfo(new Interface1010(), Description.class));
+        //TODO rest of WSDL 2.0 assertions defined in the spec
+         * 
+         */
+        
+        //Populate the Map of targetClass->List of WSDL 2.0 Assertions
+        
+        fWsdlAsserts = new HashMap();
+        
+        List descElem = new Vector();
+        descElem.add(new Description1001());
+        descElem.add(new Description1002());
+        descElem.add(new Description1002());
+        fWsdlAsserts.put(DescriptionElement.class, descElem);
+        
+        List desc = new Vector();
+        desc.add(new Interface1010());
+        fWsdlAsserts.put(Description.class, desc);
+        
+        List intf = new Vector();
+        intf.add(new Interface1009());
+        fWsdlAsserts.put(Interface.class, intf);
+        
+    }
+    
+    private void setupExtensionAssertions() {
+        
+        fExtAsserts = new HashMap();
+
+        AssertionInfo[] infos = this.fWsdlCtx.extensionRegistry.queryAssertions();
+        List asserts;
+        int len = infos.length;
+        for(int i=0; i<len; i++) {
+            Class target = infos[i].targetClass;
+            asserts = (List) fExtAsserts.get(target);
+            if(asserts == null) {
+                asserts = new Vector();
+            }
+            asserts.add(infos[i].assertion);
+            fExtAsserts.put(target, asserts);
+        }
+    }
+
+}

Added: webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WodenContextImpl.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WodenContextImpl.java?rev=809831&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WodenContextImpl.java (added)
+++ webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/wsdl20/validation/WodenContextImpl.java Tue Sep  1 05:49:02 2009
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.woden.internal.wsdl20.validation;
+
+import org.apache.woden.ErrorReporter;
+import org.apache.woden.resolver.URIResolver;
+import org.apache.woden.wsdl20.validation.WodenContext;
+
+/**
+ * @author John Kaputin (jkaputin@apache.org)
+ */
+public class WodenContextImpl implements WodenContext {
+    
+    private ErrorReporter errReporter;
+    private URIResolver uriResolver;
+    
+    //package private ctor
+    WodenContextImpl(ErrorReporter errReporter, URIResolver uriResolver) {
+        this.errReporter = errReporter;
+        this.uriResolver = uriResolver;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.validation.WodenContext#getErrorReporter()
+     */
+    public ErrorReporter getErrorReporter() {
+        return this.errReporter;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.woden.wsdl20.validation.WodenContext#getUriResolver()
+     */
+    public URIResolver getUriResolver() {
+        return this.uriResolver;
+    }
+
+}

Added: webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/ArgumentArrayAttrImpl.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/ArgumentArrayAttrImpl.java?rev=809831&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/ArgumentArrayAttrImpl.java (added)
+++ webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/ArgumentArrayAttrImpl.java Tue Sep  1 05:49:02 2009
@@ -0,0 +1,147 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.woden.internal.xml;
+
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.woden.ErrorReporter;
+import org.apache.woden.WSDLException;
+import org.apache.woden.XMLElement;
+import org.apache.woden.internal.ErrorLocatorImpl;
+import org.apache.woden.internal.util.StringUtils;
+import org.apache.woden.wsdl20.extensions.rpc.Argument;
+import org.apache.woden.wsdl20.extensions.rpc.Direction;
+import org.apache.woden.xml.ArgumentArrayAttr;
+
+/**
+ * This class represents an XML attribute information items whose type is a list
+ * of pairs (xs:QName, xs:token) that obey the contraints of wrpc:signature as
+ * defined in Part 2 of the WSDL 2.0 spec.
+ * 
+ * @author Arthur Ryman (ryman@ca.ibm.com)
+ */
+
+public class ArgumentArrayAttrImpl extends XMLAttrImpl implements
+		ArgumentArrayAttr {
+	
+	public ArgumentArrayAttrImpl(XMLElement ownerEl, QName attrType,
+			String attrValue, ErrorReporter errRpt) throws WSDLException {
+
+		super(ownerEl, attrType, attrValue, errRpt);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.woden.xml.ArgumentArrayAttr#getArgumentArray()
+	 */
+	public Argument[] getArgumentArray() {
+
+		return (Argument[]) getContent();
+	}
+
+	protected Object convert(XMLElement ownerEl, String attrValue)
+			throws WSDLException {
+
+		setValid(false);
+
+		if (attrValue != null) {
+
+			List tokens = StringUtils.parseNMTokens(attrValue);
+			int length = tokens.size();
+
+			// list consists of (qname, token) pairs
+			if (length % 2 == 0) {
+
+				int argc = length / 2;
+				Argument[] args = new Argument[argc];
+
+				Iterator i = tokens.iterator();
+				for (int j = 0; j < argc; j++) {
+
+					String qnameStr = (String) i.next();
+					QName qname = convertQName(ownerEl, qnameStr);
+					if (qname == null)
+						return null;
+
+					String directionStr = (String) i.next();
+					Direction direction = convertDirection(directionStr);
+					if (direction == null)
+						return null;
+
+					args[j] = new Argument(qname, direction);
+				}
+
+				setValid(true);
+				return args;
+			}
+		}
+
+		// TODO: line&col nos.
+		// TODO: use correct error number
+		getErrorReporter().reportError(new ErrorLocatorImpl(), "WSDL510",
+				new Object[] { attrValue }, ErrorReporter.SEVERITY_ERROR,
+				new IllegalArgumentException());
+
+		return null;
+	}
+
+	private QName convertQName(XMLElement ownerEl, String qnameStr)
+			throws WSDLException {
+
+		QName qname = null;
+
+		try {
+			qname = ownerEl.getQName(qnameStr);
+		} catch (WSDLException e) {
+
+			// TODO: line&col nos.
+			// TODO: use correct error number
+			getErrorReporter().reportError(new ErrorLocatorImpl(), "WSDL510",
+					new Object[] { qnameStr }, ErrorReporter.SEVERITY_ERROR, e);
+		}
+
+		return qname;
+	}
+
+	private Direction convertDirection(String directionStr)
+			throws WSDLException {
+
+		Direction[] directions = new Direction[] { Direction.IN,
+				Direction.INOUT, Direction.OUT, Direction.RETURN };
+
+        for (int i = 0; i < directions.length; i++) {
+            if (directionStr.equals(directions[i].toString())) {
+                return directions[i];
+            }
+        }
+
+		// TODO: line&col nos.
+		// TODO: use correct error number
+		getErrorReporter().reportError(new ErrorLocatorImpl(), "WSDL510",
+				new Object[] { directionStr }, ErrorReporter.SEVERITY_ERROR,
+				new IllegalArgumentException());
+
+		return null;
+
+	}
+
+}

Added: webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/BooleanAttrImpl.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/BooleanAttrImpl.java?rev=809831&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/BooleanAttrImpl.java (added)
+++ webservices/woden/trunk/java/woden-commons/src/main/java/org/apache/woden/internal/xml/BooleanAttrImpl.java Tue Sep  1 05:49:02 2009
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.woden.internal.xml;
+
+import javax.xml.namespace.QName;
+
+import org.apache.woden.ErrorReporter;
+import org.apache.woden.WSDLException;
+import org.apache.woden.XMLElement;
+import org.apache.woden.internal.ErrorLocatorImpl;
+import org.apache.woden.xml.BooleanAttr;
+
+/**
+ * This class represents XML attribute information items of type xs:boolean.
+ * If the attribute value is not "true" or "false" the Boolean content will
+ * be initialized to "false" by default, but the isValid() method will
+ * return "false".
+ * 
+ * @author jkaputin@apache.org
+ */
+public class BooleanAttrImpl extends XMLAttrImpl implements BooleanAttr 
+{
+    public BooleanAttrImpl(XMLElement ownerEl, QName attrType, 
+            String attrValue, ErrorReporter errRpt) throws WSDLException
+    {
+        super(ownerEl, attrType, attrValue, errRpt);
+    }
+    
+    /* ************************************************************
+     *  BooleanAttr interface declared methods 
+     * ************************************************************/
+    
+    public Boolean getBoolean() {
+        return (Boolean)getContent();
+    }
+    
+    /* ************************************************************
+     *  Non-API implementation methods 
+     * ************************************************************/
+
+    /*
+     * Convert a string of type xs:boolean to a java.lang.Boolean.
+     * An empty string or a null argument will initialize the Boolean to false.
+     * Any conversion error will be reported and will initialize the Boolean to false.
+     * If the attrValue does not match the Boolean value the Attr is marked invalid.
+     */
+    protected Object convert(XMLElement ownerEl, String attrValue) throws WSDLException
+    {
+        Boolean bool = Boolean.valueOf(attrValue);
+        
+        if(attrValue == null || !attrValue.equals(bool.toString()) )
+        {
+            setValid(false);
+            getErrorReporter().reportError(
+                    new ErrorLocatorImpl(),  //TODO line&col nos.
+                    "WSDL511", 
+                    new Object[] {attrValue}, 
+                    ErrorReporter.SEVERITY_ERROR);
+        }
+        
+        return bool;
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: woden-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: woden-dev-help@ws.apache.org