blob: d6e950ae2ba7ef6e3d32e2cd65dd90a076d11d97 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 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
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.j2ee.internal.webservice.helper;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jst.j2ee.common.QName;
import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceExtManager;
import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper;
import org.eclipse.jst.j2ee.webservice.wsclient.ComponentScopedRefs;
import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesClient;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
/**
* This class contains methods to help navigate WSDL files provided in various JSR-109 descriptors
*/
public class WSDLHelper {
private IProject proj;
public WSDLHelper(IProject aProject) {
this.proj = aProject;
}
/**
* This method returns the list of wsdl:port@name's contained in the WSDL file referred to by
* the specified <service-ref>
*
* @param serviceRefName
* The name of the <service-ref>
* @param compScopedRefName
* The name of the <component-scoped-refs>
* @param wsc
* The root object of the webservicesclient.xml descriptor
* @param exclude
* port names to exclude in the returned array
* @return String[] An array of wsdl:port@names's. null is returned if there are any problems
* with navigating the webservicesclient.xml or the WSDL.
*/
public String[] getPortNames(String serviceRefName, String compScopedRefName, WebServicesClient wsc, String[] exclude) {
ServiceRef sr = getServiceRef(serviceRefName, compScopedRefName, wsc);
if (sr == null)
return null;
String wsdlURL = getWSDLFileURL(sr);
if (wsdlURL.length() == 0)
return null;
String serviceLocalName = getServiceQname(sr);
String[] portNames = getPortNames(wsdlURL, serviceLocalName);
portNames = trim(portNames, exclude);
return portNames;
}
/**
* This method returns the namespace of the wsdl:service in WSDL file referred to by the
* specified <service-ref>
*
* @param serviceRefName
* The name of the <service-ref>
* @param compScopedRefName
* The name of the <component-scoped-refs>
* @param wsc
* The root object of the webservicesclient.xml descriptor
* @param exclude
* port names to exclude in the returned array
* @return String The namespace of the wsdl:service. null is returned if there are any problems
* with navigating the webservicesclient.xml or the WSDL.
*/
public String getPortNamespace(String serviceRefName, String compScopedRefName, WebServicesClient wsc) {
ServiceRef sr = getServiceRef(serviceRefName, compScopedRefName, wsc);
if (sr == null)
return null;
String wsdlURL = getWSDLFileURL(sr);
if (wsdlURL.length() == 0)
return ""; //$NON-NLS-1$
String serviceLocalName = getServiceQname(sr);
String namespace = getPortNamespace(wsdlURL, serviceLocalName);
return namespace;
}
/**
* This method returns the list of wsdl:port@name's contained in the specified wsdl:service in
* the specified WSDL file.
*
* @param wsdlURL
* The URL of the WSDL file.
* @param serviceLocalName
* The local name of the wsdl:service to look in.
* @return String[] An array of wsdl:port@name's. Null is returned a wsdl:service with the
* specified local name could not be found.
*/
private String[] getPortNames(String wsdlURL, String serviceLocalName) {
WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper();
Object targetService = getTargetService(wsdlURL, serviceLocalName);
if (targetService == null) {
//System.out.println("getPortNames ... targetService null.");
return null;
}
Map ports = serviceHelper.getServicePorts(targetService);
int numberOfPorts = ports.size();
String[] portNames = new String[numberOfPorts];
Iterator k = ports.values().iterator();
for (int m = 0; m < numberOfPorts; m++) {
Object port = k.next();
portNames[m] = serviceHelper.getPortName(port);
}
return portNames;
}
/**
* This method returns the namespace of the specified wsdl:service in the specified WSDL file.
*
* @param wsdlURL
* The URL of the WSDL file.
* @param serviceLocalName
* The local name of the wsdl:service to look in.
* @return String[] An array of wsdl:port@name's. An empty String is returned if a wsdl:service
* with the specified local name could not be found.
*/
private String getPortNamespace(String wsdlURL, String serviceLocalName) {
Object targetService = getTargetService(wsdlURL, serviceLocalName);
if (targetService == null) {
//System.out.println("getPortNamespace ... targetService null.");
return ""; //$NON-NLS-1$
}
return WSDLServiceExtManager.getServiceHelper().getServiceNamespaceURI(targetService);
}
private Object getTargetService(String wsdlURL, String serviceLocalName) {
WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper();
Object definition = getWSDLDefinition(wsdlURL);
if (definition == null) {
return null;
}
Object targetService = null;
Map services = serviceHelper.getDefinitionServices(definition);
if (!services.isEmpty()) {
if ((serviceLocalName == null || serviceLocalName.length() == 0) && services.size() > 1) //Multiple
// services
// without
// one
// designated
// is
// an
// error
{
return null;
}
if ((serviceLocalName == null || serviceLocalName.length() == 0) && services.size() == 1) {
//Return the port names in the one service
Iterator i = services.values().iterator();
targetService = i.next();
} else //There are multiple services but one is designated
{
Iterator j = services.values().iterator();
while (j.hasNext()) {
Object service = j.next();
String serviceName = serviceHelper.getServiceLocalPart(service);
if (serviceName.equals(serviceLocalName)) {
targetService = service;
break; //Found a match. Break out of loop. We must be assuming unique names
// on services.
}
}
}
}
return targetService;
}
private Object getWSDLDefinition(String wsdlURL) {
WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper();
return serviceHelper.getWSDLDefinition(wsdlURL);
/*try {
WSDLResourceImpl res = (WSDLResourceImpl) WorkbenchResourceHelperBase.getResource(URI.createURI(wsdlURL), true);
if (res == null)
return null;
return res.getDefinition();
} catch (Exception wsdle) {
return null;
}*/
}
/**
* Returns the file URL of the <wsdl-file>specified in the given <service-ref>. Returns a blank
* String if <wsdl-file>is not specified in the provided <service-ref>
*/
private String getWSDLFileURL(ServiceRef sr) {
String wsdlFileRelPath = sr.getWsdlFile();
if (wsdlFileRelPath == null || wsdlFileRelPath.length() == 0)
return ""; //$NON-NLS-1$
// Get a handle on the WSDL file.
IVirtualComponent component = ComponentCore.createComponent(proj);
if (component != null) {
IVirtualFolder moduleRoot = component.getRootFolder().getFolder("/"); //$NON-NLS-1$
IFile wsdlFile = moduleRoot.getFile(wsdlFileRelPath).getUnderlyingFile();
if (!wsdlFile.exists()) {
return ""; //$NON-NLS-1$
}
//Get the fileURL from wsdlFile
String wsdlURL;
try {
wsdlURL = wsdlFile.getLocation().toFile().toURL().toString();
} catch (MalformedURLException murle) {
return ""; //$NON-NLS-1$
}
if (wsdlURL == null || wsdlURL.length() == 0)
return ""; //$NON-NLS-1$
return wsdlURL;
}
return ""; //$NON-NLS-1$
}
/**
* Returns the local part of the <service-qname>specified in the given <service-ref>. Returns a
* blank String if <service-qname>is not specified in the provided <service-ref>
*/
private String getServiceQname(ServiceRef sr) {
QName serviceQname = sr.getServiceQname();
if (serviceQname == null)
return ""; //$NON-NLS-1$
String serviceLocalName = serviceQname.getLocalPart();
if (serviceLocalName == null)
return ""; //$NON-NLS-1$
return serviceLocalName;
}
/* If compScopedRefName is empty or null, we may have to check all of them. */
public ServiceRef getServiceRef(String name, String compScopedRefName, WebServicesClient wsc) {
Iterator serviceRefs;
if (compScopedRefName != null && compScopedRefName.length() > 0) {
ComponentScopedRefs csr = getCompScopedRef(compScopedRefName, wsc);
serviceRefs = csr.getServiceRefs().iterator();
} else {
serviceRefs = wsc.getServiceRefs().iterator();
//If there are no service refs ... check all component-scoped-refs for the service-ref
if (!serviceRefs.hasNext()) {
Iterator csRefs = wsc.getComponentScopedRefs().iterator();
while (csRefs.hasNext()) {
ComponentScopedRefs csr = (ComponentScopedRefs) csRefs.next();
Iterator srs = csr.getServiceRefs().iterator();
while (srs.hasNext()) {
ServiceRef sr = (ServiceRef) srs.next();
String thisName = sr.getServiceRefName();
if (thisName.equals(name)) {
return sr;
}
}
}
return null; //Could not find it in any of the component-scoped-refs
}
}
while (serviceRefs.hasNext()) {
ServiceRef serviceRef = (ServiceRef) serviceRefs.next();
String serviceRefName = serviceRef.getServiceRefName();
if (serviceRefName.equals(name))
return serviceRef;
}
return null;
}
private ComponentScopedRefs getCompScopedRef(String name, WebServicesClient wsc) {
Iterator compScopedRefs = wsc.getComponentScopedRefs().iterator();
while (compScopedRefs.hasNext()) {
ComponentScopedRefs compScopedRef = (ComponentScopedRefs) compScopedRefs.next();
String compScopedRefName = compScopedRef.getComponentName();
if (compScopedRefName.equals(name))
return compScopedRef;
}
return null;
}
private String[] trim(String[] values, String[] exclude) {
if (values == null || values.length == 0 || exclude == null || exclude.length == 0) //no
// change
// required.
// return
// as
// is.
return values;
String[] finalValues;
ArrayList finalList = new ArrayList();
for (int i = 0; i < values.length; i++) {
if (!contains(exclude, values[i])) {
finalList.add(values[i]);
}
}
int finalSize = finalList.size();
finalValues = new String[finalSize];
Object[] finalArray = finalList.toArray();
for (int j = 0; j < finalSize; j++) {
finalValues[j] = (String) (finalArray[j]);
}
return finalValues;
}
/**
* Returns true if the array of String's contains the specified String. False otherwise.
*/
private boolean contains(String[] values, String s) {
if (values == null)
return false;
for (int i = 0; i < values.length; i++) {
if (values[i].equals(s))
return true;
}
return false;
}
}