    001// Copyright 2007-2013 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
    015package org.apache.tapestry5;
    016
    017import java.io.BufferedInputStream;
    018import java.io.IOException;
    019import java.io.InputStream;
    020import java.util.Properties;
    021
    022/**
    023 * Utility methods related to managing framework version numbers.
    024 */
    025public 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                stream.close();
    059            }
    060            catch (IOException ex)
    061            {
    062                // Just ignore it.
    063            }
    064
    065            String version = properties.getProperty("version");
    066
    067            // Since the file, if it exists, is created by Gradle and will have the key, I can't see
    068            // how version would EVER be null, unless there's a problem reading the properties.
    069
    070            if (version != null) result = version;
    071        }
    072
    073        return result;
    074    }
    075}