mirror of https://github.com/apache/maven.git
[MNG-7486] Create a multiline message helper for boxed log messages
This closes #746
This commit is contained in:
parent
5002a0b0b8
commit
aec341a7a9
|
@ -0,0 +1,91 @@
|
||||||
|
package org.apache.maven.internal;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class to format multiline messages to the console
|
||||||
|
*/
|
||||||
|
public class MultilineMessageHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final int DEFAULT_MAX_SIZE = 65;
|
||||||
|
private static final char BOX_CHAR = '*';
|
||||||
|
|
||||||
|
public static String separatorLine()
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder( DEFAULT_MAX_SIZE );
|
||||||
|
repeat( sb, '*', DEFAULT_MAX_SIZE );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<String> format( String... lines )
|
||||||
|
{
|
||||||
|
int size = DEFAULT_MAX_SIZE;
|
||||||
|
int remainder = size - 4; // 4 chars = 2 box_char + 2 spaces
|
||||||
|
List<String> result = new ArrayList<>();
|
||||||
|
StringBuilder sb = new StringBuilder( size );
|
||||||
|
// first line
|
||||||
|
sb.setLength( 0 );
|
||||||
|
repeat( sb, BOX_CHAR, size );
|
||||||
|
result.add( sb.toString() );
|
||||||
|
// lines
|
||||||
|
for ( String line : lines )
|
||||||
|
{
|
||||||
|
sb.setLength( 0 );
|
||||||
|
String[] words = line.split( "\\s+" );
|
||||||
|
for ( String word : words )
|
||||||
|
{
|
||||||
|
if ( sb.length() >= remainder - word.length() - ( sb.length() > 0 ? 1 : 0 ) )
|
||||||
|
{
|
||||||
|
repeat( sb, ' ', remainder - sb.length() );
|
||||||
|
result.add( BOX_CHAR + " " + sb + " " + BOX_CHAR );
|
||||||
|
sb.setLength( 0 );
|
||||||
|
}
|
||||||
|
if ( sb.length() > 0 )
|
||||||
|
{
|
||||||
|
sb.append( ' ' );
|
||||||
|
}
|
||||||
|
sb.append( word );
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( sb.length() < remainder )
|
||||||
|
{
|
||||||
|
sb.append( ' ' );
|
||||||
|
}
|
||||||
|
result.add( BOX_CHAR + " " + sb + " " + BOX_CHAR );
|
||||||
|
}
|
||||||
|
// last line
|
||||||
|
sb.setLength( 0 );
|
||||||
|
repeat( sb, BOX_CHAR, size );
|
||||||
|
result.add( sb.toString() );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void repeat( StringBuilder sb, char c, int nb )
|
||||||
|
{
|
||||||
|
for ( int i = 0; i < nb; i++ )
|
||||||
|
{
|
||||||
|
sb.append( c );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,6 +24,7 @@ import org.apache.maven.execution.BuildFailure;
|
||||||
import org.apache.maven.execution.ExecutionEvent;
|
import org.apache.maven.execution.ExecutionEvent;
|
||||||
import org.apache.maven.execution.MavenExecutionRequest;
|
import org.apache.maven.execution.MavenExecutionRequest;
|
||||||
import org.apache.maven.execution.MavenSession;
|
import org.apache.maven.execution.MavenSession;
|
||||||
|
import org.apache.maven.internal.MultilineMessageHelper;
|
||||||
import org.apache.maven.lifecycle.LifecycleExecutionException;
|
import org.apache.maven.lifecycle.LifecycleExecutionException;
|
||||||
import org.apache.maven.lifecycle.LifecycleNotFoundException;
|
import org.apache.maven.lifecycle.LifecycleNotFoundException;
|
||||||
import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException;
|
import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException;
|
||||||
|
@ -103,34 +104,35 @@ public class BuilderCommon
|
||||||
final Set<Plugin> unsafePlugins = executionPlan.getNonThreadSafePlugins();
|
final Set<Plugin> unsafePlugins = executionPlan.getNonThreadSafePlugins();
|
||||||
if ( !unsafePlugins.isEmpty() )
|
if ( !unsafePlugins.isEmpty() )
|
||||||
{
|
{
|
||||||
logger.warn( "*****************************************************************" );
|
for ( String s : MultilineMessageHelper.format(
|
||||||
logger.warn( "* Your build is requesting parallel execution, but project *" );
|
"Your build is requesting parallel execution, but this project contains the following "
|
||||||
logger.warn( "* contains the following plugin(s) that have goals not marked *" );
|
+ "plugin(s) that have goals not marked as thread-safe to support parallel execution.",
|
||||||
logger.warn( "* as @threadSafe to support parallel building. *" );
|
"While this /may/ work fine, please look for plugin updates and/or "
|
||||||
logger.warn( "* While this /may/ work fine, please look for plugin updates *" );
|
+ "request plugins be made thread-safe.",
|
||||||
logger.warn( "* and/or request plugins be made thread-safe. *" );
|
"If reporting an issue, report it against the plugin in question, not against Apache Maven." ) )
|
||||||
logger.warn( "* If reporting an issue, report it against the plugin in *" );
|
{
|
||||||
logger.warn( "* question, not against maven-core *" );
|
logger.warn( s );
|
||||||
logger.warn( "*****************************************************************" );
|
}
|
||||||
if ( logger.isDebugEnabled() )
|
if ( logger.isDebugEnabled() )
|
||||||
{
|
{
|
||||||
final Set<MojoDescriptor> unsafeGoals = executionPlan.getNonThreadSafeMojos();
|
final Set<MojoDescriptor> unsafeGoals = executionPlan.getNonThreadSafeMojos();
|
||||||
logger.warn( "The following goals are not marked @threadSafe in " + project.getName() + ":" );
|
logger.warn( "The following goals are not marked as thread-safe in " + project.getName() + ":" );
|
||||||
for ( MojoDescriptor unsafeGoal : unsafeGoals )
|
for ( MojoDescriptor unsafeGoal : unsafeGoals )
|
||||||
{
|
{
|
||||||
logger.warn( unsafeGoal.getId() );
|
logger.warn( " " + unsafeGoal.getId() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logger.warn( "The following plugins are not marked @threadSafe in " + project.getName() + ":" );
|
logger.warn( "The following plugins are not marked as thread-safe in " + project.getName() + ":" );
|
||||||
for ( Plugin unsafePlugin : unsafePlugins )
|
for ( Plugin unsafePlugin : unsafePlugins )
|
||||||
{
|
{
|
||||||
logger.warn( unsafePlugin.getId() );
|
logger.warn( " " + unsafePlugin.getId() );
|
||||||
}
|
}
|
||||||
logger.warn( "Enable debug to see more precisely which goals are not marked @threadSafe." );
|
logger.warn( "" );
|
||||||
|
logger.warn( "Enable debug to see precisely which goals are not marked as thread-safe." );
|
||||||
}
|
}
|
||||||
logger.warn( "*****************************************************************" );
|
logger.warn( MultilineMessageHelper.separatorLine() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
package org.apache.maven.internal;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class MultilineMessageHelperTest
|
||||||
|
{
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBuilderCommon()
|
||||||
|
{
|
||||||
|
List<String> msgs = new ArrayList<>();
|
||||||
|
msgs.add( "*****************************************************************" );
|
||||||
|
msgs.add( "* Your build is requesting parallel execution, but project *" );
|
||||||
|
msgs.add( "* contains the following plugin(s) that have goals not marked *" );
|
||||||
|
msgs.add( "* as @threadSafe to support parallel building. *" );
|
||||||
|
msgs.add( "* While this /may/ work fine, please look for plugin updates *" );
|
||||||
|
msgs.add( "* and/or request plugins be made thread-safe. *" );
|
||||||
|
msgs.add( "* If reporting an issue, report it against the plugin in *" );
|
||||||
|
msgs.add( "* question, not against maven-core *" );
|
||||||
|
msgs.add( "*****************************************************************" );
|
||||||
|
|
||||||
|
assertEquals( msgs, MultilineMessageHelper.format(
|
||||||
|
"Your build is requesting parallel execution, but project contains the following "
|
||||||
|
+ "plugin(s) that have goals not marked as @threadSafe to support parallel building.",
|
||||||
|
"While this /may/ work fine, please look for plugin updates and/or "
|
||||||
|
+ "request plugins be made thread-safe.",
|
||||||
|
"If reporting an issue, report it against the plugin in question, not against maven-core"
|
||||||
|
) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMojoExecutor()
|
||||||
|
{
|
||||||
|
List<String> msgs = new ArrayList<>();
|
||||||
|
msgs.add( "*****************************************************************" );
|
||||||
|
msgs.add( "* An aggregator Mojo is already executing in parallel build, *" );
|
||||||
|
msgs.add( "* but aggregator Mojos require exclusive access to reactor to *" );
|
||||||
|
msgs.add( "* prevent race conditions. This mojo execution will be blocked *" );
|
||||||
|
msgs.add( "* until the aggregator work is done. *" );
|
||||||
|
msgs.add( "*****************************************************************" );
|
||||||
|
|
||||||
|
assertEquals( msgs, MultilineMessageHelper.format(
|
||||||
|
"An aggregator Mojo is already executing in parallel build, but aggregator "
|
||||||
|
+ "Mojos require exclusive access to reactor to prevent race conditions. This "
|
||||||
|
+ "mojo execution will be blocked until the aggregator work is done." ) );
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue