/*
 *   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.directory.server.integration.http;


import java.io.File;


/**
 * A class to configure a web application 
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class WebApp
{

    /** complete path name of a war file */
    private String warFile;

    /** context path of this web application, defaults to the war file's name */
    private String contextPath;


    public String getWarFile()
    {
        return warFile;
    }


    public String getContextPath()
    {
        if ( contextPath != null )
        {
            return contextPath;
        }

        String fileName = new File( warFile ).getName();

        return fileName.substring( 0, fileName.lastIndexOf( '.' ) );
    }


    public void setWarFile( String warFile )
    {
        this.warFile = warFile;
    }


    public void setContextPath( String contextPath )
    {
        this.contextPath = contextPath;
    }

}
