1 package org.codehaus.xfire.aegis;
2
3 import java.io.InputStream;
4 import java.util.Collection;
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Map;
9 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
10 import org.codehaus.plexus.configuration.PlexusConfiguration;
11 import org.codehaus.plexus.configuration.PlexusConfigurationException;
12 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
13 import org.codehaus.xfire.SOAPConstants;
14 import org.codehaus.xfire.XFireRuntimeException;
15 import org.codehaus.xfire.aegis.mapping.TypeRegistry;
16 import org.codehaus.xfire.aegis.operation.WrappedOperation;
17 import org.codehaus.xfire.aegis.wsdl.AegisWSDL;
18 import org.codehaus.xfire.fault.FaultHandler;
19 import org.codehaus.xfire.fault.SOAP11FaultHandler;
20 import org.codehaus.xfire.fault.SOAP12FaultHandler;
21 import org.codehaus.xfire.handler.Handler;
22 import org.codehaus.xfire.handler.dom.DOMHandler;
23 import org.codehaus.xfire.handler.dom.DOMPipelineHandler;
24 import org.codehaus.xfire.plexus.PlexusService;
25 import org.codehaus.xfire.wsdl.WSDLBuilder;
26 import org.dom4j.Document;
27 import org.dom4j.Element;
28 import org.dom4j.QName;
29 import org.dom4j.io.SAXReader;
30
31 /***
32 * AegisService
33 *
34 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
35 */
36 public class AegisService
37 extends PlexusService
38 implements Initializable
39 {
40 private Document serviceDescriptor;
41
42 private Map operations;
43
44 private String serviceClassName;
45
46 private TypeRegistry typeRegistry;
47
48 private PlexusConfiguration[] handlers;
49
50 private Handler serviceHandler;
51
52 public AegisService()
53 {
54 operations = new HashMap();
55 }
56
57 /***
58 * @see org.codehaus.xfire.service.Service#getFaultHandler()
59 */
60 public FaultHandler getFaultHandler()
61 {
62 try
63 {
64 return (FaultHandler) getServiceLocator().lookup( FaultHandler.ROLE, "1.2" );
65 }
66 catch (ComponentLookupException e)
67 {
68 throw new XFireRuntimeException( "Couldn't find service provider!", e );
69 }
70 }
71
72 /***
73 * @see org.apache.avalon.framework.activity.Initializable#initialize()
74 */
75 public void initialize() throws Exception
76 {
77 super.initialize();
78
79 DOMPipelineHandler pipe = (DOMPipelineHandler) getServiceHandler();
80
81 if ( handlers != null && handlers.length > 0 )
82 {
83 for ( int i = 0; i < handlers.length; i++ )
84 {
85 String hId = handlers[i].getValue();
86
87 DOMHandler handler = (DOMHandler) getServiceLocator().lookup( DOMHandler.ROLE, hId );
88
89 pipe.getHandlers().add( handler );
90 }
91 }
92 else
93 {
94 pipe.getHandlers().add( new AegisServiceHandler() );
95 }
96
97 typeRegistry = (TypeRegistry) getServiceLocator().lookup(TypeRegistry.ROLE);
98 setWSDLBuilder((WSDLBuilder) getServiceLocator().lookup(WSDLBuilder.ROLE, "aegis"));
99
100 SAXReader xmlReader = new SAXReader();
101 serviceDescriptor = xmlReader.read( getServiceDescriptorStream() );
102
103 createService();
104
105 AegisWSDL wsdl = (AegisWSDL) getWSDL();
106 }
107
108 /***
109 * Create a service and operations from the service descriptor.
110 */
111 protected void createService()
112 {
113 Element root = serviceDescriptor.getRootElement();
114 setDefaultNamespace( root.attribute("targetNamespace").getStringValue() );
115 setSoapVersion( root.attribute("soapVersion").getStringValue() );
116
117 if ( getSoapVersion().equals ( SOAPConstants.SOAP12_ENVELOPE_NS ))
118 {
119 setFaultHandlerHint( SOAP12FaultHandler.NAME );
120 }
121 else
122 {
123 setFaultHandlerHint( SOAP11FaultHandler.NAME );
124 }
125
126 List elements = root.elements("operation");
127 for ( Iterator itr = elements.iterator(); itr.hasNext(); )
128 {
129 Element opEl = (Element) itr.next();
130
131 WrappedOperation op = new WrappedOperation();
132 op.configure( opEl, this, getTypeRegistry() );
133
134 QName opQ = op.getQName();
135
136 operations.put( opQ, op );
137 }
138 }
139
140 public Collection getOperations()
141 {
142 return operations.values();
143 }
144
145 public WrappedOperation getOperation( QName name )
146 {
147 return (WrappedOperation) operations.get( name );
148 }
149
150 public TypeRegistry getTypeRegistry()
151 {
152 return typeRegistry;
153 }
154
155 /***
156 * Returns an InputStream for the descriptor.
157 * @return InputStream representing the descriptor
158 */
159 public InputStream getServiceDescriptorStream()
160 {
161 String name = getServiceDescriptorName();
162 InputStream is = getClass().getResourceAsStream( name );
163
164 if ( is == null )
165 throw new XFireRuntimeException("No service descriptor found: " + name);
166
167 return is;
168 }
169
170 public String getServiceDescriptorName()
171 {
172 String full = getServiceClassName();
173 full = "/" + full.replace('.', '/');
174
175 return full + ".xml";
176 }
177
178 public Document getServiceDescriptor()
179 {
180 return serviceDescriptor;
181 }
182
183 public String getServiceClassName()
184 {
185 return serviceClassName;
186 }
187
188 public void setServiceClassName(String serviceClassName)
189 {
190 this.serviceClassName = serviceClassName;
191 }
192
193 public Object createServiceObject()
194 {
195 if ( getServiceLocator().hasComponent(getServiceClassName()) )
196 {
197 try
198 {
199 return getServiceLocator().lookup( getServiceClassName() );
200 }
201 catch (ComponentLookupException e)
202 {
203 throw new XFireRuntimeException("Couldn't lookup service.", e);
204 }
205 }
206 else
207 {
208 ClassLoader cl = Thread.currentThread().getContextClassLoader();
209
210 Class clazz;
211 try
212 {
213 clazz = cl.loadClass(getServiceClassName());
214 return clazz.newInstance();
215 }
216 catch (Exception e)
217 {
218 throw new XFireRuntimeException("Couldn't create service class.", e);
219 }
220
221 }
222 }
223
224 /***
225 * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
226 */
227 public void configure( PlexusConfiguration config ) throws PlexusConfigurationException
228 {
229 super.configure( config );
230
231 setFaultHandlerHint( config.getChild("faultHandler").getValue("aegis") );
232
233 setServiceClassName( config.getChild("serviceClass").getValue() );
234 setStyle( SOAPConstants.STYLE_WRAPPED );
235 setUse( SOAPConstants.USE_LITERAL );
236
237 DOMPipelineHandler handler = new DOMPipelineHandler();
238 setServiceHandler( handler );
239
240 handlers = config.getChild("handlers").getChildren("handler");
241 }
242
243
244 public Handler getServiceHandler()
245 {
246 return serviceHandler;
247 }
248
249 public void setServiceHandler( Handler serviceHandler )
250 {
251 this.serviceHandler = serviceHandler;
252 }
253 }