1 package org.objectweb.celtix.bindings; 2 3 import java.io.IOException ; 4 5 import javax.xml.ws.handler.MessageContext; 6 7 import org.objectweb.celtix.context.ObjectMessageContext; 8 import org.objectweb.celtix.context.OutputStreamMessageContext; 9 import org.objectweb.celtix.handlers.HandlerInvoker; 10 import org.objectweb.celtix.transports.Transport; 11 12 public class Request { 13 14 private final AbstractBindingBase binding; 15 private Transport transport; 16 private final ObjectMessageContext objectCtx; 17 private MessageContext bindingCtx; 18 private final HandlerInvoker handlerInvoker; 19 private boolean expectRelatedRequest; 20 21 public Request(AbstractBindingBase b, Transport t, ObjectMessageContext o) { 22 binding = b; 23 objectCtx = o; 24 25 transport = t; 26 if (transport == null) { 27 transport = b.retrieveTransport(); 28 } 29 30 handlerInvoker = binding.createHandlerInvoker(); 31 32 objectCtx.put(ObjectMessageContext.MESSAGE_INPUT, Boolean.FALSE); 33 setOneway(false); 34 } 35 36 public String getCorrelationId() { 37 return (String )objectCtx.get(ObjectMessageContext.CORRELATION_OUT); 38 } 39 40 public AbstractBindingBase getBinding() { 41 return binding; 42 } 43 44 public Transport getTransport() { 45 return transport; 46 } 47 48 public HandlerInvoker getHandlerInvoker() { 49 return handlerInvoker; 50 } 51 52 public ObjectMessageContext getObjectMessageContext() { 53 return objectCtx; 54 } 55 56 public MessageContext getBindingContext() { 57 return bindingCtx; 58 } 59 60 public final void setOneway(boolean oneWay) { 61 objectCtx.put(OutputStreamMessageContext.ONEWAY_MESSAGE_TF, oneWay); 62 } 63 64 public final boolean isOneway() { 65 return ((Boolean )objectCtx.get(OutputStreamMessageContext.ONEWAY_MESSAGE_TF)).booleanValue(); 66 } 67 68 public OutputStreamMessageContext process(OutputStreamMessageContext ostreamCtx) throws IOException { 69 return process(ostreamCtx, false); 70 } 71 72 public OutputStreamMessageContext process(OutputStreamMessageContext ostreamCtx, 73 boolean logicalChainTraversed) 74 throws IOException { 75 return process(ostreamCtx, logicalChainTraversed, false); 76 } 77 78 public OutputStreamMessageContext process(OutputStreamMessageContext ostreamCtx, 79 boolean logicalChainTraversed, 80 boolean protocolChainTraversed) 81 throws IOException { 82 if (logicalChainTraversed 83 || handlerInvoker.invokeLogicalHandlers(true, objectCtx)) { 84 bindingCtx = binding.getBindingImpl().createBindingMessageContext(objectCtx); 85 bindingCtx.put(ObjectMessageContext.MESSAGE_INPUT, Boolean.FALSE); 86 87 if (null == bindingCtx) { 88 bindingCtx = objectCtx; 89 } else if (!protocolChainTraversed) { 90 DataBindingCallback callback = BindingContextUtils.retrieveDataBindingCallback(objectCtx); 91 binding.getBindingImpl().marshal(objectCtx, bindingCtx, callback); 92 } 93 94 if (protocolChainTraversed 95 || handlerInvoker.invokeProtocolHandlers(true, bindingCtx)) { 96 binding.getBindingImpl().updateMessageContext(bindingCtx); 97 if (ostreamCtx == null) { 98 ostreamCtx = transport.createOutputStreamContext(bindingCtx); 99 } 100 101 handlerInvoker.invokeStreamHandlers(ostreamCtx); 102 103 transport.finalPrepareOutputStreamContext(ostreamCtx); 104 105 binding.getBindingImpl().write(bindingCtx, ostreamCtx); 106 107 return ostreamCtx; 108 } else if (!isOneway()) { 109 handlerInvoker.invokeProtocolHandlers(true, bindingCtx); 110 bindingCtx.put(ObjectMessageContext.MESSAGE_INPUT, Boolean.TRUE); 111 } 112 } else if (!isOneway()) { 113 objectCtx.put(ObjectMessageContext.MESSAGE_INPUT, Boolean.TRUE); 114 handlerInvoker.invokeLogicalHandlers(true, objectCtx); 115 } 116 return null; 117 } 118 119 public void complete() { 120 handlerInvoker.mepComplete(objectCtx); 121 } 122 123 public void expectRelatedRequest() { 124 expectRelatedRequest = true; 125 } 126 127 public boolean isRelatedRequestExpected() { 128 return expectRelatedRequest; 129 } 130 } 131 | Popular Tags |