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}