Search in sources :

Example 26 with URI

use of org.apache.axis2.databinding.types.URI in project wso2-synapse by wso2.

the class XFormURLEncodedBuilder method extractParametersUsingHttpLocation.

private String extractParametersUsingHttpLocation(String templatedPath, MultipleEntryHashMap parameterMap, String requestURL, String queryParameterSeparator) throws AxisFault, UnsupportedEncodingException {
    if (templatedPath != null && !"".equals(templatedPath) && templatedPath.contains("{")) {
        StringBuilder pathTemplate = new StringBuilder(templatedPath);
        // this will hold the index, from which we need to process the request URI
        int startIndex = 0;
        int templateStartIndex = 0;
        int templateEndIndex = 0;
        int indexOfNextConstant = 0;
        StringBuilder requestURIBuffer = new StringBuilder(requestURL);
        while (startIndex < requestURIBuffer.length()) {
            // this will always hold the starting index of a template parameter
            templateStartIndex = pathTemplate.indexOf("{", templateStartIndex);
            if (templateStartIndex > 0) {
                // get the preceding constant part from the template
                String constantPart = pathTemplate.substring(templateEndIndex + 1, templateStartIndex);
                constantPart = constantPart.replaceAll("\\{\\{", "{");
                constantPart = constantPart.replaceAll("}}", "}");
                // get the index of the end of this template param
                templateEndIndex = pathTemplate.indexOf("}", templateStartIndex);
                if ((pathTemplate.length() - 1) > templateEndIndex && pathTemplate.charAt(templateEndIndex + 1) == '}') {
                    templateEndIndex = pathTemplate.indexOf("}", templateEndIndex + 2);
                }
                String parameterName = pathTemplate.substring(templateStartIndex + 1, templateEndIndex);
                // next try to find the next constant
                templateStartIndex = pathTemplate.indexOf("{", templateEndIndex);
                if (pathTemplate.charAt(templateStartIndex + 1) == '{') {
                    templateStartIndex = pathTemplate.indexOf("{", templateStartIndex + 2);
                }
                int endIndexOfConstant = requestURIBuffer.indexOf(constantPart, indexOfNextConstant) + constantPart.length();
                if (templateStartIndex == -1) {
                    if (templateEndIndex == pathTemplate.length() - 1) {
                        // We may have occations where we have templates of the form foo/{name}.
                        // In this case the next connstant will be ? and not the
                        // queryParameterSeparator
                        indexOfNextConstant = requestURIBuffer.indexOf("?", endIndexOfConstant);
                        if (indexOfNextConstant == -1) {
                            indexOfNextConstant = requestURIBuffer.indexOf(queryParameterSeparator, endIndexOfConstant);
                        }
                        if (indexOfNextConstant > 0) {
                            addParameterToMap(parameterMap, parameterName, requestURIBuffer.substring(endIndexOfConstant, indexOfNextConstant));
                            return requestURL.substring(indexOfNextConstant);
                        } else {
                            addParameterToMap(parameterMap, parameterName, requestURIBuffer.substring(endIndexOfConstant));
                            return "";
                        }
                    } else {
                        constantPart = pathTemplate.substring(templateEndIndex + 1, pathTemplate.length());
                        constantPart = constantPart.replaceAll("\\{\\{", "{");
                        constantPart = constantPart.replaceAll("}}", "}");
                        indexOfNextConstant = requestURIBuffer.indexOf(constantPart, endIndexOfConstant);
                        addParameterToMap(parameterMap, parameterName, requestURIBuffer.substring(endIndexOfConstant, indexOfNextConstant));
                        if (requestURIBuffer.length() > indexOfNextConstant + 1) {
                            return requestURIBuffer.substring(indexOfNextConstant + 1);
                        }
                        return "";
                    }
                } else {
                    // this is the next constant from the template
                    constantPart = pathTemplate.substring(templateEndIndex + 1, templateStartIndex);
                    constantPart = constantPart.replaceAll("\\{\\{", "{");
                    constantPart = constantPart.replaceAll("}}", "}");
                    indexOfNextConstant = requestURIBuffer.indexOf(constantPart, endIndexOfConstant);
                    addParameterToMap(parameterMap, parameterName, requestURIBuffer.substring(endIndexOfConstant, indexOfNextConstant));
                    startIndex = indexOfNextConstant;
                }
            }
        }
    }
    return requestURL;
}
Also used : AxisEndpoint(org.apache.axis2.description.AxisEndpoint)

Example 27 with URI

use of org.apache.axis2.databinding.types.URI in project wso2-synapse by wso2.

the class DefaultHttpGetProcessor method process.

/**
 * Process the HTTP GET request.
 *
 * @param request    The HttpRequest
 * @param response   The HttpResponse
 * @param msgContext The MessageContext
 * @param conn       The NHttpServerConnection
 * @param os         The OutputStream
 */
