You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by di...@apache.org on 2004/03/08 23:06:10 UTC

cvs commit: ws-fx/addressing/src/org/apache/axis/message/addressing/handler AddressingHandler.java

dims        2004/03/08 14:06:10

  Added:       addressing/src/org/apache/axis/message/addressing/handler
                        AddressingHandler.java
  Log:
  Forgot to checkin the beginnings of a handler
  
  Revision  Changes    Path
  1.1                  ws-fx/addressing/src/org/apache/axis/message/addressing/handler/AddressingHandler.java
  
  Index: AddressingHandler.java
  ===================================================================
  package org.apache.axis.message.addressing.handler;
  
  import org.apache.axis.AxisFault;
  import org.apache.axis.Message;
  import org.apache.axis.MessageContext;
  import org.apache.axis.client.Call;
  import org.apache.axis.components.logger.LogFactory;
  import org.apache.axis.components.uuid.UUIDGenFactory;
  import org.apache.axis.handlers.BasicHandler;
  import org.apache.axis.message.addressing.Action;
  import org.apache.axis.message.addressing.AddressingHeaders;
  import org.apache.axis.message.addressing.Constants;
  import org.apache.axis.message.addressing.EndpointReference;
  import org.apache.axis.message.addressing.MessageID;
  import org.apache.axis.message.addressing.RelatesTo;
  import org.apache.axis.message.addressing.To;
  import org.apache.axis.types.URI;
  import org.apache.commons.logging.Log;
  
  import javax.xml.parsers.ParserConfigurationException;
  import javax.xml.soap.SOAPException;
  import java.net.MalformedURLException;
  import java.util.Vector;
  
  /**
   * Class AddressingHandler
   * 
   * @author Davanum Srinivas (dims@yahoo.com)
   */
  public class AddressingHandler extends BasicHandler {
      protected static Log log = LogFactory.getLog(AddressingHandler.class.getName());
  
      /**
       * Method invoke
       * 
       * @param msgContext 
       * @throws AxisFault 
       */
      public void invoke(MessageContext msgContext) throws AxisFault {
          try {
              if (msgContext.getCurrentContext().isClient()) {
                  if (!msgContext.getCurrentContext().getPastPivot()) {
                      processClientRequest(msgContext);
                  } else {
                      processClientResponse(msgContext);
                  }
              } else {
                  if (!msgContext.getCurrentContext().getPastPivot()) {
                      processServerRequest(msgContext);
                  } else {
                      processServerResponse(msgContext);
                  }
              }
          } catch (Exception e) {
              log.error("Exception in AddressingHandler", e);
              throw new AxisFault(e.getMessage());
          }
      }
  
      /**
       * Method processClientRequest
       * 
       * @param msgContext 
       */
      void processClientRequest(MessageContext msgContext) throws AxisFault, ParserConfigurationException, SOAPException, URI.MalformedURIException {
          AddressingHeaders headers = (AddressingHeaders) msgContext.getProperty(Constants.ENV_ADDRESSING_REQUEST_HEADERS);
          if (headers == null) {
              headers = new AddressingHeaders();
          }
          if (headers.getMessageID() == null) {
              MessageID id = new MessageID(new URI("uuid:" + UUIDGenFactory.getUUIDGen().nextUUID()));
              headers.setMessageID(id);
          }
          if (headers.getTo() == null) {
              headers.setTo(new To(msgContext.getStrProp(msgContext.TRANS_URL)));
          }
          if (headers.getAction() == null) {
              headers.setAction(new Action(new URI(msgContext.getSOAPActionURI())));
          }
          if (headers.getFrom() == null) {
              headers.setFrom(new EndpointReference(Constants.NS_URI_ANONYMOUS));
          }
          Message msg = msgContext.getRequestMessage();
          headers.toEnvelope(msg.getSOAPEnvelope());
          msgContext.setProperty(Constants.ENV_ADDRESSING_REQUEST_HEADERS, headers);
      }
  
      /**
       * Method processClientResponse
       * 
       * @param msgContext 
       */
      void processClientResponse(MessageContext msgContext) throws Exception {
          Message msg = msgContext.getResponseMessage();
          if (msg != null) {
              AddressingHeaders headers = new AddressingHeaders(msg.getSOAPEnvelope());
              msgContext.setProperty(Constants.ENV_ADDRESSING_RESPONSE_HEADERS, headers);
          }
      }
  
      /**
       * Method processServerRequest
       * 
       * @param msgContext 
       * @throws Exception 
       */
      void processServerRequest(MessageContext msgContext) throws Exception {
          Message msg = msgContext.getRequestMessage();
          AddressingHeaders headers = new AddressingHeaders(msg.getSOAPEnvelope());
          msgContext.setProperty(Constants.ENV_ADDRESSING_REQUEST_HEADERS, headers);
          String to = headers.getTo().getAddress().toString();
          if (to != null) {
              // set the target service
              int i = to.lastIndexOf("/");
              to = to.substring(i + 1);
              msgContext.setTargetService(to);
          }
          String newURL = null;
          if (headers.getReplyTo() != null) {
              newURL = headers.getReplyTo().getAddress().toString();
          }
          if (newURL == null) {
              newURL = Constants.NS_URI_ANONYMOUS;
          }
  
          // Setup the response headers 
          AddressingHeaders resheaders = new AddressingHeaders();
          resheaders.setFrom(new EndpointReference(headers.getTo()));
          resheaders.setTo(new To(newURL));
          resheaders.setAction(new Action(new URI(headers.getAction().toString() + "Response")));
          resheaders.setMessageID(new MessageID(new URI("uuid:" + UUIDGenFactory.getUUIDGen().nextUUID())));
          resheaders.addRelatesTo(headers.getMessageID().toString(), "wsa:Response");
          msgContext.setProperty(Constants.ENV_ADDRESSING_RESPONSE_HEADERS, headers);
      }
  
      /**
       * Method processServerResponse
       * 
       * @param msgContext 
       */
      void processServerResponse(MessageContext msgContext) throws AxisFault, ParserConfigurationException, SOAPException, MalformedURLException {
          AddressingHeaders resheaders = (AddressingHeaders) msgContext.getProperty(Constants.ENV_ADDRESSING_RESPONSE_HEADERS);
          if (resheaders == null) {
              return;
          }
          Message msg = msgContext.getResponseMessage();
          if (msg != null) {
              resheaders.toEnvelope(msg.getSOAPEnvelope());
          }
          boolean isResponse = false;
          Vector relates = (Vector) resheaders.getRelatesTo();
          for (int i = 0; (relates != null) && (i < relates.size()); i++) {
              RelatesTo rtp = (RelatesTo) relates.get(i);
              if (rtp.getType().equals("wsa:Response")) {
                  isResponse = true;
              }
          }
  
          // process replyTo by invoking a service
          String to = resheaders.getTo().getAddress().toString();
          if ((to != null) && !to.equals(Constants.NS_URI_ANONYMOUS) && isResponse) {
              // ReplyTo has been specified. Special processing...
              Call c = new Call(to);
              c.setRequestMessage(msg);
              c.invoke();
  
              // Somehow make the response empty, or create a new empty response
              msgContext.setResponseMessage(null);
          }
      }
  }