    001    /*
    002     * Copyright (c) 2007-2014 Concurrent, Inc. All Rights Reserved.
    003     *
    004     * Project and contact information: http://www.cascading.org/
    005     *
    006     * This file is part of the Cascading project.
    007     *
    008     * Licensed under the Apache License, Version 2.0 (the "License");
    009     * you may not use this file except in compliance with the License.
    010     * You may obtain a copy of the License at
    011     *
    012     *     http://www.apache.org/licenses/LICENSE-2.0
    013     *
    014     * Unless required by applicable law or agreed to in writing, software
    015     * distributed under the License is distributed on an "AS IS" BASIS,
    016     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017     * See the License for the specific language governing permissions and
    018     * limitations under the License.
    019     */
    020
    021    package cascading.util;
    022
    023    import java.io.IOException;
    024    import java.io.InputStream;
    025    import java.util.Properties;
    026
    027    import org.slf4j.Logger;
    028    import org.slf4j.LoggerFactory;
    029
    030    /**
    031     *
    032     */
    033    public class Version
    034      {
    035      private static final Logger LOG = LoggerFactory.getLogger( Version.class );
    036
    037      private static boolean printedVersion = false;
    038
    039      public static final String CASCADING_RELEASE_MAJOR = "cascading.release.major";
    040      public static final String CASCADING_RELEASE_MINOR = "cascading.release.minor";
    041      public static final String CASCADING_BUILD_NUMBER = "cascading.build.number";
    042      public static final String CASCADING = "Cascading";
    043
    044      public static Properties versionProperties;
    045
    046      private static synchronized Properties getVersionProperties()
    047        {
    048        try
    049          {
    050          if( versionProperties == null )
    051            {
    052            versionProperties = loadVersionProperties();
    053
    054            if( versionProperties.isEmpty() )
    055              LOG.warn( "unable to load version information" );
    056            }
    057          }
    058        catch( IOException exception )
    059          {
    060          LOG.warn( "unable to load version information", exception );
    061          versionProperties = new Properties();
    062          }
    063
    064        return versionProperties;
    065        }
    066
    067      public static synchronized void printBanner()
    068        {
    069        // only print once
    070        if( printedVersion )
    071          return;
    072
    073        printedVersion = true;
    074
    075        String version = getVersionString();
    076
    077        if( version != null )
    078          LOG.info( version );
    079        }
    080
    081      public static String getVersionString()
    082        {
    083        if( getVersionProperties().isEmpty() )
    084          return null;
    085
    086        String releaseVersion;
    087
    088        if( getReleaseBuild() == null || getReleaseBuild().isEmpty() )
    089          releaseVersion = String.format( "Concurrent, Inc - %s %s", CASCADING, getReleaseFull() );
    090        else
    091          releaseVersion = String.format( "Concurrent, Inc - %s %s-%s", CASCADING, getReleaseFull(), getReleaseBuild() );
    092
    093        return releaseVersion;
    094        }
    095
    096      public static String getRelease()
    097        {
    098        if( getVersionProperties().isEmpty() )
    099          return null;
    100
    101        if( getReleaseBuild() == null || getReleaseBuild().isEmpty() )
    102          return String.format( "%s", getReleaseFull() );
    103        else
    104          return String.format( "%s-%s", getReleaseFull(), getReleaseBuild() );
    105        }
    106
    107      public static String getReleaseFull()
    108        {
    109        String releaseFull;
    110
    111        if( getReleaseMinor() == null || getReleaseMinor().isEmpty() )
    112          releaseFull = getReleaseMajor();
    113        else
    114          releaseFull = String.format( "%s.%s", getReleaseMajor(), getReleaseMinor() );
    115
    116        return releaseFull;
    117        }
    118
    119      public static boolean hasMajorMinorVersionInfo()
    120        {
    121        return !Util.isEmpty( getReleaseMinor() ) && !Util.isEmpty( getReleaseMajor() );
    122        }
    123
    124      public static boolean hasAllVersionInfo()
    125        {
    126        return !Util.isEmpty( getReleaseBuild() ) && hasMajorMinorVersionInfo();
    127        }
    128
    129      public static String getReleaseBuild()
    130        {
    131        return getVersionProperties().getProperty( CASCADING_BUILD_NUMBER );
    132        }
    133
    134      public static String getReleaseMinor()
    135        {
    136        return getVersionProperties().getProperty( CASCADING_RELEASE_MINOR );
    137        }
    138
    139      public static String getReleaseMajor()
    140        {
    141        return getVersionProperties().getProperty( CASCADING_RELEASE_MAJOR );
    142        }
    143
    144      public static Properties loadVersionProperties() throws IOException
    145        {
    146        Properties properties = new Properties();
    147
    148        InputStream stream = Version.class.getClassLoader().getResourceAsStream( "cascading/version.properties" );
    149
    150        if( stream == null )
    151          return properties;
    152
    153        try
    154          {
    155          properties.load( stream );
    156          }
    157        finally
    158          {
    159          stream.close();
    160          }
    161
    162        stream = Version.class.getClassLoader().getResourceAsStream( "cascading/build.number.properties" );
    163
    164        if( stream != null )
    165          {
    166          try
    167            {
    168            properties.load( stream );
    169            }
    170          finally
    171            {
    172            stream.close();
    173            }
    174          }
    175
    176        return properties;
    177        }
    178      }