1
2
3
4
5
6
7
8
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
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
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
94
95 extension.getConduitInitiator("http://schemas.xmlsoap.org/soap/http");
96 }
97 catch (BusException e1)
98 {
99
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
129
130 JAXBDataBinding.clearCaches();
131 try
132 {
133
134 final Field cacheField = ASMHelper.class.getDeclaredField("LOADER_MAP");
135 cacheField.setAccessible(true);
136
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 }