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.4.0). 27 * For Maven version before 3.4.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 */ 32 public class MessageUtils 33 { 34 private static final boolean JANSI; 35 36 static 37 { 38 boolean jansi = true; 39 try 40 { 41 // JAnsi is provided by Maven core since 3.4.0 42 Class.forName( "org.fusesource.jansi.Ansi" ); 43 } 44 catch ( ClassNotFoundException cnfe ) 45 { 46 jansi = false; 47 } 48 JANSI = jansi; 49 } 50 51 /** 52 * Install color support. 53 * This method is called by Maven core, and calling it is not necessary in plugins. 54 */ 55 public static void systemInstall() 56 { 57 if ( JANSI ) 58 { 59 AnsiConsole.systemInstall(); 60 } 61 } 62 63 /** 64 * Undo a previous {@link #systemInstall()}. If {@link #systemInstall()} was called 65 * multiple times, {@link #systemUninstall()} must be called call the same number of times before 66 * it is actually uninstalled. 67 */ 68 public static void systemUninstall() 69 { 70 if ( JANSI ) 71 { 72 AnsiConsole.systemUninstall(); 73 } 74 } 75 76 /** 77 * Enables message color (if JAnsi is available). 78 * @param flag 79 */ 80 public static void setColorEnabled( boolean flag ) 81 { 82 if ( JANSI ) 83 { 84 Ansi.setEnabled( flag ); 85 } 86 } 87 88 /** 89 * Is message color enabled: requires JAnsi available (through Maven) and the color has not been disabled. 90 */ 91 public static boolean isColorEnabled() 92 { 93 return JANSI ? Ansi.isEnabled() : false; 94 } 95 96 /** 97 * Create a default message buffer. 98 * @return a new buffer 99 */ 100 public static MessageBuilder buffer() 101 { 102 return JANSI ? new AnsiMessageBuilder() : new PlainMessageBuilder(); 103 } 104 105 /** 106 * Create a message buffer with defined String builder. 107 * @return a new buffer 108 */ 109 public static MessageBuilder buffer( StringBuilder builder ) 110 { 111 return JANSI ? new AnsiMessageBuilder( builder ) : new PlainMessageBuilder( builder ); 112 } 113 114 /** 115 * Create a message buffer with an internal buffer of defined size. 116 * @return a new buffer 117 */ 118 public static MessageBuilder buffer( int size ) 119 { 120 return JANSI ? new AnsiMessageBuilder( size ) : new PlainMessageBuilder( size ); 121 } 122 123 /** 124 * Remove any ANSI code from a message (colors or other escape sequences). 125 * @param msg message eventually containing ANSI codes 126 * @return the message with ANSI codes removed 127 */ 128 public static String stripAnsiCodes( String msg ) 129 { 130 return msg.replaceAll( "\u001B\\[[;\\d]*[ -/]*[@-~]", "" ); 131 } 132 133 }