View Javadoc

1   /*
2   Copyright (c) 2006, University of Tromsø
3   All rights reserved.
4   
5   Redistribution and use in source and binary forms, with or without 
6   modification, are permitted provided that the following conditions are met:
7   
8    * Redistributions of source code must retain the above copyright notice, this list 
9      of conditions and the following disclaimer.
10  
11   * Redistributions in binary form must reproduce the above copyright notice, this 
12     list of conditions and the following disclaimer in the documentation and/or other 
13     materials provided with the distribution.
14  
15   * Neither the name of the University of Tromsø nor the names of its contributors may 
16     be used to endorse or promote products derived from this software without specific 
17     prior written permission.
18  
19  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
20  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
21  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
22  SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
23  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
24  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
25  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
26  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
27  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 
28  DAMAGE.
29  */
30  
31  package axis.dynamic;
32  
33  import java.util.Collections;
34  import java.util.Hashtable;
35  import java.util.List;
36  import java.util.Map;
37  import java.util.concurrent.ConcurrentHashMap;
38  
39  import javax.xml.namespace.QName;
40  
41  import org.apache.axis.AxisEngine;
42  import org.apache.axis.ConfigurationException;
43  import org.apache.axis.EngineConfiguration;
44  import org.apache.axis.Handler;
45  import org.apache.axis.encoding.TypeMappingRegistry;
46  import org.apache.axis.encoding.TypeMappingRegistryImpl;
47  
48  /**
49   * abstract base class for dynamic Axis {@link EngineConfiguration}s.
50   */
51  public abstract class SoapConfiguration implements EngineConfiguration
52  {
53    /** the transport handlers. */
54    protected final Map<QName, Handler> _transports = new ConcurrentHashMap<QName, Handler>();
55    
56    /** this will register the Axis default type mappings */
57    protected final TypeMappingRegistry _tmr = new TypeMappingRegistryImpl();
58  
59    /** the global request handler (may be a handler chain) */
60    protected Handler _globalRequest = null;
61    
62    /** the global response handler (may be a handler chain) */
63    protected Handler _globalResponse = null;
64    
65    /** reference to the engine that uses this configuration, set in {@link #configureEngine} */
66    protected /* volatile ? */ AxisEngine _engine;
67    
68    /** synchronization shouldn't be necessary, it's a Hashtable and only modified on startup */
69    protected final Hashtable<String, String> _globalOptions = new Hashtable<String, String>();
70  
71    /**
72     * called from {@link AxisEngine#init()}. Note: when this method is called, the given engine already
73     * has a reference to this object.
74     * @param engine
75     * @throws ConfigurationException
76     * @see EngineConfiguration#configureEngine(AxisEngine)
77     * @see AxisEngine#init()
78     */
79    public void configureEngine( AxisEngine engine ) throws ConfigurationException
80    {
81      _engine = engine;
82      // engine already knows this object - now it loads our options.
83      _engine.refreshGlobalOptions();
84    }
85  
86    /**
87     * We don't write ourselves out, so this is a no-op.
88     * @param engine 
89     */
90    public void writeEngineConfig(AxisEngine engine)
91    {
92      // nothing to do
93    }
94  
95    /**
96     * Returns the global configuration options.
97     * @return  the global options
98     */
99    public Hashtable<String, String> getGlobalOptions() 
100   {
101     return _globalOptions;
102   }
103 
104   /**
105    * Returns a global request handler.
106    * @return the global request handler (may be a handler chain)
107    */
108   public Handler getGlobalRequest() 
109   {
110     return _globalRequest;
111   }
112 
113   /**
114    * Set the global request Handler
115    * @param globalRequest (may be a handler chain)
116    */
117   public void setGlobalRequest( Handler globalRequest ) 
118   {
119     _globalRequest = globalRequest;
120   }
121 
122   /**
123    * Returns a global response handler.
124    * @return the global response handler (may be a handler chain)
125    */
126   public Handler getGlobalResponse()
127   {
128     return _globalResponse;
129   }
130 
131   /**
132    * Set the global response Handler
133    * @param globalResponse (may be a handler chain)
134    */
135   public void setGlobalResponse( Handler globalResponse ) 
136   {
137     _globalResponse = globalResponse;
138   }
139 
140   /**
141    * We do not use handlers with a 'global' name, so this method always returns null.
142    * @param qname
143    * @return global handler with given name
144    * @see EngineConfiguration#getHandler(QName)
145    */
146   public Handler getHandler( QName qname )
147   {
148     return null;
149   }
150 
151   /**
152    * Get our TypeMappingRegistry.
153    * @return the TypeMappingRegistry of this configuration.
154    */
155   public TypeMappingRegistry getTypeMappingRegistry()
156   {
157     return _tmr;
158   }
159 
160   /**
161    * @param qname
162    * @return the transport for the given name, may be null
163    * @see EngineConfiguration#getTransport(QName)
164    */
165   public Handler getTransport( QName qname ) 
166   {
167     return _transports.get(qname);
168   }
169 
170   /**
171    * sets the transport for the given name
172    * @param name e.g. "http"
173    * @param transport
174    */
175   public void deployTransport( String name, Handler transport )
176   {
177     _transports.put(new QName(name), transport);
178   }
179 
180   /**
181    * removes the transport for the given name
182    * @param name
183    */
184   public void undeployTransport( String name )
185   {
186     _transports.remove(new QName(name));
187   }
188 
189   /**
190    * currently, we don't use roles, so this method always returns null.
191    * @return empty list
192    */
193   public List<String> getRoles() 
194   {
195     return Collections.emptyList();
196   }
197 
198 }