/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed 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.pentaho.di.trans.steps.webservices.wsdl; import java.beans.beancontext.BeanContext; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.wsdl.xml.WSDLLocator; import org.xml.sax.InputSource; /** * Implementation of WSDLLocator for Beehive controls. This WSDLLocator implementation may open multiple input streams, * its <tt>cleanup()</tt> method should always be called once the WSDL file has been parsed. */ public final class ControlWsdlLocator implements WSDLLocator { private final String _wsdlName; private final BeanContext _beanContext; private List<InputStream> _openStreams = new ArrayList<InputStream>(); /** * Create a new wsdl locator for the wsdl file with the specified name. * * @param wsdlName * Name of the WSDL file to try to load. Name may include file path elements. * @param beanContext * The ControlBeanContext of the control which wants to load a WSDL file. */ public ControlWsdlLocator( String wsdlName, BeanContext beanContext ) { if ( wsdlName == null ) { throw new IllegalArgumentException( "ERROR: WSDL path is null!" ); } _wsdlName = wsdlName; _beanContext = beanContext; } /** * Close any InputStreams opened by this locator. */ public void cleanup() { for ( InputStream inputStream : _openStreams ) { try { inputStream.close(); } catch ( IOException ioe ) { // TODO: log a warning!! } } } /** * Find the InputSource for the WSDL file stored in _wsdlName. This method attempts to find a WSDL file by: * <ol> * <li>If the _wsdlName can be converted to a URL, use url.openStream()</li> * <li>Attempt to locate _wsdlName using the bean context's getResourceAsStream()</li> * <li>Attempt to locate _wsdlName using the current class loader's getResourceAsStream()</li> * </ol> * * @return An InputSource for the WSDL file. */ public InputSource getBaseInputSource() { InputStream wsdlStream = null; // try to open as URL first -- try { URL url = new URL( _wsdlName ); wsdlStream = url.openStream(); } catch ( MalformedURLException e ) { // not fatal keep trying } catch ( IOException e ) { // fatal - abort throw new RuntimeException( "Cannot load WSDL file: " + _wsdlName, e ); } if ( wsdlStream == null ) { wsdlStream = _beanContext.getBeanContext().getResourceAsStream( _wsdlName, _beanContext ); } if ( wsdlStream == null ) { wsdlStream = this.getClass().getClassLoader().getResourceAsStream( _wsdlName ); } if ( wsdlStream == null ) { throw new RuntimeException( "Cannot find WSDL file: " + _wsdlName, null ); } _openStreams.add( wsdlStream ); return new InputSource( wsdlStream ); } /** * Get the base URI for the wsdl file. * * @return null if _wsdlName is not a valid URI. */ public String getBaseURI() { try { URI uri = new URI( _wsdlName ); return uri.toString(); } catch ( URISyntaxException e ) { return null; } } /** * Not implemented. * * @param string * @param string1 * @return null */ public InputSource getImportInputSource( String string, String string1 ) { return null; } /** * Not implemented. * * @return null */ public String getLatestImportURI() { return null; } public void close() { cleanup(); } }