public void process(HttpRequest request, HttpResponse response, MessageContext msgContext, NHttpServerConnection conn, OutputStream os, boolean isRestDispatching) {
    String uri = request.getRequestLine().getUri();
    String servicePath = cfgCtx.getServiceContextPath();
    if (!servicePath.startsWith("/")) {
        servicePath = "/" + servicePath;
    }
    String serviceName = getServiceName(request);
    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();
            pos = param.indexOf("=");
            if (pos != -1) {
                parameters.put(param.substring(0, pos), param.substring(pos + 1));
            } else {
                parameters.put(param, null);
            }
        }
    } else {
        msgContext.setTo(new EndpointReference(uri));
    }
    if (isServiceListBlocked(uri)) {
        response.setStatusCode(HttpStatus.SC_FORBIDDEN);
        serverHandler.commitResponseHideExceptions(conn, response);
    } else if (uri.equals("/favicon.ico")) {
        response.setStatusCode(HttpStatus.SC_MOVED_PERMANENTLY);
        response.addHeader(LOCATION, "http://wso2.org/favicon.ico");
        serverHandler.commitResponseHideExceptions(conn, response);
    // } else if (!uri.startsWith(servicePath)) {
    // response.setStatusCode(HttpStatus.SC_MOVED_PERMANENTLY);
    // response.addHeader(LOCATION, servicePath + "/");
    // serverHandler.commitResponseHideExceptions(conn, response);
    } else if (serviceName != null && parameters.containsKey("wsdl")) {
        generateWsdl(request, response, msgContext, conn, os, serviceName, parameters, isRestDispatching);
        return;
    } else if (serviceName != null && parameters.containsKey("wsdl2")) {
        generateWsdl2(request, response, msgContext, conn, os, serviceName, isRestDispatching);
        return;
    } else if (serviceName != null && parameters.containsKey("xsd")) {
        generateXsd(request, response, msgContext, conn, os, serviceName, parameters, isRestDispatching);
        return;
    } else if (serviceName != null && parameters.containsKey("info")) {
        generateServiceDetailsPage(response, conn, os, serviceName);
    } else if (uri.startsWith(servicePath) && (serviceName == null || serviceName.length() == 0)) {
        generateServicesList(response, conn, os, servicePath);
    } else {
        processGetAndDelete(request, response, msgContext, conn, os, "GET", isRestDispatching);
        return;
    }
    // make sure that the output stream is flushed and closed properly
    closeOutputStream(os);
}
Also used : EndpointReference(org.apache.axis2.addressing.EndpointReference)

Example 28 with URI

use of org.apache.axis2.databinding.types.URI in project wso2-synapse by wso2.

the class CustomURIBasedDispatcher method findService.

public AxisService findService(MessageContext messageContext) throws AxisFault {
    EndpointReference toEPR = messageContext.getTo();
    if (toEPR != null) {
        String toAddress = toEPR.getAddress();
        int index = toAddress.indexOf("//");
        if (index != -1) {
            toAddress = toAddress.substring(index + 2);
            index = toAddress.indexOf("/");
            toAddress = toAddress.substring(index + 1);
        }
        if (toAddress.startsWith("/")) {
            toAddress = toAddress.substring(1);
        }
        ConfigurationContext cfgCtx = messageContext.getConfigurationContext();
        Object property = cfgCtx.getProperty(NhttpConstants.EPR_TO_SERVICE_NAME_MAP);
        if (property != null && property instanceof Map) {
            Map eprToserviceNameMap = (Map) property;
            if (eprToserviceNameMap.containsKey(toAddress)) {
                return cfgCtx.getAxisConfiguration().getService(eprToserviceNameMap.get(toAddress).toString());
            }
        }
    } else {
        log.debug("Unable to dispatch using the custom URI the " + "To header has not been specified");
    }
    return null;
}
Also used : ConfigurationContext(org.apache.axis2.context.ConfigurationContext) Map(java.util.Map) EndpointReference(org.apache.axis2.addressing.EndpointReference)

Example 29 with URI

use of org.apache.axis2.databinding.types.URI in project wso2-synapse by wso2.

the class HTTPEndpoint method processUrlTemplate.

