View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.transport.soap.axis.wsdl;
8   
9   import org.mule.api.MuleEvent;
10  import org.mule.api.endpoint.OutboundEndpoint;
11  import org.mule.module.cxf.SoapConstants;
12  import org.mule.transport.soap.axis.AxisMessageDispatcher;
13  
14  import java.util.ArrayList;
15  import java.util.Iterator;
16  import java.util.List;
17  import java.util.Map;
18  import java.util.Vector;
19  
20  import javax.xml.namespace.QName;
21  
22  import org.apache.axis.client.AxisClient;
23  import org.apache.axis.client.Service;
24  import org.apache.axis.wsdl.gen.Parser;
25  import org.apache.axis.wsdl.symbolTable.ServiceEntry;
26  import org.apache.axis.wsdl.symbolTable.SymTabEntry;
27  
28  /**
29   * Creates and Axis client services from WSDL and invokes it.
30   */
31  public class AxisWsdlMessageDispatcher extends AxisMessageDispatcher
32  {
33  
34      public AxisWsdlMessageDispatcher(OutboundEndpoint endpoint)
35      {
36          super(endpoint);
37      }
38  
39      protected Service createService(MuleEvent event) throws Exception
40      {
41          String wsdlUrl = event.getEndpoint().getEndpointURI().getAddress();
42          // Parse the wsdl
43          Parser parser = new Parser();
44          if (event.getEndpoint().getEndpointURI().getUserInfo() != null)
45          {
46              parser.setUsername(event.getEndpoint().getEndpointURI().getUser());
47              parser.setPassword(event.getEndpoint().getEndpointURI().getPassword());
48          }
49          parser.run(wsdlUrl);
50          // Retrieves the defined services
51          Map map = parser.getSymbolTable().getHashMap();
52          List entries = new ArrayList();
53          for (Iterator it = map.entrySet().iterator(); it.hasNext();)
54          {
55              Map.Entry entry = (Map.Entry)it.next();
56              Vector v = (Vector)entry.getValue();
57              for (Iterator it2 = v.iterator(); it2.hasNext();)
58              {
59                  SymTabEntry e = (SymTabEntry)it2.next();
60                  if (ServiceEntry.class.isInstance(e))
61                  {
62                      entries.add(entry.getKey());
63                  }
64              }
65          }
66          // Currently, only one service should be defined
67          if (entries.size() != 1)
68          {
69              throw new Exception("Need one and only one service entry, found " + entries.size());
70          }
71          // Create the axis service
72          Service service = new Service(parser, (QName)entries.get(0));
73  
74          service.setEngineConfiguration(clientConfig);
75          service.setEngine(new AxisClient(clientConfig));
76  
77          // Really the Axis Client service should set this stuff
78          event.getMessage().setOutboundProperty(SoapConstants.METHOD_NAMESPACE_PROPERTY,
79                                                 parser.getCurrentDefinition().getTargetNamespace());
80          // Todo how can we autogenerate the named params from the WSDL?
81          return service;
82      }
83  }