1   package org.apache.maven.cli;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
23  
24  import java.io.IOException;
25  import java.io.InputStream;
26  import java.text.SimpleDateFormat;
27  import java.util.Date;
28  import java.util.Locale;
29  import java.util.Properties;
30  
31  import org.apache.commons.lang3.StringUtils;
32  import org.codehaus.plexus.util.Os;
33  import org.slf4j.Logger;
34  
35  
36  
37  
38  
39  
40  public final class CLIReportingUtils
41  {
42      
43      public static final long MB = 1024 * 1024;
44  
45      private static final long ONE_SECOND = 1000L;
46  
47      private static final long ONE_MINUTE = 60 * ONE_SECOND;
48  
49      private static final long ONE_HOUR = 60 * ONE_MINUTE;
50  
51      private static final long ONE_DAY = 24 * ONE_HOUR;
52      
53  
54      public static final String BUILD_VERSION_PROPERTY = "version";
55  
56      public static String showVersion()
57      {
58          final String ls = System.lineSeparator();
59          Properties properties = getBuildProperties();
60          StringBuilder version = new StringBuilder( 256 );
61          version.append( buffer().strong( createMavenVersionString( properties ) ) ).append( ls );
62          version.append( reduce(
63              properties.getProperty( "distributionShortName" ) + " home: " + System.getProperty( "maven.home",
64                                                                                                  "<unknown Maven "
65                                                                                                      + "home>" ) ) )
66              .append( ls );
67          version.append( "Java version: " ).append(
68              System.getProperty( "java.version", "<unknown Java version>" ) ).append( ", vendor: " ).append(
69              System.getProperty( "java.vendor", "<unknown vendor>" ) ).append( ", runtime: " ).append(
70              System.getProperty( "java.home", "<unknown runtime>" ) ).append( ls );
71          version.append( "Default locale: " ).append( Locale.getDefault() ).append( ", platform encoding: " ).append(
72              System.getProperty( "file.encoding", "<unknown encoding>" ) ).append( ls );
73          version.append( "OS name: \"" ).append( Os.OS_NAME ).append( "\", version: \"" ).append( Os.OS_VERSION ).append(
74              "\", arch: \"" ).append( Os.OS_ARCH ).append( "\", family: \"" ).append( Os.OS_FAMILY ).append( '\"' );
75          return version.toString();
76      }
77  
78      public static String showVersionMinimal()
79      {
80          Properties properties = getBuildProperties();
81          String version = reduce( properties.getProperty( BUILD_VERSION_PROPERTY ) );
82          return ( version != null ? version : "<version unknown>" );
83      }
84  
85      
86  
87  
88  
89  
90  
91      static String createMavenVersionString( Properties buildProperties )
92      {
93          String timestamp = reduce( buildProperties.getProperty( "timestamp" ) );
94          String version = reduce( buildProperties.getProperty( BUILD_VERSION_PROPERTY ) );
95          String rev = reduce( buildProperties.getProperty( "buildNumber" ) );
96          String distributionName = reduce( buildProperties.getProperty( "distributionName" ) );
97  
98          String msg = distributionName + " ";
99          msg += ( version != null ? version : "<version unknown>" );
100         if ( rev != null || timestamp != null )
101         {
102             msg += " (";
103             msg += ( rev != null ? rev : "" );
104             if ( StringUtils.isNotBlank( timestamp ) )
105             {
106                 String ts = formatTimestamp( Long.parseLong( timestamp ) );
107                 msg += ( rev != null ? "; " : "" ) + ts;
108             }
109             msg += ")";
110         }
111         return msg;
112     }
113 
114     private static String reduce( String s )
115     {
116         return ( s != null ? ( s.startsWith( "${" ) && s.endsWith( "}" ) ? null : s ) : null );
117     }
118 
119     static Properties getBuildProperties()
120     {
121         Properties properties = new Properties();
122 
123         try ( InputStream resourceAsStream = MavenCli.class.getResourceAsStream(
124             "/org/apache/maven/messages/build.properties" ) )
125         {
126 
127             if ( resourceAsStream != null )
128             {
129                 properties.load( resourceAsStream );
130             }
131         }
132         catch ( IOException e )
133         {
134             System.err.println( "Unable determine version from JAR file: " + e.getMessage() );
135         }
136 
137         return properties;
138     }
139 
140     public static void showError( Logger logger, String message, Throwable e, boolean showStackTrace )
141     {
142         if ( showStackTrace )
143         {
144             logger.error( message, e );
145         }
146         else
147         {
148             logger.error( message );
149 
150             if ( e != null )
151             {
152                 logger.error( e.getMessage() );
153 
154                 for ( Throwable cause = e.getCause(); cause != null; cause = cause.getCause() )
155                 {
156                     logger.error( "Caused by: {}", cause.getMessage() );
157                 }
158             }
159         }
160     }
161 
162     public static String formatTimestamp( long timestamp )
163     {
164         SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssXXX" );
165         return sdf.format( new Date( timestamp ) );
166     }
167 
168     public static String formatDuration( long duration )
169     {
170         
171         long ms = duration % 1000;
172         long s = ( duration / ONE_SECOND ) % 60;
173         long m = ( duration / ONE_MINUTE ) % 60;
174         long h = ( duration / ONE_HOUR ) % 24;
175         long d = duration / ONE_DAY;
176         
177 
178         String format;
179         if ( d > 0 )
180         {
181             
182             format = "%d d %02d:%02d h";
183         }
184         else if ( h > 0 )
185         {
186             
187             format = "%2$02d:%3$02d h";
188         }
189         else if ( m > 0 )
190         {
191             
192             format = "%3$02d:%4$02d min";
193         }
194         else
195         {
196             
197             format = "%4$d.%5$03d s";
198         }
199 
200         return String.format( format, d, h, m, s, ms );
201     }
202 
203 }