Class MessageContext

java.lang.Object
org.apache.axis2.context.AbstractContext
org.apache.axis2.context.MessageContext
All Implemented Interfaces:
Externalizable, Serializable, SafeSerializable

public class MessageContext extends AbstractContext implements Externalizable, SafeSerializable

Axis2 states are held in two information models, called description hierarchy and context hierarchy. Description hierarchy hold deployment configuration and it's values does not change unless deployment configuration change occurs where Context hierarchy hold run time information. Both hierarchies consists four levels, Global, Service Group, Operation and Message. Please look at "Information Model" section of "Axis2 Architecture Guide" for more information.

MessageContext hold run time information about one Message invocation. It hold reference to OperationContext, ServiceGroupContext, and Configuration Context tied with current message. For an example if you need accesses to other messages of the current invocation, you can get to them via OperationContext. Addition to class attributes define in Message context, message context stores the information as name value pairs. Those name value pairs,and class attributes tweak the execution behavior of message context and some of them can be find in org.apache.axis2.Constants class. (TODO we should provide list of supported options). You may set them at any level of context hierarchy and they will affect invocations related to their child elements.

See Also:
  • Field Details

    • currentMessageContext

      public static ThreadLocal<MessageContext> currentMessageContext
      A place to store the current MessageContext
    • options

      protected Options options
    • IN_FLOW

      public static final int IN_FLOW
      See Also:
    • IN_FAULT_FLOW

      public static final int IN_FAULT_FLOW
      See Also:
    • OUT_FLOW

      public static final int OUT_FLOW
      See Also:
    • OUT_FAULT_FLOW

      public static final int OUT_FAULT_FLOW
      See Also:
    • REMOTE_ADDR

      public static final String REMOTE_ADDR
      See Also:
    • TRANSPORT_ADDR

      public static final String TRANSPORT_ADDR
      See Also:
    • TRANSPORT_HEADERS

      public static final String TRANSPORT_HEADERS
      See Also:
    • IN_MESSAGE_CONTEXT

      public static final String IN_MESSAGE_CONTEXT
      Constant used as the key for the property which stores the In MessageContext in the Out MessageContext/FaultMessageContext. This is needed in cases where an OperationContext is not created, for example, since the request never gets dispatched to the service operation, either due to a security failure or a request coming in for a non-existing endpoint
      See Also:
    • attachments

      public transient org.apache.axiom.attachments.Attachments attachments
      message attachments NOTE: Serialization of message attachments is handled as part of the overall message serialization. If this needs to change, then investigate having the Attachment class implement the java.io.Externalizable interface.
    • TRANSPORT_OUT

      public static final String TRANSPORT_OUT
      Field TRANSPORT_OUT
      See Also:
    • TRANSPORT_IN

      public static final String TRANSPORT_IN
      Field TRANSPORT_IN
      See Also:
    • CHARACTER_SET_ENCODING

      public static final String CHARACTER_SET_ENCODING
      Field CHARACTER_SET_ENCODING
      See Also:
    • UTF_8

      public static final String UTF_8
      Field UTF_8. This is the 'utf-8' value for CHARACTER_SET_ENCODING property.
      See Also:
    • UTF_16

      public static final String UTF_16
      Field UTF_16. This is the 'utf-16' value for CHARACTER_SET_ENCODING property.
      See Also:
    • TRANSPORT_SUCCEED

      public static final String TRANSPORT_SUCCEED
      Field TRANSPORT_SUCCEED
      See Also:
    • DEFAULT_CHAR_SET_ENCODING

      public static final String DEFAULT_CHAR_SET_ENCODING
      Field DEFAULT_CHAR_SET_ENCODING. This is the default value for CHARACTER_SET_ENCODING property.
      See Also:
    • FLOW

      public int FLOW
    • CLIENT_API_NON_BLOCKING

      public static final String CLIENT_API_NON_BLOCKING
      To invoke fireAndforget method we have to hand over transport sending logic to a thread other wise user has to wait till it get transport response (in the case of HTTP its HTTP 202) 202). This was eariler named TRANSPORT_NON_BLOCKING, but that name is wrong as transport non blocking is NIO, which has nothing to do with this property. See https://issues.apache.org/jira/browse/AXIS2-4196. Renaming this to CLIENT_API_NON_BLOCKING instead.
      See Also:
    • DISABLE_ASYNC_CALLBACK_ON_TRANSPORT_ERROR

      public static final String DISABLE_ASYNC_CALLBACK_ON_TRANSPORT_ERROR
      This property allows someone (e.g. RM) to disable an async callback from being invoked if a fault occurs during message transmission. If this is not set, it can be assumed that the fault will be delivered via Callback.onError(...).
      See Also:
    • outputWritten

      public boolean outputWritten
  • Constructor Details

    • MessageContext

      public MessageContext()
      Constructor
  • Method Details

    • getCurrentMessageContext

      public static MessageContext getCurrentMessageContext()
    • destroyCurrentMessageContext

      public static void destroyCurrentMessageContext()
    • setCurrentMessageContext

      public static void setCurrentMessageContext(MessageContext ctx)
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getLogCorrelationID

      public String getLogCorrelationID()
      Get a "raw" version of the logCorrelationID. The logCorrelationID is guaranteed to be unique and may be persisted along with the rest of the message context.
      Returns:
      A string that can be output to a log file as an identifier for this MessageContext. It is suitable for matching related log entries.
    • getLogIDString

      public String getLogIDString()
      Get a formatted version of the logCorrelationID.
      Returns:
      A string that can be output to a log file as an identifier for this MessageContext. It is suitable for matching related log entries.
    • pause

      public void pause()
      Pause the execution of the current handler chain
    • getAxisOperation

      public AxisOperation getAxisOperation()
    • getAxisService

      public AxisService getAxisService()
    • getAxisServiceGroup

      public AxisServiceGroup getAxisServiceGroup()
    • getConfigurationContext

      public ConfigurationContext getConfigurationContext()
    • getCurrentHandlerIndex

      public int getCurrentHandlerIndex()
    • getCurrentPhaseIndex

      public int getCurrentPhaseIndex()
    • getEnvelope

      public org.apache.axiom.soap.SOAPEnvelope getEnvelope()
      Returns:
      Returns SOAPEnvelope.
    • getExecutionChain

      public ArrayList<Handler> getExecutionChain()
    • addExecutedPhase

      public void addExecutedPhase(Handler phase)
      Add a Phase to the collection of executed phases for the path. Phases will be inserted in a LIFO data structure.
      Parameters:
      phase - The phase to add to the list.
    • removeFirstExecutedPhase

      public void removeFirstExecutedPhase()
      Remove the first Phase in the collection of executed phases
    • getExecutedPhases

      public Iterator<Handler> getExecutedPhases()
      Get an iterator over the executed phase list.
      Returns:
      An Iterator over the LIFO data structure.
    • resetExecutedPhases

      public void resetExecutedPhases()
      Reset the list of executed phases. This is needed because the OutInAxisOperation currently invokes receive() even when a fault occurs, and we will have already executed the flowComplete on those before receiveFault() is called.
    • getFaultTo

      public EndpointReference getFaultTo()
      Returns:
      Returns EndpointReference.
    • getFrom

      public EndpointReference getFrom()
      Returns:
      Returns EndpointReference.
    • getMessageID

      public String getMessageID()
      Returns:
      Returns message id.
    • getModuleParameter

      public Parameter getModuleParameter(String key, String moduleName, HandlerDescription handler)
      Retrieves both module specific configuration parameters as well as other parameters. The order of search is as follows:
      1. Search in module configurations inside corresponding operation description if its there
      2. Search in corresponding operation if its there
      3. Search in module configurations inside corresponding service description if its there
      4. Next search in Corresponding Service description if its there
      5. Next search in module configurations inside axisConfiguration
      6. Search in AxisConfiguration for parameters
      7. Next get the corresponding module and search for the parameters
      8. Search in HandlerDescription for the parameter

      and the way of specifying module configuration is as follows N/A

      Parameters:
      key - : Parameter Name
      moduleName - : Name of the module
      handler - HandlerDescription
      Returns:
      Parameter Parameter
    • getOperationContext

      public OperationContext getOperationContext()
    • getParameter

      public Parameter getParameter(String key)
      Retrieves configuration descriptor parameters at any level. The order of search is as follows:
      1. Search in message description if it exists
      2. If parameter is not found or if axisMessage is null, search in AxisOperation
      3. If parameter is not found or if operationContext is null, search in AxisService
      4. If parameter is not found or if axisService is null, search in AxisConfiguration
      Parameters:
      key - name of desired parameter
      Returns:
      Parameter Parameter
    • getLocalProperty

      public Object getLocalProperty(String name)
      Retrieves a property value. The order of search is as follows: search in my own map and then look at my options. Does not search up the hierarchy.
      Overrides:
      getLocalProperty in class AbstractContext
      Parameters:
      name - name of the property to search for
      Returns:
      the value of the property, or null if the property is not found
    • getLocalProperty

      public Object getLocalProperty(String name, boolean searchOptions)
    • getProperty

      public Object getProperty(String name)
      Retrieves a property value. The order of search is as follows: search in my own map and then look in my context hierarchy, and then in options. Since its possible that the entire hierarchy is not present, I will start at whatever level has been set.
      Overrides:
      getProperty in class AbstractContext
      Parameters:
      name - name of the property to search for
      Returns:
      the value of the property, or null if the property is not found
    • isPropertyTrue

      public boolean isPropertyTrue(String name)
      Check if a given property is true. Will return false if the property does not exist or is not an explicit "true" value.
      Parameters:
      name - name of the property to check
      Returns:
      true if the property exists and is Boolean.TRUE, "true", 1, etc.
    • isPropertyTrue

      public boolean isPropertyTrue(String name, boolean defaultVal)
      Check if a given property is true. Will return the passed default if the property does not exist.
      Parameters:
      name - name of the property to check
      defaultVal - the default value if the property doesn't exist
      Returns:
      true if the property exists and is Boolean.TRUE, "true", 1, etc.
    • getProperties

      public Map<String,Object> getProperties()
      Retrieves all property values. The order of search is as follows: search in my own options and then look in my context hierarchy. Since its possible that the entire hierarchy is not present, it will start at whatever level has been set and start there. The returned map is unmodifiable, so any changes to the properties have to be done by calling AbstractContext.setProperty(String,Object). In addition, any changes to the properties are not reflected on this map.
      Overrides:
      getProperties in class AbstractContext
      Returns:
      An unmodifiable map containing the combination of all available properties or an empty map.
    • getRelationships

      public RelatesTo[] getRelationships()
      Returns:
      Returns RelatesTo array.
    • getRelatesTo

      public RelatesTo getRelatesTo(String type)
      Get any RelatesTos of a particular type associated with this MessageContext TODO: Shouldn't this return a List?
      Parameters:
      type - the relationship type
      Returns:
      Returns RelatesTo.
    • getRelatesTo

      public RelatesTo getRelatesTo()
      Returns:
      Returns RelatesTo.
    • getReplyTo

      public EndpointReference getReplyTo()
      Returns:
      Returns EndpointReference.
    • getServiceContext

      public ServiceContext getServiceContext()
      Returns:
      Returns ServiceContext.
    • getServiceContextID

      public String getServiceContextID()
      Returns:
      Returns the serviceContextID.
    • getServiceGroupContext

      public ServiceGroupContext getServiceGroupContext()
    • getServiceGroupContextId

      public String getServiceGroupContextId()
    • getSessionContext

      public SessionContext getSessionContext()
      Returns:
      Returns SessionContext.
    • setSessionContext

      public void setSessionContext(SessionContext sessionContext)
    • getSoapAction

      public String getSoapAction()
      Returns:
      Returns soap action.
    • getTo

      public EndpointReference getTo()
      Returns:
      Returns EndpointReference.
    • getTransportIn

      public TransportInDescription getTransportIn()
      Returns:
      Returns TransportInDescription.
    • getTransportOut

      public TransportOutDescription getTransportOut()
      Returns:
      Returns TransportOutDescription.
    • getWSAAction

      public String getWSAAction()
    • isDoingMTOM

      public boolean isDoingMTOM()
      Returns:
      Returns boolean.
    • isDoingREST

      public boolean isDoingREST()
      Returns:
      Returns boolean.
    • isDoingSwA

      public boolean isDoingSwA()
      Returns:
      Returns boolean.
    • isNewThreadRequired

      public boolean isNewThreadRequired()
      Returns:
      Returns boolean.
    • isOutputWritten

      public boolean isOutputWritten()
      Returns:
      Returns boolean.
    • isPaused

      public boolean isPaused()
      Returns:
      Returns boolean.
    • setPaused

      public void setPaused(boolean paused)
    • isProcessingFault

      public boolean isProcessingFault()
      Returns:
      Returns boolean.
    • isResponseWritten

      public boolean isResponseWritten()
      Returns:
      Returns boolean.
    • isSOAP11

      public boolean isSOAP11()
    • isServerSide

      public boolean isServerSide()
      Returns:
      Returns boolean.
    • getAxisMessage

      public AxisMessage getAxisMessage()
    • setAxisMessage

      public void setAxisMessage(AxisMessage axisMessage)
    • setAxisOperation

      public void setAxisOperation(AxisOperation axisOperation)
    • setAxisService

      public void setAxisService(AxisService axisService)
    • setAxisServiceGroup

      public void setAxisServiceGroup(AxisServiceGroup axisServiceGroup)
    • setConfigurationContext

      public void setConfigurationContext(ConfigurationContext context)
      Parameters:
      context -
    • setCurrentHandlerIndex

      public void setCurrentHandlerIndex(int currentHandlerIndex)
    • setCurrentPhaseIndex

      public void setCurrentPhaseIndex(int currentPhaseIndex)
    • setDoingMTOM

      public void setDoingMTOM(boolean b)
      Parameters:
      b -
    • setDoingREST

      public void setDoingREST(boolean b)
      Parameters:
      b -
    • setDoingSwA

      public void setDoingSwA(boolean b)
      Parameters:
      b -
    • setEnvelope

      public void setEnvelope(org.apache.axiom.soap.SOAPEnvelope envelope) throws AxisFault
      Parameters:
      envelope -
      Throws:
      AxisFault
    • setExecutionChain

      public void setExecutionChain(ArrayList<Handler> executionChain)
      Set the execution chain of Handler in this MessageContext. Doing this causes the current handler/phase indexes to reset to 0, since we have new Handlers to execute (this usually only happens at initialization and when a fault occurs).
      Parameters:
      executionChain -
    • setFaultTo

      public void setFaultTo(EndpointReference reference)
      Parameters:
      reference -
    • setFrom

      public void setFrom(EndpointReference reference)
      Parameters:
      reference -
    • setMessageID

      public void setMessageID(String messageId)
      Parameters:
      messageId -
    • setNewThreadRequired

      public void setNewThreadRequired(boolean b)
      Parameters:
      b -
    • setOperationContext

      public void setOperationContext(OperationContext context)
      Parameters:
      context - The OperationContext
    • setOutputWritten

      public void setOutputWritten(boolean b)
      Parameters:
      b -
    • setProcessingFault

      public void setProcessingFault(boolean b)
      Parameters:
      b -
    • addRelatesTo

      public void addRelatesTo(RelatesTo reference)
      Add a RelatesTo
      Parameters:
      reference - RelatesTo describing how we relate to another message
    • setReplyTo

      public void setReplyTo(EndpointReference reference)
      Set ReplyTo destination
      Parameters:
      reference - the ReplyTo EPR
    • setResponseWritten

      public void setResponseWritten(boolean b)
      Parameters:
      b -
    • setServerSide

      public void setServerSide(boolean b)
      Parameters:
      b -
    • setServiceContext

      public void setServiceContext(ServiceContext context)
      Parameters:
      context -
    • setServiceContextID

      public void setServiceContextID(String serviceContextID)
      Sets the service context id.
      Parameters:
      serviceContextID -
    • setServiceGroupContext

      public void setServiceGroupContext(ServiceGroupContext serviceGroupContext)
    • setServiceGroupContextId

      public void setServiceGroupContextId(String serviceGroupContextId)
    • setSoapAction

      public void setSoapAction(String soapAction)
      Parameters:
      soapAction -
    • setTo

      public void setTo(EndpointReference to)
      Parameters:
      to -
    • setTransportIn

      public void setTransportIn(TransportInDescription in)
      Parameters:
      in -
    • setTransportOut

      public void setTransportOut(TransportOutDescription out)
      Parameters:
      out -
    • setWSAAction

      public void setWSAAction(String actionURI)
      setWSAAction
    • setWSAMessageId

      public void setWSAMessageId(String messageID)
    • getFLOW

      public int getFLOW()
    • setFLOW

      public void setFLOW(int FLOW)
    • getOptions

      public Options getOptions()
    • setOptions

      public void setOptions(Options options)
      Set the options for myself. I make the given options my own options' parent so that that becomes the default. That allows the user to override specific options on a given message context and not affect the overall options.
      Parameters:
      options - the options to set
    • getIncomingTransportName

      public String getIncomingTransportName()
    • setIncomingTransportName

      public void setIncomingTransportName(String incomingTransportName)
    • setRelationships

      public void setRelationships(RelatesTo[] list)
    • getEffectivePolicy

      public org.apache.neethi.Policy getEffectivePolicy()
    • isEngaged

      public boolean isEngaged(String moduleName)
    • isHeaderPresent

      public boolean isHeaderPresent()
      Deprecated.
      The bonus you used to get from this is now built in to SOAPEnvelope.getHeader()
      Gets the first child of the envelope, check if it is a soap:Body, which means there is no header. We do this basically to make sure we don't parse and build the om tree of the whole envelope looking for the soap header. If this method returns true, there still is no guarantee that there is a soap:Header present, use getHeader() and also check for null on getHeader() to be absolutely sure.
      Returns:
      boolean
    • setAttachmentMap

      public void setAttachmentMap(org.apache.axiom.attachments.Attachments attachments)
      Setting of the attachments map should be performed at the receipt of a message only. This method is only meant to be used by the Axis2 internals.
      Parameters:
      attachments -
    • getAttachmentMap

      public org.apache.axiom.attachments.Attachments getAttachmentMap()
      You can directly access the attachment map of the message context from here. Returned attachment map can be empty.
      Returns:
      attachment
    • getAttachmentMap

      public org.apache.axiom.attachments.Attachments getAttachmentMap(boolean create)
    • addAttachment

      public void addAttachment(String contentID, jakarta.activation.DataHandler dataHandler)
      Adds an attachment to the attachment Map of this message context. This attachment gets serialised as a MIME attachment when sending the message if SOAP with Attachments is enabled.
      Parameters:
      contentID - : will be the content ID of the MIME part (without the "cid:" prefix)
      dataHandler -
    • addAttachment

      public String addAttachment(jakarta.activation.DataHandler dataHandler)
      Adds an attachment to the attachment Map of this message context. This attachment gets serialised as a MIME attachment when sending the message if SOAP with Attachments is enabled. Content ID of the MIME part will be auto generated by Axis2.
      Parameters:
      dataHandler -
      Returns:
      the auto generated content ID of the MIME attachment
    • getAttachment

      public jakarta.activation.DataHandler getAttachment(String contentID)
      Access the DataHandler of the attachment contained in the map corresponding to the given content ID. Returns "NULL" if a attachment cannot be found by the given content ID.
      Parameters:
      contentID - : Content ID of the MIME attachment (without the "cid:" prefix)
      Returns:
      Data handler of the attachment
    • removeAttachment

      public void removeAttachment(String contentID)
      Removes the attachment with the given content ID from the Attachments Map Do nothing if a attachment cannot be found by the given content ID.
      Parameters:
      contentID - of the attachment (without the "cid:" prefix)
    • setSelfManagedData

      public void setSelfManagedData(Class clazz, Object key, Object value)
      Add a key-value pair of self managed data to the set associated with this message context.

      This is primarily intended to allow handlers to manage their own message-specific data when the message context is saved/restored.

      Parameters:
      clazz - The class of the caller that owns the key-value pair
      key - The key for this data object
      value - The data object
    • getSelfManagedData

      public Object getSelfManagedData(Class clazz, Object key)
      Retrieve a value of self managed data previously saved with the specified key.
      Parameters:
      clazz - The class of the caller that owns the key-value pair
      key - The key for the data
      Returns:
      The data object associated with the key, or NULL if not found
    • containsSelfManagedDataKey

      public boolean containsSelfManagedDataKey(Class clazz, Object key)
      Check to see if the key for the self managed data is available
      Parameters:
      clazz - The class of the caller that owns the key-value pair
      key - The key to look for
      Returns:
      TRUE if the key exists, FALSE otherwise
    • removeSelfManagedData

      public void removeSelfManagedData(Class clazz, Object key)
      Removes the mapping of the specified key if the specified key has been set for self managed data
      Parameters:
      clazz - The class of the caller that owns the key-value pair
      key - The key of the object to be removed
    • writeExternal

      public void writeExternal(ObjectOutput o) throws IOException
      Save the contents of this MessageContext instance.

      NOTE: Transient fields and static fields are not saved. Also, objects that represent "static" data are not saved, except for enough information to be able to find matching objects when the message context is re-constituted.

      Specified by:
      writeExternal in interface Externalizable
      Parameters:
      o - The stream to write the object contents to
      Throws:
      IOException
    • readExternal

      public void readExternal(ObjectInput inObject) throws IOException, ClassNotFoundException
      Restore the contents of the MessageContext that was previously saved.

      NOTE: The field data must read back in the same order and type as it was written. Some data will need to be validated when resurrected.

      Specified by:
      readExternal in interface Externalizable
      Parameters:
      inObject - The stream to read the object contents from
      Throws:
      IOException
      ClassNotFoundException
    • activate

      public void activate(ConfigurationContext cc)
      This method checks to see if additional work needs to be done in order to complete the object reconstitution. Some parts of the object restored from the readExternal() cannot be completed until we have a configurationContext from the active engine. The configurationContext is used to help this object to plug back into the engine's configuration and deployment objects.
      Parameters:
      cc - The configuration context object representing the active configuration
    • activateWithOperationContext

      public void activateWithOperationContext(OperationContext operationCtx)
      This method checks to see if additional work needs to be done in order to complete the object reconstitution. Some parts of the object restored from the readExternal() cannot be completed until we have an object that gives us a view of the active object graph from the active engine.

      NOTE: when activating an object, you only need to call one of the activate methods (activate() or activateWithOperationContext()) but not both.

      Parameters:
      operationCtx - The operation context object that is a member of the active object graph
    • extractCopyMessageContext

      public MessageContext extractCopyMessageContext()
      Return a Read-Only copy of this message context that has been extracted from the object hierachy. In other words, the message context copy does not have links to the object graph.

      NOTE: The copy shares certain objects with the original. The intent is to use the copy to read values but not modify them, especially since the copy is not part of the normal *Context and Axis* object graph.

      Returns:
      A copy of the message context that is not in the object graph
    • setIsSOAP11Explicit

      public void setIsSOAP11Explicit(boolean t)
    • setExecutedPhasesExplicit

      public void setExecutedPhasesExplicit(LinkedList<Handler> inb)
    • setSelfManagedDataMapExplicit

      public void setSelfManagedDataMapExplicit(LinkedHashMap<String,Object> map)
    • setOptionsExplicit

      public void setOptionsExplicit(Options op)
    • getRootContext

      public ConfigurationContext getRootContext()
      Specified by:
      getRootContext in class AbstractContext
    • isFault

      public boolean isFault()
    • getFailureReason

      public Exception getFailureReason()
      Obtain the Exception which caused the processing chain to halt.
      Returns:
      null, or an Exception.
    • setFailureReason

      public void setFailureReason(Exception failureReason)
      Set the failure reason. Only AxisEngine should ever do this.
      Parameters:
      failureReason - an Exception which caused processing to halt.
    • findEndpoint

      public AxisEndpoint findEndpoint()
      Returns:
      Identifies and returns the service endpoint for this message context. The method will use the following steps to identify the endpoint: