View Javadoc
1   package org.apache.maven.shared.utils.logging;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.fusesource.jansi.Ansi;
23  import org.fusesource.jansi.AnsiConsole;
24  
25  /**
26   * Colored message utils, to manage colors consistently across plugins (only if Maven version is at least 3.5.0).
27   * For Maven version before 3.5.0, message built with this util will never add color.
28   * <p>
29   * Internally, <a href="http://fusesource.github.io/jansi/">Jansi</a> is used to render
30   * <a href="https://en.wikipedia.org/wiki/ANSI_escape_code#Colors">ANSI colors</a> on any platform.
31   * @since 3.1.0
32   */
33  public class MessageUtils
34  {
35      private static final boolean JANSI;
36  
37      static
38      {
39          boolean jansi = true;
40          try
41          {
42              // JAnsi is provided by Maven core since 3.5.0
43              Class.forName( "org.fusesource.jansi.Ansi" );
44          }
45          catch ( ClassNotFoundException cnfe )
46          {
47              jansi = false;
48          }
49          JANSI = jansi;
50      }
51  
52      /**
53       * Install color support.
54       * This method is called by Maven core, and calling it is not necessary in plugins.
55       */
56      public static void systemInstall()
57      {
58          if ( JANSI )
59          {
60              AnsiConsole.systemInstall();
61          }
62      }
63  
64      /**
65       * Undo a previous {@link #systemInstall()}.  If {@link #systemInstall()} was called
66       * multiple times, {@link #systemUninstall()} must be called call the same number of times before
67       * it is actually uninstalled.
68       */
69      public static void systemUninstall()
70      {
71          if ( JANSI )
72          {
73              AnsiConsole.systemUninstall();
74          }
75      }
76  
77      /**
78       * Enables message color (if JAnsi is available).
79       * @param flag
80       */
81      public static void setColorEnabled( boolean flag )
82      {
83          if ( JANSI )
84          {
85              Ansi.setEnabled( flag );
86          }
87      }
88  
89      /**
90       * Is message color enabled: requires JAnsi available (through Maven) and the color has not been disabled.
91       */
92      public static boolean isColorEnabled()
93      {
94          return JANSI ? Ansi.isEnabled() : false;
95      }
96  
97      /**
98       * Create a default message buffer.
99       * @return a new buffer
100      */
101     public static MessageBuilder buffer()
102     {
103         return JANSI ? new AnsiMessageBuilder() : new PlainMessageBuilder();
104     }
105 
106     /**
107      * Create a message buffer with defined String builder.
108      * @return a new buffer
109      */
110     public static MessageBuilder buffer( StringBuilder builder )
111     {
112         return JANSI ? new AnsiMessageBuilder( builder ) : new PlainMessageBuilder( builder );
113     }
114 
115     /**
116      * Create a message buffer with an internal buffer of defined size.
117      * @return a new buffer
118      */
119     public static MessageBuilder buffer( int size )
120     {
121         return JANSI ? new AnsiMessageBuilder( size ) : new PlainMessageBuilder( size );
122     }
123 
124     /**
125      * Create a logger level renderer.
126      * @return a logger level renderer
127      * @since 3.2.0
128      */
129     @SuppressWarnings( "checkstyle:magicnumber" )
130     public static LoggerLevelRenderer level()
131     {
132         return JANSI ? new AnsiMessageBuilder( 20 ) : new PlainMessageBuilder( 7 );
133     }
134 
135     /**
136      * Remove any ANSI code from a message (colors or other escape sequences).
137      * @param msg message eventually containing ANSI codes
138      * @return the message with ANSI codes removed
139      */
140     public static String stripAnsiCodes( String msg )
141     {
142         return msg.replaceAll( "\u001B\\[[;\\d]*[ -/]*[@-~]", "" );
143     }
144 
145 }