1 package org.codehaus.xfire.service.binding;
2
3 import java.util.Iterator;
4 import java.util.List;
5
6 import javax.xml.stream.XMLStreamException;
7 import javax.xml.stream.XMLStreamReader;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.codehaus.xfire.MessageContext;
12 import org.codehaus.xfire.XFireRuntimeException;
13 import org.codehaus.xfire.exchange.MessageExchange;
14 import org.codehaus.xfire.exchange.OutMessage;
15 import org.codehaus.xfire.fault.XFireFault;
16 import org.codehaus.xfire.handler.AbstractHandler;
17 import org.codehaus.xfire.handler.Phase;
18 import org.codehaus.xfire.service.MessageHeaderInfo;
19 import org.codehaus.xfire.service.OperationInfo;
20
21 public abstract class AbstractBinding
22 extends AbstractHandler
23 implements ObjectBinding, Cloneable
24 {
25 private static final Log logger = LogFactory.getLog(AbstractBinding.class.getName());
26
27 public static final String OPERATION_KEY = "xfire.operation";
28
29 public static final String RESPONSE_VALUE = "xfire.java.response";
30
31 public static final String RESPONSE_PIPE = "xfire.java.responsePipe";
32
33 private String style;
34 private String use;
35 private Invoker invoker;
36 private BindingProvider bindingProvider;
37 private boolean clientModeOn = false;
38
39 public String getPhase()
40 {
41 return Phase.SERVICE;
42 }
43
44 public void setOperation(OperationInfo operation, MessageContext context)
45 {
46 MessageExchange exchange = context.createMessageExchange(operation);
47
48 context.setExchange(exchange);
49 }
50
51 public void invoke(final MessageContext context)
52 throws Exception
53 {
54 try
55 {
56
57 final List params = (List) context.getInMessage().getBody();
58
59
60
61 final OperationInfo operation = context.getExchange().getOperation();
62
63
64 final List headerInfos = operation.getInputMessage().getMessageHeaders();
65 for (Iterator itr = headerInfos.iterator(); itr.hasNext();)
66 {
67 MessageHeaderInfo header = (MessageHeaderInfo) itr.next();
68 BindingProvider provider = context.getService().getBinding().getBindingProvider();
69 params.add(header.getIndex(), provider.readHeader(header, context));
70 }
71
72 final Invoker invoker = getInvoker();
73
74
75 if (!operation.isAsync())
76 {
77 sendMessage(context, params, operation, invoker);
78 }
79 else
80 {
81 Runnable runnable = new Runnable()
82 {
83 public void run()
84 {
85 try
86 {
87 sendMessage(context, params, operation, invoker);
88 }
89 catch (Exception e)
90 {
91 XFireFault fault = XFireFault.createFault(e);
92
93 context.getInPipeline().handleFault(fault, context);
94 }
95 }
96 };
97
98 Thread opthread = new Thread(runnable);
99 opthread.start();
100 }
101 }
102 catch (XFireRuntimeException e)
103 {
104 logger.warn("Error invoking service.", e);
105 throw new XFireFault("Error invoking service.", e, XFireFault.SENDER);
106 }
107 }
108
109 protected void sendMessage(final MessageContext context,
110 final List params,
111 final OperationInfo operation,
112 final Invoker invoker)
113 throws Exception
114 {
115 final Object value = invoker.invoke(operation.getMethod(),
116 params.toArray(),
117 context);
118
119 if (context.getExchange().hasOutMessage())
120 {
121 OutMessage outMsg = (OutMessage) context.getExchange().getOutMessage();
122 outMsg.setBody(new Object[] {value});
123 outMsg.setSerializer(context.getService().getBinding());
124 context.getOutPipeline().invoke(context);
125 }
126 }
127
128 protected void nextEvent(XMLStreamReader dr)
129 {
130 try
131 {
132 dr.next();
133 }
134 catch (XMLStreamException e)
135 {
136 throw new XFireRuntimeException("Couldn't parse stream.", e);
137 }
138 }
139
140 public Invoker getInvoker()
141 {
142 return invoker;
143 }
144
145 public void setInvoker(Invoker invoker)
146 {
147 this.invoker = invoker;
148 }
149
150 public String getStyle()
151 {
152 return style;
153 }
154
155 protected void setStyle(String style)
156 {
157 this.style = style;
158 }
159
160 public String getUse()
161 {
162 return use;
163 }
164
165 protected void setUse(String use)
166 {
167 this.use = use;
168 }
169
170 public BindingProvider getBindingProvider()
171 {
172 return bindingProvider;
173 }
174
175 public void setBindingProvider(BindingProvider bindingProvider)
176 {
177 this.bindingProvider = bindingProvider;
178 }
179
180 public boolean isClientModeOn()
181 {
182 return clientModeOn;
183 }
184
185 public void setClientModeOn(boolean clientModeOn)
186 {
187 this.clientModeOn = clientModeOn;
188 }
189
190 public abstract Object clone();
191 }