o Added new settings builder that uses request/result pattern to allow for better problem reporting

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-3/trunk@824172 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Benjamin Bentmann 2009-10-11 21:25:11 +00:00
parent 00fa4413d2
commit d4ca575f08
12 changed files with 960 additions and 11 deletions

View File

@ -30,6 +30,7 @@ import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
* @author jdcasey
* @author Jason van Zyl
*/
@Deprecated
public interface MavenSettingsBuilder
{
String ROLE = MavenSettingsBuilder.class.getName();

View File

@ -0,0 +1,219 @@
package org.apache.maven.settings.building;
/*
* 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.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.SettingsUtils;
import org.apache.maven.settings.TrackableBase;
import org.apache.maven.settings.io.SettingsParseException;
import org.apache.maven.settings.io.SettingsReader;
import org.apache.maven.settings.io.SettingsWriter;
import org.apache.maven.settings.validation.SettingsValidationResult;
import org.apache.maven.settings.validation.SettingsValidator;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
import org.codehaus.plexus.interpolation.InterpolationException;
import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
/**
* Builds the effective settings from a user settings file and/or a global settings file.
*
* @author Benjamin Bentmann
*/
@Component( role = SettingsBuilder.class )
public class DefaultSettingsBuilder
implements SettingsBuilder
{
@Requirement
private SettingsReader settingsReader;
@Requirement
private SettingsWriter settingsWriter;
@Requirement
private SettingsValidator settingsValidator;
public SettingsBuildingResult build( SettingsBuildingRequest request )
throws SettingsBuildingException
{
List<SettingsProblem> problems = new ArrayList<SettingsProblem>();
Settings globalSettings = readSettings( request.getGlobalSettingsFile(), request, problems );
Settings userSettings = readSettings( request.getUserSettingsFile(), request, problems );
SettingsUtils.merge( userSettings, globalSettings, TrackableBase.GLOBAL_LEVEL );
userSettings = interpolate( userSettings, request, problems );
// for the special case of a drive-relative Windows path, make sure it's absolute to save plugins from trouble
String localRepository = userSettings.getLocalRepository();
if ( localRepository != null && localRepository.length() > 0 )
{
File file = new File( localRepository );
if ( !file.isAbsolute() && file.getPath().startsWith( File.separator ) )
{
userSettings.setLocalRepository( file.getAbsolutePath() );
}
}
if ( hasErrors( problems ) )
{
throw new SettingsBuildingException( problems );
}
return new DefaultSettingsBuildingResult( userSettings, problems );
}
private boolean hasErrors( List<SettingsProblem> problems )
{
if ( problems != null )
{
for ( SettingsProblem problem : problems )
{
if ( SettingsProblem.Severity.ERROR.compareTo( problem.getSeverity() ) >= 0 )
{
return true;
}
}
}
return false;
}
private Settings readSettings( File settingsFile, SettingsBuildingRequest request, List<SettingsProblem> problems )
{
if ( settingsFile == null || !settingsFile.exists() )
{
return new Settings();
}
Settings settings;
try
{
boolean strict = true;
Map<String, ?> options = Collections.singletonMap( SettingsReader.IS_STRICT, Boolean.valueOf( strict ) );
settings = settingsReader.read( settingsFile, options );
}
catch ( SettingsParseException e )
{
problems.add( new DefaultSettingsProblem( "Non-parseable settings " + settingsFile,
SettingsProblem.Severity.FATAL, settingsFile.getAbsolutePath(),
e.getLineNumber(), e.getColumnNumber(), e ) );
return new Settings();
}
catch ( IOException e )
{
problems.add( new DefaultSettingsProblem( "Non-readable settings " + settingsFile,
SettingsProblem.Severity.FATAL, settingsFile.getAbsolutePath(),
-1, -1, e ) );
return new Settings();
}
SettingsValidationResult result = settingsValidator.validate( settings );
for ( String error : result.getMessages() )
{
problems.add( new DefaultSettingsProblem( error, SettingsProblem.Severity.ERROR,
settingsFile.getAbsolutePath(), -1, -1, null ) );
}
return settings;
}
private Settings interpolate( Settings settings, SettingsBuildingRequest request, List<SettingsProblem> problems )
{
List<String> activeProfiles = settings.getActiveProfiles();
StringWriter writer = new StringWriter( 1024 * 4 );
try
{
settingsWriter.write( writer, null, settings );
}
catch ( IOException e )
{
throw new IllegalStateException( "Failed to serialize settings to memory", e );
}
String serializedSettings = writer.toString();
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
interpolator.addValueSource( new PropertiesBasedValueSource( request.getUserProperties() ) );
interpolator.addValueSource( new PropertiesBasedValueSource( request.getSystemProperties() ) );
try
{
interpolator.addValueSource( new EnvarBasedValueSource() );
}
catch ( IOException e )
{
problems.add( new DefaultSettingsProblem( "Failed to use environment variables for interpolation: "
+ e.getMessage(), SettingsProblem.Severity.WARNING, "", -1, -1, e ) );
}
try
{
serializedSettings = interpolator.interpolate( serializedSettings, "settings" );
}
catch ( InterpolationException e )
{
problems.add( new DefaultSettingsProblem( "Failed to interpolate settings: " + e.getMessage(),
SettingsProblem.Severity.ERROR, "", -1, -1, e ) );
return settings;
}
Settings result;
try
{
Map<String, ?> options = Collections.singletonMap( SettingsReader.IS_STRICT, Boolean.FALSE );
result = settingsReader.read( new StringReader( serializedSettings ), options );
}
catch ( IOException e )
{
problems.add( new DefaultSettingsProblem( "Failed to interpolate settings: " + e.getMessage(),
SettingsProblem.Severity.ERROR, "", -1, -1, e ) );
return settings;
}
result.setActiveProfiles( activeProfiles );
return result;
}
}

View File

@ -0,0 +1,116 @@
package org.apache.maven.settings.building;
/*
* 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.io.File;
import java.util.Properties;
/**
* Collects settings that control building of effective settings.
*
* @author Benjamin Bentmann
*/
public class DefaultSettingsBuildingRequest
implements SettingsBuildingRequest
{
private File globalSettingsFile;
private File userSettingsFile;
private Properties systemProperties;
private Properties userProperties;
public File getGlobalSettingsFile()
{
return globalSettingsFile;
}
public DefaultSettingsBuildingRequest setGlobalSettingsFile( File globalSettingsFile )
{
this.globalSettingsFile = globalSettingsFile;
return this;
}
public File getUserSettingsFile()
{
return userSettingsFile;
}
public DefaultSettingsBuildingRequest setUserSettingsFile( File userSettingsFile )
{
this.userSettingsFile = userSettingsFile;
return this;
}
public Properties getSystemProperties()
{
if ( systemProperties == null )
{
systemProperties = new Properties();
}
return systemProperties;
}
public DefaultSettingsBuildingRequest setSystemProperties( Properties systemProperties )
{
if ( systemProperties != null )
{
this.systemProperties = new Properties();
this.systemProperties.putAll( systemProperties );
}
else
{
this.systemProperties = null;
}
return this;
}
public Properties getUserProperties()
{
if ( userProperties == null )
{
userProperties = new Properties();
}
return userProperties;
}
public DefaultSettingsBuildingRequest setUserProperties( Properties userProperties )
{
if ( userProperties != null )
{
this.userProperties = new Properties();
this.userProperties.putAll( userProperties );
}
else
{
this.userProperties = null;
}
return this;
}
}

View File

@ -0,0 +1,55 @@
package org.apache.maven.settings.building;
/*
* 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.List;
import org.apache.maven.settings.Settings;
/**
* Collects the output of the settings builder.
*
* @author Benjamin Bentmann
*/
class DefaultSettingsBuildingResult
implements SettingsBuildingResult
{
private Settings effectiveSettings;
private List<SettingsProblem> problems;
public DefaultSettingsBuildingResult( Settings effectiveSettings, List<SettingsProblem> problems )
{
this.effectiveSettings = effectiveSettings;
this.problems = problems;
}
public Settings getEffectiveSettings()
{
return effectiveSettings;
}
public List<SettingsProblem> getProblems()
{
return problems;
}
}

View File

@ -0,0 +1,158 @@
package org.apache.maven.settings.building;
/*
* 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.
*/
/**
* Describes a problem that was encountered during settings building. A problem can either be an exception that was
* thrown or a simple string message. In addition, a problem carries a hint about its source, e.g. the settings file
* that exhibits the problem.
*
* @author Benjamin Bentmann
*/
class DefaultSettingsProblem
implements SettingsProblem
{
private final String source;
private final int lineNumber;
private final int columnNumber;
private final String message;
private final Exception exception;
private final Severity severity;
/**
* Creates a new problem with the specified message and exception.
*
* @param message The message describing the problem, may be {@code null}.
* @param severity The severity level of the problem, may be {@code null} to default to {@link Severity#ERROR}.
* @param source A hint about the source of the problem like a file path, may be {@code null}.
* @param lineNumber The one-based index of the line containing the problem or {@code -1} if unknown.
* @param columnNumber The one-based index of the column containing the problem or {@code -1} if unknown.
* @param exception The exception that caused this problem, may be {@code null}.
*/
public DefaultSettingsProblem( String message, Severity severity, String source, int lineNumber, int columnNumber,
Exception exception )
{
this.message = message;
this.severity = ( severity != null ) ? severity : Severity.ERROR;
this.source = ( source != null ) ? source : "";
this.lineNumber = lineNumber;
this.columnNumber = columnNumber;
this.exception = exception;
}
public String getSource()
{
return source;
}
public int getLineNumber()
{
return lineNumber;
}
public int getColumnNumber()
{
return columnNumber;
}
public String getLocation()
{
StringBuilder buffer = new StringBuilder( 256 );
if ( getSource().length() > 0 )
{
if ( buffer.length() > 0 )
{
buffer.append( ", " );
}
buffer.append( getSource() );
}
if ( getLineNumber() > 0 )
{
if ( buffer.length() > 0 )
{
buffer.append( ", " );
}
buffer.append( "line " ).append( getLineNumber() );
}
if ( getColumnNumber() > 0 )
{
if ( buffer.length() > 0 )
{
buffer.append( ", " );
}
buffer.append( "column " ).append( getColumnNumber() );
}
return buffer.toString();
}
public Exception getException()
{
return exception;
}
public String getMessage()
{
String msg;
if ( message != null && message.length() > 0 )
{
msg = message;
}
else
{
msg = exception.getMessage();
if ( msg == null )
{
msg = "";
}
}
return msg;
}
public Severity getSeverity()
{
return severity;
}
@Override
public String toString()
{
StringBuilder buffer = new StringBuilder( 128 );
buffer.append( "[" ).append( getSeverity() ).append( "] " );
buffer.append( getMessage() );
buffer.append( " @ " ).append( getLocation() );
return buffer.toString();
}
}

View File

@ -0,0 +1,40 @@
package org.apache.maven.settings.building;
/*
* 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.
*/
/**
* Builds the effective settings from a user settings file and/or a global settings file.
*
* @author Benjamin Bentmann
*/
public interface SettingsBuilder
{
/**
* Builds the effective settings of the specified settings files.
*
* @param request The settings building request that holds the parameters, must not be {@code null}.
* @return The result of the settings building, never {@code null}.
* @throws SettingsBuildingException If the effective settings could not be built.
*/
SettingsBuildingResult build( SettingsBuildingRequest request )
throws SettingsBuildingException;
}

View File

@ -0,0 +1,91 @@
package org.apache.maven.settings.building;
/*
* 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.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
/**
* Signals one ore more errors during settings building. The settings builder tries to collect as many problems as
* possible before eventually failing to provide callers with rich error information. Use {@link #getProblems()} to
* query the details of the failure.
*
* @author Benjamin Bentmann
*/
public class SettingsBuildingException
extends Exception
{
private final List<SettingsProblem> problems;
/**
* Creates a new exception with the specified problems.
*
* @param modelId The identifier of the model that could not be built, may be {@code null}.
* @param problems The problems that causes this exception, may be {@code null}.
*/
public SettingsBuildingException( List<SettingsProblem> problems )
{
super( toMessage( problems ) );
this.problems = new ArrayList<SettingsProblem>();
if ( problems != null )
{
this.problems.addAll( problems );
}
}
/**
* Gets the problems that caused this exception.
*
* @return The problems that caused this exception, never {@code null}.
*/
public List<SettingsProblem> getProblems()
{
return problems;
}
private static String toMessage( List<SettingsProblem> problems )
{
StringWriter buffer = new StringWriter( 1024 );
PrintWriter writer = new PrintWriter( buffer );
writer.print( problems.size() );
writer.print( ( problems.size() == 1 ) ? " problem was " : " problems were " );
writer.print( "encountered while building the effective settings" );
writer.println();
for ( SettingsProblem problem : problems )
{
writer.print( "[" );
writer.print( problem.getSeverity() );
writer.print( "] " );
writer.print( problem.getMessage() );
writer.print( " @ " );
writer.println( problem.getLocation() );
}
return buffer.toString();
}
}

View File

@ -0,0 +1,99 @@
package org.apache.maven.settings.building;
/*
* 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.io.File;
import java.util.Properties;
/**
* Collects settings that control the building of effective settings.
*
* @author Benjamin Bentmann
*/
public interface SettingsBuildingRequest
{
/**
* Gets the global settings file.
*
* @return The global settings file or {@code null} if none.
*/
File getGlobalSettingsFile();
/**
* Sets the global settings file. A non-existent settings file is equivalent to empty settings. If both a user
* settings file and a global settings file are given, the user settings take precedence.
*
* @param globalSettingsFile The global settings file, may be {@code null} to disable global settings.
* @return This request, never {@code null}.
*/
SettingsBuildingRequest setGlobalSettingsFile( File globalSettingsFile );
/**
* Gets the user settings file.
*
* @return The user settings file or {@code null} if none.
*/
File getUserSettingsFile();
/**
* Sets the user settings file. A non-existent settings file is equivalent to empty settings. If both a user
* settings file and a global settings file are given, the user settings take precedence.
*
* @param userSettingsFile The user settings file, may be {@code null} to disable user settings.
* @return This request, never {@code null}.
*/
SettingsBuildingRequest setUserSettingsFile( File userSettingsFile );
/**
* Gets the system properties to use for interpolation. The system properties are collected from the runtime
* environment like {@link System#getProperties()} and environment variables.
*
* @return The system properties, never {@code null}.
*/
Properties getSystemProperties();
/**
* Sets the system properties to use for interpolation. The system properties are collected from the runtime
* environment like {@link System#getProperties()} and environment variables.
*
* @param systemProperties The system properties, may be {@code null}.
* @return This request, never {@code null}.
*/
SettingsBuildingRequest setSystemProperties( Properties systemProperties );
/**
* Gets the user properties to use for interpolation. The user properties have been configured directly by the user
* on his discretion, e.g. via the {@code -Dkey=value} parameter on the command line.
*
* @return The user properties, never {@code null}.
*/
Properties getUserProperties();
/**
* Sets the user properties to use for interpolation. The user properties have been configured directly by the user
* on his discretion, e.g. via the {@code -Dkey=value} parameter on the command line.
*
* @param userProperties The user properties, may be {@code null}.
* @return This request, never {@code null}.
*/
SettingsBuildingRequest setUserProperties( Properties userProperties );
}

View File

@ -0,0 +1,50 @@
package org.apache.maven.settings.building;
/*
* 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.List;
import org.apache.maven.settings.Settings;
/**
* Collects the output of the settings builder.
*
* @author Benjamin Bentmann
*/
public interface SettingsBuildingResult
{
/**
* Gets the assembled settings.
*
* @return The assembled settings, never {@code null}.
*/
Settings getEffectiveSettings();
/**
* Gets the problems that were encountered during the settings building. Note that only problems of severity
* {@link SettingsProblem.Severity#WARNING} and below are reported here. Problems with a higher severity level cause
* the settings builder to fail with a {@link SettingsBuildingException}.
*
* @return The problems that were encountered during the model building, can be empty but never {@code null}.
*/
List<SettingsProblem> getProblems();
}

View File

@ -0,0 +1,100 @@
package org.apache.maven.settings.building;
/*
* 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.
*/
/**
* Describes a problem that was encountered during settings building. A problem can either be an exception that was
* thrown or a simple string message. In addition, a problem carries a hint about its source, e.g. the settings file
* that exhibits the problem.
*
* @author Benjamin Bentmann
*/
public interface SettingsProblem
{
/**
* The different severity levels for a problem, in decreasing order.
*/
enum Severity
{
FATAL, //
ERROR, //
WARNING; //
}
/**
* Gets the hint about the source of the problem. While the syntax of this hint is unspecified and depends on the
* creator of the problem, the general expectation is that the hint provides sufficient information to the user to
* track the problem back to its origin. A concrete example for such a source hint can be the file path or URL from
* which the settings were read.
*
* @return The hint about the source of the problem or an empty string if unknown, never {@code null}.
*/
String getSource();
/**
* Gets the one-based index of the line containing the problem. The line number should refer to some text file that
* is given by {@link #getSource()}.
*
* @return The one-based index of the line containing the problem or a non-positive value if unknown.
*/
int getLineNumber();
/**
* Gets the one-based index of the column containing the problem. The column number should refer to some text file
* that is given by {@link #getSource()}.
*
* @return The one-based index of the column containing the problem or non-positive value if unknown.
*/
int getColumnNumber();
/**
* Gets the location of the problem. The location is a user-friendly combination of the values from
* {@link #getSource()}, {@link #getLineNumber()} and {@link #getColumnNumber()}. The exact syntax of the returned
* value is undefined.
*
* @return The location of the problem, never {@code null}.
*/
String getLocation();
/**
* Gets the exception that caused this problem (if any).
*
* @return The exception that caused this problem or {@code null} if not applicable.
*/
Exception getException();
/**
* Gets the message that describes this problem.
*
* @return The message describing this problem, never {@code null}.
*/
String getMessage();
/**
* Gets the severity level of this problem.
*
* @return The severity level of this problem, never {@code null}.
*/
Severity getSeverity();
}

View File

@ -39,8 +39,13 @@ import org.apache.maven.execution.MavenExecutionRequestPopulator;
import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.model.locator.ModelLocator;
import org.apache.maven.repository.ArtifactTransferListener;
import org.apache.maven.settings.MavenSettingsBuilder;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
import org.apache.maven.settings.building.SettingsBuilder;
import org.apache.maven.settings.building.SettingsBuildingException;
import org.apache.maven.settings.building.SettingsBuildingRequest;
import org.apache.maven.settings.building.SettingsBuildingResult;
import org.apache.maven.settings.building.SettingsProblem;
import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
import org.codehaus.plexus.ContainerConfiguration;
import org.codehaus.plexus.DefaultContainerConfiguration;
@ -249,11 +254,32 @@ public class MavenCli
try
{
MavenSettingsBuilder settingsBuilder = container.lookup( MavenSettingsBuilder.class );
SettingsBuildingRequest settingsRequest = new DefaultSettingsBuildingRequest();
settingsRequest.setGlobalSettingsFile( configuration.getGlobalSettingsFile() );
settingsRequest.setUserSettingsFile( configuration.getUserSettingsFile() );
settingsRequest.setSystemProperties( request.getSystemProperties() );
settingsRequest.setUserProperties( request.getUserProperties() );
SettingsBuilder settingsBuilder = container.lookup( SettingsBuilder.class );
try
{
settings = settingsBuilder.buildSettings( request );
SettingsBuildingResult settingsResult = settingsBuilder.build( settingsRequest );
settings = settingsResult.getEffectiveSettings();
if ( !settingsResult.getProblems().isEmpty() && logger.isWarnEnabled() )
{
logger.warn( "" );
logger.warn( "Some problems were encountered while building the effective settings" );
for ( SettingsProblem problem : settingsResult.getProblems() )
{
logger.warn( problem.getMessage() + " @ " + problem.getLocation() );
}
logger.warn( "" );
}
}
finally
{
@ -273,18 +299,12 @@ public class MavenCli
return 1;
}
catch ( IOException e )
catch ( SettingsBuildingException e )
{
CLIReportingUtils.showError( logger, "Failed to read settings: ", e, showErrors );
return 1;
}
catch ( XmlPullParserException e )
{
CLIReportingUtils.showError( logger, "Failed to parse settings: ", e, showErrors );
return 1;
}
try
{

View File

@ -316,7 +316,7 @@ public class DefaultModelBuilder
}
catch ( IOException e )
{
problems.addFatalError( "Non-parseable POM " + modelSource.getLocation() + ": " + e.getMessage(), -1, -1, e );
problems.addFatalError( "Non-readable POM " + modelSource.getLocation() + ": " + e.getMessage(), -1, -1, e );
throw new ModelBuildingException( problems.getRootModelId(), problems.getProblems() );
}