View Javadoc

1   /*
2    * $Id: CxfConfiguration.java 21217 2011-02-09 19:57:31Z dandiep $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.module.cxf;
12  
13  import org.mule.api.MuleContext;
14  import org.mule.api.MuleException;
15  import org.mule.api.context.MuleContextAware;
16  import org.mule.api.lifecycle.Disposable;
17  import org.mule.api.lifecycle.Initialisable;
18  import org.mule.api.lifecycle.InitialisationException;
19  import org.mule.config.spring.SpringRegistry;
20  import org.mule.module.cxf.support.MuleHeadersInInterceptor;
21  import org.mule.module.cxf.support.MuleHeadersOutInterceptor;
22  import org.mule.module.cxf.support.MuleProtocolHeadersOutInterceptor;
23  import org.mule.module.cxf.transport.MuleUniversalTransport;
24  
25  import java.lang.reflect.Field;
26  import java.util.Map;
27  
28  import org.apache.commons.logging.Log;
29  import org.apache.commons.logging.LogFactory;
30  import org.apache.cxf.Bus;
31  import org.apache.cxf.BusException;
32  import org.apache.cxf.BusFactory;
33  import org.apache.cxf.bus.spring.SpringBusFactory;
34  import org.apache.cxf.common.util.ASMHelper;
35  import org.apache.cxf.jaxb.JAXBDataBinding;
36  import org.apache.cxf.transport.ConduitInitiatorManager;
37  import org.apache.cxf.transport.DestinationFactoryManager;
38  import org.springframework.context.ApplicationContext;
39  
40  /**
41   * Provides global CXF configuration defaults.
42   */
43  public class CxfConfiguration implements Initialisable, Disposable, MuleContextAware
44  {
45      public static final String CXF = "cxf";
46      public static final String CONFIGURATION_LOCATION = "configurationLocation";
47      public static final String DEFAULT_MULE_NAMESPACE_URI = "http://www.muleumo.org";
48      public static final String BUS_PROPERTY = CXF;
49  
50      protected transient Log logger = LogFactory.getLog(getClass());
51  
52      // The CXF Bus object
53      private Bus bus;
54      private String configurationLocation;
55      private boolean initializeStaticBusInstance;
56      private MuleContext muleContext;
57      private boolean enableMuleSoapHeaders = true;
58      
59      public void initialise() throws InitialisationException
60      {
61          BusFactory.setDefaultBus(null);
62          ApplicationContext context = (ApplicationContext) muleContext.getRegistry().lookupObject(SpringRegistry.SPRING_APPLICATION_CONTEXT);
63  
64          if (configurationLocation != null)
65          {
66              bus = new SpringBusFactory(context).createBus(configurationLocation, true);
67          }
68          else
69          {
70              bus = new SpringBusFactory().createBus((String) null, true);
71          }
72  
73          if (!initializeStaticBusInstance)
74          {
75              BusFactory.setDefaultBus(null);
76          }
77  
78          MuleUniversalTransport transport = new MuleUniversalTransport(this);
79          DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
80          dfm.registerDestinationFactory("http://schemas.xmlsoap.org/soap/http", transport);
81          dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/soap/http", transport);
82          dfm.registerDestinationFactory("http://cxf.apache.org/transports/http/configuration", transport);
83          dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/http/", transport);
84          dfm.registerDestinationFactory("http://www.w3.org/2003/05/soap/bindings/HTTP/", transport);
85          dfm.registerDestinationFactory("http://cxf.apache.org/transports/jms", transport);
86          dfm.registerDestinationFactory("http://cxf.apache.org/transports/http", transport);
87          
88          dfm.registerDestinationFactory(MuleUniversalTransport.TRANSPORT_ID, transport);
89  
90          ConduitInitiatorManager extension = bus.getExtension(ConduitInitiatorManager.class);
91          try
92          {
93              // Force the HTTP transport to load if available, otherwise it could
94              // overwrite our namespaces later
95              extension.getConduitInitiator("http://schemas.xmlsoap.org/soap/http");
96          }
97          catch (BusException e1)
98          {
99              // If unavailable eat exception and continue
100         }
101         extension.registerConduitInitiator("http://cxf.apache.org/transports/http", transport);
102         extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/soap/", transport);
103         extension.registerConduitInitiator("http://schemas.xmlsoap.org/soap/http", transport);
104         extension.registerConduitInitiator("http://schemas.xmlsoap.org/soap/http/", transport);
105         extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/soap/http", transport);
106         extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/http/", transport);
107         extension.registerConduitInitiator("http://www.w3.org/2003/05/soap/bindings/HTTP/", transport);
108         extension.registerConduitInitiator("http://cxf.apache.org/transports/http/configuration", transport);
109         extension.registerConduitInitiator("http://cxf.apache.org/bindings/xformat", transport);
110         extension.registerConduitInitiator("http://cxf.apache.org/transports/jms", transport);
111         extension.registerConduitInitiator(MuleUniversalTransport.TRANSPORT_ID, transport);
112         
113         bus.getOutInterceptors().add(new MuleProtocolHeadersOutInterceptor());
114         bus.getOutFaultInterceptors().add(new MuleProtocolHeadersOutInterceptor());
115 
116         if (enableMuleSoapHeaders)
117         {
118             bus.getInInterceptors().add(new MuleHeadersInInterceptor());
119             bus.getInFaultInterceptors().add(new MuleHeadersInInterceptor());
120             bus.getOutInterceptors().add(new MuleHeadersOutInterceptor());
121             bus.getOutFaultInterceptors().add(new MuleHeadersOutInterceptor());
122         }
123     }
124 
125     public void dispose()
126     {
127         bus.shutdown(true);
128         // clear static caches preventing memory leaks on redeploy
129         // needed because cxf core classes are loaded by the Mule system classloader, not app's
130         JAXBDataBinding.clearCaches();
131         try
132         {
133             // ASMHelper.LOADER_MAP is a protected static field
134             final Field cacheField = ASMHelper.class.getDeclaredField("LOADER_MAP");
135             cacheField.setAccessible(true);
136             // static field
137             final Map cache = (Map) cacheField.get(null);
138             cache.clear();
139         }
140         catch (Throwable t)
141         {
142             logger.warn("Error disposing CxfConfiguration, this may cause a memory leak", t);
143         }
144     }
145 
146     public Bus getCxfBus()
147     {
148         return bus;
149     }
150 
151     public void setCxfBus(Bus bus)
152     {
153         this.bus = bus;
154     }
155 
156     public String getConfigurationLocation()
157     {
158         return configurationLocation;
159     }
160 
161     public void setConfigurationLocation(String configurationLocation)
162     {
163         this.configurationLocation = configurationLocation;
164     }
165     
166     public boolean isInitializeStaticBusInstance()
167     {
168         return initializeStaticBusInstance;
169     }
170 
171     public void setInitializeStaticBusInstance(boolean initializeStaticBusInstance)
172     {
173         this.initializeStaticBusInstance = initializeStaticBusInstance;
174     }
175 
176     public void setMuleContext(MuleContext context)
177     {
178         this.muleContext = context;
179     }
180 
181     public MuleContext getMuleContext()
182     {
183         return muleContext;
184     }
185 
186     public static CxfConfiguration getConfiguration(MuleContext muleContext) throws MuleException
187     {
188         CxfConfiguration configuration = muleContext.getRegistry().get(CxfConstants.DEFAULT_CXF_CONFIGURATION);
189         if (configuration == null) 
190         {
191             configuration = new CxfConfiguration();
192             configuration.setMuleContext(muleContext);
193             configuration.initialise();
194             muleContext.getRegistry().registerObject(CxfConstants.DEFAULT_CXF_CONFIGURATION, configuration);
195         }
196         return configuration;
197     }
198 
199     public boolean isEnableMuleSoapHeaders()
200     {
201         return enableMuleSoapHeaders;
202     }
203 
204     public void setEnableMuleSoapHeaders(boolean enableMuleSoapHeaders)
205     {
206         this.enableMuleSoapHeaders = enableMuleSoapHeaders;
207     }
208 
209 }