synapse-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Ruwan Linton" <ruwan.lin...@gmail.com>
Subject Re: svn commit: r670682 - in /synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp: ServerWorker.java util/RESTUtil.java
Date Tue, 24 Jun 2008 00:32:47 GMT
You are welcome, Andreas.

Ruwan

On Tue, Jun 24, 2008 at 1:25 AM, Andreas Veithen <andreas.veithen@skynet.be>
wrote:

> Thanks Ruwan!
>
> Andreas
>
>
> On 23 juin 08, at 19:41, ruwan@apache.org wrote:
>
>  Author: ruwan
>> Date: Mon Jun 23 10:41:11 2008
>> New Revision: 670682
>>
>> URL: http://svn.apache.org/viewvc?rev=670682&view=rev
>> Log:
>> Fixing the issue SYNAPSE-365, REST support fixed
>>
>> Modified:
>>
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java
>>
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/util/RESTUtil.java
>>
>> Modified:
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java
>> URL:
>> http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java?rev=670682&r1=670681&r2=670682&view=diff
>>
>> ==============================================================================
>> ---
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java
>> (original)
>> +++
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java
>> Mon Jun 23 10:41:11 2008
>> @@ -30,7 +30,6 @@
>> import org.apache.axis2.transport.RequestResponseTransport;
>> import org.apache.axis2.transport.http.HTTPTransportReceiver;
>> import org.apache.axis2.transport.http.HTTPTransportUtils;
>> -import org.apache.axis2.transport.http.util.RESTUtil;
>> import org.apache.axis2.util.MessageContextBuilder;
>> import org.apache.commons.logging.Log;
>> import org.apache.commons.logging.LogFactory;
>> @@ -38,6 +37,7 @@
>> import org.apache.http.nio.NHttpServerConnection;
>> import org.apache.http.protocol.HTTP;
>> import org.apache.synapse.transport.base.MetricsCollector;
>> +import org.apache.synapse.transport.nhttp.util.RESTUtil;
>> import org.apache.ws.commons.schema.XmlSchema;
>>
>> import java.io.IOException;
>> @@ -76,6 +76,7 @@
>>    private OutputStream os = null;
>>    /** the metrics collector */
>>    private MetricsCollector metrics = null;
>> +
>>    private static final String SOAPACTION   = "SOAPAction";
>>    private static final String LOCATION     = "Location";
>>    private static final String CONTENT_TYPE = "Content-Type";
>> @@ -145,15 +146,14 @@
>>            msgContext.setIncomingTransportName(Constants.TRANSPORT_HTTP);
>>        }
>>        msgContext.setProperty(Constants.OUT_TRANSPORT_INFO, this);
>> -        msgContext.setServiceGroupContextId(UUIDGenerator.getUUID()); //
>> TODO check if this is valid
>> +        msgContext.setServiceGroupContextId(UUIDGenerator.getUUID());
>>        msgContext.setServerSide(true);
>>        msgContext.setProperty(
>>            Constants.Configuration.TRANSPORT_IN_URL,
>> request.getRequestLine().getUri());
>>
>> -        Map headers = new HashMap();
>> -        Header[] headerArr = request.getAllHeaders();
>> -        for (int i = 0; i < headerArr.length; i++) {
>> -            headers.put(headerArr[i].getName(), headerArr[i].getValue());
>> +        Map<String, String> headers = new HashMap<String, String>();
>> +        for (Header header : request.getAllHeaders()) {
>> +            headers.put(header.getName(), header.getValue());
>>        }
>>        msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, headers);
>>
>> @@ -259,14 +259,6 @@
>>
>>        String uri = request.getRequestLine().getUri();
>>
>> -        String contextPath = cfgCtx.getContextRoot();
>> -        if (!contextPath.startsWith("/")) {
>> -            contextPath = "/" + contextPath;
>> -        }
>> -        if (!contextPath.endsWith("/")) {
>> -            contextPath = contextPath + "/";
>> -        }
>> -
>>        String servicePath = cfgCtx.getServiceContextPath();
>>        if (!servicePath.startsWith("/")) {
>>            servicePath = "/" + servicePath;
>> @@ -292,9 +284,10 @@
>>            }
>>        }
>>
>> -        Map parameters = new HashMap();
>> +        Map<String, String> parameters = new HashMap<String, String>();
>>        int pos = uri.indexOf("?");
>>        if (pos != -1) {
>> +            msgContext.setTo(new EndpointReference(uri.substring(0,
>> pos)));
>>            StringTokenizer st = new StringTokenizer(uri.substring(pos+1),
>> "&");
>>            while (st.hasMoreTokens()) {
>>                String param = st.nextToken();
>> @@ -305,6 +298,8 @@
>>                    parameters.put(param, null);
>>                }
>>            }
>> +        } else {
>> +            msgContext.setTo(new EndpointReference(uri));
>>        }
>>
>>        if ("GET".equalsIgnoreCase(request.getRequestLine().getMethod())) {
>> @@ -375,7 +370,7 @@
>>
>>            } else {
>>                //cater for named xsds - check for the xsd name
>> -                String schemaName = (String) parameters.get("xsd");
>> +                String schemaName = parameters.get("xsd");
>>                AxisService service = (AxisService)
>> cfgCtx.getAxisConfiguration()
>>                    .getServices().get(serviceName);
>>
>> @@ -439,9 +434,11 @@
>>
>>            } else {
>>                try {
>> -                    Header contentType =
>> request.getFirstHeader(HTTP.CONTENT_TYPE);
>> -                    RESTUtil.processURLRequest(msgContext, os,
>> -                            contentType != null ? contentType.getValue()
>> :  null);
>> +
>> +                    RESTUtil.processURLRequest(
>> +                            msgContext, os,
>> (request.getFirstHeader(SOAPACTION) != null ?
>> +                            request.getFirstHeader(SOAPACTION).getValue()
>> : null),
>> +                            request.getRequestLine().getUri(), cfgCtx,
>> parameters);
>>                    // do not let the output stream close (as by default
>> below) since
>>                    // we are serving this GET request through the Synapse
>> engine
>>                    return;
>> @@ -568,26 +565,26 @@
>>        if ((services != null) && !services.isEmpty()) {
>>
>>            servicesFound = true;
>> -            Collection serviceCollection = services.values();
>>            resultBuf.append("<h2>" + "Deployed services" + "</h2>");
>>
>> -            for (Iterator it = serviceCollection.iterator();
>> it.hasNext();) {
>> +            for (Object service : services.values()) {
>>
>> -                AxisService axisService = (AxisService) it.next();
>> +                AxisService axisService = (AxisService) service;
>>                if (axisService.getName().startsWith("__")) {
>>                    continue;    // skip private services
>>                }
>>
>>                Iterator iterator = axisService.getOperations();
>> -                resultBuf.append("<h3><a href=\"" + axisService.getName()
>> + "?wsdl\">" +
>> -                        axisService.getName() + "</a></h3>");
>> +                resultBuf.append("<h3><a
>> href=\"").append(axisService.getName()).append(
>> +
>>  "?wsdl\">").append(axisService.getName()).append("</a></h3>");
>>
>>                if (iterator.hasNext()) {
>>                    resultBuf.append("Available operations <ul>");
>>
>>                    for (; iterator.hasNext();) {
>>                        AxisOperation axisOperation = (AxisOperation)
>> iterator.next();
>> -                        resultBuf.append("<li>" +
>> axisOperation.getName().getLocalPart() + "</li>");
>> +                        resultBuf.append("<li>").append(
>> +
>>  axisOperation.getName().getLocalPart()).append("</li>");
>>                    }
>>                    resultBuf.append("</ul>");
>>                } else {
>> @@ -603,7 +600,8 @@
>>
>>            while (faultyservices.hasMoreElements()) {
>>                String faultyserviceName = (String)
>> faultyservices.nextElement();
>> -                resultBuf.append("<h3><font color=\"blue\">" +
>> faultyserviceName + "</font></h3>");
>> +                resultBuf.append("<h3><font color=\"blue\">").append(
>> +                        faultyserviceName).append("</font></h3>");
>>            }
>>        }
>>
>>
>> Modified:
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/util/RESTUtil.java
>> URL:
>> http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/util/RESTUtil.java?rev=670682&r1=670681&r2=670682&view=diff
>>
>> ==============================================================================
>> ---
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/util/RESTUtil.java
>> (original)
>> +++
>> synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/util/RESTUtil.java
>> Mon Jun 23 10:41:11 2008
>> @@ -20,14 +20,36 @@
>> package org.apache.synapse.transport.nhttp.util;
>>
>> import org.apache.axiom.om.OMElement;
>> +import org.apache.axiom.om.OMNamespace;
>> +import org.apache.axiom.soap.SOAPEnvelope;
>> +import org.apache.axiom.soap.SOAPFactory;
>> +import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
>> import org.apache.axis2.AxisFault;
>> +import org.apache.axis2.Constants;
>> +import org.apache.axis2.util.Utils;
>> +import org.apache.axis2.addressing.EndpointReference;
>> +import org.apache.axis2.i18n.Messages;
>> +import org.apache.axis2.builder.BuilderUtil;
>> import org.apache.axis2.context.MessageContext;
>> -import org.apache.axis2.description.WSDL20DefaultValueHolder;
>> -import org.apache.axis2.description.WSDL2Constants;
>> +import org.apache.axis2.context.ConfigurationContext;
>> +import org.apache.axis2.description.*;
>> +import org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher;
>> +import org.apache.axis2.dispatchers.RequestURIBasedDispatcher;
>> +import org.apache.axis2.dispatchers.RequestURIOperationDispatcher;
>> +import org.apache.axis2.engine.AxisEngine;
>> +import org.apache.axis2.engine.Handler;
>> +import org.apache.axis2.transport.TransportUtils;
>> +import org.apache.axis2.transport.http.HTTPConstants;
>> import org.apache.axis2.transport.http.util.URIEncoderDecoder;
>>
>> +import javax.xml.namespace.QName;
>> +import javax.xml.stream.XMLStreamException;
>> +import java.io.IOException;
>> +import java.io.OutputStream;
>> import java.io.UnsupportedEncodingException;
>> +import java.io.InputStream;
>> import java.util.Iterator;
>> +import java.util.Map;
>>
>> /**
>>  * This class provides a set of utility methods to manage the REST
>> invocation calls
>> @@ -38,14 +60,14 @@
>>    /**
>>     * This method will return the URI part for the GET HTTPRequest by
>> converting
>>     * the SOAP infoset to the URL-encoded GET format
>> -     *
>> +     *
>>     * @param messageContext - from which the SOAP infoset will be
>> extracted to encode
>>     * @param address        - address of the actual service
>>     * @return uri       - ERI of the GET request
>>     * @throws AxisFault - if the SOAP infoset cannot be converted in to
>> the GET URL-encoded format
>>     */
>>    public static String getURI(MessageContext messageContext, String
>> address) throws AxisFault {
>> -
>> +
>>        OMElement firstElement;
>>        address = address.substring(address.indexOf("//") + 2);
>>        address = address.substring(address.indexOf("/"));
>> @@ -69,7 +91,7 @@
>>            Iterator iter = firstElement.getChildElements();
>>
>>            String legalCharacters = WSDL2Constants
>> -
>>  .LEGAL_CHARACTERS_IN_QUERY.replaceAll(queryParameterSeparator, "");
>> +
>>  .LEGAL_CHARACTERS_IN_QUERY.replaceAll(queryParameterSeparator, "");
>>            StringBuffer buff = new StringBuffer(params);
>>
>>            // iterate through the child elements and find the request
>> parameters
>> @@ -77,11 +99,11 @@
>>                OMElement element = (OMElement) iter.next();
>>                try {
>>
>>  buff.append(URIEncoderDecoder.quoteIllegal(element.getLocalName(),
>> -
>>  legalCharacters)).append("=").append(URIEncoderDecoder.quoteIllegal(element.getText(),
>> -
>>  legalCharacters)).append(queryParameterSeparator);
>> +
>>  legalCharacters)).append("=").append(URIEncoderDecoder.quoteIllegal(element.getText(),
>> +
>>  legalCharacters)).append(queryParameterSeparator);
>>                } catch (UnsupportedEncodingException e) {
>>                    throw new AxisFault("URI Encoding error : " +
>> element.getLocalName()
>> -                        + "=" + element.getText(), e);
>> +                            + "=" + element.getText(), e);
>>                }
>>            }
>>
>> @@ -99,10 +121,99 @@
>>
>>            } else {
>>                address = address
>> -                    + queryParameterSeparator + params.substring(0,
>> params.length() - 1);
>> +                        + queryParameterSeparator + params.substring(0,
>> params.length() - 1);
>>            }
>>        }
>> -
>> +
>>        return address;
>>    }
>> +
>> +    /**
>> +     * Processes the HTTP GET request and builds the SOAP info-set of the
>> REST message
>> +     *
>> +     * @param msgContext The MessageContext of the Request Message
>> +     * @param out The output stream of the response
>> +     * @param soapAction SoapAction of the request
>> +     * @param requestURI The URL that the request came to
>> +     * @param configurationContext The Axis Configuration Context
>> +     * @param requestParameters The parameters of the request message
>> +     * @return boolean indication whether the operation was succesfull
>> +     * @throws AxisFault - Thrown in case a fault occurs
>> +     */
>> +    public static boolean processURLRequest(MessageContext msgContext,
>> OutputStream out,
>> +        String soapAction, String requestURI, ConfigurationContext
>> configurationContext,
>> +        Map requestParameters) throws AxisFault {
>> +
>> +        if ((soapAction != null) && soapAction.startsWith("\"") &&
>> soapAction.endsWith("\"")) {
>> +            soapAction = soapAction.substring(1, soapAction.length() -
>> 1);
>> +        }
>> +
>> +        msgContext.setSoapAction(soapAction);
>> +        msgContext.setTo(new EndpointReference(requestURI));
>> +        msgContext.setProperty(MessageContext.TRANSPORT_OUT, out);
>> +        msgContext.setServerSide(true);
>> +        SOAPEnvelope envelope = createEnvelopeFromGetRequest(
>> +                requestURI, requestParameters, configurationContext);
>> +
>> +        if (envelope == null) {
>> +            return false;
>> +        } else {
>> +            msgContext.setDoingREST(true);
>> +            msgContext.setEnvelope(envelope);
>> +            AxisEngine.receive(msgContext);
>> +            return true;
>> +        }
>> +    }
>> +
>> +    /**
>> +     * Creates the {@link SOAPEnvelope} from the GET URL request. REST
>> message building inside
>> +     * synapse will be handled in this manner
>> +     *
>> +     * @param requestUrl GET URL of the request
>> +     * @param map query parameters of the GET request
>> +     * @param configCtx axis configuration context
>> +     * @return created SOAPEnvelope or null if cannot be processed
>> +     * @throws AxisFault if the service represented by the GET request
>> URL cannot be found
>> +     */
>> +    public static SOAPEnvelope createEnvelopeFromGetRequest(String
>> requestUrl, Map map,
>> +        ConfigurationContext configCtx) throws AxisFault {
>> +
>> +        String[] values = Utils.parseRequestURLForServiceAndOperation(
>> +                requestUrl, configCtx.getServiceContextPath());
>> +
>> +        if (values == null) {
>> +            return new SOAP11Factory().getDefaultEnvelope();
>> +        }
>> +
>> +        if ((values[1] != null) && (values[0] != null)) {
>> +            String srvice = values[0];
>> +            AxisService service =
>> configCtx.getAxisConfiguration().getService(srvice);
>> +            if (service == null) {
>> +                throw new AxisFault("service not found: " + srvice);
>> +            }
>> +            String operation = values[1];
>> +            SOAPFactory soapFactory = new SOAP11Factory();
>> +            SOAPEnvelope envelope = soapFactory.getDefaultEnvelope();
>> +            OMNamespace omNs =
>> soapFactory.createOMNamespace(service.getSchemaTargetNamespace(),
>> +                    service.getSchemaTargetNamespacePrefix());
>> +
>>  soapFactory.createOMNamespace(service.getSchemaTargetNamespace(),
>> +                    service.getSchemaTargetNamespacePrefix());
>> +            OMElement opElement = soapFactory.createOMElement(operation,
>> omNs);
>> +
>> +            for (Object o : map.keySet()) {
>> +                String name = (String) o;
>> +                String value = (String) map.get(name);
>> +                OMElement omEle = soapFactory.createOMElement(name,
>> omNs);
>> +
>> +                omEle.setText(value);
>> +                opElement.addChild(omEle);
>> +            }
>> +
>> +            envelope.getBody().addChild(opElement);
>> +
>> +            return envelope;
>> +        } else {
>> +            return null;
>> +        }
>> +    }
>> }
>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@synapse.apache.org
> For additional commands, e-mail: dev-help@synapse.apache.org
>
>


-- 
Ruwan Linton
http://wso2.org - "Oxygenating the Web Services Platform"
http://ruwansblog.blogspot.com/

Mime
View raw message