package org.pentaho.platform.plugin.services.webservices; import com.ibm.wsdl.factory.WSDLFactoryImpl; import org.apache.axis2.AxisFault; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.Parameter; import org.apache.axis2.description.WSDL2Constants; import org.apache.axis2.engine.AxisConfiguration; import org.apache.axis2.engine.MessageReceiver; import org.apache.axis2.util.Loader; import org.apache.axis2.wsdl.WSDLConstants; import org.apache.ws.java2wsdl.Java2WSDLBuilder; import org.pentaho.platform.api.engine.IServiceConfig; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.xml.sax.InputSource; import javax.wsdl.Definition; import javax.wsdl.xml.WSDLReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; public class AxisUtil { public static String WS_EXECUTE_SERVICE_ID = "ws-run"; //$NON-NLS-1$ public static String WSDL_SERVICE_ID = "ws-wsdl"; //$NON-NLS-1$ public static Definition getWsdlDefinition( AxisConfiguration axisConfig, IServiceConfig webservice ) throws Exception { String wsdlStr = getWsdl( axisConfig, webservice ); InputStream in = new ByteArrayInputStream( wsdlStr.getBytes() ); InputSource source = new InputSource( in ); WSDLFactoryImpl factory = new WSDLFactoryImpl(); WSDLReader reader = factory.newWSDLReader(); Definition def = reader.readWSDL( "", source ); //$NON-NLS-1$ return def; } public static String getWsdl( AxisConfiguration axisConfig, IServiceConfig webservice ) throws Exception { Class<?> serviceClass = webservice.getServiceClass(); String name = serviceClass.getSimpleName(); ByteArrayOutputStream out = new ByteArrayOutputStream(); Java2WSDLBuilder java2WsdlBuilder = new Java2WSDLBuilder( out, serviceClass.getName(), serviceClass.getClassLoader() ); // convert the extra classes into a list of class names Collection<Class<?>> extraClasses = webservice.getExtraClasses(); if ( extraClasses != null ) { ArrayList<String> extraClassNames = new ArrayList<String>(); for ( Class<?> extraClass : extraClasses ) { extraClassNames.add( extraClass.getName() ); } java2WsdlBuilder.setExtraClasses( extraClassNames ); } java2WsdlBuilder.setSchemaTargetNamespace( "http://webservice.pentaho.com" ); //$NON-NLS-1$ java2WsdlBuilder.setLocationUri( getWebServiceExecuteUrl() + name ); java2WsdlBuilder.setTargetNamespacePrefix( "pho" ); //$NON-NLS-1$ java2WsdlBuilder.setServiceName( name ); java2WsdlBuilder.setAttrFormDefault( "unqualified" ); //$NON-NLS-1$ java2WsdlBuilder.setElementFormDefault( "unqualified" ); //$NON-NLS-1$ java2WsdlBuilder.setGenerateDocLitBare( false ); java2WsdlBuilder.generateWSDL(); return new String( out.toByteArray() ); } /** * Create a web service from a web service wrapper. The concrete subclass providers the wrappers via * getWebServiceWrappers() * * @param wrapper * The wrapper * @return * @throws AxisFault */ public static AxisService createService( IServiceConfig ws, AxisConfiguration axisConfig ) throws AxisFault { Class<?> serviceClass = ws.getServiceClass(); String serviceName = ws.getId(); if ( axisConfig.getService( serviceName ) != null ) { axisConfig.removeService( serviceName ); } AxisService axisService = createService( serviceClass.getName(), axisConfig, serviceClass.getClassLoader() ); axisService.setName( serviceName ); axisService.setDocumentation( ws.getDescription() ); return axisService; } @SuppressWarnings( "unchecked" ) private static AxisService createService( String implClass, AxisConfiguration axisConfig, ClassLoader loader ) throws AxisFault { try { HashMap messageReciverMap = new HashMap(); Class inOnlyMessageReceiver = Loader.loadClass( "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" ); //$NON-NLS-1$ MessageReceiver messageReceiver = (MessageReceiver) inOnlyMessageReceiver.newInstance(); messageReciverMap.put( WSDL2Constants.MEP_URI_IN_ONLY, messageReceiver ); Class inoutMessageReceiver = Loader.loadClass( "org.apache.axis2.rpc.receivers.RPCMessageReceiver" ); //$NON-NLS-1$ MessageReceiver inOutmessageReceiver = (MessageReceiver) inoutMessageReceiver.newInstance(); messageReciverMap.put( WSDL2Constants.MEP_URI_IN_OUT, inOutmessageReceiver ); messageReciverMap.put( WSDL2Constants.MEP_URI_ROBUST_IN_ONLY, inOutmessageReceiver ); return AxisService.createService( implClass, axisConfig, messageReciverMap, null, null, loader ); } catch ( Exception e ) { throw AxisFault.makeFault( e ); } } /** * Creates the WSDL for an Axis service * * @param axisService * @param wrapper * @throws Exception */ public static void createServiceWsdl( AxisService axisService, IServiceConfig wsDef, AxisConfiguration axisConfig ) throws Exception { // specific that we are generating the WSDL Parameter useOriginalwsdl = new Parameter(); useOriginalwsdl.setName( "useOriginalwsdl" ); //$NON-NLS-1$ useOriginalwsdl.setValue( "true" ); //$NON-NLS-1$ axisService.addParameter( useOriginalwsdl ); // get the WSDL generation and make it a parameter Definition wsdlDefn = AxisUtil.getWsdlDefinition( axisConfig, wsDef ); Parameter wsdl = new Parameter(); wsdl.setName( WSDLConstants.WSDL_4_J_DEFINITION ); wsdl.setValue( wsdlDefn ); // add the WSDL parameter to the service axisService.addParameter( wsdl ); } public static IServiceConfig getSourceDefinition( AxisService axisService, SystemSolutionAxisConfigurator axisConfigurator ) { return axisConfigurator.getWebServiceDefinition( axisService.getName() ); } /** * Currently webservice content generators are wired up by a plugin. The following methods generate urls for executing * web service and wsdl generation. These methods are tightly bound to the content generator specifications in the * default-plugin of the system solution. */ public static String getWebServiceExecuteUrl() { String url = PentahoSystem.getApplicationContext().getFullyQualifiedServerURL() + "content/" + WS_EXECUTE_SERVICE_ID + "/"; //$NON-NLS-1$ //$NON-NLS-2$ return url; } public static String getWebServiceWsdlUrl() { String url = PentahoSystem.getApplicationContext().getFullyQualifiedServerURL() + "content/" + WSDL_SERVICE_ID + "/"; //$NON-NLS-1$ //$NON-NLS-2$ return url; } }