private void processUrlTemplate(MessageContext synCtx) throws ExpressionParseException {
    Map<String, Object> variables = new HashMap<String, Object>();
    /*The properties with uri.var.* are only considered for Outbound REST Endpoints*/
    Set propertySet = synCtx.getPropertyKeySet();
    // We have to create a local UriTemplate object, or else the UriTemplate.set(variables) call will fill up a list of variables and since uriTemplate
    // is not thread safe, this list won't be clearing.
    UriTemplate template = null;
    String evaluatedUri = "";
    // legacySupport for backward compatibility where URI Template decoding handled via HTTPEndpoint
    if (legacySupport) {
        for (Object propertyKey : propertySet) {
            if (propertyKey.toString() != null && (propertyKey.toString().startsWith(RESTConstants.REST_URI_VARIABLE_PREFIX) || propertyKey.toString().startsWith(RESTConstants.REST_QUERY_PARAM_PREFIX))) {
                Object objProperty = synCtx.getProperty(propertyKey.toString());
                if (objProperty != null) {
                    if (objProperty instanceof String) {
                        variables.put(propertyKey.toString(), decodeString((String) synCtx.getProperty(propertyKey.toString())));
                    } else {
                        variables.put(propertyKey.toString(), decodeString(String.valueOf(synCtx.getProperty(propertyKey.toString()))));
                    }
                }
            }
        }
        // Include properties defined at endpoint.
        Iterator endpointProperties = getProperties().iterator();
        while (endpointProperties.hasNext()) {
            MediatorProperty property = (MediatorProperty) endpointProperties.next();
            if (property.getName().toString() != null && (property.getName().toString().startsWith(RESTConstants.REST_URI_VARIABLE_PREFIX) || property.getName().toString().startsWith(RESTConstants.REST_QUERY_PARAM_PREFIX))) {
                variables.put(property.getName(), decodeString((String) property.getValue()));
            }
        }
        template = UriTemplate.fromTemplate(uriTemplate.getTemplate());
        if (template != null) {
            template.set(variables);
        }
        if (variables.isEmpty()) {
            evaluatedUri = template.getTemplate();
        } else {
            try {
                // Decode needs to avoid replacing special characters(e.g %20 -> %2520) when creating URL.
                String decodedString = URLDecoder.decode(template.expand(), "UTF-8");
                URL url = new URL(decodedString);
                URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), // this to avoid url.toURI which causes exceptions
                url.getRef());
                evaluatedUri = uri.toURL().toString();
                if (log.isDebugEnabled()) {
                    log.debug("Expanded URL : " + evaluatedUri);
                }
            } catch (URISyntaxException e) {
                if (log.isDebugEnabled()) {
                    log.debug("Invalid URL syntax for HTTP Endpoint: " + this.getName(), e);
                }
                evaluatedUri = template.getTemplate();
            } catch (ExpressionParseException e) {
                log.debug("No URI Template variables defined in HTTP Endpoint: " + this.getName());
                evaluatedUri = template.getTemplate();
            } catch (MalformedURLException e) {
                log.debug("Invalid URL for HTTP Endpoint: " + this.getName());
                evaluatedUri = template.getTemplate();
            } catch (UnsupportedEncodingException e) {
                log.debug("Exception while decoding the URL in HTTP Endpoint: " + this.getName());
                evaluatedUri = template.getTemplate();
            }
        }
    } else {
        // URI Template encoding not handled by HTTP Endpoint, compliant with RFC6570
        for (Object propertyKey : propertySet) {
            if (propertyKey.toString() != null && (propertyKey.toString().startsWith(RESTConstants.REST_URI_VARIABLE_PREFIX) || propertyKey.toString().startsWith(RESTConstants.REST_QUERY_PARAM_PREFIX))) {
                Object objProperty = synCtx.getProperty(propertyKey.toString());
                if (objProperty != null) {
                    if (objProperty instanceof String) {
                        variables.put(propertyKey.toString(), (String) synCtx.getProperty(propertyKey.toString()));
                    } else {
                        variables.put(propertyKey.toString(), (String) String.valueOf(synCtx.getProperty(propertyKey.toString())));
                    }
                }
            }
        }
        // Include properties defined at endpoint.
        Iterator endpointProperties = getProperties().iterator();
        while (endpointProperties.hasNext()) {
            MediatorProperty property = (MediatorProperty) endpointProperties.next();
            if (property.getName().toString() != null && (property.getName().toString().startsWith(RESTConstants.REST_URI_VARIABLE_PREFIX) || property.getName().toString().startsWith(RESTConstants.REST_QUERY_PARAM_PREFIX))) {
                variables.put(property.getName(), (String) property.getValue());
            }
        }
        String tmpl;
        // this was used in connectors Eg:- uri-template="{uri.var.variable}"
        if (uriTemplate.getTemplate().charAt(0) == '{' && uriTemplate.getTemplate().charAt(1) != '+') {
            tmpl = "{+" + uriTemplate.getTemplate().substring(1);
        } else {
            tmpl = uriTemplate.getTemplate();
        }
        template = UriTemplate.fromTemplate(tmpl);
        if (template != null) {
            template.set(variables);
        }
        if (variables.isEmpty()) {
            evaluatedUri = template.getTemplate();
        } else {
            try {
                URI uri = new URI(template.expand());
                evaluatedUri = uri.toString();
                if (log.isDebugEnabled()) {
                    log.debug("Expanded URL : " + evaluatedUri);
                }
            } catch (URISyntaxException e) {
                if (log.isDebugEnabled()) {
                    log.debug("Invalid URL syntax for HTTP Endpoint: " + this.getName(), e);
                }
                evaluatedUri = template.getTemplate();
            } catch (ExpressionParseException e) {
                log.debug("No URI Template variables defined in HTTP Endpoint: " + this.getName());
                evaluatedUri = template.getTemplate();
            }
        }
    }
    if (evaluatedUri != null) {
        synCtx.setTo(new EndpointReference(evaluatedUri));
        if (super.getDefinition() != null) {
            synCtx.setProperty(EndpointDefinition.DYNAMIC_URL_VALUE, evaluatedUri);
        }
    }
}
Also used : Set(java.util.Set) HashMap(java.util.HashMap) ExpressionParseException(com.damnhandy.uri.template.impl.ExpressionParseException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) UriTemplate(com.damnhandy.uri.template.UriTemplate) EndpointReference(org.apache.axis2.addressing.EndpointReference) MediatorProperty(org.apache.synapse.mediators.MediatorProperty) Iterator(java.util.Iterator)

Example 30 with URI

use of org.apache.axis2.databinding.types.URI in project wso2-synapse by wso2.

the class Axis2FlexibleMEPClient method send.

/**
 * Based on the Axis2 client code. Sends the Axis2 Message context out and returns
 * the Axis2 message context for the response.
 * <p/>
 * Here Synapse works as a Client to the service. It would expect 200 ok, 202 ok and
 * 500 internal server error as possible responses.
 *
 * @param endpoint                 the endpoint being sent to, maybe null
 * @param synapseOutMessageContext the outgoing synapse message
 * @throws AxisFault on errors
 */
