blob: 1a173a6b4db2ef84518fa142177dd242a9eb993b [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.uddi;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
import javax.wsdl.Binding;
import javax.wsdl.Port;
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.AssertionProcessVisitor;
import org.eclipse.wst.wsi.internal.core.report.AssertionResult;
import org.eclipse.wst.wsi.internal.core.util.UDDIUtils;
import org.eclipse.wst.wsi.internal.core.wsdl.WSDLDocument;
import org.eclipse.wst.wsi.internal.core.wsdl.traversal.WSDLTraversal;
import org.eclipse.wst.wsi.internal.core.wsdl.traversal.WSDLTraversalContext;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;
import org.uddi4j.datatype.tmodel.TModel;
import org.uddi4j.util.CategoryBag;
import org.uddi4j.util.KeyedReference;
import org.w3c.dom.Element;
/**
* WSI3004 - The conformance claims in the uddi:tModel are the same
* as those in the wsdl:binding which is referenced by the uddi:tModel.
*/
public class WSI3004 extends AssertionProcessVisitor implements WSITag
{
private final UDDIValidatorImpl validator;
/**
* @param UDDIValidatorImpl
*/
public WSI3004(UDDIValidatorImpl impl)
{
super(impl);
this.validator = impl;
}
private static final String PORTS_PARAM = "ports";
private static final String BINDING_PARAM = "binding";
/**
* Gets WSI conformance claims from a tModel.
* @param tModel
* @return HashSet
* @throws WSIException
*/
private HashSet getConformanceClaimsFromUDDI(TModel tModel)
throws WSIException
{
String conformanceKey = UDDIUtils.getWSIConformanceTModelKey(validator.uddiProxy);
HashSet result = new HashSet();
CategoryBag bag = tModel.getCategoryBag();
if (bag != null)
{
Vector references = bag.getKeyedReferenceVector();
for (int i = 0; i < references.size(); i++)
{
KeyedReference ref = (KeyedReference) references.get(i);
if (ref.getTModelKey().equalsIgnoreCase(conformanceKey))
{
result.add(ref.getKeyValue());
}
}
}
return result;
}
/**
* Gets WSI conformance claims from WSDL binding
* that references specified tModel. Additionally,
* WSDL ports, which uses the binding, are processed.
*
* @param tModel
* @return HashSet
*/
private HashSet getConformanceClaimsFromWSDL(TModel tModel)
{
HashSet result = new HashSet();
try
{
// Read the WSDL document
String overviewURL = UDDIUtils.getOverviewURL(tModel);
WSDLDocument wsdlDocument = validator.getWSDLDocument(overviewURL);
// Get binding
Binding binding = UDDIUtils.getBinding(overviewURL, wsdlDocument);
String bindingName = binding.getQName().getLocalPart();
// Get claims
result =
getClaimsFromElement(binding.getDocumentationElement(), result);
// Get ports, which reference this binding, because:
// "A claim on a wsdl:port is inherited by the referenced wsdl:bindings."
Vector ports = getPorts(wsdlDocument, bindingName);
for (int i = 0; i < ports.size(); i++)
{
Port port = (Port) ports.get(i);
result = getClaimsFromElement(port.getDocumentationElement(), result);
}
}
catch (Exception e)
{
// ADD:
}
return result;
}
/**
* Gets WSI conformance claims from the 'documentation' XML element
* and puts them into the HashSet.
* @param docElement
* @param result
* @return HashSet
*/
private HashSet getClaimsFromElement(Element docElement, HashSet result)
{
if (result == null)
{
result = new HashSet();
}
if (docElement != null)
{
Element claimElement = XMLUtils.findChildElement(docElement, WSI_CLAIM);
while (claimElement != null)
{
/*
Node attr = XMLUtils.getAttribute(claimElement, ATTR_CLAIM_CONFORMSTO);
if (attr != null)
result.add(attr.getNodeValue());
*/
String value =
claimElement.getAttribute(ATTR_CLAIM_CONFORMSTO.getLocalPart());
if (value != null)
result.add(value);
claimElement = XMLUtils.findElement(claimElement, WSI_CLAIM);
}
}
return result;
}
/**
* Gets wsdl:ports, which use specified binding.
* @param wsdlDocument
* @param bindingName
* @return Vector
*/
private Vector getPorts(WSDLDocument wsdlDocument, String bindingName)
{
Vector ports = new Vector();
Map params = new HashMap();
params.put(PORTS_PARAM, ports);
params.put(BINDING_PARAM, bindingName);
WSDLTraversal traversal = new WSDLTraversal();
//VisitorAdaptor.adapt(this);
traversal.setVisitor(this);
traversal.visitPort(true);
traversal.ignoreReferences();
traversal.ignoreImport();
traversal.traverse(wsdlDocument.getDefinitions(), params);
return ports;
}
/* (non-Javadoc)
* @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Port, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext)
*/
public void visit(Port port, Object parent, WSDLTraversalContext ctx)
{
if (port
.getBinding()
.getQName()
.getLocalPart()
.equals(ctx.getParameter(BINDING_PARAM).toString()))
{
((Vector) ctx.getParameter(PORTS_PARAM)).add(port);
}
}
/* (non-Javadoc)
* @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;
// Get the tModel from the entryContext
TModel tModel = (TModel) entryContext.getEntry().getEntryDetail();
// If the tModel does not exist, then fail
if (tModel == null)
{
result = AssertionResult.RESULT_FAILED;
failureDetailMessage = "Could not locate a tModel.";
}
// If there is a tModel
else
{
try
{
HashSet claimsFromUDDI = getConformanceClaimsFromUDDI(tModel);
HashSet claimsFromWSDL = getConformanceClaimsFromWSDL(tModel);
if (claimsFromUDDI.size() == 0)
{
result = AssertionResult.RESULT_PASSED;
}
else if (claimsFromUDDI.size() == claimsFromWSDL.size())
{
int counter = 0;
for (Iterator iter = claimsFromWSDL.iterator(); iter.hasNext();)
{
String claim = (String) iter.next();
for (Iterator iter2 = claimsFromUDDI.iterator();
iter2.hasNext();
)
{
String uddiClaim = (String) iter2.next();
if (claim.equalsIgnoreCase(uddiClaim))
{
counter++;
break;
}
}
}
if (counter != claimsFromWSDL.size())
{
// failed
result = AssertionResult.RESULT_FAILED;
failureDetailMessage =
"The tModel key is: [" + tModel.getTModelKey() + "].";
}
}
else
{
// failed
result = AssertionResult.RESULT_FAILED;
failureDetailMessage =
"The tModel key is: [" + tModel.getTModelKey() + "].";
}
}
catch (IllegalStateException e)
{
result = AssertionResult.RESULT_FAILED;
failureDetailMessage =
"The tModel key is: [" + tModel.getTModelKey() + "].";
}
}
// Return assertion result
return validator.createAssertionResult(testAssertion, result, failureDetailMessage);
}
}