/*
 *  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.asyncweb.server.resolver;

import org.apache.asyncweb.common.HttpRequest;

/**
 * Resolves the name of the <code>HttpService</code> to be used to
 * service a request.
 *
 */
public interface ServiceResolver {

    /**
     * Determines the name of the <code>HttpService</code> to be employed
     * to service a given <code>HttpRequest</code>.<br/>
     *
     * If no service can be resolved for the specified request, this method
     * should return <code>null</code>.
     *
     * @param request  The request for which a service name is required
     * @return         The name of the <code>HttpService</code> which
     *                 should be used to service the request, or
     *                 <code>null</code> if no appropriate service can be
     *                 found
     */
    public String resolveService(HttpRequest request);

}
