001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019:
020: package org.apache.axis2.transport;
021:
022: import org.apache.axis2.AxisFault;
023: import org.apache.axis2.context.MessageContext;
024:
025: /**
026: * This interface represents a control object for a Request/Response transport.
027: * The normal flow of Axis2 is rooted at the transport -- this does not
028: * allow for an acknowledgement to be transmitted before processing has
029: * completed, nor does it allow for processing to be paused and resumed
030: * on a separate thread without having a response be sent back. This interface
031: * enables both of those scenarios by allowing the transport to expose
032: * controls to the rest of the engine via a callback.
033: */
034: public interface RequestResponseTransport {
035:
036: /*This is the name of the property that is to be stored on the
037: MessageContext*/
038: public static final String TRANSPORT_CONTROL = "RequestResponseTransportControl";
039:
040: /**
041: * If this property is set to true in a message transport will call the awaitResponse method
042: * of the RequestResponseTransport instead of returning. The value should be a Boolean object.
043: */
044: public static final String HOLD_RESPONSE = "HoldResponse";
045:
046: /**
047: * Notify the transport that a message should be acknowledged at this time.
048: *
049: * @param msgContext
050: * @throws AxisFault
051: */
052: public void acknowledgeMessage(MessageContext msgContext)
053: throws AxisFault;
054:
055: /**
056: * Pause execution and wait for a response message to be ready. This will
057: * typically be called by the transport after a message has been paused and
058: * will cause the transport to block until a response message is ready to be
059: * returned. This is required to enable RM for in-out MEPs over a
060: * request/response transport; without it the message would be paused and the
061: * transport would simply ack the request.
062: *
063: * @throws InterruptedException
064: */
065: public void awaitResponse() throws InterruptedException, AxisFault;
066:
067: /**
068: * Signal that a response has be created and is ready for transmission. This
069: * should release anyone who is blocked on a awaitResponse().
070: */
071: public void signalResponseReady();
072:
073: /**
074: * This will tell the transport to end a current wait by raising the given fault.
075: * @param fault The fault to be raised.
076: */
077: public void signalFaultReady(AxisFault fault);
078:
079: /**
080: * This gives the current status of an RequestResponseTransport object.
081: *
082: * @return
083: */
084: public RequestResponseTransportStatus getStatus();
085:
086: /**
087: * This will indicate whether or not the response has already been written
088: */
089: public boolean isResponseWritten();
090:
091: /**
092: * This is used to set the response written flag on the RequestResponseTransport
093: * instance
094: */
095: public void setResponseWritten(boolean responseWritten);
096:
097: /**
098: * Used to give the current status of the RequestResponseTransport object.
099: */
100: public class RequestResponseTransportStatus {
101: /**
102: * Transport is in its initial stage.
103: */
104: public static RequestResponseTransportStatus INITIAL = new RequestResponseTransportStatus(
105: 1);
106:
107: /**
108: * awaitResponse has been called.
109: */
110: public static RequestResponseTransportStatus WAITING = new RequestResponseTransportStatus(
111: 2);
112:
113: /**
114: * 'signalResponseReady' has been called.
115: */
116: public static RequestResponseTransportStatus SIGNALLED = new RequestResponseTransportStatus(
117: 3);
118:
119: private int value;
120:
121: private RequestResponseTransportStatus(int value) {
122: this .value = value;
123: }
124:
125: public int hashCode() {
126: return value;
127: }
128:
129: public boolean equals(Object obj) {
130: if (!(obj instanceof RequestResponseTransportStatus)) {
131: return false;
132: }
133: final RequestResponseTransportStatus instance = (RequestResponseTransportStatus) obj;
134: return (value == instance.value);
135: }
136:
137: public String toString() {
138: return Integer.toString(value);
139: }
140:
141: }
142:
143: }
|