/******************************************************************************* * 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 * http://www.eclipse.org/legal/epl-v10.html * * 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; } }