blob: cfe0dba60d1f9f0e24262b6bb0856af5b7509e7c [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.impl;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeMap;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
import org.eclipse.wst.wsi.internal.WSITestToolsEclipseProperties;
import org.eclipse.wst.wsi.internal.WSITestToolsProperties;
import org.eclipse.wst.wsi.internal.core.WSIConstants;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.profile.EntryTypeList;
import org.eclipse.wst.wsi.internal.core.profile.ProfileArtifact;
import org.eclipse.wst.wsi.internal.core.profile.ProfileAssertions;
import org.eclipse.wst.wsi.internal.core.profile.ProfileAssertionsReader;
import org.eclipse.wst.wsi.internal.core.profile.TestAssertion;
import org.eclipse.wst.wsi.internal.core.util.ArtifactType;
import org.eclipse.wst.wsi.internal.core.util.Utils;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;
import org.xml.sax.Attributes;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
/**
* This class ...
*
* @version 1.0.1
* @author Peter Brittenham (peterbr@us.ibm.com)
*/
public class ProfileAssertionsReaderImpl implements ProfileAssertionsReader
{
/**
* Profile assertions.
*/
protected ProfileAssertions profileAssertions;
/**
* ReportArtifact list.
*/
protected TreeMap artifactList = new TreeMap();
/**
* Create new reader.
*/
public ProfileAssertionsReaderImpl()
{
}
/* (non-Javadoc)
* @see org.wsi.test.profile.ProfileAssertionsReader#readProfileAssertions(String)
*/
public ProfileAssertions readProfileAssertions(String assertionsURI)
throws WSIException
{
return readProfileAssertions(new InputSource(assertionsURI));
}
/* (non-Javadoc)
* @see org.wsi.test.profile.ProfileAssertionsReader#readProfileAssertions(Reader)
*/
public ProfileAssertions readProfileAssertions(Reader reader)
throws WSIException
{
return readProfileAssertions(new InputSource(reader));
}
/**
* Read profile assertions.
*/
private ProfileAssertions readProfileAssertions(InputSource inputSource)
throws WSIException
{
// Create profile assertions
profileAssertions = new ProfileAssertionsImpl();
// Profile parts are put into a vector
artifactList = new TreeMap();
try
{
// Create xml reader
XMLReader reader = XMLUtils.getXMLReader();
// Set content handler to inner class
reader.setContentHandler(new ProfileAssertionsHandler());
if(WSITestToolsProperties.getEclipseContext())
{
EntityResolver resolver = new EntityResolver(){
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
URIResolver resolver = WSITestToolsEclipseProperties.getURIResolver();
String uri = resolver.resolve("", publicId, systemId);
String physicalLocation = resolver.resolvePhysicalLocation("", publicId, uri);
InputSource is = null;
try
{
URL url = new URL(physicalLocation);
is = new InputSource(uri);
is.setByteStream(url.openStream());
}
catch(Exception e)
{
// Do nothing if opening the stream fails.
}
return is;
}
};
reader.setEntityResolver(resolver);
}
// Parse profile definition file
reader.parse(inputSource);
}
catch (Exception e)
{
throw new WSIException("Could not read and parse profile definition.", e);
}
finally
{
//Check to see if the version of test asssertion document is supported
if (!Utils.isValidProfileTADVersion(profileAssertions))
{
String tadVersion = profileAssertions.getTADVersion();
if(tadVersion != null)
{
String tadName = profileAssertions.getTADName();
throw new WSIException(
"\nVersion "
+ tadVersion
+ " of the \""
+ tadName
+ "\"\n"
+ "document is not compatible with this version of"
+ "\n"
+ "the test tools.");
}
else
{
throw new WSIException("WS-I validation was unable to run. Unable to read the test assertion document.");
}
}
}
// The assertions from the TAD are reordered for purposes of processing. All
// assertions of an artifact are reordered such that prerequisites occur
// before the assertions they prereq. The assumption is that prerequisites do
// not cross artifact types.
//
Iterator it = artifactList.keySet().iterator();
// for each artifact type do reordering assertion
while (it.hasNext())
{
ProfileArtifact art = (ProfileArtifact) artifactList.get(it.next());
// result list of the reordering assertions
LinkedList res = new LinkedList();
Iterator it2 = art.getTestAssertionList().iterator();
// sort the artifact assertions into result list
while (it2.hasNext())
{
// call for each assertion ,
// if the assertion has the prereq, the prereq will added first into res list
sortTestAssertions(art, (TestAssertion) it2.next(), res);
}
// replace the original assertions list to the prereq reordering assertions list
art.getTestAssertionList().clear();
art.getTestAssertionList().addAll(res);
}
// Put the profile parts into the profile definition
profileAssertions.setArtifactList(artifactList);
return profileAssertions;
}
/* (non-Javadoc)
* @see org.wsi.test.document.DocumentReader#getLocation()
*/
public String getLocation()
{
return null;
}
/* (non-Javadoc)
* @see org.wsi.test.document.DocumentReader#setLocation(String)
*/
public void setLocation(String documentURI)
{
}
/**
* Recursive walk to order assertions so that assertions are
* processed following the ones that prereq them.
* If assertion has prereq, then add it to the result list first.
*
* @param art profile artifact for call @link ProfileArtifact#getTestAssertion(String)
* @param asrt test assertion
* @param list result list to sort
*/
private void sortTestAssertions(ProfileArtifact art, TestAssertion asrt, List list)
{
// if assertion is null or does not exist, then exit
if((asrt == null) || list.contains(asrt))
return;
// if it has not prereq, add the asertion and exit
if(asrt.getPrereqIdList().isEmpty())
{
list.add(asrt);
return;
}
// get list prereq assertion and reqursive call sortTestAssertions this each
Iterator it = asrt.getPrereqIdList().iterator();
while(it.hasNext()) {
String id = (String) it.next();
sortTestAssertions(art, art.getTestAssertion(id), list);
}
list.add(asrt);
}
/**
* Inner class: ProfileAssertionsHandler
*/
class ProfileAssertionsHandler extends DefaultHandler
{
private ProfileArtifact artifact = profileAssertions.createArtifact();
private StringBuffer context = null;
private StringBuffer assertionDescription = null;
private StringBuffer failureMessage = null;
private StringBuffer failureDetailDescription = null;
private StringBuffer detailDescription = null;
private StringBuffer testAssertionId = null;
private String currentElement = null;
private TestAssertion testAssertion = null;
private StringBuffer logInput = null;
private StringBuffer wsdlInput = null;
private EntryTypeList entryTypeList = null;
// Process start element event
public void startElement(
String namespaceURI,
String localName,
String qName,
Attributes atts)
{
if (namespaceURI != null
&& (namespaceURI.equals(WSIConstants.NS_URI_WSI_ASSERTIONS_2003)
|| namespaceURI.equals(WSIConstants.NS_URI_WSI_ASSERTIONS)))
{
// Save element name
currentElement = localName;
// <artifact>
if (localName.equals(WSIConstants.ELEM_ARTIFACT))
{
// Create a new profile artifact object
artifact = profileAssertions.createArtifact();
// Set type
artifact.setType(
ArtifactType.getArtifactType(
atts.getValue(WSIConstants.ATTR_TYPE)));
// ADD: Get specification list
// Add artifact to list of artifact list
artifactList.put(artifact.getType().getTypeName(), artifact);
}
// <testAssertion>
else if (localName.equals(WSIConstants.ELEM_TEST_ASSERTION))
{
// Create test assertion
testAssertion = new TestAssertionImpl();
// Get attribute values
String id = atts.getValue("", WSIConstants.ATTR_ID);
testAssertion.setId(id);
testAssertion.setType(atts.getValue("", WSIConstants.ATTR_TYPE));
testAssertion.setEntryTypeName(
atts.getValue("", WSIConstants.ATTR_ENTRY_TYPE));
// if assertion is not required or it has already been checked by core validator then disable it
if (alreadyChecked(id) || !(testAssertion.getType().equals(TestAssertion.TYPE_REQUIRED)))
testAssertion.setEnabled(false);
else
testAssertion.setEnabled(Boolean.valueOf(atts.getValue("", WSIConstants.ATTR_ENABLED)).booleanValue());
// Add test assertion to artifact
artifact.addTestAssertion(testAssertion);
}
// <context>
else if (localName.equals(WSIConstants.ELEM_CONTEXT))
{
context = new StringBuffer();
}
// <assertionDescription>
else if (localName.equals(WSIConstants.ELEM_ASSERTION_DESCRIPTION))
{
assertionDescription = new StringBuffer();
}
// <failureMessage>
else if (localName.equals(WSIConstants.ELEM_FAILURE_MESSAGE))
{
failureMessage = new StringBuffer();
}
// <failureDetailDescription>
else if (localName.equals(WSIConstants.ELEM_FAILURE_DETAIL_DESCRIPTION))
{
failureDetailDescription = new StringBuffer();
}
// <detailDescription>
else if (localName.equals(WSIConstants.ELEM_DETAIL_DESCRIPTION))
{
detailDescription = new StringBuffer();
}
// <testAssertionID>
else if (localName.equals(WSIConstants.ELEM_TEST_ASSERTION_ID))
{
testAssertionId = new StringBuffer();
}
// <additionalEntryTypeList>
else if (
localName.equals(WSIConstants.ELEM_ADDITIONAL_ENTRY_TYPE_LIST))
{
// Create entry type list
entryTypeList = new EntryTypeListImpl();
}
// <messageInput>
else if (localName.equals(WSIConstants.ELEM_MESSAGE_INPUT))
{
logInput = new StringBuffer();
}
// <wsdlInput>
else if (localName.equals(WSIConstants.ELEM_WSDL_INPUT))
{
wsdlInput = new StringBuffer();
}
// <profileAssertions>
else if (localName.equals(WSIConstants.ELEM_PROFILE_ASSERTIONS))
{
profileAssertions.setTADName(
atts.getValue("", WSIConstants.ATTR_NAME));
profileAssertions.setTADVersion(
atts.getValue("", WSIConstants.ATTR_VERSION));
}
/* REMOVE:
// <uddiInput>
else if (localName.equals(WSIConstants.ELEM_UDDI_INPUT)) {
uddiInput = new StringBuffer();
}
*/
}
} // END startElement
public void endElement(String namespaceURI, String localName, String qname)
{
// If this is the profile namespace, then check for and process selected elements
if (namespaceURI != null
&& (namespaceURI.equals(WSIConstants.NS_URI_WSI_ASSERTIONS_2003)
|| namespaceURI.equals(WSIConstants.NS_URI_WSI_ASSERTIONS)))
{
// <context>
if (localName.equals(WSIConstants.ELEM_CONTEXT))
{
// Set context in test assertion
testAssertion.setContext(context.toString());
context = null;
}
// <assertionDescription>
else if (localName.equals(WSIConstants.ELEM_ASSERTION_DESCRIPTION))
{
// Set assertion description in test assertion
testAssertion.setAssertionDescription(
assertionDescription.toString());
assertionDescription = null;
}
// <failureMessage>
else if (localName.equals(WSIConstants.ELEM_FAILURE_MESSAGE))
{
// Set failure message in test assertion
testAssertion.setFailureMessage(failureMessage.toString());
failureMessage = null;
}
// <failureDetailDescription>
else if (localName.equals(WSIConstants.ELEM_FAILURE_DETAIL_DESCRIPTION))
{
// Set failure detail description in test assertion
testAssertion.setFailureDetailDescription(
failureDetailDescription.toString());
failureDetailDescription = null;
}
// <detailDescription>
else if (localName.equals(WSIConstants.ELEM_DETAIL_DESCRIPTION))
{
// Set detail description in test assertion
testAssertion.setDetailDescription(detailDescription.toString());
detailDescription = null;
}
// <testAssertionID>
else if (localName.equals(WSIConstants.ELEM_TEST_ASSERTION_ID))
{
// Set test assertion id in prereq list
testAssertion.addPrereqId(testAssertionId.toString());
testAssertionId = null;
}
// <addtionalEntryTypeList>
else if (
localName.equals(WSIConstants.ELEM_ADDITIONAL_ENTRY_TYPE_LIST))
{
// Set target list
testAssertion.setAdditionalEntryTypeList(entryTypeList);
entryTypeList = null;
}
// <messageInput>
else if (localName.equals(WSIConstants.ELEM_MESSAGE_INPUT))
{
// Set test assertion id in prereq list
entryTypeList.setLogInput(logInput.toString());
logInput = null;
}
// <wsdlInput>
else if (localName.equals(WSIConstants.ELEM_WSDL_INPUT))
{
// Set test assertion id in prereq list
entryTypeList.setWSDLInput(wsdlInput.toString());
wsdlInput = null;
}
// <profileAssertions>
else if (localName.equals(WSIConstants.ELEM_PROFILE_ASSERTIONS))
{
// a no-op
}
/* REMOVE:
// <uddiInput>
else if (localName.equals(WSIConstants.ELEM_UDDI_INPUT)) {
// Set test assertion id in prereq list
entryTypeList.setUDDIInput(uddiInput.toString());
uddiInput = null;
}
*/
}
} // END endElement
public void characters(char[] ch, int start, int length)
{
// <context>
if ((context != null)
&& (currentElement.equals(WSIConstants.ELEM_CONTEXT)))
{
context.append(ch, start, length);
}
// <assertionDescription>
else if (
(assertionDescription != null)
&& (currentElement.equals(WSIConstants.ELEM_ASSERTION_DESCRIPTION)))
{
assertionDescription.append(ch, start, length);
}
// <failureMessage>
else if (
(failureMessage != null)
&& (currentElement.equals(WSIConstants.ELEM_FAILURE_MESSAGE)))
{
failureMessage.append(ch, start, length);
}
// <failureDetailDescription>
else if (
(failureDetailDescription != null) && (
currentElement.equals(WSIConstants.ELEM_FAILURE_DETAIL_DESCRIPTION)))
{
failureDetailDescription.append(ch, start, length);
}
// <detailDescription>
else if (
(detailDescription != null)
&& (currentElement.equals(WSIConstants.ELEM_DETAIL_DESCRIPTION)))
{
detailDescription.append(ch, start, length);
}
// <testAssertionID>
else if (
(testAssertionId != null)
&& (currentElement.equals(WSIConstants.ELEM_TEST_ASSERTION_ID)))
{
testAssertionId.append(ch, start, length);
}
// <messageInput>
else if (
(logInput != null)
&& (currentElement.equals(WSIConstants.ELEM_MESSAGE_INPUT)))
{
logInput.append(ch, start, length);
}
// <wsdlInput>
else if (
(wsdlInput != null)
&& (currentElement.equals(WSIConstants.ELEM_WSDL_INPUT)))
{
wsdlInput.append(ch, start, length);
}
/* REMOVE:
// <uddiInput>
else if ((uddiInput != null) && (currentElement.equals(WSIConstants.ELEM_UDDI_INPUT))) {
uddiInput.append(ch, start, length);
}
*/
}
}
/**
* NOTE that this api assumes that base wsdl validator has already validated
* the wsdl document and corresponding schemas against the wsdl 1.1 specification.
* Note also that there are a number of duplicate checks between the base validator
* and the ws-i validator. Since some of these checks are cpu intensive, we disable
* those assertions here.
*
* Returns true if the assertion has already been checked by the base validator.
* @param testAssertion
* @return true if the assertion has already been checked by the base validator.
*/
protected boolean alreadyChecked(String id)
{
boolean result = false;
if (id != null)
{
result = (id.equals("BP2110") ||
id.equals("BP2115") ||
id.equals("BP2417") ||
id.equals("BP2114") ||
id.equals("BP2123") ||
id.equals("SSBP2209") ||
id.equals("AP2209") ||
id.equals("BP2700")
);
}
return result;
}
}