View Javadoc

1   /*
2    * $Id: CxfConfiguration.java 20376 2010-11-29 05:25:28Z mike.schilling $
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.transport.MuleUniversalTransport;
21  
22  import java.lang.reflect.Field;
23  import java.util.Map;
24  
25  import org.apache.commons.logging.Log;
26  import org.apache.commons.logging.LogFactory;
27  import org.apache.cxf.Bus;
28  import org.apache.cxf.BusException;
29  import org.apache.cxf.BusFactory;
30  import org.apache.cxf.bus.spring.SpringBusFactory;
31  import org.apache.cxf.common.util.ASMHelper;
32  import org.apache.cxf.jaxb.JAXBDataBinding;
33  import org.apache.cxf.transport.ConduitInitiatorManager;
34  import org.apache.cxf.transport.DestinationFactoryManager;
35  import org.springframework.context.ApplicationContext;
36  
37  /**
38   * Provides global CXF configuration defaults.
39   */
40  public class CxfConfiguration implements Initialisable, Disposable, MuleContextAware
41  {
42      public static final String CXF = "cxf";
43      public static final String CONFIGURATION_LOCATION = "configurationLocation";
44      public static final String DEFAULT_MULE_NAMESPACE_URI = "http://www.muleumo.org";
45      public static final String BUS_PROPERTY = CXF;
46  
47      protected transient Log logger = LogFactory.getLog(getClass());
48  
49      // The CXF Bus object
50      private Bus bus;
51      private String configurationLocation;
52      private boolean initializeStaticBusInstance = true;
53      private MuleContext muleContext;
54      
55      public void initialise() throws InitialisationException
56      {
57          BusFactory.setDefaultBus(null);
58          ApplicationContext context = (ApplicationContext) muleContext.getRegistry().lookupObject(SpringRegistry.SPRING_APPLICATION_CONTEXT);
59  
60          if (configurationLocation != null)
61          {
62              bus = new SpringBusFactory(context).createBus(configurationLocation, true);
63          }
64          else
65          {
66              bus = new SpringBusFactory().createBus((String) null, true);
67          }
68  
69          if (!initializeStaticBusInstance)
70          {
71              BusFactory.setDefaultBus(null);
72          }
73  
74          MuleUniversalTransport transport = new MuleUniversalTransport(this);
75          DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
76          dfm.registerDestinationFactory("http://schemas.xmlsoap.org/soap/http", transport);
77          dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/soap/http", transport);
78          dfm.registerDestinationFactory("http://cxf.apache.org/transports/http/configuration", transport);
79          dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/http/", transport);
80          dfm.registerDestinationFactory("http://www.w3.org/2003/05/soap/bindings/HTTP/", transport);
81          dfm.registerDestinationFactory("http://cxf.apache.org/transports/jms", transport);
82          dfm.registerDestinationFactory(MuleUniversalTransport.TRANSPORT_ID, transport);
83  
84          ConduitInitiatorManager extension = bus.getExtension(ConduitInitiatorManager.class);
85          try
86          {
87              // Force the HTTP transport to load if available, otherwise it could
88              // overwrite our namespaces later
89              extension.getConduitInitiator("http://schemas.xmlsoap.org/soap/http");
90          }
91          catch (BusException e1)
92          {
93              // If unavailable eat exception and continue
94          }
95          extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/soap/", transport);
96          extension.registerConduitInitiator("http://schemas.xmlsoap.org/soap/http", transport);
97          extension.registerConduitInitiator("http://schemas.xmlsoap.org/soap/http/", transport);
98          extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/soap/http", transport);
99          extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/http/", transport);
100         extension.registerConduitInitiator("http://www.w3.org/2003/05/soap/bindings/HTTP/", transport);
101         extension.registerConduitInitiator("http://cxf.apache.org/transports/http/configuration", transport);
102         extension.registerConduitInitiator("http://cxf.apache.org/bindings/xformat", transport);
103         extension.registerConduitInitiator("http://cxf.apache.org/transports/jms", transport);
104         extension.registerConduitInitiator(MuleUniversalTransport.TRANSPORT_ID, transport);
105     }
106 
107     public void dispose()
108     {
109         bus.shutdown(true);
110         // clear static caches preventing memory leaks on redeploy
111         // needed because cxf core classes are loaded by the Mule system classloader, not app's
112         JAXBDataBinding.clearCaches();
113         try
114         {
115             // ASMHelper.LOADER_MAP is a protected static field
116             final Field cacheField = ASMHelper.class.getDeclaredField("LOADER_MAP");
117             cacheField.setAccessible(true);
118             // static field
119             final Map cache = (Map) cacheField.get(null);
120             cache.clear();
121         }
122         catch (Throwable t)
123         {
124             logger.warn("Error disposing CxfConfiguration, this may cause a memory leak", t);
125         }
126     }
127 
128     public Bus getCxfBus()
129     {
130         return bus;
131     }
132 
133     public void setCxfBus(Bus bus)
134     {
135         this.bus = bus;
136     }
137 
138     public String getConfigurationLocation()
139     {
140         return configurationLocation;
141     }
142 
143     public void setConfigurationLocation(String configurationLocation)
144     {
145         this.configurationLocation = configurationLocation;
146     }
147     
148     public boolean isInitializeStaticBusInstance()
149     {
150         return initializeStaticBusInstance;
151     }
152 
153     public void setInitializeStaticBusInstance(boolean initializeStaticBusInstance)
154     {
155         this.initializeStaticBusInstance = initializeStaticBusInstance;
156     }
157 
158     public void setMuleContext(MuleContext context)
159     {
160         this.muleContext = context;
161     }
162 
163     public MuleContext getMuleContext()
164     {
165         return muleContext;
166     }
167 
168     public static CxfConfiguration getConfiguration(MuleContext muleContext) throws MuleException
169     {
170         CxfConfiguration configuration = muleContext.getRegistry().get(CxfConstants.DEFAULT_CXF_CONFIGURATION);
171         if (configuration == null) 
172         {
173             configuration = new CxfConfiguration();
174             configuration.setMuleContext(muleContext);
175             configuration.initialise();
176             muleContext.getRegistry().registerObject(CxfConstants.DEFAULT_CXF_CONFIGURATION, configuration);
177         }
178         return configuration;
179     }
180     
181 }