package org.openslx.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
import org.apache.log4j.Logger;
public class AppUtil
{
private static final int PROPERTY_MAX_WIDTH = 30;
private static final String MANIFEST_REVISION_VERSION = "Revision-Version";
private static final String MANIFEST_REVISION_BRANCH = "Revision-Branch";
private static final String MANIFEST_BUILD_TIMESTAMP = "Build-Timestamp";
private static final String MANIFEST_BUILD_JDK = "Build-Jdk";
private static final String PROPERTY_APP_NAME = "app.name";
private static final String PROPERTY_APP_VERSION = "app.version";
private static final String PROPERTY_APP_REVISION_VERSION = "app.revision.version";
private static final String PROPERTY_APP_REVISION_BRANCH = "app.revision.branch";
private static final String PROPERTY_APP_BUILD_DATE = "app.build.date";
private static final String PROPERTY_APP_BUILD_JDK = "app.build.jdk";
private static final String PROPERTY_JAVA_OS_NAME = "os.name";
private static final String PROPERTY_JAVA_SPEC_VENDOR = "java.specification.vendor";
private static final String PROPERTY_JAVA_SPEC_NAME = "java.specification.name";
private static final String PROPERTY_JAVA_SPEC_VERSION = "java.specification.version";
private static final String PROPERTY_JAVA_VERSION = "java.version";
private static final String PROPERTY_JAVA_VERSION_VM = "java.vm.version";
private static final String PROPERTY_JAVA_VERSION_RUNTIME = "java.runtime.version";
private static String getManifestValue( final String entry )
{
File jarFile = null;
InputStream jarFileStream = null;
JarInputStream jarStream = null;
String value = null;
try {
final String jarFilename = AppUtil.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
jarFile = new File( jarFilename );
jarFileStream = new FileInputStream( jarFile );
jarStream = new JarInputStream( jarFileStream );
final Manifest mf = jarStream.getManifest();
value = mf.getMainAttributes().getValue( entry );
} catch ( URISyntaxException | IOException e ) {
return value;
} finally {
Util.safeClose( jarStream );
Util.safeClose( jarFileStream );
}
return value;
}
public static String getRevisionVersion()
{
return AppUtil.getManifestValue( AppUtil.MANIFEST_REVISION_VERSION );
}
public static String getRevisionBranch()
{
return AppUtil.getManifestValue( AppUtil.MANIFEST_REVISION_BRANCH );
}
public static long getBuildTimestamp()
{
final String timestampRaw = AppUtil.getManifestValue( AppUtil.MANIFEST_BUILD_TIMESTAMP );
long timestamp = 0;
try {
timestamp = Long.valueOf( timestampRaw );
timestamp /= 1000L;
} catch ( NumberFormatException e ) {
timestamp = 0;
}
return timestamp;
}
public static String getBuildTime()
{
final long timestamp = AppUtil.getBuildTimestamp();
final String buildTime;
if ( timestamp > 0 ) {
final Instant time = Instant.ofEpochSecond( timestamp );
buildTime = DateTimeFormatter.RFC_1123_DATE_TIME.withZone( ZoneId.systemDefault() ).format( time );
} else {
buildTime = null;
}
return buildTime;
}
public static String getBuildJdk()
{
return AppUtil.getManifestValue( AppUtil.MANIFEST_BUILD_JDK );
}
private static String formatProperty( final String property )
{
return String.format( "%-" + AppUtil.PROPERTY_MAX_WIDTH + "s", property );
}
public static void logProperty( final Logger logger, final String propertyName, final String propertyValue )
{
logger.info( AppUtil.formatProperty( propertyName ) + propertyValue );
}
public static void logJavaProperty( Logger logger, final String javaProperty )
{
AppUtil.logProperty( logger, javaProperty, System.getProperty( javaProperty ) );
}
public static void logHeader( final Logger logger, final String appName, final String appVersion )
{
logger.info( "-------------------------------------------------------------------------------" );
logger.info( appName );
logger.info( "-------------------------------------------------------------------------------" );
logProperty( logger, AppUtil.PROPERTY_APP_NAME, appName );
logProperty( logger, AppUtil.PROPERTY_APP_VERSION, appVersion );
logProperty( logger, AppUtil.PROPERTY_APP_REVISION_VERSION, AppUtil.getRevisionVersion() );
logProperty( logger, AppUtil.PROPERTY_APP_REVISION_BRANCH, AppUtil.getRevisionBranch() );
logProperty( logger, AppUtil.PROPERTY_APP_BUILD_DATE, AppUtil.getBuildTime() );
logProperty( logger, AppUtil.PROPERTY_APP_BUILD_JDK, AppUtil.getBuildJdk() );
logJavaProperty( logger, AppUtil.PROPERTY_JAVA_OS_NAME );
logJavaProperty( logger, AppUtil.PROPERTY_JAVA_SPEC_VENDOR );
logJavaProperty( logger, AppUtil.PROPERTY_JAVA_SPEC_NAME );
logJavaProperty( logger, AppUtil.PROPERTY_JAVA_SPEC_VERSION );
logJavaProperty( logger, AppUtil.PROPERTY_JAVA_VERSION );
logJavaProperty( logger, AppUtil.PROPERTY_JAVA_VERSION_VM );
logJavaProperty( logger, AppUtil.PROPERTY_JAVA_VERSION_RUNTIME );
logger.info( "-------------------------------------------------------------------------------" );
}
}