You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2006/12/15 16:07:25 UTC
svn commit: r487577 - in
/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2:
client/ description/
Author: dims
Date: Fri Dec 15 07:07:24 2006
New Revision: 487577
URL: http://svn.apache.org/viewvc?view=rev&rev=487577
Log:
Fix for AXIS2-1841 - Duplicate code in OperationClient
Added:
webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/TwoChannelAxisOperation.java
Modified:
webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/client/OperationClient.java
webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/InOutAxisOperation.java
webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutOnlyAxisOperation.java
Modified: webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/client/OperationClient.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/client/OperationClient.java?view=diff&rev=487577&r1=487576&r2=487577
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/client/OperationClient.java (original)
+++ webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/client/OperationClient.java Fri Dec 15 07:07:24 2006
@@ -16,10 +16,24 @@
package org.apache.axis2.client;
+import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
+import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.async.Callback;
+import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.OperationContext;
+import org.apache.axis2.context.ServiceContext;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.description.ClientUtils;
+import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.util.UUIDGenerator;
+import org.apache.axis2.util.TargetResolver;
+import org.apache.axis2.wsdl.WSDLConstants;
+
+import java.util.Iterator;
+import java.util.Map;
/**
* An operation client is the way an advanced user interacts with Axis2. Actual
@@ -31,7 +45,34 @@
* in a new message being created, then if a message receiver is registered with
* the client then the message will be delivered to that client.
*/
-public interface OperationClient {
+public abstract class OperationClient {
+
+ protected AxisOperation axisOp;
+
+ protected ServiceContext sc;
+
+ protected Options options;
+
+ protected OperationContext oc;
+
+ protected Callback callback;
+
+ /*
+ * indicates whether the MEP execution has completed (and hence ready for
+ * resetting)
+ */
+ protected boolean completed;
+
+ protected OperationClient(AxisOperation axisOp, ServiceContext sc,
+ Options options) {
+ this.axisOp = axisOp;
+ this.sc = sc;
+ this.options = options;
+ this.completed = false;
+ this.oc = new OperationContext(axisOp);
+ this.oc.setParent(this.sc);
+ }
+
/**
* Sets the options that should be used for this particular client. This
* resets the entire set of options to use the new options - so you'd lose
@@ -39,7 +80,9 @@
*
* @param options the options
*/
- public void setOptions(Options options);
+ public void setOptions(Options options) {
+ this.options = options;
+ }
/**
* Return the options used by this client. If you want to set a single
@@ -48,7 +91,9 @@
*
* @return the options, which will never be null.
*/
- public Options getOptions();
+ public Options getOptions() {
+ return options;
+ }
/**
* Add a message context to the client for processing. This method must not
@@ -58,7 +103,7 @@
* @param messageContext the message context
* @throws AxisFault if this is called inappropriately.
*/
- public void addMessageContext(MessageContext messageContext) throws AxisFault;
+ public abstract void addMessageContext(MessageContext messageContext) throws AxisFault;
/**
* Return a message from the client - will return null if the requested
@@ -68,7 +113,7 @@
* @return the desired message context or null if its not available.
* @throws AxisFault if the message label is invalid
*/
- public MessageContext getMessageContext(String messageLabel)
+ public abstract MessageContext getMessageContext(String messageLabel)
throws AxisFault;
/**
@@ -81,7 +126,7 @@
* @param callback the callback to be used when the client decides its time to
* use it
*/
- public void setCallback(Callback callback);
+ public abstract void setCallback(Callback callback);
/**
* Execute the MEP. What this does depends on the specific operation client.
@@ -97,7 +142,7 @@
* @throws AxisFault if something goes wrong during the execution of the operation
* client.
*/
- public void execute(boolean block) throws AxisFault;
+ public abstract void execute(boolean block) throws AxisFault;
/**
* Reset the operation client to a clean status after the MEP has completed.
@@ -107,24 +152,110 @@
* @throws AxisFault if reset is called before the MEP client has completed an
* interaction.
*/
- public void reset() throws AxisFault;
+ public void reset() throws AxisFault {
+ if (!completed) {
+ throw new AxisFault(Messages.getMessage("cannotreset"));
+ }
+ oc = null;
+ completed = false;
+ }
+
/**
- * To close the transport if necessary , can call this method. The main
- * usage of this method is when client uses two tarnsports for sending and
- * receiving , and we need to remove entries for waiting calls in the
+ * To close the transport if necessary , can call this method. The main
+ * usage of this method is when client uses two tarnsports for sending and
+ * receiving , and we need to remove entries for waiting calls in the
* transport listener queue.
- * Note : DO NOT call this method if you are not using two transports to
+ * Note : DO NOT call this method if you are not using two transports to
* send and receive
*
* @param msgCtxt : MessageContext# which has all the transport information
* @throws AxisFault : throws AxisFault if something goes wrong
*/
- public void complete(MessageContext msgCtxt) throws AxisFault;
+ public void complete(MessageContext msgCtxt) throws AxisFault {
+ TransportOutDescription trsout = msgCtxt.getTransportOut();
+ if (trsout != null) {
+ trsout.getSender().cleanup(msgCtxt);
+ }
+ }
+
/**
* To get the operation context of the operation client
+ *
* @return OperationContext
*/
- public OperationContext getOperationContext();
+ public OperationContext getOperationContext() {
+ return oc;
+ }
+
+ /**
+ * Create a message ID for the given message context if needed. If user gives an option with
+ * MessageID then just copy that into MessageContext , and with that there can be multiple
+ * message with same MessageID unless user call setOption for each invocation.
+ * <p/>
+ * If user want to give message ID then the better way is to set the message ID in the option and
+ * call setOption for each invocation then the right thing will happen.
+ * <p/>
+ * If user does not give a message ID then the new one will be created and set that into Message
+ * Context.
+ *
+ * @param mc the message context whose id is to be set
+ */
+ protected void setMessageID(MessageContext mc) {
+ // now its the time to put the parameters set by the user in to the
+ // correct places and to the
+ // if there is no message id still, set a new one.
+ String messageId = options.getMessageId();
+ if (messageId == null || "".equals(messageId)) {
+ messageId = UUIDGenerator.getUUID();
+ }
+ mc.setMessageID(messageId);
+ }
+
+ protected void addReferenceParameters(MessageContext msgctx) {
+ EndpointReference to = msgctx.getTo();
+ if (options.isManageSession()) {
+ EndpointReference tepr = sc.getTargetEPR();
+ if (tepr != null) {
+ Map map = tepr.getAllReferenceParameters();
+ if (map != null) {
+ Iterator valuse = map.values().iterator();
+ while (valuse.hasNext()) {
+ Object refparaelement = valuse.next();
+ if (refparaelement instanceof OMElement) {
+ to.addReferenceParameter((OMElement) refparaelement);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ protected void prepareMessageContext(ConfigurationContext cc, MessageContext mc) throws AxisFault{
+ // set options on the message context
+ if (mc.getSoapAction() == null || "".equals(mc.getSoapAction())) {
+ mc.setSoapAction(options.getAction());
+ }
+ mc.setOptions(options);
+ mc.setAxisMessage(axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE));
+
+ // do Target Resolution
+ TargetResolver targetResolver = cc.getAxisConfiguration().getTargetResolverChain();
+ if (targetResolver != null) {
+ targetResolver.resolveTarget(mc);
+ }
+ // if the transport to use for sending is not specified, try to find it
+ // from the URL
+ TransportOutDescription senderTransport = options.getTransportOut();
+ if (senderTransport == null) {
+ EndpointReference toEPR = (options.getTo() != null) ? options
+ .getTo() : mc.getTo();
+ senderTransport = ClientUtils.inferOutTransport(cc
+ .getAxisConfiguration(), toEPR, mc);
+ }
+ mc.setTransportOut(senderTransport);
+
+ addReferenceParameters(mc);
+ }
}
Modified: webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/InOutAxisOperation.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/InOutAxisOperation.java?view=diff&rev=487577&r1=487576&r2=487577
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/InOutAxisOperation.java (original)
+++ webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/InOutAxisOperation.java Fri Dec 15 07:07:24 2006
@@ -1,158 +1,54 @@
-/*
-* Copyright 2004,2006 The Apache Software Foundation.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.apache.axis2.description;
-
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.i18n.Messages;
-
-import javax.xml.namespace.QName;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-public class InOutAxisOperation extends AxisOperation {
- private AxisMessage inFaultMessage;
-// private AxisMessage inMessage;
- private AxisMessage outFaultMessage;
-// private AxisMessage outMessage;
-
- public InOutAxisOperation() {
- super();
- createMessages();
- }
-
- public InOutAxisOperation(QName name) {
- super(name);
- createMessages();
- }
-
- public void addMessage(AxisMessage message, String label) {
- if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
- addChild("outMessage", message);
- } else if (WSDLConstants.MESSAGE_LABEL_IN_VALUE.equals(label)) {
- addChild("inMessage", message);
- } else if (WSDLConstants.MESSAGE_LABEL_FAULT_VALUE.equals(label)) {
- addChild("faultMessage", message);
- } else {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- }
-
- public void addMessageContext(MessageContext msgContext, OperationContext opContext)
- throws AxisFault {
- HashMap mep = opContext.getMessageContexts();
- MessageContext inMsgContext = (MessageContext) mep.get(MESSAGE_LABEL_IN_VALUE);
- MessageContext outmsgContext = (MessageContext) mep.get(MESSAGE_LABEL_OUT_VALUE);
-
- if ((inMsgContext != null) && (outmsgContext != null)) {
- throw new AxisFault(Messages.getMessage("mepcompleted"));
- }
-
- if (inMsgContext == null) {
- mep.put(MESSAGE_LABEL_IN_VALUE, msgContext);
- } else {
- mep.put(MESSAGE_LABEL_OUT_VALUE, msgContext);
- opContext.setComplete(true);
- opContext.cleanup();
- }
- }
-
- public void addFaultMessageContext(MessageContext msgContext, OperationContext opContext) throws AxisFault {
- HashMap mep = opContext.getMessageContexts();
- MessageContext faultMessageCtxt = (MessageContext) mep.get(MESSAGE_LABEL_FAULT_VALUE);
-
- if (faultMessageCtxt != null) {
- throw new AxisFault(Messages.getMessage("mepcompleted"));
- } else {
- mep.put(MESSAGE_LABEL_FAULT_VALUE, msgContext);
- opContext.setComplete(true);
- opContext.cleanup();
- }
-
- }
-
- private void createMessages() {
-// inMessage = new AxisMessage();
-// inMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
-// inMessage.setParent(this);
-
- AxisMessage inMessage = new AxisMessage();
- inMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
- inMessage.setParent(this);
- addChild("inMessage", inMessage);
-
- inFaultMessage = new AxisMessage();
- inFaultMessage.setParent(this);
-
- outFaultMessage = new AxisMessage();
- outFaultMessage.setParent(this);
-
-// outMessage = new AxisMessage();
-// outMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
-// outMessage.setParent(this);
-
- AxisMessage outMessage = new AxisMessage();
- outMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
- outMessage.setParent(this);
- addChild("outMessage", outMessage);
-
-
- }
-
- public AxisMessage getMessage(String label) {
- if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
- return (AxisMessage) getChild("outMessage");
- } else if (WSDLConstants.MESSAGE_LABEL_IN_VALUE.equals(label)) {
- return (AxisMessage) getChild("inMessage");
- } else {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- }
-
- public ArrayList getPhasesInFaultFlow() {
- return inFaultMessage.getMessageFlow();
- }
-
- public ArrayList getPhasesOutFaultFlow() {
- return outFaultMessage.getMessageFlow();
- }
-
- public ArrayList getPhasesOutFlow() {
- return ((AxisMessage) getChild("outMessage")).getMessageFlow();
- }
-
- public ArrayList getRemainingPhasesInFlow() {
- return ((AxisMessage) getChild("inMessage")).getMessageFlow();
- }
-
- public void setPhasesInFaultFlow(ArrayList list) {
- inFaultMessage.setMessageFlow(list);
- }
-
- public void setPhasesOutFaultFlow(ArrayList list) {
- outFaultMessage.setMessageFlow(list);
- }
-
- public void setPhasesOutFlow(ArrayList list) {
- ((AxisMessage) getChild("outMessage")).setMessageFlow(list);
- }
-
- public void setRemainingPhasesInFlow(ArrayList list) {
- ((AxisMessage) getChild("inMessage")).setMessageFlow(list);
- }
-}
+/*
+* Copyright 2004,2006 The Apache Software Foundation.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.axis2.description;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.OperationContext;
+import org.apache.axis2.i18n.Messages;
+
+import javax.xml.namespace.QName;
+import java.util.HashMap;
+
+public class InOutAxisOperation extends TwoChannelAxisOperation {
+
+ public InOutAxisOperation() {
+ super();
+ }
+
+ public InOutAxisOperation(QName name) {
+ super(name);
+ }
+
+ public void addMessageContext(MessageContext msgContext, OperationContext opContext)
+ throws AxisFault {
+ HashMap mep = opContext.getMessageContexts();
+ MessageContext inMsgContext = (MessageContext) mep.get(MESSAGE_LABEL_IN_VALUE);
+ MessageContext outmsgContext = (MessageContext) mep.get(MESSAGE_LABEL_OUT_VALUE);
+
+ if ((inMsgContext != null) && (outmsgContext != null)) {
+ throw new AxisFault(Messages.getMessage("mepcompleted"));
+ }
+
+ if (inMsgContext == null) {
+ mep.put(MESSAGE_LABEL_IN_VALUE, msgContext);
+ } else {
+ mep.put(MESSAGE_LABEL_OUT_VALUE, msgContext);
+ opContext.setComplete(true);
+ opContext.cleanup();
+ }
+ }
+}
Modified: webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java?view=diff&rev=487577&r1=487576&r2=487577
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java (original)
+++ webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java Fri Dec 15 07:07:24 2006
@@ -1,476 +1,334 @@
-/*
-* Copyright 2004,2006 The Apache Software Foundation.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.apache.axis2.description;
-
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.soap.SOAPBody;
-import org.apache.axiom.soap.SOAPEnvelope;
-import org.apache.axiom.soap.SOAPFault;
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.Constants;
-import org.apache.axis2.addressing.EndpointReference;
-import org.apache.axis2.client.OperationClient;
-import org.apache.axis2.client.Options;
-import org.apache.axis2.client.async.AsyncResult;
-import org.apache.axis2.client.async.Callback;
-import org.apache.axis2.context.ConfigurationContext;
-import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.context.ServiceContext;
-import org.apache.axis2.engine.AxisEngine;
-import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.transport.TransportUtils;
-import org.apache.axis2.util.CallbackReceiver;
-import org.apache.axis2.util.UUIDGenerator;
-import org.apache.axis2.util.TargetResolver;
-import org.apache.axis2.wsdl.WSDLConstants;
-
-import javax.xml.namespace.QName;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-public class OutInAxisOperation extends InOutAxisOperation {
- public OutInAxisOperation() {
- super();
- setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_IN);
- }
-
- public OutInAxisOperation(QName name) {
- super(name);
- setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_IN);
- }
-
- public void addMessageContext(MessageContext msgContext,
- OperationContext opContext) throws AxisFault {
- HashMap mep = opContext.getMessageContexts();
- MessageContext immsgContext = (MessageContext) mep
- .get(MESSAGE_LABEL_IN_VALUE);
- MessageContext outmsgContext = (MessageContext) mep
- .get(MESSAGE_LABEL_OUT_VALUE);
-
- if ((immsgContext != null) && (outmsgContext != null)) {
- throw new AxisFault(Messages.getMessage("mepcompleted"));
- }
-
- if (outmsgContext == null) {
- mep.put(MESSAGE_LABEL_OUT_VALUE, msgContext);
- } else {
- mep.put(MESSAGE_LABEL_IN_VALUE, msgContext);
- opContext.setComplete(true);
- }
- }
-
- /**
- * Returns a MEP client for an Out-IN operation. This client can be used to
- * interact with a server which is offering an In-Out operation. To use the
- * client, you must call addMessageContext() with a message context and then
- * call execute() to execute the client.
- *
- * @param sc The service context for this client to live within. Cannot be
- * null.
- * @param options Options to use as defaults for this client. If any options are
- * set specifically on the client then those override options
- * here.
- */
- public OperationClient createClient(ServiceContext sc, Options options) {
- return new OutInAxisOperationClient(this, sc, options);
- }
-}
-
-/**
- * MEP client for moi.
- */
-class OutInAxisOperationClient implements OperationClient {
-
- private AxisOperation axisOp;
-
- protected ServiceContext sc;
-
- protected Options options;
-
- protected OperationContext oc;
-
- protected Callback callback;
-
- /*
- * indicates whether the MEP execution has completed (and hence ready for
- * resetting)
- */
- boolean completed;
-
- OutInAxisOperationClient(OutInAxisOperation axisOp, ServiceContext sc,
- Options options) {
- this.axisOp = axisOp;
- this.sc = sc;
- this.options = options;
- this.completed = false;
- this.oc = new OperationContext(axisOp);
- this.oc.setParent(this.sc);
- }
-
- /**
- * Sets the options that should be used for this particular client. This
- * resets the entire set of options to use the new options - so you'd lose
- * any option cascading that may have been set up.
- *
- * @param options the options
- */
- public void setOptions(Options options) {
- this.options = options;
- }
-
- /**
- * Returns the options used by this client. If you want to set a single
- * option, then the right way is to call getOptions() and set specific
- * options.
- *
- * @return Returns the options, which will never be null.
- */
- public Options getOptions() {
- return options;
- }
-
- /**
- * Adds message context to operation context , so that it will handle the
- * logic correctly if the OperationContext is null then new one will be
- * created , and Operation Context will become null when some one calls reset().
- *
- * @param mc
- * @throws AxisFault
- */
- public void addMessageContext(MessageContext mc) throws AxisFault {
- mc.setServiceContext(sc);
- if (mc.getMessageID() == null) {
- setMessageID(mc);
- }
- axisOp.registerOperationContext(mc, oc);
- }
-
- /**
- * Returns the message context for a given message label.
- *
- * @param messageLabel :
- * label of the message and that can be either "Out" or "In" and
- * nothing else
- * @return Returns MessageContext.
- * @throws AxisFault
- */
- public MessageContext getMessageContext(String messageLabel)
- throws AxisFault {
- return oc.getMessageContext(messageLabel);
- }
-
- public void setCallback(Callback callback) {
- this.callback = callback;
- }
-
- /**
- * Create a message ID for the given message context if needed. If user gives an option with
- * MessageID then just copy that into MessageContext , and with that there can be multiple
- * message with same MessageID unless user call setOption for each invocation.
- * <p/>
- * If user want to give message ID then the better way is to set the message ID in the option and
- * call setOption for each invocation then the right thing will happen.
- * <p/>
- * If user does not give a message ID then the new one will be created and set that into Message
- * Context.
- *
- * @param mc the message context whose id is to be set
- */
- private void setMessageID(MessageContext mc) {
- // now its the time to put the parameters set by the user in to the
- // correct places and to the
- // if there is no message id still, set a new one.
- String messageId = options.getMessageId();
- if (messageId == null || "".equals(messageId)) {
- messageId = UUIDGenerator.getUUID();
- }
- mc.setMessageID(messageId);
- }
-
-
- /**
- * Executes the MEP. What this does depends on the specific MEP client. The
- * basic idea is to have the MEP client execute and do something with the
- * messages that have been added to it so far. For example, if its an Out-In
- * MEP, then if the Out message has been set, then executing the client asks
- * it to send the message and get the In message, possibly using a different
- * thread.
- *
- * @param block Indicates whether execution should block or return ASAP. What
- * block means is of course a function of the specific MEP
- * client. IGNORED BY THIS MEP CLIENT.
- * @throws AxisFault if something goes wrong during the execution of the MEP.
- */
- public void execute(boolean block) throws AxisFault {
- if (completed) {
- throw new AxisFault(Messages.getMessage("mepiscomplted"));
- }
- ConfigurationContext cc = sc.getConfigurationContext();
-
- // copy interesting info from options to message context.
- MessageContext mc = oc
- .getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
- if (mc == null) {
- throw new AxisFault(Messages.getMessage("outmsgctxnull"));
- }
- //setting AxisMessage
- mc.setAxisMessage(axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE));
- if (mc.getSoapAction() == null || "".equals(mc.getSoapAction())) {
- mc.setSoapAction(options.getAction());
- }
- mc.setOptions(options);
-
- // do Target Resolution
- TargetResolver targetResolver = cc.getAxisConfiguration().getTargetResolverChain();
- if(targetResolver != null){
- targetResolver.resolveTarget(mc);
- }
-
- // if the transport to use for sending is not specified, try to find it
- // from the URL
- TransportOutDescription transportOut = options.getTransportOut();
- if (transportOut == null) {
- EndpointReference toEPR = (options.getTo() != null) ? options
- .getTo() : mc.getTo();
- transportOut = ClientUtils.inferOutTransport(cc
- .getAxisConfiguration(), toEPR, mc);
- }
- mc.setTransportOut(transportOut);
-
-
- if (options.getTransportIn() == null && mc.getTransportIn() == null) {
- mc.setTransportIn(ClientUtils.inferInTransport(cc
- .getAxisConfiguration(), options, mc));
- } else if (mc.getTransportIn() == null) {
- mc.setTransportIn(options.getTransportIn());
- }
-
- addReferenceParameters(mc);
- if (options.isUseSeparateListener()) {
- CallbackReceiver callbackReceiver = (CallbackReceiver) axisOp
- .getMessageReceiver();
- callbackReceiver.addCallback(mc.getMessageID(), callback);
-
- /**
- * If USE_CUSTOM_LISTENER is set to 'true' the replyTo value will not be replaced and Axis2 will not
- * start its internal listner. Some other enntity (e.g. a module) should take care of obtaining the
- * response message.
- */
- Boolean useCustomListener = (Boolean) options.getProperty(Constants.Configuration.USE_CUSTOM_LISTENER);
- if (useCustomListener==null || !useCustomListener.booleanValue()) {
-
- EndpointReference replyToFromTransport = mc.getConfigurationContext().getListenerManager().
- getEPRforService(sc.getAxisService().getName(), axisOp.getName().getLocalPart(), mc
- .getTransportIn().getName()
- .getLocalPart());
-
- if (mc.getReplyTo() == null) {
- mc.setReplyTo(replyToFromTransport);
- } else {
- mc.getReplyTo().setAddress(replyToFromTransport.getAddress());
- }
- }
-
-
-
- //if we don't do this , this guy will wait till it gets HTTP 202 in the HTTP case
- mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.TRUE);
- AxisEngine engine = new AxisEngine(cc);
- mc.getConfigurationContext().registerOperationContext(mc.getMessageID(), oc);
- engine.send(mc);
- } else {
- if (block) {
- // Send the SOAP Message and receive a response
- MessageContext response = send(mc);
- // check for a fault and return the result
- if (response != null) {
- SOAPEnvelope resEnvelope = response.getEnvelope();
- if (resEnvelope.getBody().hasFault()) {
- SOAPFault soapFault = resEnvelope.getBody().getFault();
-
- //we need to call engine.receiveFault
- AxisEngine engine = new AxisEngine(mc.getConfigurationContext());
- engine.receiveFault(response);
- if (options.isExceptionToBeThrownOnSOAPFault()) {
- // does the SOAPFault has a detail element for Excpetion
-
- throw new AxisFault(soapFault.getCode(), soapFault.getReason(),
- soapFault.getNode(), soapFault.getRole(), soapFault.getDetail());
-
- }
- }
- }
- completed = true;
- } else {
- sc.getConfigurationContext().getThreadPool().execute(
- new NonBlockingInvocationWorker(callback, mc));
- }
- }
- }
-
- private void addReferenceParameters(MessageContext msgctx) {
- EndpointReference to = msgctx.getTo();
- if (options.isManageSession()) {
- EndpointReference tepr = sc.getTargetEPR();
- if (tepr != null) {
- Map map = tepr.getAllReferenceParameters();
- if (map != null) {
- Iterator valuse = map.values().iterator();
- while (valuse.hasNext()) {
- Object refparaelement = valuse.next();
- if (refparaelement instanceof OMElement) {
- to.addReferenceParameter((OMElement) refparaelement);
- }
- }
- }
- }
- }
- }
-
- /**
- * @param msgctx
- * @return Returns MessageContext.
- * @throws AxisFault Sends the message using a two way transport and waits for a response
- */
- protected MessageContext send(MessageContext msgctx) throws AxisFault {
-
- AxisEngine engine = new AxisEngine(msgctx.getConfigurationContext());
-
- // create the responseMessageContext
- MessageContext responseMessageContext = new MessageContext();
-
- // This is a hack - Needs to change
- responseMessageContext.setOptions(options);
-
-
- responseMessageContext.setServerSide(false);
- responseMessageContext.setMessageID(msgctx.getMessageID());
- addMessageContext(responseMessageContext);
- responseMessageContext.setServiceContext(msgctx.getServiceContext());
- responseMessageContext.setAxisMessage(
- axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE));
-
- //sending the message
- engine.send(msgctx);
- responseMessageContext.setDoingREST(msgctx.isDoingREST());
-
- responseMessageContext.setProperty(MessageContext.TRANSPORT_IN, msgctx
- .getProperty(MessageContext.TRANSPORT_IN));
- responseMessageContext.setTransportIn(msgctx.getTransportIn());
- responseMessageContext.setTransportOut(msgctx.getTransportOut());
-
- // Options object reused above so soapAction needs to be removed so
- // that soapAction+wsa:Action on response don't conflict
- responseMessageContext.setSoapAction("");
-
- if (responseMessageContext.getEnvelope() == null) {
- // If request is REST we assume the responseMessageContext is REST, so
- // set the variable
-
- SOAPEnvelope resenvelope = TransportUtils.createSOAPMessage(
- responseMessageContext, msgctx.getEnvelope().getNamespace()
- .getNamespaceURI());
- if (resenvelope != null) {
- responseMessageContext.setEnvelope(resenvelope);
- engine = new AxisEngine(msgctx.getConfigurationContext());
- engine.receive(responseMessageContext);
- if (responseMessageContext.getReplyTo() != null) {
- sc.setTargetEPR(responseMessageContext.getReplyTo());
- }
- } else {
- throw new AxisFault(Messages
- .getMessage("blockingInvocationExpectsResponse"));
- }
- }
- return responseMessageContext;
- }
-
- /**
- * Resets the MEP client to a clean status after the MEP has completed. This
- * is how you can reuse a MEP client. NOTE: this does not reset the options;
- * only the internal state so the client can be used again.
- *
- * @throws AxisFault if reset is called before the MEP client has completed an
- * interaction.
- */
- public void reset() throws AxisFault {
- if (!completed) {
- throw new AxisFault(Messages.getMessage("cannotreset"));
- }
- oc = null;
- completed = false;
- }
-
- public void complete(MessageContext msgCtxt) throws AxisFault {
- TransportOutDescription trsout = msgCtxt.getTransportOut();
- if (trsout != null) {
- trsout.getSender().cleanup(msgCtxt);
- }
- }
-
- public OperationContext getOperationContext() {
- return oc;
- }
-
- /**
- * This class is the workhorse for a non-blocking invocation that uses a two
- * way transport.
- */
- private class NonBlockingInvocationWorker implements Runnable {
- private Callback callback;
-
- private MessageContext msgctx;
-
- public NonBlockingInvocationWorker(Callback callback,
- MessageContext msgctx) {
- this.callback = callback;
- this.msgctx = msgctx;
- }
-
- public void run() {
- try {
- // send the request and wait for response
- MessageContext response = send(msgctx);
- // call the callback
- if (response != null) {
- SOAPEnvelope resenvelope = response.getEnvelope();
- SOAPBody body = resenvelope.getBody();
- if (body.hasFault()) {
- Exception ex = body.getFault().getException();
-
- if (ex != null) {
- callback.onError(ex);
- } else {
- callback.onError(new Exception(body.getFault()
- .getReason().getText()));
- }
- } else {
- AsyncResult asyncResult = new AsyncResult(response);
-
- callback.onComplete(asyncResult);
- }
- }
-
- } catch (Exception e) {
- callback.onError(e);
- } finally {
- callback.setComplete(true);
- }
- }
- }
-}
+/*
+* Copyright 2004,2006 The Apache Software Foundation.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.axis2.description;
+
+import org.apache.axiom.soap.SOAPBody;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFault;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.OperationClient;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.async.AsyncResult;
+import org.apache.axis2.client.async.Callback;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.OperationContext;
+import org.apache.axis2.context.ServiceContext;
+import org.apache.axis2.engine.AxisEngine;
+import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.transport.TransportUtils;
+import org.apache.axis2.util.CallbackReceiver;
+import org.apache.axis2.wsdl.WSDLConstants;
+
+import javax.xml.namespace.QName;
+import java.util.HashMap;
+
+public class OutInAxisOperation extends TwoChannelAxisOperation {
+ public OutInAxisOperation() {
+ super();
+ setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_IN);
+ }
+
+ public OutInAxisOperation(QName name) {
+ super(name);
+ setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_IN);
+ }
+
+ public void addMessageContext(MessageContext msgContext,
+ OperationContext opContext) throws AxisFault {
+ HashMap mep = opContext.getMessageContexts();
+ MessageContext immsgContext = (MessageContext) mep
+ .get(MESSAGE_LABEL_IN_VALUE);
+ MessageContext outmsgContext = (MessageContext) mep
+ .get(MESSAGE_LABEL_OUT_VALUE);
+
+ if ((immsgContext != null) && (outmsgContext != null)) {
+ throw new AxisFault(Messages.getMessage("mepcompleted"));
+ }
+
+ if (outmsgContext == null) {
+ mep.put(MESSAGE_LABEL_OUT_VALUE, msgContext);
+ } else {
+ mep.put(MESSAGE_LABEL_IN_VALUE, msgContext);
+ opContext.setComplete(true);
+ }
+ }
+
+ /**
+ * Returns a MEP client for an Out-IN operation. This client can be used to
+ * interact with a server which is offering an In-Out operation. To use the
+ * client, you must call addMessageContext() with a message context and then
+ * call execute() to execute the client.
+ *
+ * @param sc The service context for this client to live within. Cannot be
+ * null.
+ * @param options Options to use as defaults for this client. If any options are
+ * set specifically on the client then those override options
+ * here.
+ */
+ public OperationClient createClient(ServiceContext sc, Options options) {
+ return new OutInAxisOperationClient(this, sc, options);
+ }
+}
+
+/**
+ * MEP client for moi.
+ */
+class OutInAxisOperationClient extends OperationClient {
+
+
+ OutInAxisOperationClient(OutInAxisOperation axisOp, ServiceContext sc,
+ Options options) {
+ super(axisOp, sc, options);
+ }
+
+ /**
+ * Adds message context to operation context , so that it will handle the
+ * logic correctly if the OperationContext is null then new one will be
+ * created , and Operation Context will become null when some one calls reset().
+ *
+ * @param mc
+ * @throws AxisFault
+ */
+ public void addMessageContext(MessageContext mc) throws AxisFault {
+ mc.setServiceContext(sc);
+ if (mc.getMessageID() == null) {
+ setMessageID(mc);
+ }
+ axisOp.registerOperationContext(mc, oc);
+ }
+
+ /**
+ * Returns the message context for a given message label.
+ *
+ * @param messageLabel :
+ * label of the message and that can be either "Out" or "In" and
+ * nothing else
+ * @return Returns MessageContext.
+ * @throws AxisFault
+ */
+ public MessageContext getMessageContext(String messageLabel)
+ throws AxisFault {
+ return oc.getMessageContext(messageLabel);
+ }
+
+ public void setCallback(Callback callback) {
+ this.callback = callback;
+ }
+
+
+ /**
+ * Executes the MEP. What this does depends on the specific MEP client. The
+ * basic idea is to have the MEP client execute and do something with the
+ * messages that have been added to it so far. For example, if its an Out-In
+ * MEP, then if the Out message has been set, then executing the client asks
+ * it to send the message and get the In message, possibly using a different
+ * thread.
+ *
+ * @param block Indicates whether execution should block or return ASAP. What
+ * block means is of course a function of the specific MEP
+ * client. IGNORED BY THIS MEP CLIENT.
+ * @throws AxisFault if something goes wrong during the execution of the MEP.
+ */
+ public void execute(boolean block) throws AxisFault {
+ if (completed) {
+ throw new AxisFault(Messages.getMessage("mepiscomplted"));
+ }
+ ConfigurationContext cc = sc.getConfigurationContext();
+
+ // copy interesting info from options to message context.
+ MessageContext mc = oc
+ .getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
+ if (mc == null) {
+ throw new AxisFault(Messages.getMessage("outmsgctxnull"));
+ }
+ prepareMessageContext(cc, mc);
+
+ if (options.getTransportIn() == null && mc.getTransportIn() == null) {
+ mc.setTransportIn(ClientUtils.inferInTransport(cc
+ .getAxisConfiguration(), options, mc));
+ } else if (mc.getTransportIn() == null) {
+ mc.setTransportIn(options.getTransportIn());
+ }
+
+ if (options.isUseSeparateListener()) {
+ CallbackReceiver callbackReceiver = (CallbackReceiver) axisOp
+ .getMessageReceiver();
+ callbackReceiver.addCallback(mc.getMessageID(), callback);
+
+ /**
+ * If USE_CUSTOM_LISTENER is set to 'true' the replyTo value will not be replaced and Axis2 will not
+ * start its internal listner. Some other enntity (e.g. a module) should take care of obtaining the
+ * response message.
+ */
+ Boolean useCustomListener = (Boolean) options.getProperty(Constants.Configuration.USE_CUSTOM_LISTENER);
+ if (useCustomListener == null || !useCustomListener.booleanValue()) {
+
+ EndpointReference replyToFromTransport = mc.getConfigurationContext().getListenerManager().
+ getEPRforService(sc.getAxisService().getName(), axisOp.getName().getLocalPart(), mc
+ .getTransportIn().getName()
+ .getLocalPart());
+
+ if (mc.getReplyTo() == null) {
+ mc.setReplyTo(replyToFromTransport);
+ } else {
+ mc.getReplyTo().setAddress(replyToFromTransport.getAddress());
+ }
+ }
+
+ //if we don't do this , this guy will wait till it gets HTTP 202 in the HTTP case
+ mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.TRUE);
+ AxisEngine engine = new AxisEngine(cc);
+ mc.getConfigurationContext().registerOperationContext(mc.getMessageID(), oc);
+ engine.send(mc);
+ } else {
+ if (block) {
+ // Send the SOAP Message and receive a response
+ MessageContext response = send(mc);
+ // check for a fault and return the result
+ if (response != null) {
+ SOAPEnvelope resEnvelope = response.getEnvelope();
+ if (resEnvelope.getBody().hasFault()) {
+ SOAPFault soapFault = resEnvelope.getBody().getFault();
+
+ //we need to call engine.receiveFault
+ AxisEngine engine = new AxisEngine(mc.getConfigurationContext());
+ engine.receiveFault(response);
+ if (options.isExceptionToBeThrownOnSOAPFault()) {
+ // does the SOAPFault has a detail element for Excpetion
+
+ throw new AxisFault(soapFault.getCode(), soapFault.getReason(),
+ soapFault.getNode(), soapFault.getRole(), soapFault.getDetail());
+
+ }
+ }
+ }
+ completed = true;
+ } else {
+ sc.getConfigurationContext().getThreadPool().execute(
+ new NonBlockingInvocationWorker(callback, mc));
+ }
+ }
+ }
+
+
+ /**
+ * @param msgctx
+ * @return Returns MessageContext.
+ * @throws AxisFault Sends the message using a two way transport and waits for a response
+ */
+ protected MessageContext send(MessageContext msgctx) throws AxisFault {
+
+ AxisEngine engine = new AxisEngine(msgctx.getConfigurationContext());
+
+ // create the responseMessageContext
+ MessageContext responseMessageContext = new MessageContext();
+
+ // This is a hack - Needs to change
+ responseMessageContext.setOptions(options);
+
+
+ responseMessageContext.setServerSide(false);
+ responseMessageContext.setMessageID(msgctx.getMessageID());
+ addMessageContext(responseMessageContext);
+ responseMessageContext.setServiceContext(msgctx.getServiceContext());
+ responseMessageContext.setAxisMessage(
+ axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE));
+
+ //sending the message
+ engine.send(msgctx);
+ responseMessageContext.setDoingREST(msgctx.isDoingREST());
+
+ responseMessageContext.setProperty(MessageContext.TRANSPORT_IN, msgctx
+ .getProperty(MessageContext.TRANSPORT_IN));
+ responseMessageContext.setTransportIn(msgctx.getTransportIn());
+ responseMessageContext.setTransportOut(msgctx.getTransportOut());
+
+ // Options object reused above so soapAction needs to be removed so
+ // that soapAction+wsa:Action on response don't conflict
+ responseMessageContext.setSoapAction("");
+
+ if (responseMessageContext.getEnvelope() == null) {
+ // If request is REST we assume the responseMessageContext is REST, so
+ // set the variable
+
+ SOAPEnvelope resenvelope = TransportUtils.createSOAPMessage(
+ responseMessageContext, msgctx.getEnvelope().getNamespace()
+ .getNamespaceURI());
+ if (resenvelope != null) {
+ responseMessageContext.setEnvelope(resenvelope);
+ engine = new AxisEngine(msgctx.getConfigurationContext());
+ engine.receive(responseMessageContext);
+ if (responseMessageContext.getReplyTo() != null) {
+ sc.setTargetEPR(responseMessageContext.getReplyTo());
+ }
+ } else {
+ throw new AxisFault(Messages
+ .getMessage("blockingInvocationExpectsResponse"));
+ }
+ }
+ return responseMessageContext;
+ }
+
+ /**
+ * This class is the workhorse for a non-blocking invocation that uses a two
+ * way transport.
+ */
+ private class NonBlockingInvocationWorker implements Runnable {
+ private Callback callback;
+
+ private MessageContext msgctx;
+
+ public NonBlockingInvocationWorker(Callback callback,
+ MessageContext msgctx) {
+ this.callback = callback;
+ this.msgctx = msgctx;
+ }
+
+ public void run() {
+ try {
+ // send the request and wait for response
+ MessageContext response = send(msgctx);
+ // call the callback
+ if (response != null) {
+ SOAPEnvelope resenvelope = response.getEnvelope();
+ SOAPBody body = resenvelope.getBody();
+ if (body.hasFault()) {
+ Exception ex = body.getFault().getException();
+
+ if (ex != null) {
+ callback.onError(ex);
+ } else {
+ callback.onError(new Exception(body.getFault()
+ .getReason().getText()));
+ }
+ } else {
+ AsyncResult asyncResult = new AsyncResult(response);
+
+ callback.onComplete(asyncResult);
+ }
+ }
+
+ } catch (Exception e) {
+ callback.onError(e);
+ } finally {
+ callback.setComplete(true);
+ }
+ }
+ }
+}
Modified: webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutOnlyAxisOperation.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutOnlyAxisOperation.java?view=diff&rev=487577&r1=487576&r2=487577
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutOnlyAxisOperation.java (original)
+++ webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/OutOnlyAxisOperation.java Fri Dec 15 07:07:24 2006
@@ -1,389 +1,251 @@
-/*
-* Copyright 2004,2006 The Apache Software Foundation.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.apache.axis2.description;
-
-import org.apache.axiom.om.OMElement;
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.addressing.EndpointReference;
-import org.apache.axis2.client.OperationClient;
-import org.apache.axis2.client.Options;
-import org.apache.axis2.client.async.Callback;
-import org.apache.axis2.context.ConfigurationContext;
-import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.context.ServiceContext;
-import org.apache.axis2.engine.AxisEngine;
-import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.util.UUIDGenerator;
-import org.apache.axis2.util.TargetResolver;
-import org.apache.axis2.wsdl.WSDLConstants;
-
-import javax.xml.namespace.QName;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-public class OutOnlyAxisOperation extends AxisOperation {
-
- private AxisMessage inFaultMessage;
-
- // just to keep the inflow , there won't be any usage
- private ArrayList inPhases;
-
- private AxisMessage outFaultMessage;
-
- private AxisMessage outMessage;
-
- public OutOnlyAxisOperation() {
- super();
- createMessage();
- setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_ONLY);
- }
-
- public OutOnlyAxisOperation(QName name) {
- super(name);
- createMessage();
- setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_ONLY);
- }
-
- public void addMessage(AxisMessage message, String label) {
- if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
- outMessage = message;
- } else {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- }
-
- public void addMessageContext(MessageContext msgContext,
- OperationContext opContext) throws AxisFault {
- if (!opContext.isComplete()) {
- opContext.getMessageContexts().put(MESSAGE_LABEL_OUT_VALUE,
- msgContext);
- opContext.setComplete(true);
- } else {
- throw new AxisFault(Messages.getMessage("mepcompleted"));
- }
- }
-
- public void addFaultMessageContext(MessageContext msgContext, OperationContext opContext) throws AxisFault {
- HashMap mep = opContext.getMessageContexts();
- MessageContext faultMessageCtxt = (MessageContext) mep.get(MESSAGE_LABEL_FAULT_VALUE);
-
- if (faultMessageCtxt != null) {
- throw new AxisFault(Messages.getMessage("mepcompleted"));
- } else {
- mep.put(MESSAGE_LABEL_FAULT_VALUE, msgContext);
- opContext.setComplete(true);
- opContext.cleanup();
- }
- }
-
- private void createMessage() {
- outMessage = new AxisMessage();
- outMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
- inFaultMessage = new AxisMessage();
- outFaultMessage = new AxisMessage();
- inPhases = new ArrayList();
- }
-
- public AxisMessage getMessage(String label) {
- if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
- return outMessage;
- } else {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- }
-
- public ArrayList getPhasesInFaultFlow() {
- return inFaultMessage.getMessageFlow();
- }
-
- public ArrayList getPhasesOutFaultFlow() {
- return outFaultMessage.getMessageFlow();
- }
-
- public ArrayList getPhasesOutFlow() {
- return outMessage.getMessageFlow();
- }
-
- public ArrayList getRemainingPhasesInFlow() {
- return inPhases;
- }
-
- public void setPhasesInFaultFlow(ArrayList list) {
- inFaultMessage.setMessageFlow(list);
- }
-
- public void setPhasesOutFaultFlow(ArrayList list) {
- outFaultMessage.setMessageFlow(list);
- }
-
- public void setPhasesOutFlow(ArrayList list) {
- outMessage.setMessageFlow(list);
- }
-
- public void setRemainingPhasesInFlow(ArrayList list) {
- inPhases = list;
- }
-
- /**
- * Returns a MEP client for an Out-only operation. This client can be used to
- * interact with a server which is offering an In-only operation. To use the
- * client, you must call addMessageContext() with a message context and then
- * call execute() to execute the client. Note that the execute method's
- * block parameter is ignored by this client and also the setMessageReceiver
- * method cannot be used.
- *
- * @param sc The service context for this client to live within. Cannot be
- * null.
- * @param options Options to use as defaults for this client. If any options are
- * set specifically on the client then those override options
- * here.
- */
- public OperationClient createClient(ServiceContext sc, Options options) {
- return new OutOnlyAxisOperationClient(this, sc, options);
- }
-}
-
-/**
- * MEP client for moi.
- */
-class OutOnlyAxisOperationClient implements OperationClient {
- OutOnlyAxisOperation axisOp;
-
- ServiceContext sc;
-
- Options options;
-
- MessageContext mc;
-
- OperationContext oc;
-
- /*
- * indicates whether the MEP execution has completed (and hence ready for
- * resetting)
- */
- boolean completed;
-
- OutOnlyAxisOperationClient(OutOnlyAxisOperation axisOp, ServiceContext sc,
- Options options) {
- this.axisOp = axisOp;
- this.sc = sc;
- this.options = options;
- this.completed = false;
- oc = new OperationContext(axisOp, sc);
- }
-
- /**
- * Sets the options that should be used for this particular client. This
- * resets the entire set of options to use the new options - so you'd lose
- * any option cascading that may have been set up.
- *
- * @param options the options
- */
- public void setOptions(Options options) {
- this.options = options;
- }
-
- /**
- * Returns the options used by this client. If you want to set a single
- * option, then the right way is to do getOptions() and set specific
- * options.
- *
- * @return Returns the options, which will never be null.
- */
- public Options getOptions() {
- return options;
- }
-
- /**
- * Adds a message context to the client for processing. This method must not
- * process the message - it only records it in the MEP client. Processing
- * only occurs when execute() is called.
- *
- * @param mc the message context
- * @throws AxisFault if this is called inappropriately.
- */
- public void addMessageContext(MessageContext mc) throws AxisFault {
- if (this.mc != null) {
- throw new AxisFault(Messages.getMessage("cannotaddmsgctx"));
- }
- this.mc = mc;
- if (mc.getMessageID() == null) {
- setMessageID(mc);
- }
- mc.setServiceContext(sc);
- axisOp.registerOperationContext(mc, oc);
- this.completed = false;
- }
-
- /**
- * Returns a message from the client - will return null if the requested
- * message is not available.
- *
- * @param messageLabel the message label of the desired message context
- * @return Returns the desired message context or null if its not available.
- * @throws AxisFault if the message label is invalid
- */
- public MessageContext getMessageContext(String messageLabel)
- throws AxisFault {
- if (messageLabel.equals(WSDLConstants.MESSAGE_LABEL_OUT_VALUE)) {
- return mc;
- }
- throw new AxisFault(Messages.getMessage("unknownMsgLabel", messageLabel));
- }
-
- /**
- * Sets the message receiver to be executed when a message comes into the MEP
- * and the MEP is executed. This is the way the MEP client provides
- * notification that a message has been received by it. Exactly when its
- * executed and under what conditions is a function of the specific MEP
- * client.
- */
- public void setCallback(Callback callback) {
- throw new UnsupportedOperationException(
- "This feature is not supported by this MEP");
- }
-
- /**
- * Create a message ID for the given message context if needed. If user gives an option with
- * MessageID then just copy that into MessageContext , and with that there can be multiple
- * message with same MessageID unless user call setOption for each invocation.
- * <p/>
- * If user want to give message ID then the better way is to set the message ID in the option and
- * call setOption for each invocation then the right thing will happen.
- * <p/>
- * If user does not give a message ID then the new one will be created and set that into Message
- * Context.
- *
- * @param mc the message context whose id is to be set
- */
- private void setMessageID(MessageContext mc) {
- // now its the time to put the parameters set by the user in to the
- // correct places and to the
- // if there is no message id still, set a new one.
- String messageId = options.getMessageId();
- if (messageId == null || "".equals(messageId)) {
- messageId = UUIDGenerator.getUUID();
- }
- mc.setMessageID(messageId);
- }
-
- private void addReferenceParameters(MessageContext msgctx) {
- EndpointReference to = msgctx.getTo();
- if (options.isManageSession()) {
- EndpointReference tepr = sc.getTargetEPR();
- if (tepr != null) {
- Map map = tepr.getAllReferenceParameters();
- Iterator valuse = map.values().iterator();
- while (valuse.hasNext()) {
- Object refparaelement = valuse.next();
- if (refparaelement instanceof OMElement) {
- to.addReferenceParameter((OMElement) refparaelement);
- }
- }
- }
- }
- }
-
-
- /**
- * Executes the MEP. What this does depends on the specific MEP client. The
- * basic idea is to have the MEP client execute and do something with the
- * messages that have been added to it so far. For example, if its an Out-In
- * MEP, then if the Out message has been set, then executing the client asks
- * it to send the message and get the In message, possibly using a different
- * thread.
- *
- * @param block Indicates whether execution should block or return ASAP. What
- * block means is of course a function of the specific MEP
- * client. IGNORED BY THIS MEP CLIENT.
- * @throws AxisFault if something goes wrong during the execution of the MEP.
- */
- public void execute(boolean block) throws AxisFault {
- if (completed) {
- throw new AxisFault(Messages.getMessage("mepiscomplted"));
- }
- ConfigurationContext cc = sc.getConfigurationContext();
-
- // set options on the message context
- if (mc.getSoapAction() == null || "".equals(mc.getSoapAction())) {
- mc.setSoapAction(options.getAction());
- }
- mc.setOptions(options);
- mc.setAxisMessage(axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE));
-
- // do Target Resolution
- TargetResolver targetResolver = cc.getAxisConfiguration().getTargetResolverChain();
- if(targetResolver != null){
- targetResolver.resolveTarget(mc);
- }
-
- // setting message ID if it null
- // if the transport to use for sending is not specified, try to find it
- // from the URL
- TransportOutDescription senderTransport = options.getTransportOut();
- if (senderTransport == null) {
- EndpointReference toEPR = (options.getTo() != null) ? options
- .getTo() : mc.getTo();
- senderTransport = ClientUtils.inferOutTransport(cc
- .getAxisConfiguration(), toEPR, mc);
- }
- mc.setTransportOut(senderTransport);
-
- // create the operation context for myself
- OperationContext oc = new OperationContext(axisOp, sc);
- oc.addMessageContext(mc);
- addReferenceParameters(mc);
- // ship it out
- AxisEngine engine = new AxisEngine(cc);
- if (!block) {
- mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.TRUE);
- }
- engine.send(mc);
- // all done
- completed = true;
- }
-
- /**
- * Resets the MEP client to a clean status after the MEP has completed. This
- * is how you can reuse a MEP client. NOTE: this does not reset the options;
- * only the internal state so the client can be used again.
- *
- * @throws AxisFault if reset is called before the MEP client has completed an
- * interaction.
- */
- public void reset() throws AxisFault {
- if (!completed) {
- throw new AxisFault(Messages.getMessage("cannotreset"));
- }
- mc = null;
- completed = false;
- }
-
- public void complete(MessageContext msgCtxt) throws AxisFault {
- TransportOutDescription trsout = msgCtxt.getTransportOut();
- if (trsout != null) {
- trsout.getSender().cleanup(msgCtxt);
- }
- }
-
- public OperationContext getOperationContext() {
- return oc;
- }
-
-}
+/*
+* Copyright 2004,2006 The Apache Software Foundation.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.axis2.description;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.client.OperationClient;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.async.Callback;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.OperationContext;
+import org.apache.axis2.context.ServiceContext;
+import org.apache.axis2.engine.AxisEngine;
+import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.wsdl.WSDLConstants;
+
+import javax.xml.namespace.QName;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class OutOnlyAxisOperation extends AxisOperation {
+
+ private AxisMessage inFaultMessage;
+
+ // just to keep the inflow , there won't be any usage
+ private ArrayList inPhases;
+
+ private AxisMessage outFaultMessage;
+
+ private AxisMessage outMessage;
+
+ public OutOnlyAxisOperation() {
+ super();
+ createMessage();
+ setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_ONLY);
+ }
+
+ public OutOnlyAxisOperation(QName name) {
+ super(name);
+ createMessage();
+ setMessageExchangePattern(WSDL20_2004Constants.MEP_URI_OUT_ONLY);
+ }
+
+ public void addMessage(AxisMessage message, String label) {
+ if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
+ outMessage = message;
+ } else {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+ }
+
+ public void addMessageContext(MessageContext msgContext,
+ OperationContext opContext) throws AxisFault {
+ if (!opContext.isComplete()) {
+ opContext.getMessageContexts().put(MESSAGE_LABEL_OUT_VALUE,
+ msgContext);
+ opContext.setComplete(true);
+ } else {
+ throw new AxisFault(Messages.getMessage("mepcompleted"));
+ }
+ }
+
+ public void addFaultMessageContext(MessageContext msgContext, OperationContext opContext) throws AxisFault {
+ HashMap mep = opContext.getMessageContexts();
+ MessageContext faultMessageCtxt = (MessageContext) mep.get(MESSAGE_LABEL_FAULT_VALUE);
+
+ if (faultMessageCtxt != null) {
+ throw new AxisFault(Messages.getMessage("mepcompleted"));
+ } else {
+ mep.put(MESSAGE_LABEL_FAULT_VALUE, msgContext);
+ opContext.setComplete(true);
+ opContext.cleanup();
+ }
+ }
+
+ private void createMessage() {
+ outMessage = new AxisMessage();
+ outMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
+ inFaultMessage = new AxisMessage();
+ outFaultMessage = new AxisMessage();
+ inPhases = new ArrayList();
+ }
+
+ public AxisMessage getMessage(String label) {
+ if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
+ return outMessage;
+ } else {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+ }
+
+ public ArrayList getPhasesInFaultFlow() {
+ return inFaultMessage.getMessageFlow();
+ }
+
+ public ArrayList getPhasesOutFaultFlow() {
+ return outFaultMessage.getMessageFlow();
+ }
+
+ public ArrayList getPhasesOutFlow() {
+ return outMessage.getMessageFlow();
+ }
+
+ public ArrayList getRemainingPhasesInFlow() {
+ return inPhases;
+ }
+
+ public void setPhasesInFaultFlow(ArrayList list) {
+ inFaultMessage.setMessageFlow(list);
+ }
+
+ public void setPhasesOutFaultFlow(ArrayList list) {
+ outFaultMessage.setMessageFlow(list);
+ }
+
+ public void setPhasesOutFlow(ArrayList list) {
+ outMessage.setMessageFlow(list);
+ }
+
+ public void setRemainingPhasesInFlow(ArrayList list) {
+ inPhases = list;
+ }
+
+ /**
+ * Returns a MEP client for an Out-only operation. This client can be used to
+ * interact with a server which is offering an In-only operation. To use the
+ * client, you must call addMessageContext() with a message context and then
+ * call execute() to execute the client. Note that the execute method's
+ * block parameter is ignored by this client and also the setMessageReceiver
+ * method cannot be used.
+ *
+ * @param sc The service context for this client to live within. Cannot be
+ * null.
+ * @param options Options to use as defaults for this client. If any options are
+ * set specifically on the client then those override options
+ * here.
+ */
+ public OperationClient createClient(ServiceContext sc, Options options) {
+ return new OutOnlyAxisOperationClient(this, sc, options);
+ }
+}
+
+/**
+ * MEP client for moi.
+ */
+class OutOnlyAxisOperationClient extends OperationClient {
+
+ private MessageContext mc;
+
+ OutOnlyAxisOperationClient(OutOnlyAxisOperation axisOp, ServiceContext sc,
+ Options options) {
+ super(axisOp, sc, options);
+ }
+
+
+ /**
+ * Adds a message context to the client for processing. This method must not
+ * process the message - it only records it in the MEP client. Processing
+ * only occurs when execute() is called.
+ *
+ * @param mc the message context
+ * @throws AxisFault if this is called inappropriately.
+ */
+ public void addMessageContext(MessageContext mc) throws AxisFault {
+ if (this.mc != null) {
+ throw new AxisFault(Messages.getMessage("cannotaddmsgctx"));
+ }
+ this.mc = mc;
+ if (mc.getMessageID() == null) {
+ setMessageID(mc);
+ }
+ mc.setServiceContext(sc);
+ axisOp.registerOperationContext(mc, oc);
+ this.completed = false;
+ }
+
+ /**
+ * Returns a message from the client - will return null if the requested
+ * message is not available.
+ *
+ * @param messageLabel the message label of the desired message context
+ * @return Returns the desired message context or null if its not available.
+ * @throws AxisFault if the message label is invalid
+ */
+ public MessageContext getMessageContext(String messageLabel)
+ throws AxisFault {
+ if (messageLabel.equals(WSDLConstants.MESSAGE_LABEL_OUT_VALUE)) {
+ return mc;
+ }
+ throw new AxisFault(Messages.getMessage("unknownMsgLabel", messageLabel));
+ }
+
+ /**
+ * Sets the message receiver to be executed when a message comes into the MEP
+ * and the MEP is executed. This is the way the MEP client provides
+ * notification that a message has been received by it. Exactly when its
+ * executed and under what conditions is a function of the specific MEP
+ * client.
+ */
+ public void setCallback(Callback callback) {
+ throw new UnsupportedOperationException(
+ "This feature is not supported by this MEP");
+ }
+
+ /**
+ * Executes the MEP. What this does depends on the specific MEP client. The
+ * basic idea is to have the MEP client execute and do something with the
+ * messages that have been added to it so far. For example, if its an Out-In
+ * MEP, then if the Out message has been set, then executing the client asks
+ * it to send the message and get the In message, possibly using a different
+ * thread.
+ *
+ * @param block Indicates whether execution should block or return ASAP. What
+ * block means is of course a function of the specific MEP
+ * client. IGNORED BY THIS MEP CLIENT.
+ * @throws AxisFault if something goes wrong during the execution of the MEP.
+ */
+ public void execute(boolean block) throws AxisFault {
+ if (completed) {
+ throw new AxisFault(Messages.getMessage("mepiscomplted"));
+ }
+ ConfigurationContext cc = sc.getConfigurationContext();
+ prepareMessageContext(cc, mc);
+ // setting message ID if it null
+
+ // create the operation context for myself
+ OperationContext oc = new OperationContext(axisOp, sc);
+ oc.addMessageContext(mc);
+ // ship it out
+ AxisEngine engine = new AxisEngine(cc);
+ if (!block) {
+ mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.TRUE);
+ }
+ engine.send(mc);
+ // all done
+ completed = true;
+ }
+}
Added: webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/TwoChannelAxisOperation.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/TwoChannelAxisOperation.java?view=auto&rev=487577
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/TwoChannelAxisOperation.java (added)
+++ webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/description/TwoChannelAxisOperation.java Fri Dec 15 07:07:24 2006
@@ -0,0 +1,136 @@
+package org.apache.axis2.description;
+
+import org.apache.axis2.wsdl.WSDLConstants;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.OperationContext;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.i18n.Messages;
+
+import javax.xml.namespace.QName;
+import java.util.ArrayList;
+import java.util.HashMap;
+/*
+* Copyright 2004,2005 The Apache Software Foundation.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*
+*/
+
+/**
+ * This class is to keep common methods and properties in InOut and OutIn axisOperation
+ */
+public abstract class TwoChannelAxisOperation extends AxisOperation {
+
+ protected AxisMessage inFaultMessage;
+ protected AxisMessage outFaultMessage;
+ protected AxisMessage inMessage;
+ protected AxisMessage outMessage;
+
+ public TwoChannelAxisOperation() {
+ super();
+ createMessages();
+ }
+
+ public TwoChannelAxisOperation(QName name) {
+ super(name);
+ createMessages();
+ }
+
+ private void createMessages() {
+ inMessage = new AxisMessage();
+ inMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
+ inMessage.setParent(this);
+ addChild("inMessage", inMessage);
+
+ inFaultMessage = new AxisMessage();
+ inFaultMessage.setParent(this);
+
+ outFaultMessage = new AxisMessage();
+ outFaultMessage.setParent(this);
+
+ outMessage = new AxisMessage();
+ outMessage.setDirection(WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
+ outMessage.setParent(this);
+ addChild("outMessage", outMessage);
+ }
+
+ public void addMessage(AxisMessage message, String label) {
+ if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
+ addChild("outMessage", message);
+ } else if (WSDLConstants.MESSAGE_LABEL_IN_VALUE.equals(label)) {
+ addChild("inMessage", message);
+ } else if (WSDLConstants.MESSAGE_LABEL_FAULT_VALUE.equals(label)) {
+ addChild("faultMessage", message);
+ } else {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+ }
+
+
+ public AxisMessage getMessage(String label) {
+ if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equals(label)) {
+ return (AxisMessage) getChild("outMessage");
+ } else if (WSDLConstants.MESSAGE_LABEL_IN_VALUE.equals(label)) {
+ return (AxisMessage) getChild("inMessage");
+ } else {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+ }
+
+ public void addFaultMessageContext(MessageContext msgContext, OperationContext opContext) throws AxisFault {
+ HashMap mep = opContext.getMessageContexts();
+ MessageContext faultMessageCtxt = (MessageContext) mep.get(MESSAGE_LABEL_FAULT_VALUE);
+
+ if (faultMessageCtxt != null) {
+ throw new AxisFault(Messages.getMessage("mepcompleted"));
+ } else {
+ mep.put(MESSAGE_LABEL_FAULT_VALUE, msgContext);
+ opContext.setComplete(true);
+ opContext.cleanup();
+ }
+
+ }
+
+ public ArrayList getPhasesInFaultFlow() {
+ return inFaultMessage.getMessageFlow();
+ }
+
+ public ArrayList getPhasesOutFaultFlow() {
+ return outFaultMessage.getMessageFlow();
+ }
+
+ public ArrayList getPhasesOutFlow() {
+ return outMessage.getMessageFlow();
+ }
+
+ public ArrayList getRemainingPhasesInFlow() {
+ return inMessage.getMessageFlow();
+ }
+
+ public void setPhasesInFaultFlow(ArrayList list) {
+ inFaultMessage.setMessageFlow(list);
+ }
+
+ public void setPhasesOutFaultFlow(ArrayList list) {
+ outFaultMessage.setMessageFlow(list);
+ }
+
+ public void setPhasesOutFlow(ArrayList list) {
+ outMessage.setMessageFlow(list);
+ }
+
+ public void setRemainingPhasesInFlow(ArrayList list) {
+ inMessage.setMessageFlow(list);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org