/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */


package org.apache.axis2.dispatchers;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.AxisEndpoint;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.HandlerDescription;
import org.apache.axis2.description.WSDL2Constants;
import org.apache.axis2.engine.AbstractDispatcher;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

/**
 * Dispatches the operation based on the information from the target endpoint URL.
 */
public class HTTPLocationBasedDispatcher extends AbstractDispatcher {

    public static final String NAME = "HTTPLocationBasedDispatcher";
    private static final Log log = LogFactory.getLog(HTTPLocationBasedDispatcher.class);

    /*
     *  (non-Javadoc)
     * @see org.apache.axis2.engine.AbstractDispatcher#findOperation(org.apache.axis2.description.AxisService, org.apache.axis2.context.MessageContext)
     */
    public AxisOperation findOperation(AxisService service, MessageContext messageContext)
            throws AxisFault {

        AxisService axisService = messageContext.getAxisService();
        if (axisService != null && messageContext.getTo() != null) {
            String uri = messageContext.getTo().getAddress();
            String httpLocation = parseRequestURL(uri, axisService.getName());
            String httpMethod = (String) messageContext.getProperty(HTTPConstants.HTTP_METHOD);

            if (httpLocation != null) {
                httpLocation = httpMethod + httpLocation;
                if(! httpLocation.endsWith("/")){
                     httpLocation=httpLocation.concat("/");
                }
                AxisEndpoint axisEndpoint = (AxisEndpoint) messageContext
                        .getProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME);
                // Here we check whether the request was dispatched to the correct endpoint. If it
                // was we can dispatch the operation using the HTTPLocationDispatcher table of that
                // specific endpoint. 
                if (axisEndpoint != null) {
                    Map httpLocationTable = (Map) axisEndpoint.getBinding()
                            .getProperty(WSDL2Constants.HTTP_LOCATION_TABLE);
                    if (httpLocationTable != null) {
                        return getOperationFromHTTPLocation(httpLocation, httpLocationTable);
                    }
                } 
            } else {
                log.debug("Attempt to check for Operation using HTTP Location failed");
                return null;
            }
        }
        return null;
    }

    /*
     *  (non-Javadoc)
     * @see org.apache.axis2.engine.AbstractDispatcher#findService(org.apache.axis2.context.MessageContext)
     */
    public AxisService findService(MessageContext messageContext) throws AxisFault {
        // This Dispatcher does not need to resolve the service, as that is handled
        // by the RequestURIBasedDispatcher.
        return null;
    }

    public void initDispatcher() {
        init(new HandlerDescription(NAME));
    }

    private String parseRequestURL(String path, String serviceName) {

        serviceName = "/" + serviceName;
        int index = path.lastIndexOf(serviceName);
        String httpLocation = null;

        if (-1 != index) {
            int serviceStart = index + serviceName.length();
            if (path.length() > serviceStart + 1) {
                httpLocation = path.substring(serviceStart);
            }
        }

        if (httpLocation != null) {
            index = httpLocation.indexOf("/");
            if (-1 != index) {
                httpLocation = httpLocation.substring(index);
            } else {
                int queryIndex = httpLocation.indexOf("?");
                if (queryIndex != -1) {
                    httpLocation = httpLocation.substring(queryIndex);
                }
            }
        }
        return httpLocation;
    }

    /**
     * Given the requestPath that the request came to his method returns the corresponding axisOperation
     *
     * @param requestPath - Part of the request url which is the part after the service name
     * @param httpLocationTable - The httpLocationTable stored in the relavant binding
     * @return AxisOperation - The corresponding AxisOperation
     */
    private AxisOperation getOperationFromHTTPLocation(String requestPath, Map httpLocationTable) {

        Collection httpLocations = httpLocationTable.keySet();
        Iterator iter = httpLocations.iterator();
        while (iter.hasNext()) {
            String location = (String) iter.next();
            int index = requestPath.indexOf(location);
            if (index == 0) {
                return (AxisOperation) httpLocationTable.get(location);
            }

        }
        return null;
    }
}