public static void send(EndpointDefinition endpoint, org.apache.synapse.MessageContext synapseOutMessageContext) throws AxisFault {
    boolean separateListener = false;
    boolean wsSecurityEnabled = false;
    String wsSecPolicyKey = null;
    String inboundWsSecPolicyKey = null;
    String outboundWsSecPolicyKey = null;
    boolean wsRMEnabled = false;
    boolean wsAddressingEnabled = false;
    String wsAddressingVersion = null;
    if (endpoint != null) {
        separateListener = endpoint.isUseSeparateListener();
        wsSecurityEnabled = endpoint.isSecurityOn();
        wsSecPolicyKey = endpoint.getWsSecPolicyKey();
        inboundWsSecPolicyKey = endpoint.getInboundWsSecPolicyKey();
        outboundWsSecPolicyKey = endpoint.getOutboundWsSecPolicyKey();
        wsAddressingEnabled = endpoint.isAddressingOn();
        wsAddressingVersion = endpoint.getAddressingVersion();
    }
    if (log.isDebugEnabled()) {
        String to;
        if (endpoint != null && endpoint.getAddress() != null) {
            to = endpoint.getAddress(synapseOutMessageContext);
        } else {
            to = synapseOutMessageContext.getTo().toString();
        }
        log.debug("Sending [add = " + wsAddressingEnabled + "] [sec = " + wsSecurityEnabled + (endpoint != null ? "] [mtom = " + endpoint.isUseMTOM() + "] [swa = " + endpoint.isUseSwa() + "] [format = " + endpoint.getFormat() + "] [force soap11=" + endpoint.isForceSOAP11() + "] [force soap12=" + endpoint.isForceSOAP12() + "] [pox=" + endpoint.isForcePOX() + "] [get=" + endpoint.isForceGET() + "] [encoding=" + endpoint.getCharSetEncoding() : "") + "] [to=" + to + "]");
    }
    // save the original message context without altering it, so we can tie the response
    MessageContext originalInMsgCtx = ((Axis2MessageContext) synapseOutMessageContext).getAxis2MessageContext();
    // TODO Temp hack: ESB removes the session id from request in a random manner.
    Map headers = (Map) originalInMsgCtx.getProperty(MessageContext.TRANSPORT_HEADERS);
    String session = (String) synapseOutMessageContext.getProperty("LB_COOKIE_HEADER");
    if (session != null) {
        headers.put("Cookie", session);
    }
    // create a new MessageContext to be sent out as this should not corrupt the original
    // we need to create the response to the original message later on
    String preserveAddressingProperty = (String) synapseOutMessageContext.getProperty(SynapseConstants.PRESERVE_WS_ADDRESSING);
    MessageContext axisOutMsgCtx = cloneForSend(originalInMsgCtx, preserveAddressingProperty);
    if (log.isDebugEnabled()) {
        log.debug("Message [Original Request Message ID : " + synapseOutMessageContext.getMessageID() + "]" + " [New Cloned Request Message ID : " + axisOutMsgCtx.getMessageID() + "]");
    }
    // so that we can use the original message context for resending through different endpoints
    if (endpoint != null) {
        // get the endpoint encoding attribute
        String strCharSetEncoding = "";
        if (endpoint.getCharSetEncoding() != null) {
            strCharSetEncoding = ";" + endpoint.getCharSetEncoding();
        }
        if (SynapseConstants.FORMAT_POX.equals(endpoint.getFormat())) {
            axisOutMsgCtx.setDoingREST(true);
            axisOutMsgCtx.setProperty(org.apache.axis2.Constants.Configuration.MESSAGE_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_APPLICATION_XML);
            axisOutMsgCtx.setProperty(Constants.Configuration.CONTENT_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_APPLICATION_XML);
            Object o = axisOutMsgCtx.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
            Map _headers = (Map) o;
            if (_headers != null) {
                _headers.remove(HTTP.CONTENT_TYPE);
                _headers.put(HTTP.CONTENT_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_APPLICATION_XML + strCharSetEncoding);
            }
        } else if (SynapseConstants.FORMAT_GET.equals(endpoint.getFormat())) {
            axisOutMsgCtx.setDoingREST(true);
            axisOutMsgCtx.setProperty(Constants.Configuration.HTTP_METHOD, Constants.Configuration.HTTP_METHOD_GET);
            axisOutMsgCtx.setProperty(org.apache.axis2.Constants.Configuration.MESSAGE_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_X_WWW_FORM);
        } else if (SynapseConstants.FORMAT_SOAP11.equals(endpoint.getFormat())) {
            axisOutMsgCtx.setDoingREST(false);
            axisOutMsgCtx.removeProperty(org.apache.axis2.Constants.Configuration.MESSAGE_TYPE);
            // We need to set this explicitly here in case the request was not a POST
            axisOutMsgCtx.setProperty(Constants.Configuration.HTTP_METHOD, Constants.Configuration.HTTP_METHOD_POST);
            if (axisOutMsgCtx.getSoapAction() == null && axisOutMsgCtx.getWSAAction() != null) {
                axisOutMsgCtx.setSoapAction(axisOutMsgCtx.getWSAAction());
            }
            if (!axisOutMsgCtx.isSOAP11()) {
                SOAPUtils.convertSOAP12toSOAP11(axisOutMsgCtx);
            }
            Object o = axisOutMsgCtx.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
            Map transportHeaders = (Map) o;
            if (transportHeaders != null) {
                // Fix ESBJAVA-3645 Should not do this for multipart/related
                String trpContentType = (String) transportHeaders.get(HTTP.CONTENT_TYPE);
                // if content type is not found, setting the content type
                if (trpContentType == null) {
                    transportHeaders.put(HTTP.CONTENT_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_TEXT_XML + strCharSetEncoding);
                } else if (!trpContentType.contains(PassThroughConstants.CONTENT_TYPE_MULTIPART_RELATED)) {
                    transportHeaders.remove(HTTP.CONTENT_TYPE);
                    try {
                        // ESBJAVA-3447, Appending charset, if exist in property
                        ContentType contentType = new ContentType(trpContentType);
                        if (contentType.getParameter(HTTPConstants.CHAR_SET_ENCODING) != null) {
                            strCharSetEncoding = "; charset=" + contentType.getParameter(HTTPConstants.CHAR_SET_ENCODING);
                        }
                    } catch (ParseException e) {
                        log.warn("Error occurred while parsing ContentType header, using default: " + HTTPConstants.MEDIA_TYPE_TEXT_XML);
                    }
                    transportHeaders.put(HTTP.CONTENT_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_TEXT_XML + strCharSetEncoding);
                }
            }
        } else if (SynapseConstants.FORMAT_SOAP12.equals(endpoint.getFormat())) {
            axisOutMsgCtx.setDoingREST(false);
            axisOutMsgCtx.removeProperty(org.apache.axis2.Constants.Configuration.MESSAGE_TYPE);
            // We need to set this explicitly here in case the request was not a POST
            axisOutMsgCtx.setProperty(Constants.Configuration.HTTP_METHOD, Constants.Configuration.HTTP_METHOD_POST);
            if (axisOutMsgCtx.getSoapAction() == null && axisOutMsgCtx.getWSAAction() != null) {
                axisOutMsgCtx.setSoapAction(axisOutMsgCtx.getWSAAction());
            }
            if (axisOutMsgCtx.isSOAP11()) {
                SOAPUtils.convertSOAP11toSOAP12(axisOutMsgCtx);
            }
            Object o = axisOutMsgCtx.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
            Map transportHeaders = (Map) o;
            if (transportHeaders != null) {
                // Fix ESBJAVA-3645 Should not do this for multipart/related
                String trpContentType = (String) transportHeaders.get(HTTP.CONTENT_TYPE);
                // if content type is not found, setting the content type
                if (trpContentType == null) {
                    transportHeaders.put(HTTP.CONTENT_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_APPLICATION_SOAP_XML + strCharSetEncoding);
                } else if (!trpContentType.contains(PassThroughConstants.CONTENT_TYPE_MULTIPART_RELATED)) {
                    transportHeaders.remove(HTTP.CONTENT_TYPE);
                    try {
                        // ESBJAVA-3447, Appending charset, if exist in property
                        ContentType contentType = new ContentType(trpContentType);
                        if (contentType.getParameter(HTTPConstants.CHAR_SET_ENCODING) != null) {
                            strCharSetEncoding = "; charset=" + contentType.getParameter(HTTPConstants.CHAR_SET_ENCODING);
                        }
                    } catch (ParseException e) {
                        log.warn("Error occurred while parsing ContentType header in property, using default: " + HTTPConstants.MEDIA_TYPE_APPLICATION_SOAP_XML);
                    }
                    if (axisOutMsgCtx.getSoapAction() != null) {
                        String actionHeaderPrefix = ";action=\"";
                        String contentTypeWithAction = new StringBuilder(org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_APPLICATION_SOAP_XML.length() + axisOutMsgCtx.getSoapAction().length() + actionHeaderPrefix.length() + 1).append(org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_APPLICATION_SOAP_XML).append(actionHeaderPrefix).append(axisOutMsgCtx.getSoapAction()).append('\"').toString();
                        transportHeaders.put(HTTP.CONTENT_TYPE, contentTypeWithAction + strCharSetEncoding);
                    } else {
                        transportHeaders.put(HTTP.CONTENT_TYPE, org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_APPLICATION_SOAP_XML + strCharSetEncoding);
                    }
                }
            }
        } else if (SynapseConstants.FORMAT_REST.equals(endpoint.getFormat())) {
            /* Remove Message Type  for GET and DELETE Request */
            if (originalInMsgCtx.getProperty(Constants.Configuration.HTTP_METHOD) != null) {
                if (originalInMsgCtx.getProperty(Constants.Configuration.HTTP_METHOD).toString().equals(Constants.Configuration.HTTP_METHOD_GET) || originalInMsgCtx.getProperty(Constants.Configuration.HTTP_METHOD).toString().equals(Constants.Configuration.HTTP_METHOD_DELETE)) {
                    axisOutMsgCtx.removeProperty(org.apache.axis2.Constants.Configuration.MESSAGE_TYPE);
                }
            }
            axisOutMsgCtx.setDoingREST(true);
        } else {
            processWSDL2RESTRequestMessageType(originalInMsgCtx, axisOutMsgCtx);
        }
        if (endpoint.isUseMTOM()) {
            axisOutMsgCtx.setDoingMTOM(true);
            // fix / workaround for AXIS2-1798
            axisOutMsgCtx.setProperty(org.apache.axis2.Constants.Configuration.ENABLE_MTOM, org.apache.axis2.Constants.VALUE_TRUE);
            axisOutMsgCtx.setDoingMTOM(true);
        } else if (endpoint.isUseSwa()) {
            axisOutMsgCtx.setDoingSwA(true);
            // fix / workaround for AXIS2-1798
            axisOutMsgCtx.setProperty(org.apache.axis2.Constants.Configuration.ENABLE_SWA, org.apache.axis2.Constants.VALUE_TRUE);
            axisOutMsgCtx.setDoingSwA(true);
        }
        if (endpoint.getCharSetEncoding() != null) {
            axisOutMsgCtx.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, endpoint.getCharSetEncoding());
        }
        // HTTP Endpoint : use the specified HTTP method and remove REST_URL_POSTFIX, it's not supported in HTTP Endpoint
        if (endpoint.isHTTPEndpoint()) {
            axisOutMsgCtx.setProperty(Constants.Configuration.HTTP_METHOD, synapseOutMessageContext.getProperty(Constants.Configuration.HTTP_METHOD));
            axisOutMsgCtx.removeProperty(NhttpConstants.REST_URL_POSTFIX);
        }
        // add rest request' suffix URI
        String restSuffix = (String) axisOutMsgCtx.getProperty(NhttpConstants.REST_URL_POSTFIX);
        boolean isRest = SynapseConstants.FORMAT_REST.equals(endpoint.getFormat());
        if (!isRest && !endpoint.isForceSOAP11() && !endpoint.isForceSOAP12()) {
            isRest = isRequestRest(originalInMsgCtx);
        }
        if (endpoint.getAddress() != null) {
            String address = endpoint.getAddress(synapseOutMessageContext);
            if (isRest && restSuffix != null && !"".equals(restSuffix)) {
                String url = "";
                if (!address.endsWith("/") && !restSuffix.startsWith("/") && !restSuffix.startsWith("?")) {
                    url = address + "/" + restSuffix;
                } else if (address.endsWith("/") && restSuffix.startsWith("/")) {
                    url = address + restSuffix.substring(1);
                } else if (address.endsWith("/") && restSuffix.startsWith("?")) {
                    url = address.substring(0, address.length() - 1) + restSuffix;
                } else {
                    if (!address.startsWith("jms")) {
                        url = address + restSuffix;
                    } else {
                        url = address;
                    }
                }
                axisOutMsgCtx.setTo(new EndpointReference(url));
            } else {
                axisOutMsgCtx.setTo(new EndpointReference(address));
            }
            axisOutMsgCtx.setProperty(NhttpConstants.ENDPOINT_PREFIX, address);
            synapseOutMessageContext.setProperty(SynapseConstants.ENDPOINT_PREFIX, address);
        } else {
            // Supporting RESTful invocation
            if (isRest && restSuffix != null && !"".equals(restSuffix)) {
                EndpointReference epr = axisOutMsgCtx.getTo();
                if (epr != null) {
                    String address = epr.getAddress();
                    String url;
                    if (!address.endsWith("/") && !restSuffix.startsWith("/") && !restSuffix.startsWith("?")) {
                        url = address + "/" + restSuffix;
                    } else {
                        url = address + restSuffix;
                    }
                    axisOutMsgCtx.setTo(new EndpointReference(url));
                }
            }
        }
        if (endpoint.isUseSeparateListener()) {
            axisOutMsgCtx.getOptions().setUseSeparateListener(true);
        }
    } else {
        processWSDL2RESTRequestMessageType(originalInMsgCtx, axisOutMsgCtx);
    }
    // only put whttp:location for the REST (GET) requests, otherwise causes issues for POX messages
    if (axisOutMsgCtx.isDoingREST() && HTTPConstants.MEDIA_TYPE_X_WWW_FORM.equals(axisOutMsgCtx.getProperty(Constants.Configuration.MESSAGE_TYPE))) {
        if (axisOutMsgCtx.getProperty(WSDL2Constants.ATTR_WHTTP_LOCATION) == null && axisOutMsgCtx.getEnvelope().getBody().getFirstElement() != null) {
            axisOutMsgCtx.setProperty(WSDL2Constants.ATTR_WHTTP_LOCATION, axisOutMsgCtx.getEnvelope().getBody().getFirstElement().getQName().getLocalPart());
        }
    }
    if (wsAddressingEnabled) {
        if (wsAddressingVersion != null && SynapseConstants.ADDRESSING_VERSION_SUBMISSION.equals(wsAddressingVersion)) {
            axisOutMsgCtx.setProperty(AddressingConstants.WS_ADDRESSING_VERSION, AddressingConstants.Submission.WSA_NAMESPACE);
        } else if (wsAddressingVersion != null && SynapseConstants.ADDRESSING_VERSION_FINAL.equals(wsAddressingVersion)) {
            axisOutMsgCtx.setProperty(AddressingConstants.WS_ADDRESSING_VERSION, AddressingConstants.Final.WSA_NAMESPACE);
        }
        axisOutMsgCtx.setProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES, Boolean.FALSE);
    } else {
        axisOutMsgCtx.setProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES, Boolean.TRUE);
    }
    // remove the headers if we don't need to preserve them.
    // determine weather we need to preserve the processed headers
    String preserveHeaderProperty = (String) synapseOutMessageContext.getProperty(SynapseConstants.PRESERVE_PROCESSED_HEADERS);
    if (preserveHeaderProperty == null || !Boolean.parseBoolean(preserveHeaderProperty)) {
        // default behaviour is to remove the headers
        MessageHelper.removeProcessedHeaders(axisOutMsgCtx, (preserveAddressingProperty != null && Boolean.parseBoolean(preserveAddressingProperty)));
    }
    ConfigurationContext axisCfgCtx = axisOutMsgCtx.getConfigurationContext();
    AxisConfiguration axisCfg = axisCfgCtx.getAxisConfiguration();
    AxisService anoymousService = AnonymousServiceFactory.getAnonymousService(synapseOutMessageContext.getConfiguration(), axisCfg, wsAddressingEnabled, wsRMEnabled, wsSecurityEnabled);
    // mark the anon services created to be used in the client side of synapse as hidden
    // from the server side of synapse point of view
    anoymousService.getParent().addParameter(SynapseConstants.HIDDEN_SERVICE_PARAM, "true");
    ServiceGroupContext sgc = new ServiceGroupContext(axisCfgCtx, (AxisServiceGroup) anoymousService.getParent());
    ServiceContext serviceCtx = sgc.getServiceContext(anoymousService);
    boolean outOnlyMessage = "true".equals(synapseOutMessageContext.getProperty(SynapseConstants.OUT_ONLY));
    // get a reference to the DYNAMIC operation of the Anonymous Axis2 service
    AxisOperation axisAnonymousOperation = anoymousService.getOperation(outOnlyMessage ? new QName(AnonymousServiceFactory.OUT_ONLY_OPERATION) : new QName(AnonymousServiceFactory.OUT_IN_OPERATION));
    Options clientOptions = MessageHelper.cloneOptions(originalInMsgCtx.getOptions());
    clientOptions.setUseSeparateListener(separateListener);
    // if security is enabled,
    if (wsSecurityEnabled) {
        // if a WS-Sec policy is specified, use it
        if (wsSecPolicyKey != null) {
            if (endpoint.isDynamicPolicy()) {
                wsSecPolicyKey = endpoint.evaluateDynamicEndpointSecurityPolicy(synapseOutMessageContext);
            }
            clientOptions.setProperty(SynapseConstants.RAMPART_POLICY, MessageHelper.getPolicy(synapseOutMessageContext, wsSecPolicyKey));
        } else {
            if (inboundWsSecPolicyKey != null) {
                clientOptions.setProperty(SynapseConstants.RAMPART_IN_POLICY, MessageHelper.getPolicy(synapseOutMessageContext, inboundWsSecPolicyKey));
            }
            if (outboundWsSecPolicyKey != null) {
                clientOptions.setProperty(SynapseConstants.RAMPART_OUT_POLICY, MessageHelper.getPolicy(synapseOutMessageContext, outboundWsSecPolicyKey));
            }
        }
        // temporary workaround for https://issues.apache.org/jira/browse/WSCOMMONS-197
        if (axisOutMsgCtx.getEnvelope().getHeader() == null) {
            SOAPFactory fac = axisOutMsgCtx.isSOAP11() ? OMAbstractFactory.getSOAP11Factory() : OMAbstractFactory.getSOAP12Factory();
            fac.createSOAPHeader(axisOutMsgCtx.getEnvelope());
        }
    }
    OperationClient mepClient = axisAnonymousOperation.createClient(serviceCtx, clientOptions);
    mepClient.addMessageContext(axisOutMsgCtx);
    axisOutMsgCtx.setAxisMessage(axisAnonymousOperation.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE));
    // set the SEND_TIMEOUT for transport sender
    if (endpoint != null && endpoint.getEffectiveTimeout() > 0) {
        if (!endpoint.isDynamicTimeoutEndpoint()) {
            axisOutMsgCtx.setProperty(SynapseConstants.SEND_TIMEOUT, endpoint.getEffectiveTimeout());
        } else {
            axisOutMsgCtx.setProperty(SynapseConstants.SEND_TIMEOUT, endpoint.evaluateDynamicEndpointTimeout(synapseOutMessageContext));
        }
    }
    // always set a callback as we decide if the send it blocking or non blocking within
    // the MEP client. This does not cause an overhead, as we simply create a 'holder'
    // object with a reference to the outgoing synapse message context
    // synapseOutMessageContext
    AsyncCallback callback = new AsyncCallback(axisOutMsgCtx, synapseOutMessageContext);
    if (!outOnlyMessage) {
        if (endpoint != null) {
            // TimeoutHandler can detect timed out callbacks and take appropriate action.
            if (!endpoint.isDynamicTimeoutEndpoint()) {
                long endpointTimeout = endpoint.getEffectiveTimeout();
                callback.setTimeout(endpointTimeout);
                callback.setTimeOutAction(endpoint.getTimeoutAction());
                callback.setTimeoutType(endpoint.getEndpointTimeoutType());
                if (log.isDebugEnabled()) {
                    log.debug("Setting Timeout for endpoint : " + getEndpointLogMessage(synapseOutMessageContext, axisOutMsgCtx) + " to static timeout value : " + endpointTimeout);
                }
            } else {
                long endpointTimeout = endpoint.evaluateDynamicEndpointTimeout(synapseOutMessageContext);
                callback.setTimeout(endpointTimeout);
                callback.setTimeOutAction(endpoint.getTimeoutAction());
                callback.setTimeoutType(endpoint.getEndpointTimeoutType());
                if (log.isDebugEnabled()) {
                    log.debug("Setting Timeout for endpoint : " + getEndpointLogMessage(synapseOutMessageContext, axisOutMsgCtx) + " to dynamic timeout value : " + endpointTimeout);
                }
            }
        } else {
            long globalTimeout = synapseOutMessageContext.getEnvironment().getGlobalTimeout();
            callback.setTimeout(globalTimeout);
            callback.setTimeoutType(SynapseConstants.ENDPOINT_TIMEOUT_TYPE.GLOBAL_TIMEOUT);
            if (log.isDebugEnabled()) {
                log.debug("Setting timeout for implicit endpoint : " + getEndpointLogMessage(synapseOutMessageContext, axisOutMsgCtx) + " to global timeout value of " + globalTimeout);
            }
        }
    }
    mepClient.setCallback(callback);
    // HTTP 1.1 messages and HTTP 1.0 require the whole message to caculate the content length
    if (originalInMsgCtx.isPropertyTrue(NhttpConstants.FORCE_HTTP_1_0)) {
        synapseOutMessageContext.getEnvelope().toString();
    }
    // with the nio transport, this causes the listener not to write a 202
    // Accepted response, as this implies that Synapse does not yet know if
    // a 202 or 200 response would be written back.
    originalInMsgCtx.getOperationContext().setProperty(org.apache.axis2.Constants.RESPONSE_WRITTEN, "SKIP");
    // if the transport out is explicitly set use it
    Object o = originalInMsgCtx.getProperty("TRANSPORT_OUT_DESCRIPTION");
    if (o != null && o instanceof TransportOutDescription) {
        axisOutMsgCtx.setTransportOut((TransportOutDescription) o);
        clientOptions.setTransportOut((TransportOutDescription) o);
        clientOptions.setProperty("TRANSPORT_OUT_DESCRIPTION", o);
    }
    // clear the message context properties related to endpoint in last service invocation
    Set keySet = synapseOutMessageContext.getPropertyKeySet();
    if (keySet != null) {
        keySet.remove(EndpointDefinition.DYNAMIC_URL_VALUE);
    }
    // throttling count for OUT_ONLY messages
    if (outOnlyMessage) {
        Boolean isConcurrencyThrottleEnabled = (Boolean) synapseOutMessageContext.getProperty(SynapseConstants.SYNAPSE_CONCURRENCY_THROTTLE);
        if (isConcurrencyThrottleEnabled != null && isConcurrencyThrottleEnabled) {
            ConcurrentAccessController concurrentAccessController = (ConcurrentAccessController) synapseOutMessageContext.getProperty(SynapseConstants.SYNAPSE_CONCURRENT_ACCESS_CONTROLLER);
            int available = concurrentAccessController.incrementAndGet();
            int concurrentLimit = concurrentAccessController.getLimit();
            if (log.isDebugEnabled()) {
                log.debug("Concurrency Throttle : Connection returned" + " :: " + available + " of available of " + concurrentLimit + " connections");
            }
            ConcurrentAccessReplicator concurrentAccessReplicator = (ConcurrentAccessReplicator) synapseOutMessageContext.getProperty(SynapseConstants.SYNAPSE_CONCURRENT_ACCESS_REPLICATOR);
            String throttleKey = (String) synapseOutMessageContext.getProperty(SynapseConstants.SYNAPSE_CONCURRENCY_THROTTLE_KEY);
            if (concurrentAccessReplicator != null) {
                concurrentAccessReplicator.replicate(throttleKey, true);
            }
        }
    }
    mepClient.execute(true);
}
Also used : AxisConfiguration(org.apache.axis2.engine.AxisConfiguration) Options(org.apache.axis2.client.Options) Set(java.util.Set) ContentType(javax.mail.internet.ContentType) AxisOperation(org.apache.axis2.description.AxisOperation) AxisService(org.apache.axis2.description.AxisService) SOAPFactory(org.apache.axiom.soap.SOAPFactory) ConcurrentAccessController(org.apache.synapse.commons.throttle.core.ConcurrentAccessController) MessageContext(org.apache.axis2.context.MessageContext) TransportOutDescription(org.apache.axis2.description.TransportOutDescription) ConfigurationContext(org.apache.axis2.context.ConfigurationContext) OperationClient(org.apache.axis2.client.OperationClient) ServiceContext(org.apache.axis2.context.ServiceContext) QName(javax.xml.namespace.QName) EndpointReference(org.apache.axis2.addressing.EndpointReference) ConcurrentAccessReplicator(org.apache.synapse.commons.throttle.core.ConcurrentAccessReplicator) ServiceGroupContext(org.apache.axis2.context.ServiceGroupContext) ParseException(javax.mail.internet.ParseException) Map(java.util.Map)

Aggregations

AxisConfiguration (org.apache.axis2.engine.AxisConfiguration)16 SynapseConfiguration (org.apache.synapse.config.SynapseConfiguration)15 OMElement (org.apache.axiom.om.OMElement)13 ConfigurationContext (org.apache.axis2.context.ConfigurationContext)13 Parameter (org.apache.axis2.description.Parameter)11 SynapseEnvironment (org.apache.synapse.core.SynapseEnvironment)10 URI (java.net.URI)9 Axis2SynapseEnvironment (org.apache.synapse.core.axis2.Axis2SynapseEnvironment)9 Test (org.junit.Test)9 EndpointReference (org.apache.axis2.addressing.EndpointReference)8 URI (org.apache.axis2.databinding.types.URI)7 IOException (java.io.IOException)5 SynapseException (org.apache.synapse.SynapseException)5 MalformedURLException (java.net.MalformedURLException)4 Calendar (java.util.Calendar)4 HumanTaskRuntimeException (org.wso2.carbon.humantask.core.engine.runtime.api.HumanTaskRuntimeException)4 InputStream (java.io.InputStream)3 URISyntaxException (java.net.URISyntaxException)3 URL (java.net.URL)3 HashMap (java.util.HashMap)3