Dynamic Client WSDL

788 Views Asked by At

I am newbie to web service. My requirement is given a WSDL link

  1. I want to dynamically find all the operations supported (Methods published by WSDL)
  2. Iterate though the different operations listed
  3. Dynamically get the list of Parameters and return values for each of these operations
  4. Consume a Service dynamically after getting the details of Operation Name, Param and return

I'm able to write a Dynamic client application ( Axis 2 , WSDL4J) which will consume the WSDL and gave the method Name, parameters defined for the method, data type etc. I have created an application which is taking the WSDL and giving me all the methods which is present in the WSDL.

Definition def = reader.readWSDL(null, wsdlURI);
Map services = def.getServices();
// Services when Iterated will give all the Method Names 
// .......
Operation operation = boperation.getOperation();
String OperationName = operation.getName();
System.out.println("OperationName :" + OperationName.toString());

Beyond this I’m not sure how to dynamically get the parameters name for the given method. Any sample codes / tutorials is greatly appreciated

The Complete Code for the client is attached.

    public class DynamicInvoke {

    public static void main(String[] args) throws WSDLException {

        String wsdlURI = "WORKING_WSDL_LINK";
        DynamicInvoke di = new DynamicInvoke();
        List wsdlList = new ArrayList();

        wsdlList = di.buildComponents(wsdlURI);

    }

    public List buildComponents(String wsdlURI) throws WSDLException {
        // The list of components that will be returned
        List serviceList = Collections.synchronizedList(new ArrayList());

        // Create the WSDL Reader object
        WSDLFactory factory = WSDLFactory.newInstance();
        WSDLReader reader = factory.newWSDLReader();

        try {
            // Read the WSDL and get the top-level Definition object
            Definition def = reader.readWSDL(null, wsdlURI);

            java.util.Map<QName, Service> services = null;
            // Get the services defined in the document
            try {
                services = def.getServices();
            } catch (Exception e) {
                System.out.println("Cast Exception " + e.getMessage());
            }

            if (services != null) {
                // Create a component for each service defined
                Iterator serviceIter = (services).values().iterator();

                for (int i = 0; serviceIter.hasNext(); i++) {
                    // Create a new ServiceInfo component for each service found
                    ServiceInfo serviceInfo = new ServiceInfo();

                    // Populate the new component from the WSDL Definition read
                    populateComponent(serviceInfo, (Service) serviceIter.next());

                    // Add the new component to the List to be returned
                    serviceList.add(serviceInfo);
                }
            }
        }

        catch (Throwable t) {
            // Process the error/exception
            System.err.println(t.getMessage());
        }

        // return the List of services we created
        return serviceList;
    }


    private ServiceInfo populateComponent(ServiceInfo component, Service service)
            throws WSDLException {
        // Get the qualified service name information
        QName qName = service.getQName();

        // Get the service's namespace URI
        String namespace = qName.getNamespaceURI();

        // Use the local part of the qualified name for the component's name
        String name = qName.getLocalPart();

        // Get the defined ports for this service
        Map ports = service.getPorts();

        // Use the Ports to create methods for all request/response messages
        // defined
        Iterator portIter = ports.values().iterator();



        while (portIter.hasNext()) {
            // Get the next defined port
            Port port = (Port) portIter.next();

            // Get the Port's Binding
            javax.wsdl.Binding binding = port.getBinding();

            // Now we will create operations from the Binding information
            List operations = buildOperations(binding);

            // Process methods built from the binding information
            Iterator operIter = operations.iterator();

            while (operIter.hasNext()) {
                BindingOperation boperation = (BindingOperation) operIter.next();
                Operation operation = boperation.getOperation();

                // Get all the QName,Port Name,Name Space, WebService Name...
                System.out.println("Port Name =" + port.getName());
                System.out.println("QName = " + qName.toString());
                System.out.println("Namespace = " + namespace.toString());
                System.out.println("WebService Name = " + name.toString());

                // Get All the Method Name...
                String OperationName = operation.getName();
                System.out.println("OperationName :" + OperationName.toString());

                Input inDef = operation.getInput();
                String ParamName = inDef.getName();
                System.out.println("inDef--->" + ParamName);
                Message inMessage = inDef.getMessage();
                Map parts = inMessage.getParts();


                System.out.print("\nAxis parameters gathered:\nTargetNamespace = " +"\n"+
                        "Service Name = "+namespace.toString() +"\n"+
                        "Port Name = "+port.getName() +"\n"+
                        "Operation Name = "+operation.getName()+"\n"+
                        "Input Parameters = ");



            }
        }

        return component;
    }

    private List buildOperations(Binding binding) {
        // TODO Auto-generated method stub

        List list = binding.getBindingOperations();

        System.out.println("Bindings :" + list);
        return list;

    }

}
1

There are 1 best solutions below

0
On

You need to compile your stub code from the given WSDL with the wsdl2java-tool (it's packaged with the axis2-zip). Then you'll find your web service-related classes including all methods, parameteres ready for you.

For an example, see Step 5 here