001 package org.apache.maven.cli; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. 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, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import java.io.IOException; 023 import java.io.InputStream; 024 import java.io.PrintStream; 025 import java.text.DateFormat; 026 import java.text.SimpleDateFormat; 027 import java.util.Date; 028 import java.util.Locale; 029 import java.util.Properties; 030 import java.util.TimeZone; 031 032 import org.codehaus.plexus.logging.Logger; 033 import org.codehaus.plexus.util.IOUtil; 034 import org.codehaus.plexus.util.Os; 035 036 /** 037 * Utility class used to report errors, statistics, application version info, etc. 038 * 039 * @author jdcasey 040 * 041 */ 042 public final class CLIReportingUtils 043 { 044 045 public static final long MB = 1024 * 1024; 046 047 public static final int MS_PER_SEC = 1000; 048 049 public static final int SEC_PER_MIN = 60; 050 051 public static final String BUILD_VERSION_PROPERTY = "version"; 052 053 public static void showVersion( PrintStream stdout ) 054 { 055 Properties properties = getBuildProperties(); 056 stdout.println( createMavenVersionString( properties ) ); 057 String shortName = reduce( properties.getProperty( "distributionShortName" ) ); 058 059 stdout.println( shortName + " home: " + System.getProperty( "maven.home", "<unknown maven home>" ) ); 060 061 stdout.println( "Java version: " + System.getProperty( "java.version", "<unknown java version>" ) 062 + ", vendor: " + System.getProperty( "java.vendor", "<unknown vendor>" ) ); 063 064 stdout.println( "Java home: " + System.getProperty( "java.home", "<unknown java home>" ) ); 065 066 stdout.println( "Default locale: " + Locale.getDefault() + ", platform encoding: " 067 + System.getProperty( "file.encoding", "<unknown encoding>" ) ); 068 069 stdout.println( "OS name: \"" + Os.OS_NAME + "\", version: \"" + Os.OS_VERSION + "\", arch: \"" + Os.OS_ARCH 070 + "\", family: \"" + Os.OS_FAMILY + "\"" ); 071 } 072 073 /** 074 * Create a human readable string containing the Maven version, buildnumber, and time of build 075 * 076 * @param buildProperties The build properties 077 * @return Readable build info 078 */ 079 static String createMavenVersionString( Properties buildProperties ) 080 { 081 String timestamp = reduce( buildProperties.getProperty( "timestamp" ) ); 082 String version = reduce( buildProperties.getProperty( BUILD_VERSION_PROPERTY ) ); 083 String rev = reduce( buildProperties.getProperty( "buildNumber" ) ); 084 String distributionName = reduce( buildProperties.getProperty( "distributionName" ) ); 085 086 String msg = distributionName + " "; 087 msg += ( version != null ? version : "<version unknown>" ); 088 if ( rev != null || timestamp != null ) 089 { 090 msg += " ("; 091 msg += ( rev != null ? "r" + rev : "" ); 092 if ( timestamp != null ) 093 { 094 SimpleDateFormat fmt = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ssZ" ); 095 String ts = fmt.format( new Date( Long.valueOf( timestamp ).longValue() ) ); 096 msg += ( rev != null ? "; " : "" ) + ts; 097 } 098 msg += ")"; 099 } 100 return msg; 101 } 102 103 private static String reduce( String s ) 104 { 105 return ( s != null ? ( s.startsWith( "${" ) && s.endsWith( "}" ) ? null : s ) : null ); 106 } 107 108 109 private static void stats( Date start, Logger logger ) 110 { 111 Date finish = new Date(); 112 113 long time = finish.getTime() - start.getTime(); 114 115 logger.info( "Total time: " + formatTime( time ) ); 116 117 logger.info( "Finished at: " + finish ); 118 119 //noinspection CallToSystemGC 120 System.gc(); 121 122 Runtime r = Runtime.getRuntime(); 123 124 logger.info( "Final Memory: " + ( r.totalMemory() - r.freeMemory() ) / MB + "M/" + r.totalMemory() / MB + "M" ); 125 } 126 127 private static String formatTime( long ms ) 128 { 129 long secs = ms / MS_PER_SEC; 130 131 long min = secs / SEC_PER_MIN; 132 133 secs = secs % SEC_PER_MIN; 134 135 String msg = ""; 136 137 if ( min > 1 ) 138 { 139 msg = min + " minutes "; 140 } 141 else if ( min == 1 ) 142 { 143 msg = "1 minute "; 144 } 145 146 if ( secs > 1 ) 147 { 148 msg += secs + " seconds"; 149 } 150 else if ( secs == 1 ) 151 { 152 msg += "1 second"; 153 } 154 else if ( min == 0 ) 155 { 156 msg += "< 1 second"; 157 } 158 return msg; 159 } 160 161 private static String getFormattedTime( long time ) 162 { 163 String pattern = "s.SSS's'"; 164 if ( time / 60000L > 0 ) 165 { 166 pattern = "m:s" + pattern; 167 if ( time / 3600000L > 0 ) 168 { 169 pattern = "H:m" + pattern; 170 } 171 } 172 DateFormat fmt = new SimpleDateFormat( pattern ); 173 fmt.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); 174 return fmt.format( new Date( time ) ); 175 } 176 177 static Properties getBuildProperties() 178 { 179 Properties properties = new Properties(); 180 InputStream resourceAsStream = null; 181 try 182 { 183 resourceAsStream = MavenCli.class.getResourceAsStream( "/org/apache/maven/messages/build.properties" ); 184 185 if ( resourceAsStream != null ) 186 { 187 properties.load( resourceAsStream ); 188 } 189 } 190 catch ( IOException e ) 191 { 192 System.err.println( "Unable determine version from JAR file: " + e.getMessage() ); 193 } 194 finally 195 { 196 IOUtil.close( resourceAsStream ); 197 } 198 199 return properties; 200 } 201 202 public static void showError( Logger logger, String message, Throwable e, boolean showStackTrace ) 203 { 204 if ( logger == null ) 205 { 206 logger = new PrintStreamLogger( System.out ); 207 } 208 209 if ( showStackTrace ) 210 { 211 logger.error( message, e ); 212 } 213 else 214 { 215 logger.error( message ); 216 217 if ( e != null ) 218 { 219 logger.error( e.getMessage() ); 220 221 for ( Throwable cause = e.getCause(); cause != null; cause = cause.getCause() ) 222 { 223 logger.error( "Caused by: " + cause.getMessage() ); 224 } 225 } 226 } 227 } 228 229 }