void process()

in modules/core/src/main/java/org/apache/synapse/rest/API.java [248:363]


    void process(MessageContext synCtx) {
        if (log.isDebugEnabled()) {
            log.debug("Processing message with ID: " + synCtx.getMessageID() + " through the " +
                    "API: " + name);
        }

        synCtx.setProperty(RESTConstants.SYNAPSE_REST_API, getName());
        synCtx.setProperty(RESTConstants.SYNAPSE_REST_API_VERSION, versionStrategy.getVersion());
        synCtx.setProperty(RESTConstants.REST_API_CONTEXT, context);

        // Remove the API context part from the REST_URL_POSTFIX
        String restURLPostfix = (String) ((Axis2MessageContext) synCtx).getAxis2MessageContext().
                getProperty(NhttpConstants.REST_URL_POSTFIX);
        if (restURLPostfix != null) {
            if (!restURLPostfix.startsWith("/")) {
                restURLPostfix = "/" + restURLPostfix;
            }
            if (restURLPostfix.startsWith(context)) {
                restURLPostfix = restURLPostfix.substring(context.length());
            }
            if (versionStrategy instanceof URLBasedVersionStrategy) {
                String version = versionStrategy.getVersion();
                if (restURLPostfix.startsWith(version)) {
                    restURLPostfix = restURLPostfix.substring(version.length());
                } else if (restURLPostfix.startsWith("/" + version)) {
                    restURLPostfix = restURLPostfix.substring(version.length() + 1);
                }
            }
            ((Axis2MessageContext) synCtx).getAxis2MessageContext().
                    setProperty(NhttpConstants.REST_URL_POSTFIX,restURLPostfix);
        }

        for (Handler handler : handlers) {
            if (log.isDebugEnabled()) {
                log.debug("Processing message with ID: " + synCtx.getMessageID() + " through " +
                        "handler: " + handler.getClass().getName());
            }

            boolean proceed;
            if (synCtx.isResponse()) {
                proceed = handler.handleResponse(synCtx);
            } else {
                proceed = handler.handleRequest(synCtx);
            }

            if (!proceed) {
                return;
            }
        }

        if (synCtx.isResponse()) {
            String resourceName = (String) synCtx.getProperty(RESTConstants.SYNAPSE_RESOURCE);
            if (resourceName != null) {
                Resource resource = resources.get(resourceName);
                if (resource != null) {
                    resource.process(synCtx);
                }
            } else if (log.isDebugEnabled()) {
                log.debug("No resource information on the response: " + synCtx.getMessageID());
            }
            return;
        }


        String path = RESTUtils.getFullRequestPath(synCtx);
        String subPath;
        if (versionStrategy.getVersionType().equals(VersionStrategyFactory.TYPE_URL)) {
            //for URL based
            //request --> http://{host:port}/context/version/path/to/resource
            subPath = path.substring(context.length() + versionStrategy.getVersion().length() + 1);
        } else {
            subPath = path.substring(context.length());
        }
        if ("".equals(subPath)) {
            subPath = "/";
        }
        synCtx.setProperty(RESTConstants.REST_SUB_REQUEST_PATH, subPath);

        org.apache.axis2.context.MessageContext msgCtx =
                        ((Axis2MessageContext) synCtx).getAxis2MessageContext();
        String hostHeader = getHostHeader(msgCtx);
        if (hostHeader != null) {
            synCtx.setProperty(RESTConstants.REST_URL_PREFIX,
                    msgCtx.getIncomingTransportName() + "://" + hostHeader);
        }

        Set<Resource> acceptableResources = new HashSet<Resource>();
        for (Resource r : resources.values()) {
            if (r.canProcess(synCtx)) {
                acceptableResources.add(r);
            }
        }

        boolean processed = false;
        if (!acceptableResources.isEmpty()) {
            for (RESTDispatcher dispatcher : RESTUtils.getDispatchers()) {
                Resource resource = dispatcher.findResource(synCtx, acceptableResources);
                if (resource != null) {
                    resource.process(synCtx);
                    processed = true;
                    break;
                }
            }
        }

        if (!processed) {
            if (log.isDebugEnabled()) {
                log.debug("No matching resource was found for the request: " + synCtx.getMessageID());
            }

            Mediator sequence = synCtx.getSequence(RESTConstants.NO_MATCHING_RESOURCE_HANDLER);
            if (sequence != null) {
                sequence.mediate(synCtx);
            }
        }
    }