1 package org.codehaus.xfire.exchange;
2
3 import org.apache.commons.logging.Log;
4 import org.apache.commons.logging.LogFactory;
5 import org.codehaus.xfire.MessageContext;
6 import org.codehaus.xfire.transport.Channel;
7
8 /***
9 * A robust in-out MEP. A reply is always sent back. If a fault occurs
10 * it is also sent back.
11 *
12 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
13 */
14 public class RobustInOutExchange
15 extends AbstractMessageExchange
16 {
17 private static final Log logger = LogFactory.getLog(RobustInOutExchange.class);
18
19 public RobustInOutExchange(MessageContext context)
20 {
21 super(context);
22
23 if (context.getExchange() != null)
24 {
25 setInMessage(context.getExchange().getInMessage());
26 }
27
28 context.setExchange(this);
29 }
30
31 public OutMessage getOutMessage()
32 {
33 if (super.getOutMessage() == null)
34 {
35 OutMessage outMessage = new OutMessage(Channel.BACKCHANNEL_URI);
36 outMessage.setChannel(getOutChannel());
37 outMessage.setSoapVersion(getInMessage().getSoapVersion());
38
39 setOutMessage(outMessage);
40 }
41 return super.getOutMessage();
42 }
43
44 public AbstractMessage getFaultMessage()
45 throws UnsupportedOperationException
46 {
47 if (super.getFaultMessage() == null)
48 {
49 OutMessage outMessage = new OutMessage(Channel.BACKCHANNEL_URI);
50 outMessage.setChannel(getFaultChannel());
51 outMessage.setSoapVersion(getInMessage().getSoapVersion());
52
53 setFaultMessage(outMessage);
54 }
55 return super.getFaultMessage();
56 }
57
58 public boolean hasFaultMessage()
59 {
60 return true;
61 }
62
63 public boolean hasInMessage()
64 {
65 return true;
66 }
67
68 public boolean hasOutMessage()
69 {
70 return true;
71 }
72
73 public Channel getFaultChannel()
74 {
75 return getInChannel();
76 }
77
78 public Channel getInChannel()
79 {
80 return getContext().getInMessage().getChannel();
81 }
82
83 public Channel getOutChannel()
84 {
85 return getInChannel();
86 }
87 }