    001    // Copyright 2007, 2008, 2011 The Apache Software Foundation
    002    //
    003    // Licensed under the Apache License, Version 2.0 (the "License");
    004    // you may not use this file except in compliance with the License.
    005    // You may obtain a copy of the License at
    006    //
    007    //     http://www.apache.org/licenses/LICENSE-2.0
    008    //
    009    // Unless required by applicable law or agreed to in writing, software
    010    // distributed under the License is distributed on an "AS IS" BASIS,
    011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012    // See the License for the specific language governing permissions and
    013    // limitations under the License.
    014
    015    package org.apache.tapestry5;
    016
    017    import java.io.BufferedInputStream;
    018    import java.io.IOException;
    019    import java.io.InputStream;
    020    import java.util.Properties;
    021
    022    /**
    023     * Utility methods related to managing framework version numbers.
    024     */
    025    public class VersionUtils
    026    {
    027
    028        /**
    029         * Reads a version number from a properties file on the classpath.  These files are generally created by Gradle.  For
    030         * example, tapestry-core's properties file is <code>META-INF/gradle/org.apache.tapestry/tapestry-core/pom.properties</code>.
    031         * The Gradle generated properties files include the version and possibly others properties.
    032         * <p/>
    033         * The resource is located using the Thread's context class loader.
    034         *
    035         * @param resourcePath the complete path to the resource, including a leading slash.
    036         * @return the version number read from the properties file, or "UNKNOWN" if the version number is not present or
    037         *         the file can not be opened
    038         */
    039        public static String readVersionNumber(String resourcePath)
    040        {
    041            String result = "UNKNOWN";
    042
    043            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(
    044                    resourcePath);
    045
    046
    047            if (stream != null)
    048            {
    049                Properties properties = new Properties();
    050
    051
    052                try
    053                {
    054                    stream = new BufferedInputStream(stream);
    055
    056                    properties.load(stream);
    057                }
    058                catch (IOException ex)
    059                {
    060                    // Just ignore it.
    061                }
    062
    063                String version = properties.getProperty("version");
    064
    065                // Since the file, if it exists, is created by Gradle and will have the key, I can't see
    066                // how version would EVER be null, unless there's a problem reading the properties.
    067
    068                if (version != null) result = version;
    069            }
    070
    071            return result;
    072        }
    073    }