blob: d272b9d7547e0a20297a7b2aa864ec317a846d99 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002-2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.wsi.internal.core.profile.validator.impl.wsdl;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.wsdl.Definition;
import javax.wsdl.Types;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.UnknownExtensibilityElement;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.WSITag;
import org.eclipse.wst.wsi.internal.core.profile.TestAssertion;
import org.eclipse.wst.wsi.internal.core.profile.validator.EntryContext;
import org.eclipse.wst.wsi.internal.core.profile.validator.impl.AssertionProcess;
import org.eclipse.wst.wsi.internal.core.report.AssertionResult;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* BP2102.
* <context>For a candidate wsdl:types element, with XML schema import elements</context>
* <assertionDescription>Each XML schema import statement (xsd:import) is only used to directly reference an XML schema definition, which has "schema" from XML namespace "http://www.w3.org/2001/XMLSchema" as root element. It does not contain a reference to another document embedding the XML schema definition (e.g. WSDL).</assertionDescription>
*/
public class BP2102 extends AssertionProcess implements WSITag
{
private final WSDLValidatorImpl validator;
/**
* @param WSDLValidatorImpl
*/
public BP2102(WSDLValidatorImpl impl)
{
super(impl);
this.validator = impl;
}
private boolean importFound = false;
/* Validates the test assertion.
* @see org.wsi.test.profile.validator.impl.BaseValidatorImpl.AssertionProcess#validate(org.wsi.test.profile.TestAssertion, org.wsi.test.profile.validator.EntryContext)
*/
public AssertionResult validate(
TestAssertion testAssertion,
EntryContext entryContext)
throws WSIException
{
result = AssertionResult.RESULT_PASSED;
// parse WSDL as XML
try
{
Types t = (Types) entryContext.getEntry().getEntryDetail();
List exts = t.getExtensibilityElements();
Definition definition = null;
if ((definition = validator.analyzerContext.getCandidateInfo().getDefinition(t))
== null)
{
throw new WSIException("Could not find types definition in any WSDL document.");
}
if (exts != null)
{
Iterator it = exts.iterator();
while (it.hasNext())
{
ExtensibilityElement el = (ExtensibilityElement) it.next();
if (el instanceof UnknownExtensibilityElement
&& el.getElementType().equals(ELEM_XSD_SCHEMA))
testNode(((UnknownExtensibilityElement) el).getElement(),
definition.getDocumentBaseURI());
if (result.equals(AssertionResult.RESULT_FAILED))
{
failureDetail =
this.validator.createFailureDetail(failureDetailMessage, entryContext);
}
}
}
if (!importFound)
result = AssertionResult.RESULT_NOT_APPLICABLE;
}
catch (Throwable tt)
{
result = AssertionResult.RESULT_NOT_APPLICABLE;
failureDetail =
this.validator.createFailureDetail(
"WSDL document can not be processed",
entryContext);
}
return validator.createAssertionResult(testAssertion, result, failureDetail);
}
/*
* Check node is xsd import and it is
* only used to directly reference an XML schema definition, which has "schema"
* from XML namespace "http://www.w3.org/2001/XMLSchema" as root element.
* And it does not contain a reference to another document embedding the XML schema
* definition (e.g. WSDL).
* @param n - Unknown extensibility element
*/
private void testNode(Node n, String context)
{
while (n != null)
{
// searches for xsd:import element
if (Node.ELEMENT_NODE == n.getNodeType())
{
if (XMLUtils.equals(n, ELEM_XSD_IMPORT))
{
importFound = true;
Element im = (Element) n;
// Getting the schemaLocation and the namespace attributes
Attr schemaLocation =
XMLUtils.getAttribute(im, ATTR_XSD_SCHEMALOCATION);
Attr namespace = XMLUtils.getAttribute(im, ATTR_XSD_NAMESPACE);
// If there is only the namespace attribute of import element
if (schemaLocation == null && namespace != null)
{
// Getting all the inline schemas of the wsdl definition
Map schemasMap = validator.wsdlDocument.getSchemas();
// If an inline schema imported is defined
if (schemasMap.keySet().contains(namespace.getValue()))
{
// If an inline schema imported is defined
// (that means the schema is valid),
// continue with the next element
n = n.getNextSibling();
continue;
}
// no schemaLocation so try the namespace
schemaLocation = namespace;
}
// try to parse imported XSD
if (schemaLocation != null && schemaLocation.getValue() != null)
{
try
{
// if any error or root element is not XSD schema -> error
// !! ATTENTION
// root XSD SCHEMA SCHEMA is not valid
//Document schema = XMLUtils.parseXMLDocumentURL(schemaLocation.getValue(), XSD_SCHEMALOCATION, context);
Document schema =
validator.parseXMLDocumentURL(schemaLocation.getValue(), context);
// If the import is valid, then check its contents
if (XMLUtils
.equals(schema.getDocumentElement(), ELEM_XSD_SCHEMA))
{
// Check content of imported document
testNode(schema.getDocumentElement().getFirstChild(),
XMLUtils.createURLString(schemaLocation.getValue(), context));
}
else
{
throw new Exception();
}
}
catch (Throwable t)
{
result = AssertionResult.RESULT_FAILED;
failureDetailMessage = schemaLocation.getValue();
break;
}
}
else
{
//result = AssertionResult.RESULT_FAILED;
result = AssertionResult.RESULT_NOT_APPLICABLE;
failureDetailMessage =
"schemaLocation == null and namespace == null";
break;
}
}
testNode(n.getFirstChild(), context);
}
n = n.getNextSibling();
}
}
}