Package org.apache.muse.core.platform.mini

Source Code of org.apache.muse.core.platform.mini.MiniIsolationLayer

// ========================================================================
//
// Licensed Materials - Property of IBM
//
// PRODUCT_NO
//
// (c) Copyright IBM Corp. 2005.    All Rights Reserved.
//
// US Government Users Restricted Rights - Use, duplication or
// disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
//
// =========================================================================

package org.apache.muse.core.platform.mini;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import org.apache.muse.core.Environment;
import org.apache.muse.core.platform.AbstractIsolationLayer;
import org.apache.muse.core.routing.ResourceRouter;
import org.apache.muse.util.LoggingUtils;
import org.apache.muse.util.xml.XmlUtils;
import org.apache.muse.ws.addressing.MessageHeaders;
import org.apache.muse.ws.addressing.soap.SoapConstants;
import org.apache.muse.ws.addressing.soap.SoapUtils;

/**
*
* @author Dan Jemiolo (danjemiolo)
*/

public class MiniIsolationLayer extends AbstractIsolationLayer
{
    private ServletContext _initialContext = null;
   
    private HttpServletRequest _initialRequest = null;
   
    public MiniIsolationLayer(HttpServletRequest initialRequest, ServletContext initialContext)
    {
        _initialRequest = initialRequest;
        _initialContext = initialContext;
    }
   
    protected Environment createEnvironment()
    {
        return new MiniEnvironment(getInitialRequest(), getInitialContext());
    }
   
    protected ServletContext getInitialContext()
    {
        return _initialContext;
    }
   
    protected HttpServletRequest getInitialRequest()
    {
        return _initialRequest;
    }

    public Document handleRequest(Document request)
    {
        Element soap = XmlUtils.getFirstElement(request);
        Element header = XmlUtils.getElement(soap, SoapConstants.HEADER_QNAME);
        Element body = XmlUtils.getElement(soap, SoapConstants.BODY_QNAME);

        if (header == null)
            throw new RuntimeException("Invalid SOAP envelope: no header element.");       

        if (body == null)
            throw new RuntimeException("Invalid SOAP envelope: no body element.");

        Element requestData = XmlUtils.getFirstElement(body);
       
        ResourceRouter router = getRouter();
        Environment env = router.getEnvironment();

        MessageHeaders addressing = null;

        try
        {
            //
            // WS-A info provides resource context for this request
            //
            addressing = new MessageHeaders(header);
            env.addAddressingContext(addressing);
        }

        catch (Throwable error)
        {
            LoggingUtils.logError(router.getLog(), error);
        }

        if (!hasFailedToInitialize())
            LoggingUtils.logMessage(router.getLog(), request, true);

        //
        // actually perform the operation with the given parameters
        //
        Element result = router.invoke(requestData);
       
        //
        // the standard response wsa:Action name is Action + "Response"
        //
        MessageHeaders replyAddressing = null;

        //
        // send back fault headers on exception
        //
        if (SoapUtils.isFault(result))
            replyAddressing = addressing.createFaultHeaders();

        else
            replyAddressing = addressing.createReplyHeaders();

        //
        // DONE - must be sure to remove the request context, or
        // we'll have a memory leak
        //
        env.removeAddressingContext();

        //
        // import all of the headers into the response envelope...
        //       
        Element replyXML = replyAddressing.toXML();
        Element[] children = XmlUtils.getAllElements(replyXML);

        Document response = XmlUtils.createDocument();

        soap = XmlUtils.createElement(response, SoapConstants.ENVELOPE_QNAME);
        response.appendChild(soap);

        header = XmlUtils.createElement(response, SoapConstants.HEADER_QNAME);
        soap.appendChild(header);

        for (int n = 0; n < children.length; ++n)
        {
            Node next = response.importNode(children[n], true);
            header.appendChild(next);
        }

        //
        // add the result (valid or fault) to the SOAP body...
        //
        body = XmlUtils.createElement(response, SoapConstants.BODY_QNAME);
        soap.appendChild(body);

        result = (Element)response.importNode(result, true);
        body.appendChild(result);

        if (!hasFailedToInitialize())
            LoggingUtils.logMessage(router.getLog(), response, false);

        return response;
    }
}
TOP

Related Classes of org.apache.muse.core.platform.mini.MiniIsolationLayer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.