/*
 * 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.taglibs.standard;

/**
 * [lifted from xalan]
 * <meta name="usage" content="general"/>
 * Administrative class to keep track of the version number of
 * the standard tag library.
 * <P>This class implements the upcoming standard of having
 * org.apache.project-name.Version.getVersion() be a standard way
 * to get version information.
 */
public class Version {
    /**
     * Get the basic version string for the current release.
     * Version String formatted like
     * <CODE>"<B>standard-taglib</B> v.r[.dd| <B>D</B>nn]"</CODE>.
     * <p>Futurework: have this read version info from jar manifest.
     *
     * @return String denoting our current version
     */
    public static String getVersion() {
        return getProduct() + " " +
                getMajorVersionNum() + "." + getReleaseVersionNum() + "." +
                getMaintenanceVersionNum() +
                ((getDevelopmentVersionNum() > 0) ?
                        ("_D" + getDevelopmentVersionNum()) : "");
    }

    /**
     * Print the processor version to the command line.
     *
     * @param argv command line arguments, unused.
     */
    public static void main(String argv[]) {
        System.out.println(getVersion());
    }

    /**
     * Name of product
     */
    public static String getProduct() {
        return "standard-taglib";
    }

    /**
     * Major version number.
     * Version number. This changes only when there is a
     * significant, externally apparent enhancement from
     * the previous release. 'n' represents the n'th
     * version.
     * <p>Clients should carefully consider the implications
     * of new versions as external interfaces and behaviour
     * may have changed.
     */
    public static int getMajorVersionNum() {
        return 1;
    }

    /**
     * Release Number.
     * Release number. This changes when:
     * -  a new set of functionality is to be added, eg,
     * implementation of a new W3C specification.
     * -  API or behaviour change.
     * -  its designated as a reference release.
     */
    public static int getReleaseVersionNum() {
        return 2;
    }

    /**
     * Maintenance Drop Number.
     * Optional identifier used to designate maintenance
     * drop applied to a specific release and contains
     * fixes for defects reported. It maintains compatibility
     * with the release and contains no API changes.
     * When missing, it designates the final and complete
     * development drop for a release.
     */
    public static int getMaintenanceVersionNum() {
        // TODO: BZ 57548: Make this autogenerated by Maven, or read from "Implementation-Version"
        // of Manifest. Note that there is a test class that has to be kept in sync (VersionTest).
        return 5;
    }

    /**
     * Development Drop Number.
     * Optional identifier designates development drop of
     * a specific release. D01 is the first development drop
     * of a new release.
     * <p>Development drops are works in progress towards a
     * compeleted, final release. A specific development drop
     * may not completely implement all aspects of a new
     * feature, which may take several development drops to
     * complete. At the point of the final drop for the
     * release, the D suffix will be omitted.
     * <p>Each 'D' drops can contain functional enhancements as
     * well as defect fixes. 'D' drops may not be as stable as
     * the final releases.
     */
    public static int getDevelopmentVersionNum() {
        return 0;
    }
}
