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    }