| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.axis2.jaxws.util; |
| |
| import org.apache.axis2.Constants; |
| import org.apache.axis2.context.ConfigurationContext; |
| import org.apache.axis2.description.Parameter; |
| import org.apache.axis2.engine.AxisConfiguration; |
| import org.apache.axis2.java.security.AccessController; |
| import org.apache.axis2.jaxws.ExceptionFactory; |
| import org.apache.axis2.jaxws.catalog.JAXWSCatalogManager; |
| import org.apache.axis2.jaxws.catalog.impl.OASISCatalogManager; |
| import org.apache.axis2.jaxws.i18n.Messages; |
| import org.apache.axis2.jaxws.wsdl.WSDLReaderConfigurator; |
| import org.apache.axis2.metadata.factory.ResourceFinderFactory; |
| import org.apache.axis2.metadata.registry.MetadataFactoryRegistry; |
| import org.apache.axis2.metadata.resource.ResourceFinder; |
| import org.apache.axis2.wsdl.WSDLUtil; |
| import org.apache.axis2.wsdl.util.WSDLDefinitionWrapper; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import javax.wsdl.Binding; |
| import javax.wsdl.BindingOperation; |
| import javax.wsdl.Definition; |
| import javax.wsdl.Port; |
| import javax.wsdl.Service; |
| import javax.wsdl.WSDLException; |
| import javax.wsdl.extensions.ExtensibilityElement; |
| import javax.wsdl.extensions.soap.SOAPOperation; |
| import javax.wsdl.xml.WSDLReader; |
| import javax.xml.namespace.QName; |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.ConnectException; |
| import java.net.URL; |
| import java.net.URLClassLoader; |
| import java.net.URLConnection; |
| import java.net.UnknownHostException; |
| import java.security.PrivilegedAction; |
| import java.security.PrivilegedActionException; |
| import java.security.PrivilegedExceptionAction; |
| import java.util.ArrayList; |
| import java.util.Enumeration; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.jar.JarEntry; |
| import java.util.jar.JarFile; |
| |
| |
| /** |
| * Implementation of WSDLWrapper interface which controls access |
| * to the underlying Definition (WSDLDefinitionWrapper). |
| * The WSDLDefinitionWrapper implementation uses various strategies |
| * to control its in-memory footprint. |
| */ |
| public class WSDL4JWrapper implements WSDLWrapper { |
| private static final Log log = LogFactory.getLog(WSDL4JWrapper.class); |
| |
| private WSDLDefinitionWrapper wsdlDefinition = null; |
| |
| private URL wsdlURL; |
| private String wsdlExplicitURL; |
| private ConfigurationContext configContext; |
| private JAXWSCatalogManager catalogManager = null; |
| |
| // By default, use a reload strategy for the WSDLWrapper |
| private boolean limitMemory = true; |
| private int memoryType = 2; |
| |
| /** |
| * Constructor |
| * |
| * @param URL The URL for the WSDL |
| * @deprecated Use a constructor that passes in the ConfigContext, or memoryLimit parameter |
| */ |
| public WSDL4JWrapper(URL wsdlURL) throws FileNotFoundException, UnknownHostException, |
| ConnectException, IOException, WSDLException { |
| super(); |
| this.commonPartsURLConstructor(wsdlURL, (ConfigurationContext)null); |
| } |
| |
| /** |
| * @param wsdlURL |
| * @param limitMemory true if memory should be limited |
| * @throws FileNotFoundException |
| * @throws UnknownHostException |
| * @throws ConnectException |
| * @throws IOException |
| * @throws WSDLException |
| */ |
| public WSDL4JWrapper(URL wsdlURL, boolean limitMemory, int memoryType) throws FileNotFoundException, UnknownHostException, |
| ConnectException, IOException, WSDLException { |
| super(); |
| this.limitMemory = limitMemory; |
| this.memoryType = memoryType; |
| this.commonPartsURLConstructor(wsdlURL, (ConfigurationContext)null); |
| } |
| |
| /** |
| * @param wsdlURL |
| * @param catalogManager |
| * @throws FileNotFoundException |
| * @throws UnknownHostException |
| * @throws ConnectException |
| * @throws IOException |
| * @throws WSDLException |
| * @deprecated use a constructor with a ConfigurationContext or limitMemory parameter |
| */ |
| public WSDL4JWrapper(URL wsdlURL, JAXWSCatalogManager catalogManager) throws FileNotFoundException, |
| UnknownHostException, ConnectException, IOException, WSDLException { |
| this(wsdlURL, catalogManager, false, 0); |
| } |
| |
| public WSDL4JWrapper(URL wsdlURL, JAXWSCatalogManager catalogManager, boolean limitMemory) throws FileNotFoundException, |
| UnknownHostException, ConnectException, IOException, WSDLException { |
| super(); |
| this.catalogManager = catalogManager; |
| this.limitMemory = limitMemory; |
| this.commonPartsURLConstructor(wsdlURL, (ConfigurationContext)null); |
| } |
| public WSDL4JWrapper(URL wsdlURL, JAXWSCatalogManager catalogManager, boolean limitMemory, int memoryType) throws FileNotFoundException, |
| UnknownHostException, ConnectException, IOException, WSDLException { |
| super(); |
| this.catalogManager = catalogManager; |
| this.limitMemory = limitMemory; |
| this.memoryType = memoryType; |
| this.commonPartsURLConstructor(wsdlURL, (ConfigurationContext)null); |
| } |
| |
| public WSDL4JWrapper(URL wsdlURL, ConfigurationContext configContext, |
| JAXWSCatalogManager catalogManager) throws FileNotFoundException, |
| UnknownHostException, ConnectException, IOException, WSDLException { |
| super(); |
| this.catalogManager = catalogManager; |
| this.commonPartsURLConstructor(wsdlURL, configContext); |
| } |
| |
| public WSDL4JWrapper(URL wsdlURL, ConfigurationContext configContext) throws FileNotFoundException, |
| UnknownHostException, ConnectException, IOException, WSDLException { |
| super(); |
| this.commonPartsURLConstructor(wsdlURL, configContext); |
| } |
| |
| private void commonPartsURLConstructor(URL wsdlURL, ConfigurationContext configContext) throws FileNotFoundException, UnknownHostException, |
| ConnectException, IOException, WSDLException { |
| this.configContext = configContext; |
| // debugMemoryParms(configContext); |
| if(log.isDebugEnabled()) { |
| log.debug("WSDL4JWrapper(URL,ConfigurationContext) - Looking for wsdl file on client: " + (wsdlURL != null ? |
| wsdlURL.getPath():null)); |
| } |
| ClassLoader classLoader = (ClassLoader) AccessController.doPrivileged( |
| new PrivilegedAction() { |
| public Object run() { |
| return Thread.currentThread().getContextClassLoader(); |
| } |
| }); |
| this.wsdlURL = wsdlURL; |
| |
| URLConnection urlCon; |
| try { |
| |
| urlCon = getPrivilegedURLConnection(this.wsdlURL); |
| |
| InputStream is = null; |
| |
| try { |
| is = getInputStream(urlCon); |
| } |
| catch(IOException e) { |
| if(log.isDebugEnabled()) { |
| log.debug("Could not open url connection. Trying to use " + |
| "classloader to get another URL."); |
| } |
| String filePath = wsdlURL != null ? wsdlURL.getPath() : null; |
| if(filePath != null) { |
| URL url = getAbsoluteURL(classLoader, filePath); |
| if(url == null) { |
| if(log.isDebugEnabled()) { |
| log.debug("Could not locate URL for wsdl. Reporting error"); |
| } |
| throw new WSDLException("WSDL4JWrapper : ", e.getMessage(), e); |
| } |
| else { |
| urlCon = openConnection(url); |
| if(log.isDebugEnabled()) { |
| log.debug("Found URL for WSDL from jar"); |
| } |
| } |
| } |
| else { |
| if(log.isDebugEnabled()) { |
| log.debug("Could not get URL from classloader. Reporting " + |
| "error due to no file path."); |
| } |
| throw new WSDLException("WSDL4JWrapper : ", e.getMessage(), e); |
| } |
| } |
| if(is != null) { |
| is.close(); |
| } |
| this.wsdlExplicitURL = urlCon.getURL().toString(); |
| getDefinition(); |
| } catch (FileNotFoundException ex) { |
| throw ex; |
| } catch (UnknownHostException ex) { |
| throw ex; |
| } catch (ConnectException ex) { |
| throw ex; |
| } catch(IOException ex) { |
| throw ex; |
| } catch (Exception ex) { |
| throw new WSDLException("WSDL4JWrapper : ", ex.getMessage(), ex); |
| } |
| } |
| |
| /** |
| * This is a helper method to retrieve a URLConnection object |
| * based on a URL for the WSDL document. |
| */ |
| private URLConnection getURLConnection(URL url) throws IOException { |
| String filePath = null; |
| boolean isFileProtocol = |
| (url != null && "file".equals(url.getProtocol())) ? true : false; |
| if (isFileProtocol) { |
| filePath = (url != null) ? url.getPath() : null; |
| //Check is the uri has relative path i.e path is not absolute and is not starting with a "/" |
| boolean isRelativePath = |
| (filePath != null && !new File(filePath).isAbsolute()) ? true : false; |
| if (isRelativePath) { |
| if (log.isDebugEnabled()) { |
| log.debug("WSDL URL has a relative path"); |
| } |
| //Lets read the complete WSDL URL for relative path from class loader |
| //Use relative path of url to fetch complete URL. |
| url = getAbsoluteURL(getThreadClassLoader(), filePath); |
| if (url == null) { |
| if (log.isDebugEnabled()) { |
| log.debug("WSDL URL for relative path not found in ClassLoader"); |
| log.warn( |
| "Unable to read WSDL from relative path, check the relative path"); |
| log.info("Relative path example: file:/WEB-INF/wsdl/<wsdlfilename>"); |
| log.warn( |
| "Using relative path as default wsdl URL to create wsdl Definition."); |
| } |
| url = wsdlURL; |
| } |
| else { |
| if(log.isDebugEnabled()) { |
| log.debug("WSDL URL found for relative path: " + filePath + " scheme: " + |
| url.getProtocol()); |
| } |
| } |
| } |
| } |
| URLConnection connection = null; |
| if(url != null) { |
| if(log.isDebugEnabled()) { |
| log.debug("Retrieving URLConnection from WSDL URL"); |
| } |
| connection = openConnection(url); |
| } |
| return connection; |
| } |
| |
| private URLConnection getPrivilegedURLConnection(final URL url) throws IOException { |
| try { |
| |
| return (URLConnection) AccessController.doPrivileged( new PrivilegedExceptionAction() { |
| public Object run() throws IOException { |
| return (getURLConnection(url)); |
| } |
| }); |
| |
| } catch (PrivilegedActionException e) { |
| throw (IOException) e.getException(); |
| } |
| } |
| |
| private URLConnection openConnection(final URL url) throws IOException { |
| try { |
| return (URLConnection) AccessController.doPrivileged(new PrivilegedExceptionAction() { |
| public Object run() throws IOException { |
| return url.openConnection(); |
| } |
| }); |
| } catch (PrivilegedActionException e) { |
| throw (IOException) e.getException(); |
| } |
| } |
| |
| private ClassLoader getThreadClassLoader() { |
| return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { |
| public Object run() { |
| return Thread.currentThread().getContextClassLoader(); |
| } |
| }); |
| } |
| |
| private URL getAbsoluteURL(final ClassLoader classLoader, final String filePath){ |
| URL url = (URL) AccessController.doPrivileged( |
| new PrivilegedAction() { |
| public Object run() { |
| return classLoader.getResource(filePath); |
| } |
| } |
| ); |
| if(url == null) { |
| if(log.isDebugEnabled()) { |
| log.debug("Could not get URL from classloader. Looking in a jar."); |
| } |
| if(classLoader instanceof URLClassLoader){ |
| final URLClassLoader urlLoader = (URLClassLoader)classLoader; |
| |
| url = (URL) AccessController.doPrivileged( new PrivilegedAction() { |
| public Object run() { |
| return (getURLFromJAR(urlLoader, wsdlURL)); |
| } |
| }); |
| |
| } |
| else { |
| final URLClassLoader nestedLoader = (URLClassLoader) getNestedClassLoader(URLClassLoader.class, classLoader); |
| if (nestedLoader != null) { |
| url = (URL) AccessController.doPrivileged( new PrivilegedAction() { |
| public Object run() { |
| return (getURLFromJAR(nestedLoader, wsdlURL)); |
| } |
| }); |
| } |
| } |
| } |
| return url; |
| } |
| |
| private ClassLoader getNestedClassLoader(Class type, ClassLoader root) { |
| if (log.isDebugEnabled()) { |
| log.debug("Searching for nested URLClassLoader"); |
| } |
| while (!(root instanceof URLClassLoader)) { |
| if (root == null) { |
| break; |
| } |
| |
| final ClassLoader current = root; |
| root = (ClassLoader) AccessController.doPrivileged( |
| new PrivilegedAction() { |
| public Object run() { |
| return current.getParent(); |
| } |
| } |
| ); |
| if (log.isDebugEnabled() && root != null) { |
| log.debug("Checking parent ClassLoader: " + root.getClass().getName()); |
| } |
| } |
| |
| return root; |
| } |
| |
| private URL getURLFromJAR(URLClassLoader urlLoader, URL relativeURL) { |
| URL[] urlList = null; |
| ResourceFinderFactory rff =(ResourceFinderFactory)MetadataFactoryRegistry.getFactory(ResourceFinderFactory.class); |
| ResourceFinder cf = rff.getResourceFinder(); |
| if (log.isDebugEnabled()) { |
| log.debug("ResourceFinderFactory: " + rff.getClass().getName()); |
| log.debug("ResourceFinder: " + cf.getClass().getName()); |
| } |
| |
| urlList = cf.getURLs(urlLoader); |
| if(urlList == null){ |
| if(log.isDebugEnabled()){ |
| log.debug("No URL's found in URL ClassLoader"); |
| } |
| throw ExceptionFactory.makeWebServiceException(Messages.getMessage("WSDL4JWrapperErr1")); |
| } |
| |
| for (URL url : urlList) { |
| if ("file".equals(url.getProtocol())) { |
| // Insure that Windows spaces are properly handled in the URL |
| final File f = new File(url.getPath().replaceAll("%20", " ")); |
| // If file is not of type directory then its a jar file |
| if (isAFile(f)) { |
| try { |
| JarFile jf = (JarFile) AccessController.doPrivileged( |
| new PrivilegedExceptionAction() { |
| public Object run() throws IOException { |
| return new JarFile(f); |
| } |
| } |
| ); |
| Enumeration<JarEntry> entries = jf.entries(); |
| // read all entries in jar file and return the first |
| // wsdl file that matches |
| // the relative path |
| while (entries.hasMoreElements()) { |
| JarEntry je = entries.nextElement(); |
| String name = je.getName(); |
| if (name.endsWith(".wsdl")) { |
| String relativePath = relativeURL.getPath(); |
| if (relativePath.endsWith(name)) { |
| String path = f.getAbsolutePath(); |
| // This check is necessary because Unix/Linux file paths begin |
| // with a '/'. When adding the prefix 'jar:file:/' we may end |
| // up with '//' after the 'file:' part. This causes the URL |
| // object to treat this like a remote resource |
| if(path != null && path.indexOf("/") == 0) { |
| path = path.substring(1, path.length()); |
| } |
| |
| URL absoluteUrl = new URL("jar:file:/" |
| + path + "!/" |
| + je.getName()); |
| return absoluteUrl; |
| } |
| } |
| } |
| } catch (Exception e) { |
| throw ExceptionFactory.makeWebServiceException(e); |
| } |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| private boolean isAFile(final File f) { |
| Boolean ret = (Boolean) AccessController.doPrivileged( |
| new PrivilegedAction() { |
| public Object run() { |
| return new Boolean(f.exists() && !f.isDirectory()); |
| } |
| } |
| ); |
| return ret.booleanValue(); |
| } |
| |
| private static WSDLReader getWSDLReader() throws WSDLException { |
| // Keep this method private |
| WSDLReader reader; |
| try { |
| reader = (WSDLReader)AccessController.doPrivileged( |
| new PrivilegedExceptionAction() { |
| public Object run() throws WSDLException { |
| return WSDLUtil.newWSDLReaderWithPopulatedExtensionRegistry(); |
| } |
| }); |
| } catch (PrivilegedActionException e) { |
| throw (WSDLException)e.getException(); |
| } |
| WSDLReaderConfigurator configurator = (WSDLReaderConfigurator) MetadataFactoryRegistry. |
| getFactory(WSDLReaderConfigurator.class); |
| if(configurator != null) { |
| if(log.isDebugEnabled()) { |
| log.debug("Calling configureReaderInstance with: " + configurator.getClass().getName()); |
| } |
| configurator.configureReaderInstance(reader); |
| } |
| return reader; |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param URL The URL for the WSDL |
| * @param Definition Definition for the WSDL |
| * @deprecated Use a constructor that has a ConfigContext or memoryLimit parameter |
| */ |
| public WSDL4JWrapper(URL wsdlURL, Definition wsdlDefinition) throws WSDLException { |
| this(wsdlURL, wsdlDefinition, null, null); |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param URL The URL for the WSDL |
| * @param Definition Definition for the WSDL |
| * @param ConfigurationContext |
| */ |
| public WSDL4JWrapper(URL wsdlURL, Definition wsdlDefinition, |
| ConfigurationContext configContext) throws WSDLException { |
| this(wsdlURL, wsdlDefinition, configContext, null); |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param URL The URL for the WSDL |
| * @param Definition Definition for the WSDL |
| * @param limitMemory boolean |
| */ |
| public WSDL4JWrapper(URL wsdlURL, Definition wsdlDefinition, boolean limitMemory, int memoryType) throws WSDLException { |
| this(wsdlURL, wsdlDefinition, null, null, limitMemory, memoryType); |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param URL The URL for the WSDL |
| * @param Definition Definition for the WSDL |
| * @param JAXWSCatalogManager Catalog Manager to use for locating external resources |
| */ |
| public WSDL4JWrapper(URL wsdlURL, Definition wsdlDefinition, |
| JAXWSCatalogManager catalogManager, |
| boolean limitMemory, int memoryType) throws WSDLException { |
| this(wsdlURL, wsdlDefinition, null, catalogManager, limitMemory, memoryType); |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param URL The URL for the WSDL |
| * @param Definition Definition for the WSDL |
| * @param JAXWSCatalogManager Catalog Manager to use for locating external resources |
| * @deprecated Use a constructor with a ConfigurationContext or memory limit setting |
| */ |
| public WSDL4JWrapper(URL wsdlURL, Definition wsdlDefinition, JAXWSCatalogManager catalogManager) throws WSDLException { |
| this(wsdlURL, wsdlDefinition, null, catalogManager, false, 0); |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param URL The URL for the WSDL |
| * @param Definition Definition for the WSDL |
| * @param ConfigurationContext to get parameters for WSDL building |
| * @param JAXWSCatalogManager Catalog Manager to use for locating external resources |
| */ |
| public WSDL4JWrapper(URL wsdlURL, Definition wsdlDefinition, ConfigurationContext configContext, |
| JAXWSCatalogManager catalogManager) throws WSDLException { |
| this(wsdlURL, wsdlDefinition, configContext, catalogManager, false, 0); |
| } |
| |
| /** |
| * Full Constructor |
| */ |
| private WSDL4JWrapper(URL wsdlURL, Definition wsdlDefinition, ConfigurationContext configContext, |
| JAXWSCatalogManager catalogManager, boolean limitMemory, int memoryType) throws WSDLException { |
| super(); |
| if (log.isDebugEnabled() ) { log.debug("WSDL4JWrapper(...) entry"); } |
| |
| this.configContext = configContext; |
| this.catalogManager = catalogManager; |
| this.wsdlURL = wsdlURL; |
| this.limitMemory = limitMemory; // Only used if configContext is not present |
| this.memoryType = memoryType; |
| if ((wsdlDefinition != null) && !(wsdlDefinition instanceof WSDLDefinitionWrapper)) { |
| if (configContext != null && configContext.getAxisConfiguration() != null) { |
| this.wsdlDefinition = |
| new WSDLDefinitionWrapper(wsdlDefinition, wsdlURL, |
| configContext.getAxisConfiguration() ); |
| } else { |
| this.wsdlDefinition = |
| new WSDLDefinitionWrapper(wsdlDefinition, wsdlURL, |
| limitMemory, 2); |
| } |
| } else { |
| this.wsdlDefinition = (WSDLDefinitionWrapper) wsdlDefinition; |
| } |
| } |
| |
| |
| /** |
| * Constructor |
| * |
| * @param Definition Definition for the WSDL |
| * @deprecated Use WSDL4JWrapper(Definition,ConfigurationContext) |
| */ |
| public WSDL4JWrapper(Definition wsdlDefinition) throws WSDLException { |
| this(wsdlDefinition, false, 0); |
| |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param Definition Definition for the WSDL |
| * @boolean limitMemory |
| */ |
| public WSDL4JWrapper(Definition wsdlDefinition, boolean limitMemory, int memoryType) throws WSDLException { |
| if (log.isDebugEnabled() ) { log.debug("WSDL4JWrapper(Definition, boolean) entry"); } |
| |
| this.limitMemory = limitMemory; |
| this.memoryType = memoryType; |
| if ((wsdlDefinition != null) && !(wsdlDefinition instanceof WSDLDefinitionWrapper)) { |
| this.wsdlDefinition = new WSDLDefinitionWrapper(wsdlDefinition, null, limitMemory, memoryType); |
| } else { |
| this.wsdlDefinition = (WSDLDefinitionWrapper) wsdlDefinition; |
| } |
| |
| if (this.wsdlDefinition != null) { |
| String baseURI = wsdlDefinition.getDocumentBaseURI(); |
| try { |
| wsdlURL = new URL(baseURI); |
| } catch (Exception ex) { |
| // just absorb the error |
| } |
| } |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param Definition Definition for the WSDL |
| * @param ConfigurationContext |
| */ |
| public WSDL4JWrapper(Definition wsdlDefinition, |
| ConfigurationContext configContext) throws WSDLException { |
| super(); |
| if (log.isDebugEnabled() ) { log.debug("WSDL4JWrapper(Definition) entry"); } |
| |
| if ((wsdlDefinition != null) && !(wsdlDefinition instanceof WSDLDefinitionWrapper)) { |
| this.wsdlDefinition = new WSDLDefinitionWrapper(wsdlDefinition, configContext.getAxisConfiguration()); |
| } else { |
| this.wsdlDefinition = (WSDLDefinitionWrapper) wsdlDefinition; |
| } |
| |
| if (this.wsdlDefinition != null) { |
| String baseURI = wsdlDefinition.getDocumentBaseURI(); |
| try { |
| wsdlURL = new URL(baseURI); |
| } catch (Exception ex) { |
| // just absorb the error |
| } |
| } |
| } |
| //TODO: Perform validations for each method to check for null parameters on QName. |
| |
| /* |
| * Returns a wrapped WSDL4J wSDL definition |
| */ |
| public Definition getDefinition() { |
| if (wsdlDefinition == null) { |
| Definition def = loadDefinition(); |
| if (def != null) { |
| if (configContext != null) { |
| wsdlDefinition = new WSDLDefinitionWrapper(def, configContext.getAxisConfiguration() ); |
| } else { |
| wsdlDefinition = new WSDLDefinitionWrapper(def, wsdlURL, limitMemory, memoryType); |
| } |
| } |
| } |
| return wsdlDefinition; |
| } |
| |
| /* |
| * Returns an unwrapped WSDL4J wSDL definition |
| */ |
| public Definition getUnwrappedDefinition() { |
| Definition def; |
| if (wsdlDefinition == null) { |
| def = loadDefinition(); |
| } else if (wsdlDefinition instanceof WSDLDefinitionWrapper) { |
| def = wsdlDefinition.getUnwrappedDefinition(); |
| } else { |
| def = wsdlDefinition; |
| } |
| return def; |
| } |
| |
| |
| /* |
| * Load a WSDL4J WSDL definition from a URL |
| */ |
| public Definition loadDefinition() { |
| |
| Definition def = null; |
| |
| if (wsdlExplicitURL != null) { |
| try { |
| |
| URLConnection urlConn = getPrivilegedURLConnection(this.wsdlURL); |
| if(urlConn != null) { |
| try { |
| InputStream is = getInputStream(urlConn); |
| if(is != null) { |
| if (catalogManager == null) { |
| catalogManager = new OASISCatalogManager(); |
| } |
| final CatalogWSDLLocator locator = new CatalogWSDLLocator(wsdlExplicitURL, is, |
| getThreadClassLoader(), catalogManager); |
| if(log.isDebugEnabled()) { |
| log.debug("Loading WSDL using ModuleWSDLLocator from base " + |
| "location: " + wsdlExplicitURL); |
| } |
| def = (Definition) AccessController.doPrivileged(new PrivilegedExceptionAction() { |
| public Object run() throws WSDLException { |
| WSDLReader reader = getWSDLReader(); |
| return reader.readWSDL(locator); |
| } |
| }); |
| } |
| } |
| catch(Exception e) { |
| if(log.isDebugEnabled()) { |
| log.debug("Using ModuleWSDLLocator was not successful for loading " + |
| "WSDL due to the following error: " + e.toString() + ". The " + |
| "WSDL will be read from the WSDL location: " + wsdlExplicitURL); |
| } |
| } |
| } |
| if(def == null) { |
| if(log.isDebugEnabled()) { |
| log.debug("Loading WSDL from location: " + wsdlExplicitURL); |
| } |
| def = (Definition) AccessController.doPrivileged(new PrivilegedExceptionAction() { |
| public Object run() throws WSDLException { |
| WSDLReader reader = getWSDLReader(); |
| return reader.readWSDL(wsdlExplicitURL); |
| } |
| }); |
| } |
| |
| } catch (PrivilegedActionException e) { |
| if (log.isDebugEnabled()) { |
| log.debug("Exception thrown from AccessController: " + e); |
| } |
| throw ExceptionFactory.makeWebServiceException(e.getException()); |
| } |
| catch(IOException ioe) { |
| if(log.isDebugEnabled()) { |
| log.debug("An error occurred while attempting to load the WSDL " + |
| "file at the following location: " + wsdlExplicitURL); |
| } |
| throw ExceptionFactory.makeWebServiceException(ioe); |
| } |
| } |
| |
| |
| if (log.isDebugEnabled()) { |
| if (def != null) { |
| log.debug("loadDefinition() returning a NON-NULL definition"); |
| } else { |
| log.debug("loadDefinition() returning a NULL definition"); |
| } |
| } |
| |
| return def; |
| } |
| |
| public Binding getFirstPortBinding(QName serviceQname) { |
| Service service = getService(serviceQname); |
| if (service == null) { |
| return null; |
| } |
| Map map = getService(serviceQname).getPorts(); |
| if (map == null || map.isEmpty()) { |
| return null; |
| } |
| for (Object listObject : map.values()) { |
| Port wsdlPort = (Port)listObject; |
| return wsdlPort.getBinding(); |
| |
| } |
| return null; |
| |
| } |
| |
| public String getOperationName(QName serviceQname, QName portQname) { |
| Port port = getPort(serviceQname, portQname); |
| Binding binding = port.getBinding(); |
| if (binding == null) { |
| return null; |
| } |
| |
| List operations = binding.getBindingOperations(); |
| for (Object opObj : operations) { |
| BindingOperation operation = (BindingOperation)opObj; |
| return operation.getName(); |
| } |
| return null; |
| } |
| |
| private Port getPort(QName serviceQname, QName eprQname) { |
| Service service = getService(serviceQname); |
| if (service == null) { |
| return null; |
| } |
| return service.getPort(eprQname.getLocalPart()); |
| |
| } |
| |
| public ArrayList getPortBinding(QName serviceQname) { |
| Map map = this.getService(serviceQname).getPorts(); |
| if (map == null || map.isEmpty()) { |
| return null; |
| } |
| ArrayList<Binding> portBindings = new ArrayList<Binding>(); |
| for (Object listObject : map.values()) { |
| Port wsdlPort = (Port)listObject; |
| Binding binding = wsdlPort.getBinding(); |
| if (binding != null) { |
| portBindings.add(binding); |
| } |
| |
| } |
| return portBindings; |
| |
| } |
| |
| public String getPortBinding(QName serviceQname, QName portQname) { |
| Port port = getPort(serviceQname, portQname); |
| if (port == null) { |
| return null; |
| } |
| Binding binding = port.getBinding(); |
| return binding.getQName().getLocalPart(); |
| } |
| |
| public String[] getPorts(QName serviceQname) { |
| String[] portNames = null; |
| Service service = this.getService(serviceQname); |
| if (service == null) { |
| return null; |
| } |
| Map map = service.getPorts(); |
| if (map == null || map.isEmpty()) { |
| return null; |
| } |
| portNames = new String[map.values().size()]; |
| Iterator iter = map.values().iterator(); |
| for (int i = 0; iter.hasNext(); i++) { |
| Port wsdlPort = (Port)iter.next(); |
| if (wsdlPort != null) { |
| portNames[i] = wsdlPort.getName(); |
| } |
| } |
| return portNames; |
| } |
| |
| public Service getService(QName serviceQname) { |
| if (serviceQname == null) { |
| return null; |
| } |
| |
| Definition def = getDefinition(); |
| if (def != null) { |
| return def.getService(serviceQname); |
| } else { |
| return null; |
| } |
| } |
| |
| public String getSOAPAction(QName serviceQname) { |
| Binding binding = getFirstPortBinding(serviceQname); |
| if (binding == null) { |
| return null; |
| } |
| List operations = binding.getBindingOperations(); |
| for (Object opObj : operations) { |
| BindingOperation operation = (BindingOperation)opObj; |
| List exElements = operation.getExtensibilityElements(); |
| for (Object elObj : exElements) { |
| ExtensibilityElement exElement = (ExtensibilityElement)elObj; |
| if (isSoapOperation(exElement)) { |
| SOAPOperation soapOperation = (SOAPOperation)exElement; |
| return soapOperation.getSoapActionURI(); |
| } |
| } |
| } |
| return null; |
| } |
| |
| public String getSOAPAction(QName serviceQname, QName portQname) { |
| Port port = getPort(serviceQname, portQname); |
| if (port == null) { |
| return null; |
| } |
| Binding binding = port.getBinding(); |
| if (binding == null) { |
| return null; |
| } |
| List operations = binding.getBindingOperations(); |
| for (Object opObj : operations) { |
| BindingOperation operation = (BindingOperation)opObj; |
| List exElements = operation.getExtensibilityElements(); |
| for (Object elObj : exElements) { |
| ExtensibilityElement exElement = (ExtensibilityElement)elObj; |
| if (isSoapOperation(exElement)) { |
| SOAPOperation soapOperation = (SOAPOperation)exElement; |
| return soapOperation.getSoapActionURI(); |
| } |
| } |
| } |
| return null; |
| } |
| |
| public String getSOAPAction(QName serviceQname, QName portQname, QName operationQname) { |
| Port port = getPort(serviceQname, portQname); |
| if (port == null) { |
| return null; |
| } |
| Binding binding = port.getBinding(); |
| if (binding == null) { |
| return null; |
| } |
| List operations = binding.getBindingOperations(); |
| if (operations == null) { |
| return null; |
| } |
| BindingOperation operation = null; |
| for (Object opObj : operations) { |
| operation = (BindingOperation)opObj; |
| } |
| List exElements = operation.getExtensibilityElements(); |
| for (Object elObj : exElements) { |
| ExtensibilityElement exElement = (ExtensibilityElement)elObj; |
| if (isSoapOperation(exElement)) { |
| SOAPOperation soapOperation = (SOAPOperation)exElement; |
| if (soapOperation.getElementType().equals(operationQname)) { |
| return soapOperation.getSoapActionURI(); |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| public URL getWSDLLocation() { |
| return this.wsdlURL; |
| } |
| |
| private boolean isSoapOperation(ExtensibilityElement exElement) { |
| return WSDLWrapper.SOAP_11_OPERATION.equals(exElement.getElementType()); |
| //TODO: Add Soap12 support later |
| // || WSDLWrapper.SOAP_12_OPERATION.equals(exElement.getElementType()); |
| } |
| |
| public String getTargetNamespace() { |
| Definition def = getDefinition(); |
| if (def != null) { |
| return def.getTargetNamespace(); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * This method provides a Java2 Security compliant way to obtain the InputStream |
| * for a given URLConnection object. This is needed as a given URLConnection object |
| * may be an instance of a FileURLConnection object which would require access |
| * permissions if Java2 Security was enabled. |
| */ |
| private InputStream getInputStream(URLConnection urlCon) throws Exception { |
| final URLConnection finalURLCon = urlCon; |
| InputStream is = null; |
| try { |
| is = (InputStream) AccessController.doPrivileged( |
| new PrivilegedExceptionAction() { |
| public Object run() throws IOException { |
| return finalURLCon.getInputStream(); |
| } |
| }); |
| } |
| catch(PrivilegedActionException e) { |
| throw e.getException(); |
| } |
| return is; |
| } |
| |
| private void debugMemoryParms(ConfigurationContext configContext) { |
| if (configContext != null) { |
| AxisConfiguration axisCfg = configContext.getAxisConfiguration(); |
| |
| boolean reduceWSDLMemoryCache = false; |
| int reduceWSDLMemoryType = 9; |
| // determine what the setting for the memory optimization is |
| if (axisCfg != null) { |
| Parameter param = axisCfg.getParameter(Constants.Configuration.REDUCE_WSDL_MEMORY_CACHE); |
| |
| reduceWSDLMemoryCache = |
| param != null && ((String) param.getValue()).equalsIgnoreCase("true"); |
| |
| |
| param = axisCfg.getParameter(Constants.Configuration.REDUCE_WSDL_MEMORY_TYPE); |
| |
| if (param != null) { |
| String value = (String) param.getValue(); |
| |
| if (value != null) { |
| Integer i = new Integer(value); |
| reduceWSDLMemoryType = i.intValue(); |
| } |
| } |
| log.debug("reduceWSDLMemoryCache:"+ reduceWSDLMemoryCache + ", reduceWSDLMemoryType:" + reduceWSDLMemoryType ); |
| } else { |
| log.debug("AxisConfiguration is null"); |
| } |
| } else { |
| log.debug("ConfigContext is null"); |
| } |
| } |
| |
| } |