| /******************************************************************************* |
| * 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); |
| } |
| } |