Class MessageContext

  • All Implemented Interfaces:
    Externalizable, Serializable, SafeSerializable
    Direct Known Subclasses:
    ScriptMessageContext

    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:
    Serialized Form
    • Field Detail

      • currentMessageContext

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

        protected Options options
      • 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:
        Constant Field Values
      • attachments

        public transient 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.
      • CHARACTER_SET_ENCODING

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

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

        public static final String UTF_16
        Field UTF_16. This is the 'utf-16' value for CHARACTER_SET_ENCODING property.
        See Also:
        Constant Field Values
      • 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:
        Constant Field Values
      • 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:
        Constant Field Values
      • 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:
        Constant Field Values
      • outputWritten

        public boolean outputWritten
    • Constructor Detail

      • MessageContext

        public MessageContext()
        Constructor
    • Method Detail

      • getCurrentMessageContext

        public static MessageContext getCurrentMessageContext()
      • destroyCurrentMessageContext

        public static void destroyCurrentMessageContext()
      • setCurrentMessageContext

        public static void setCurrentMessageContext​(MessageContext ctx)
      • 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
      • getCurrentHandlerIndex

        public int getCurrentHandlerIndex()
      • getCurrentPhaseIndex

        public int getCurrentPhaseIndex()
      • getEnvelope

        public SOAPEnvelope getEnvelope()
        Returns:
        Returns SOAPEnvelope.
      • 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.
      • 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
      • 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.
      • 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.
      • 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.
      • 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 -
      • 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 -
      • 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​(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 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 Attachments getAttachmentMap​(boolean create)
      • addAttachment

        public void addAttachment​(String contentID,
                                  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​(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 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
      • 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)
      • setOptionsExplicit

        public void setOptionsExplicit​(Options op)
      • 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: