001package org.hl7.fhir.validation.cli.utils;
002
003import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
004import static org.apache.commons.lang3.StringUtils.left;
005
006/*
007  Copyright (c) 2011+, HL7, Inc.
008  All rights reserved.
009  
010  Redistribution and use in source and binary forms, with or without modification, 
011  are permitted provided that the following conditions are met:
012    
013   * Redistributions of source code must retain the above copyright notice, this 
014     list of conditions and the following disclaimer.
015   * Redistributions in binary form must reproduce the above copyright notice, 
016     this list of conditions and the following disclaimer in the documentation 
017     and/or other materials provided with the distribution.
018   * Neither the name of HL7 nor the names of its contributors may be used to 
019     endorse or promote products derived from this software without specific 
020     prior written permission.
021  
022  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
023  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
024  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
025  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
026  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
027  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
028  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
029  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
030  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
031  POSSIBILITY OF SUCH DAMAGE.
032  
033 */
034
035
036import java.io.InputStream;
037import java.time.Duration;
038import java.util.Date;
039import java.util.Properties;
040
041import org.hl7.fhir.r5.model.InstantType;
042import org.hl7.fhir.utilities.Utilities;
043
044/**
045 * Used internally by HAPI to log the version of the HAPI FHIR framework
046 * once, when the framework is first loaded by the classloader.
047 */
048public class VersionUtil {
049
050  private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ca.uhn.fhir.util.VersionUtil.class);
051  private static String ourVersion;
052  private static String ourBuildNumber;
053  private static String ourBuildTime;
054
055  static {
056    initialize();
057  }
058
059  public static String getBuildNumber() {
060    return ourBuildNumber;
061  }
062
063  public static String getBuildTime() {
064    return ourBuildTime;
065  }
066
067  public static String getVersion() {
068    return ourVersion;
069  }
070
071  private static void initialize() {
072    try (InputStream is = ca.uhn.fhir.util.VersionUtil.class.getResourceAsStream("/fhir-build.properties")) {
073
074      Properties p = new Properties();
075      if (is != null) {
076        p.load(is);
077      }
078
079      ourVersion = p.getProperty("orgfhir.version");
080      ourVersion = defaultIfBlank(ourVersion, "(unknown)");
081
082      ourBuildNumber = p.getProperty("orgfhir.buildnumber");
083      ourBuildTime = p.getProperty("orgfhir.timestamp");
084
085    } catch (Exception e) {
086      ourLog.warn("Unable to determine version information", e);
087    }
088  }
089
090  public static String getVersionString() {
091    return "Version " + getVersion() + " (Git# " + left(getBuildNumber(), 12)+"). Built " + getBuildTime() + " ("+getDurationSinceBuild()+")";
092  }
093
094  private static String getDurationSinceBuild() {
095    try {
096      InstantType dt = new InstantType(ourBuildTime);
097      return Utilities.describeDuration(Duration.ofMillis(new Date().getTime() - dt.getValue().getTime()))+" old";
098    } catch (Exception e) {
099      return "??";
100    }
101  }
102
103
104}