blob: 3df554d0cef81448f3c70bea714768253354ff71 [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.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Vector;
import javax.wsdl.Binding;
import javax.wsdl.WSDLException;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.analyzer.AnalyzerContext;
import org.eclipse.wst.wsi.internal.core.analyzer.ServiceReference;
import org.eclipse.wst.wsi.internal.core.analyzer.config.UDDIReference;
import org.eclipse.wst.wsi.internal.core.analyzer.config.WSDLElement;
import org.eclipse.wst.wsi.internal.core.analyzer.config.impl.WSDLElementImpl;
import org.eclipse.wst.wsi.internal.core.profile.ProfileArtifact;
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.UDDIValidator;
import org.eclipse.wst.wsi.internal.core.profile.validator.impl.BaseValidatorImpl;
import org.eclipse.wst.wsi.internal.core.report.Entry;
import org.eclipse.wst.wsi.internal.core.report.ReportArtifact;
import org.eclipse.wst.wsi.internal.core.report.Reporter;
import org.eclipse.wst.wsi.internal.core.util.EntryType;
import org.eclipse.wst.wsi.internal.core.util.UDDIUtils;
import org.eclipse.wst.wsi.internal.core.wsdl.WSDLDocument;
import org.uddi4j.client.UDDIProxy;
import org.uddi4j.datatype.binding.BindingTemplate;
import org.uddi4j.datatype.binding.TModelInstanceInfo;
import org.uddi4j.datatype.tmodel.TModel;
import org.uddi4j.response.BindingDetail;
import org.uddi4j.response.TModelDetail;
import org.uddi4j.util.CategoryBag;
import org.uddi4j.util.KeyedReference;
import com.ibm.wsdl.util.StringUtils;
/**
* The UDDI validator will verify that a web service description was published correctly in a UDDI registry.
*
* @version 1.0.1
* @author Peter Brittenham (peterbr@us.ibm.com)
*/
public class UDDIValidatorImpl
extends BaseValidatorImpl
implements UDDIValidator
{
/**
* UDDI reference.
*/
protected UDDIReference uddiReference;
/**
* UDDI proxy.
*/
protected UDDIProxy uddiProxy;
/**
* WSDL binding.
*/
private Binding binding = null;
/* (non-Javadoc)
* @see org.wsi.test.profile.validator.UDDIValidator#init(org.eclipse.wst.wsi.internal.core.analyzer.AnalyzerContext, org.wsi.test.profile.ProfileArtifact, org.wsi.test.report.ReportArtifact, org.wsi.test.analyzer.config.UDDIReference, org.wsi.test.report.Reporter)
*/
public void init(
AnalyzerContext analyzerContext,
ProfileArtifact profileArtifact,
ReportArtifact reportArtifact,
UDDIReference uddiReference,
Reporter reporter)
throws WSIException
{
// BaseValidatorImpl
super.init(analyzerContext, profileArtifact, reportArtifact, reporter);
// Save input references
this.uddiReference = uddiReference;
}
/* (non-Javadoc)
* @see org.wsi.test.profile.validator.UDDIValidator#validate()
*/
public String validate() throws WSIException
{
String wsdlURL = null;
Entry entry = null;
BindingTemplate bindingTemplate = null;
TModel tModel = null;
// it depricated after refactoring
// now the inner classes moved out from validator
//String classPrefix = this.getClass().getName() + "$";
String classPrefix = this.getClass().getPackage().getName()+".";
try
{
// Set up a reference to the UDDI registry
uddiProxy = new UDDIProxy();
//new Socket(new InetAddress(uddiReference.getInquiryURL()));
uddiProxy.setInquiryURL(uddiReference.getInquiryURL());
boolean wasEx = false;
InputStream stream;
try
{
URL url = StringUtils.getURL(null, uddiReference.getInquiryURL());
stream = url.openStream();
stream.close();
}
catch (UnknownHostException ex)
{
wasEx = true;
}
catch (IOException ex)
{
}
if (!wasEx)
{
// If the UDDI reference is to a bindingTemplate then get it
if (uddiReference.getKeyType().equals(UDDIReference.BINDING_KEY))
{
// Get binding detail which will contain the bindingTemplate
BindingDetail bindingDetail =
uddiProxy.get_bindingDetail(uddiReference.getKey());
// Get bindingTemplate
bindingTemplate =
(BindingTemplate) bindingDetail
.getBindingTemplateVector()
.elementAt(
0);
if (verboseOption)
{
System.err.println(
" BindingTemplate - "
+ UDDIUtils.bindingTemplateToString(bindingTemplate));
}
// Get the wsdlSpec tModel
tModel = findTModel(uddiProxy, bindingTemplate);
}
// Else it has to be a tModel
else
{
TModelDetail tModelDetail =
uddiProxy.get_tModelDetail(uddiReference.getKey());
tModel = (TModel) tModelDetail.getTModelVector().elementAt(0);
}
if (verboseOption)
{
System.err.println(
" TModel specified or found in bindingTemplate - "
+ UDDIUtils.tModelToString(tModel));
}
}
if (bindingTemplate == null)
{
setMissingInput(
EntryType.getEntryType(EntryType.TYPE_DISCOVERY_BINDINGTEMPLATE));
}
// If there is a bindingTemplate, then process test assertions for it
else
{
// Create entry
entry = this.reporter.getReport().createEntry();
entry.setEntryType(
EntryType.getEntryType(EntryType.TYPE_DISCOVERY_BINDINGTEMPLATE));
entry.setReferenceID(bindingTemplate.getBindingKey());
entry.setEntryDetail(bindingTemplate);
// Process test assertions
processAssertions(
classPrefix,
new EntryContext(entry, this.analyzerContext));
}
// NOTE: From this point forward, if a bindingTemplate does NOT have a wsdlSpec tModel,
// the tModel will be NULL.
//Parse WSDL document, and get WSDL document url, binding name and namespace
try
{
String overviewURL = getOverviewURL(tModel);
wsdlURL = getWSDLLocation(overviewURL);
WSDLDocument wsdlDocument = getWSDLDocument(wsdlURL);
// ADD: The WSDL binding is used in WSI3001 and should be moved to the entryContext
binding = getBinding(overviewURL, wsdlDocument);
}
catch (Exception e)
{
// ADD:
if (verboseOption)
{
System.err.println(" EXCEPTION: " + e.toString());
}
}
// Create entry
entry = this.reporter.getReport().createEntry();
entry.setEntryType(
EntryType.getEntryType(EntryType.TYPE_DISCOVERY_TMODEL));
entry.setReferenceID(
(tModel == null ? "[tModel]" : tModel.getTModelKey()));
entry.setEntryDetail(tModel);
// Process test assertions
processAssertions(
classPrefix,
new EntryContext(entry, this.analyzerContext));
}
catch (Exception e)
{
// Throw WSIException
if (e instanceof WSIException)
throw (WSIException) e;
else
throw new WSIException(
"An exception occurred while processing the discovery test assertions.",
e);
}
// Cleanup
cleanup();
// Get WSDL location
wsdlURL = this.analyzerContext.getServiceReference().getWSDLLocation();
// Return WSDL URL
return wsdlURL;
}
/**
* Set WSDL binding in the service reference portion of the analyzer context.
*/
protected void setWSDLBinding(Binding binding)
{
String bindingName =
binding == null ? null : binding.getQName().getLocalPart();
String namespace =
binding == null ? null : binding.getQName().getNamespaceURI();
// Set the WSDL document location in analyzerContext
ServiceReference serviceReference =
this.analyzerContext.getServiceReference();
// If the wsdlElement does not exist, then set it
WSDLElement wsdlElement;
if ((wsdlElement = serviceReference.getWSDLElement()) == null)
{
// Get the WSDL binding from the overviewURL and set in analyzerContext
wsdlElement = new WSDLElementImpl();
wsdlElement.setName(bindingName);
wsdlElement.setNamespace(namespace);
wsdlElement.setType(EntryType.TYPE_DESCRIPTION_BINDING);
}
// Set the wsdlElement in the service reference
serviceReference.setWSDLElement(wsdlElement);
// Set the service reference back into the analyzerContext
analyzerContext.setServiceReference(serviceReference);
}
/**
* Set the WSDL location in the service reference portion of the analyzer context.
*/
protected void setWSDLLocation(String wsdlURL)
{
// Set the WSDL document location in analyzerContext
ServiceReference serviceReference =
this.analyzerContext.getServiceReference();
serviceReference.setWSDLLocation(wsdlURL);
// Set the service reference back into the analyzerContext
analyzerContext.setServiceReference(serviceReference);
}
/**
* Find the wsdlSpec tModel associated with a binding.
*/
private TModel findTModel(
UDDIProxy uddiProxy,
BindingTemplate bindingTemplate)
throws WSIException
{
TModel tModel = null;
// Get the list of tModel references associated with this bindingTemplate
Iterator iterator =
bindingTemplate
.getTModelInstanceDetails()
.getTModelInstanceInfoVector()
.iterator();
// Process each tModel reference
Vector tModelKeyList = new Vector();
while (iterator.hasNext())
{
// Get tModelInstanceInfo
TModelInstanceInfo tModelInstanceInfo =
(TModelInstanceInfo) iterator.next();
// Add key to list
tModelKeyList.add(tModelInstanceInfo.getTModelKey());
}
// Get the tModels associated with the bindingTemplate
if (tModelKeyList.size() > 0)
{
try
{
// Get the tModel details
TModelDetail tModelDetail = uddiProxy.get_tModelDetail(tModelKeyList);
// Get the list of tModels
Iterator tModelIterator = tModelDetail.getTModelVector().iterator();
//boolean tModelFound = false;
TModel nextTModel = null;
// Go through the list of tModels
while ((tModelIterator.hasNext()) && (tModel == null))
{
// Get next tModel in list
nextTModel = (TModel) tModelIterator.next();
if (verboseOption)
{
System.err.println(
" TModel referenced from bindingTemplate - "
+ UDDIUtils.tModelToString(nextTModel));
}
// If this is a wsdlSpec tModel, then this is the tModel we want
if (isWsdlSpec(nextTModel))
tModel = nextTModel;
}
}
catch (Exception e)
{
// Throw WSIException
throw new WSIException("Could not get tModel details.", e);
}
}
else
{
// Throw exception
//throw new WSIException("UDDI bindingTemplate did not contain any tModel references.");
}
return tModel;
}
/**
* Determine if this is a wsdlSpec tModel.
*/
protected boolean isWsdlSpec(TModel tModel)
{
boolean tModelFound = false;
CategoryBag categoryBag = null;
Iterator categoryBagIterator = null;
// Determine if the catetgoryBag contains wsdlSpec
if ((categoryBag = tModel.getCategoryBag()) != null)
{
// Get the list of keyed references
categoryBagIterator = categoryBag.getKeyedReferenceVector().iterator();
KeyedReference keyedReference = null;
// Go through the list of keyed references
while (categoryBagIterator.hasNext() && !(tModelFound))
{
// Get next keyed reference
keyedReference = (KeyedReference) categoryBagIterator.next();
// If this is a types taxonomy tModel and the value is wsdlSpec, then this is the tModel we want
// REMOVE: It is not necessary to check the key name
//if (keyedReference.getTModelKey().equalsIgnoreCase(TModel.TYPES_TMODEL_KEY) &&
// "wsdlSpec".equals(keyedReference.getKeyValue()) &&
// ("types".equals(keyedReference.getKeyName()) ||
// "uddi-org:types".equals(keyedReference.getKeyName()))) {
// tModelFound = true;
//}
if (keyedReference
.getTModelKey()
.equalsIgnoreCase(TModel.TYPES_TMODEL_KEY)
&& "wsdlSpec".equals(keyedReference.getKeyValue()))
{
tModelFound = true;
}
}
}
return tModelFound;
}
/**
* Get an OverviewURL from tModel.
*/
protected String getOverviewURL(TModel tModel)
{
if (tModel != null
&& tModel.getOverviewDoc() != null
&& tModel.getOverviewDoc().getOverviewURL() != null)
{
return tModel.getOverviewDoc().getOverviewURL().getText();
}
return null;
}
/**
* Get WSDL document.
*/
protected String getWSDLLocation(String wsdlLocation)
{
int index;
// Check if the overviewURL contains a fragment identifier
if ((index = wsdlLocation.indexOf("#")) > -1)
{
wsdlLocation = wsdlLocation.substring(0, index);
}
return wsdlLocation;
}
/**
* Get WSDL document.
*/
protected WSDLDocument getWSDLDocument(String wsdlLocation)
throws MalformedURLException, WSDLException
{
return new WSDLDocument(getWSDLLocation(wsdlLocation));
}
/**
* Get WSDL binding from the overviewURL in the tModel.
*/
protected Binding getBinding(String overviewURL, WSDLDocument wsdlDocument)
{
int index;
int nameIndex;
Binding[] bindings = wsdlDocument.getBindings();
if (bindings == null || bindings.length == 0)
return null;
if (overviewURL != null)
{
// Check if the overviewURL contains a fragment identifier
if ((index = overviewURL.indexOf("#")) > -1)
{
// TEMP: Need to use a real XPath evaluator like Xalan
String nameAttribute = "@name=";
// Locate name reference
if ((nameIndex =
overviewURL.substring(index + 1).indexOf(nameAttribute))
> -1)
{
// Get the next character which should be a quote
int firstQuoteIndex = index + 1 + nameIndex + nameAttribute.length();
String quote =
overviewURL.substring(firstQuoteIndex, firstQuoteIndex + 1);
// Get the part of the URL which should contain the binding name
String urlPart = overviewURL.substring(firstQuoteIndex + 1);
// Find the next quote
int nextQuoteIndex;
if ((nextQuoteIndex = urlPart.indexOf(quote)) > -1)
{
String bindingName = urlPart.substring(0, nextQuoteIndex);
//look for binding with the specified name
for (int i = 0; i < bindings.length; i++)
{
if (bindingName.equals(bindings[i].getQName().getLocalPart()))
return bindings[i];
}
}
}
}
}
return bindings[0];
}
/**
* Get string representation of categoryBag.
* @param categoryBag a CategoryBag object.
* @return string representation of categoryBag.
*/
protected String categoryBagToString(CategoryBag categoryBag)
{
String toString = "";
if (categoryBag != null)
{
Vector keyedReferenceList = null;
if (((keyedReferenceList = categoryBag.getKeyedReferenceVector())
== null)
|| (keyedReferenceList.size() == 0))
{
toString += "No KeyedReferences";
}
else
{
int count = 1;
KeyedReference keyedReference;
Iterator iterator = keyedReferenceList.iterator();
while (iterator.hasNext())
{
keyedReference = (KeyedReference) iterator.next();
toString += "\n ["
+ count++
+ "] tModelKey: "
+ keyedReference.getTModelKey()
+ ", keyName: "
+ keyedReference.getKeyName()
+ ", keyValue: "
+ keyedReference.getKeyValue();
}
}
}
else
{
toString = "null";
}
return toString;
}
/* (non-Javadoc)
* @see org.wsi.test.profile.validator.impl.BaseValidatorImpl#isPrimaryEntryTypeMatch(org.wsi.test.profile.TestAssertion, org.wsi.test.profile.validator.EntryContext)
*/
protected boolean isPrimaryEntryTypeMatch(
TestAssertion testAssertion,
EntryContext targetContext)
{
boolean match = false;
// If the test assertion entry type matches the target context entry type, then contine
if (testAssertion
.getEntryTypeName()
.equals(targetContext.getEntry().getEntryType().getTypeName()))
{
match = true;
}
return match;
}
/* (non-Javadoc)
* @see org.wsi.test.profile.validator.impl.BaseValidatorImpl#isNotApplicable(org.wsi.test.profile.TestAssertion)
*/
protected boolean isNotApplicable(TestAssertion testAssertion)
{
boolean notApplicable = false;
// ADD:
return notApplicable;
}
}