diff options
Diffstat (limited to 'framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java')
-rw-r--r-- | framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java b/framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java new file mode 100644 index 00000000..07863b72 --- /dev/null +++ b/framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java @@ -0,0 +1,205 @@ +package org.apache.maven.cli; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.Locale; +import java.util.Properties; +import java.util.TimeZone; + +import org.codehaus.plexus.util.IOUtil; +import org.codehaus.plexus.util.Os; +import org.slf4j.Logger; + +/** + * Utility class used to report errors, statistics, application version info, etc. + * + * @author jdcasey + * + */ +public final class CLIReportingUtils +{ + // CHECKSTYLE_OFF: MagicNumber + public static final long MB = 1024 * 1024; + + private static final long ONE_SECOND = 1000L; + private static final long ONE_MINUTE = 60 * ONE_SECOND; + private static final long ONE_HOUR = 60 * ONE_MINUTE; + private static final long ONE_DAY = 24 * ONE_HOUR; + // CHECKSTYLE_ON: MagicNumber + + public static final String BUILD_VERSION_PROPERTY = "version"; + + public static String showVersion() + { + final String ls = System.getProperty( "line.separator" ); + Properties properties = getBuildProperties(); + StringBuilder version = new StringBuilder(); + version.append( createMavenVersionString( properties ) ).append( ls ); + version.append( reduce( properties.getProperty( "distributionShortName" ) + " home: " + + System.getProperty( "maven.home", "<unknown maven home>" ) ) ).append( ls ); + version.append( "Java version: " ).append( + System.getProperty( "java.version", "<unknown java version>" ) ).append( ", vendor: " ).append( + System.getProperty( "java.vendor", "<unknown vendor>" ) ).append( ls ); + version.append( "Java home: " ).append( System.getProperty( "java.home", "<unknown java home>" ) ).append( ls ); + version.append( "Default locale: " ).append( Locale.getDefault() ).append( ", platform encoding: " ).append( + System.getProperty( "file.encoding", "<unknown encoding>" ) ).append( ls ); + version.append( "OS name: \"" ).append( Os.OS_NAME ).append( "\", version: \"" ).append( Os.OS_VERSION ).append( + "\", arch: \"" ).append( Os.OS_ARCH ).append( "\", family: \"" ).append( Os.OS_FAMILY ).append( "\"" ); + return version.toString(); + } + + /** + * Create a human readable string containing the Maven version, buildnumber, and time of build + * + * @param buildProperties The build properties + * @return Readable build info + */ + static String createMavenVersionString( Properties buildProperties ) + { + String timestamp = reduce( buildProperties.getProperty( "timestamp" ) ); + String version = reduce( buildProperties.getProperty( BUILD_VERSION_PROPERTY ) ); + String rev = reduce( buildProperties.getProperty( "buildNumber" ) ); + String distributionName = reduce( buildProperties.getProperty( "distributionName" ) ); + + String msg = distributionName + " "; + msg += ( version != null ? version : "<version unknown>" ); + if ( rev != null || timestamp != null ) + { + msg += " ("; + msg += ( rev != null ? rev : "" ); + if ( timestamp != null ) + { + String ts = formatTimestamp( Long.valueOf( timestamp ) ); + msg += ( rev != null ? "; " : "" ) + ts; + } + msg += ")"; + } + return msg; + } + + private static String reduce( String s ) + { + return ( s != null ? ( s.startsWith( "${" ) && s.endsWith( "}" ) ? null : s ) : null ); + } + + static Properties getBuildProperties() + { + Properties properties = new Properties(); + InputStream resourceAsStream = null; + try + { + resourceAsStream = MavenCli.class.getResourceAsStream( "/org/apache/maven/messages/build.properties" ); + + if ( resourceAsStream != null ) + { + properties.load( resourceAsStream ); + } + } + catch ( IOException e ) + { + System.err.println( "Unable determine version from JAR file: " + e.getMessage() ); + } + finally + { + IOUtil.close( resourceAsStream ); + } + + return properties; + } + + public static void showError( Logger logger, String message, Throwable e, boolean showStackTrace ) + { + if ( showStackTrace ) + { + logger.error( message, e ); + } + else + { + logger.error( message ); + + if ( e != null ) + { + logger.error( e.getMessage() ); + + for ( Throwable cause = e.getCause(); cause != null; cause = cause.getCause() ) + { + logger.error( "Caused by: " + cause.getMessage() ); + } + } + } + } + + public static String formatTimestamp( long timestamp ) + { + // Manual construction of the tz offset because only Java 7 is aware of ISO 8601 time zones + TimeZone tz = TimeZone.getDefault(); + int offset = tz.getRawOffset(); + + // Raw offset ignores DST, so check if we are in DST now and add the offset + if ( tz.inDaylightTime( new Date( timestamp ) ) ) + { + offset += tz.getDSTSavings(); + } + + // CHECKSTYLE_OFF: MagicNumber + long m = Math.abs( ( offset / ONE_MINUTE ) % 60 ); + long h = Math.abs( ( offset / ONE_HOUR ) % 24 ); + // CHECKSTYLE_ON: MagicNumber + + int offsetDir = (int) Math.signum( (float) offset ); + char offsetSign = offsetDir >= 0 ? '+' : '-'; + return String.format( "%tFT%<tT%s%02d:%02d", timestamp, offsetSign, h, m ); + } + + public static String formatDuration( long duration ) + { + // CHECKSTYLE_OFF: MagicNumber + long ms = duration % 1000; + long s = ( duration / ONE_SECOND ) % 60; + long m = ( duration / ONE_MINUTE ) % 60; + long h = ( duration / ONE_HOUR ) % 24; + long d = duration / ONE_DAY; + // CHECKSTYLE_ON: MagicNumber + + String format; + if ( d > 0 ) + { + format = "%d d %02d:%02d h"; + } + else if ( h > 0 ) + { + format = "%2$02d:%3$02d h"; + } + else if ( m > 0 ) + { + format = "%3$02d:%4$02d min"; + } + else + { + format = "%4$d.%5$03d s"; + } + + return String.format( format, d, h, m, s, ms ); + } + +} |