1 package org.controlhaus.xfire.client;
2
3 import java.io.IOException;
4 import java.lang.reflect.Method;
5
6 import javax.xml.stream.XMLStreamException;
7 import javax.xml.stream.XMLStreamReader;
8 import javax.xml.stream.XMLStreamWriter;
9
10 import org.apache.beehive.controls.api.context.Context;
11 import org.apache.beehive.controls.api.context.ResourceContext;
12 import org.apache.beehive.controls.api.context.ControlBeanContext;
13 import org.apache.beehive.controls.api.events.EventHandler;
14 import org.apache.beehive.controls.api.bean.ControlImplementation;
15 import org.apache.beehive.controls.api.bean.Extensible;
16 import org.apache.xmlbeans.XmlObject;
17 import org.apache.xmlbeans.XmlOptions;
18 import org.codehaus.xfire.client.ClientHandler;
19 import org.codehaus.xfire.client.http.SoapHttpClient;
20 import org.codehaus.xfire.fault.XFireFault;
21 import org.codehaus.xfire.xmlbeans.client.XMLBeansClientHandler;
22 import org.controlhaus.xfire.client.XFireClientControl.ServiceUrl;
23
24 /***
25 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
26 * @since Nov 5, 2004
27 */
28 @ControlImplementation
29 public class XFireClientControlImpl
30 implements XFireClientControl, Extensible
31 {
32 @Context ControlBeanContext context;
33 @Context ResourceContext resourceContext;
34
35 private String encoding;
36 private String serviceUrl;
37
38 private XmlOptions options;
39 private SoapHttpClient client;
40
41 @EventHandler (field="resourceContext",
42 eventSet=ResourceContext.ResourceEvents.class,
43 eventName="onAcquire")
44 public void onAcquire()
45 {
46 options = new XmlOptions();
47 options.setCharacterEncoding( getEncoding() );
48
49 ServiceUrl destProp =
50 (ServiceUrl) context.getControlPropertySet(XFireClientControl.ServiceUrl.class);
51 if ( destProp != null )
52 {
53 serviceUrl = destProp.value();
54 }
55
56 Encoding encProp =
57 (Encoding) context.getControlPropertySet(XFireClientControl.Encoding.class);
58 if ( encProp != null )
59 {
60 encoding = encProp.value();
61 }
62 }
63
64 public XmlObject[] invoke(XmlObject[] request)
65 throws IOException, XFireFault
66 {
67 XMLBeansClientHandler handler = new XMLBeansClientHandler(options);
68 handler.setRequest(request);
69
70 SoapHttpClient client = new SoapHttpClient(handler, getHeaderHandler(), getServiceUrl());
71 client.invoke();
72
73 return handler.getResponse();
74 }
75
76 public String getServiceUrl()
77 {
78 return serviceUrl;
79 }
80
81 public String getEncoding()
82 {
83 return encoding;
84 }
85
86 /***
87 * Gets the HeaderHandler. Override this or fill this in
88 * to provide your own HeaderHandler.
89 * @return null by default.
90 */
91 public ClientHandler getHeaderHandler()
92 {
93 return null;
94 }
95
96 public Object invoke(Method m, Object [] args) throws Throwable
97 {
98 if ( getServiceUrl() == null )
99 {
100 ServiceUrl a = m.getDeclaringClass().getAnnotation(ServiceUrl.class);
101 serviceUrl = a.value();
102 }
103
104 XmlObject[] arr = new XmlObject[args.length];
105 for ( int i = 0; i < args.length; i++ )
106 {
107 arr[i] = (XmlObject) args[i];
108 }
109
110 if ( m.getReturnType().isArray() )
111 return invoke( (XmlObject[]) arr );
112 else
113 return invoke( (XmlObject[]) arr )[0];
114 }
115 }