blob: e92e065d8a983cce76f6def787fba2ce8cf84371 [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.util;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;
import javax.wsdl.Binding;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.wsdl.WSDLDocument;
import org.uddi4j.UDDIException;
import org.uddi4j.client.UDDIProxy;
import org.uddi4j.datatype.binding.BindingTemplate;
import org.uddi4j.datatype.binding.TModelInstanceInfo;
import org.uddi4j.datatype.business.BusinessEntity;
import org.uddi4j.datatype.service.BusinessService;
import org.uddi4j.datatype.tmodel.TModel;
import org.uddi4j.response.BusinessDetail;
import org.uddi4j.response.ServiceDetail;
import org.uddi4j.response.TModelDetail;
import org.uddi4j.response.TModelInfo;
import org.uddi4j.response.TModelList;
import org.uddi4j.transport.TransportException;
import org.uddi4j.util.CategoryBag;
import org.uddi4j.util.FindQualifier;
import org.uddi4j.util.FindQualifiers;
import org.uddi4j.util.KeyedReference;
/**
* This class provide some service functions used by UDDIValidator.
*
* @version 1.0.1
* @author Peter Brittenham
*/
public final class UDDIUtils
{
static public final FindQualifiers EXACT_NAME_MATCH_QUALIFIER;
static {
Vector vector = new Vector();
EXACT_NAME_MATCH_QUALIFIER = new FindQualifiers();
vector.add(new FindQualifier(FindQualifier.exactNameMatch));
vector.add(new FindQualifier(FindQualifier.sortByNameAsc));
EXACT_NAME_MATCH_QUALIFIER.setFindQualifierVector(vector);
}
static final String WS_I_CONFORMANCE_TMODEL_NAME =
"ws-i-org:conformsTo:2002_12";
static private Hashtable wsiConformanceTable = new Hashtable();
/**
* Gets a business service by key.
* @param proxy a UDDI proxy.
* @param key a key to a business service.
* @return a business service specified by the given key.
* @throws TransportException if error originating within the SOAP transport.
* @throws UDDIException if the return value of a UDDI API cannot indicate an error condition.
*/
public static BusinessService getBusinessServiceByKey(
UDDIProxy proxy,
String key)
throws TransportException, UDDIException
{
BusinessService result = null;
ServiceDetail sd = proxy.get_serviceDetail(key);
if (sd != null)
{
Vector v = sd.getBusinessServiceVector();
if (v != null && v.size() > 0)
{
result = (BusinessService) v.firstElement();
}
}
return result;
}
/**
* Gets business entity by key.
* @param proxy a UDDI proxy.
* @param key a key to a business entiy.
* @return a business entity specified by the given key.
* @throws TransportException if error originating within the SOAP transport.
* @throws UDDIException if the return value of a UDDI API cannot indicate
* an error condition.
*/
public static BusinessEntity getBusinessByKey(UDDIProxy proxy, String key)
throws TransportException, UDDIException
{
BusinessEntity result = null;
BusinessDetail bd = proxy.get_businessDetail(key);
if (bd != null)
{
Vector v = bd.getBusinessEntityVector();
if (v != null && v.size() > 0)
{
result = (BusinessEntity) v.firstElement();
}
}
return result;
}
/**
* Gets a tModel by key.
* @param proxy a UDDI proxy.
* @param key a key to a tModel.
* @return a tModel specified by the given key.
* @throws TransportException if error originating within the SOAP transport.
* @throws UDDIException if the return value of a UDDI API cannot indicate
* an error condition.
*/
public static TModel getTModelByKey(UDDIProxy proxy, String key)
{
TModel result = null;
try
{
TModelDetail bd = proxy.get_tModelDetail(key);
if (bd != null)
{
Vector v = bd.getTModelVector();
if (v != null && v.size() > 0)
{
result = (TModel) v.firstElement();
}
}
}
catch (Throwable e)
{
}
return result;
}
/**
* Gets key of the WSI Conformance tModel.
* @param proxy a UDDI proxy.
* @return the key of the WSI Conformance tModel.
*/
public static String getWSIConformanceTModelKey(UDDIProxy proxy)
{
if (proxy == null)
throw new IllegalArgumentException("UDDI proxy cannot be null.");
String result = null;
if (wsiConformanceTable.containsKey(proxy))
{
result = wsiConformanceTable.get(proxy).toString();
}
else
{
result = getTModelKeyByName(proxy, WS_I_CONFORMANCE_TMODEL_NAME);
if (result == null)
{
throw new IllegalStateException("WS-I conformance taxonomy tModel was not found");
}
wsiConformanceTable.put(proxy, result);
}
return result;
}
/**
* Gets a tModel key by tModel name.
* @param proxy a UDDI proxy.
* @param name a tModel name.
* @return a tModel key specified by the given tModel name.
*/
public static String getTModelKeyByName(UDDIProxy proxy, String name)
{
String result = null;
try
{
TModelList list =
proxy.find_tModel(name, null, null, EXACT_NAME_MATCH_QUALIFIER, 1);
TModelInfo info =
(TModelInfo) list.getTModelInfos().getTModelInfoVector().firstElement();
result = info.getTModelKey();
}
catch (Throwable e)
{
}
return result;
}
/**
* Get string representation of bindingTemplate.
* @param bindingTemplate a BindingTemplate object.
* @return a string representation of bindingTemplate.
*/
public static String bindingTemplateToString(BindingTemplate bindingTemplate)
{
String returnString = "";
if (bindingTemplate == null)
returnString = "null";
else
{
returnString =
"accessPoint: "
+ (bindingTemplate.getAccessPoint() == null
? "null"
: bindingTemplate.getAccessPoint().getText());
if (bindingTemplate.getTModelInstanceDetails() == null
|| bindingTemplate
.getTModelInstanceDetails()
.getTModelInstanceInfoVector()
== null)
{
returnString += ", [no tModel reference]";
}
else
{
Iterator iterator =
bindingTemplate
.getTModelInstanceDetails()
.getTModelInstanceInfoVector()
.iterator();
int infoCount = 1;
TModelInstanceInfo info;
while (iterator.hasNext())
{
info = (TModelInstanceInfo) iterator.next();
returnString += ", ["
+ infoCount++
+ "] tModelKey: "
+ info.getTModelKey();
}
}
}
return returnString;
}
/**
* Get string representation of tModel.
* @param tModel a TModel object.
* @return a string representation of tModel.
*/
public static String tModelToString(TModel tModel)
{
String returnString = "";
if (tModel == null)
returnString = "null";
else
{
returnString =
"name: "
+ tModel.getNameString()
+ ", categoryBag: "
+ (tModel.getCategoryBag() == null
? "null"
: categoryBagToString(tModel.getCategoryBag()))
+ ", overviewURL: "
+ (tModel.getOverviewDoc() == null
? "null"
: tModel.getOverviewDoc().getOverviewURLString());
}
return returnString;
}
/**
* Get string representation of categoryBag.
* @param categoryBag a CategoryBag object.
* @return a tring representation of categoryBag.
*/
public static String categoryBagToString(CategoryBag categoryBag)
{
String returnString = "";
if (categoryBag == null)
{
returnString += "null";
}
else
{
returnString += "KeyedReferenceList: ";
Vector krList = null;
if ((krList = categoryBag.getKeyedReferenceVector()) == null)
{
returnString += "null";
}
else if (krList.size() == 0)
{
returnString += "empty";
}
else
{
KeyedReference kr = null;
Iterator iterator = krList.iterator();
while (iterator.hasNext())
{
kr = (KeyedReference) iterator.next();
returnString += "tModelKey: "
+ kr.getTModelKey()
+ ", keyName: "
+ kr.getKeyName()
+ ", keyValue: "
+ kr.getKeyValue();
}
}
}
return returnString;
}
/**
* Find the wsdlSpec tModel associated with a binding.
*/
public static TModel findTModel(
UDDIProxy uddiProxy,
BindingTemplate bindingTemplate,
boolean verboseOption)
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.
*/
public static 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.
*/
public static String getOverviewURL(TModel tModel)
{
if (tModel != null
&& tModel.getOverviewDoc() != null
&& tModel.getOverviewDoc().getOverviewURL() != null)
{
return tModel.getOverviewDoc().getOverviewURL().getText();
}
return null;
}
/**
* Get WSDL document.
*/
public static 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 binding from the overviewURL in the tModel.
*/
public static 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];
}
}