You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2010/03/19 16:02:22 UTC

svn commit: r925254 - in /maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings: DefaultMavenSettingsBuilder.java MavenSettingsBuilder.java building/DefaultSettingsBuilder.java

Author: bentmann
Date: Fri Mar 19 15:02:22 2010
New Revision: 925254

URL: http://svn.apache.org/viewvc?rev=925254&view=rev
Log:
o Restored backward-compat

Modified:
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java?rev=925254&r1=925253&r2=925254&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java Fri Mar 19 15:02:22 2010
@@ -21,25 +21,18 @@ package org.apache.maven.settings;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.List;
 
 import org.apache.maven.execution.MavenExecutionRequest;
-import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
-import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
+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.SettingsProblem;
 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;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
@@ -50,200 +43,138 @@ public class DefaultMavenSettingsBuilder
     extends AbstractLogEnabled
     implements MavenSettingsBuilder
 {
+
     @Requirement
-    private SettingsValidator validator;
+    private SettingsBuilder settingsBuilder;
 
-    /** @since 2.1 */
-    public Settings buildSettings( MavenExecutionRequest request )
+    public Settings buildSettings()
         throws IOException, XmlPullParserException
     {
-        File userSettingsFile = request.getUserSettingsFile();
-
-        File globalSettingsFile = request.getGlobalSettingsFile();
-
-        if ( ( globalSettingsFile == null ) && ( userSettingsFile == null ) )
-        {
-            getLogger().debug(
-                "No settings files provided, and default locations are disabled for this request. Returning empty Settings instance." );
-            return new Settings();
-        }
-
-        getLogger().debug( "Reading global settings from: " + globalSettingsFile );
-
-        Settings globalSettings = readSettings( globalSettingsFile );
-
-        if ( globalSettings == null )
-        {
-            globalSettings = new Settings();
-        }
-
-        getLogger().debug( "Reading user settings from: " + userSettingsFile );
-
-        Settings userSettings = readSettings( userSettingsFile );
-
-        if ( userSettings == null )
-        {
-            userSettings = new Settings();
-        }
-
-        validateSettings(
-            globalSettings,
-            globalSettingsFile );
-
-        validateSettings(
-            userSettings,
-            userSettingsFile );
-
-        SettingsUtils.merge(
-            userSettings,
-            globalSettings,
-            TrackableBase.GLOBAL_LEVEL );
-
-        userSettings = interpolate( userSettings, request );
-
-        // 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() );
-            }
-        }
+        File userSettingsFile =
+            getFile( "${user.home}/.m2/settings.xml", "user.home", MavenSettingsBuilder.ALT_USER_SETTINGS_XML_LOCATION );
 
-        return userSettings;
+        return buildSettings( userSettingsFile );
     }
 
-
-    private Settings interpolate( Settings settings, MavenExecutionRequest request )
+    public Settings buildSettings( boolean useCachedSettings )
         throws IOException, XmlPullParserException
     {
-        List<String> activeProfiles = settings.getActiveProfiles();
-
-        StringWriter writer = new StringWriter();
-
-        new SettingsXpp3Writer().write(
-            writer,
-            settings );
-
-        String serializedSettings = writer.toString();
-
-        RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
-
-        interpolator.addValueSource( new PropertiesBasedValueSource( request.getUserProperties() ) );
+        return buildSettings();
+    }
 
-        interpolator.addValueSource( new PropertiesBasedValueSource( request.getSystemProperties() ) );
+    public Settings buildSettings( File userSettingsFile )
+        throws IOException, XmlPullParserException
+    {
+        File globalSettingsFile =
+            getFile( "${maven.home}/conf/settings.xml", "maven.home",
+                     MavenSettingsBuilder.ALT_GLOBAL_SETTINGS_XML_LOCATION );
+
+        SettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
+        request.setUserSettingsFile( userSettingsFile );
+        request.setGlobalSettingsFile( globalSettingsFile );
+        request.setSystemProperties( System.getProperties() );
+        return build(request);
+    }
 
-        interpolator.addValueSource( new EnvarBasedValueSource() );
+    public Settings buildSettings( File userSettingsFile, boolean useCachedSettings )
+        throws IOException, XmlPullParserException
+    {
+        return buildSettings( userSettingsFile );
+    }
 
+    private Settings build( SettingsBuildingRequest request )
+        throws IOException, XmlPullParserException
+    {
         try
         {
-            serializedSettings = interpolator.interpolate(
-                serializedSettings,
-                "settings" );
+            return settingsBuilder.build( request ).getEffectiveSettings();
         }
-        catch ( InterpolationException e )
+        catch ( SettingsBuildingException e )
         {
-            IOException error = new IOException( "Failed to interpolate settings." );
-            error.initCause( e );
-
-            throw error;
+            throw (IOException) new IOException( e.getMessage() ).initCause( e );
         }
-
-        Settings result = new SettingsXpp3Reader().read( new StringReader( serializedSettings ) );
-
-        result.setActiveProfiles( activeProfiles );
-
-        return result;
     }
 
-    private Settings readSettings( File settingsFile )
+    /** @since 2.1 */
+    public Settings buildSettings( MavenExecutionRequest request )
         throws IOException, XmlPullParserException
     {
-        if ( settingsFile == null )
-        {
-            getLogger().debug( "Settings file is null. Returning null." );
-
-            return null;
-        }
-
-        if ( !settingsFile.exists() )
-        {
-            getLogger().debug( "Settings file doesn't exist. Returning null." );
-
-            return null;
-        }
+        SettingsBuildingRequest settingsRequest = new DefaultSettingsBuildingRequest();
+        settingsRequest.setUserSettingsFile( request.getUserSettingsFile() );
+        settingsRequest.setGlobalSettingsFile( request.getGlobalSettingsFile() );
+        settingsRequest.setUserProperties( request.getUserProperties() );
+        settingsRequest.setSystemProperties( request.getSystemProperties() );
+        
+        return build(settingsRequest);
+    }
 
-        Settings settings = null;
+    public SettingsValidationResult validateSettings( File settingsFile )
+    {
+        SettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
+        request.setUserSettingsFile( settingsFile );
 
-        Reader reader = null;
+        SettingsValidationResult result = new SettingsValidationResult();
 
         try
         {
-            reader = ReaderFactory.newXmlReader( settingsFile );
-
-            SettingsXpp3Reader modelReader = new SettingsXpp3Reader();
-
-            settings = modelReader.read( reader );
-        }
-        catch ( XmlPullParserException e )
-        {
-            getLogger().error( "Failed to read settings from: " + settingsFile + ". Throwing XmlPullParserException..." );
-
-            throw e;
-        }
-        catch ( IOException e )
-        {
-            getLogger().error( "Failed to read settings from: " + settingsFile + ". Throwing IOException..." );
-
-            throw e;
+            settingsBuilder.build( request );
         }
-        finally
+        catch ( SettingsBuildingException e )
         {
-            IOUtil.close( reader );
+            for ( SettingsProblem problem : e.getProblems() )
+            {
+                result.addMessage( problem.getMessage() );
+            }
         }
 
-        return settings;
+        return result;
     }
 
-    private void validateSettings( Settings settings,
-                                   File location )
-        throws IOException
+    private File getFile( String pathPattern, String basedirSysProp, String altLocationSysProp )
     {
-        SettingsValidationResult validationResult = validator.validate( settings );
+        // -------------------------------------------------------------------------------------
+        // Alright, here's the justification for all the regexp wizardry below...
+        //
+        // Continuum and other server-like apps may need to locate the user-level and
+        // global-level settings somewhere other than ${user.home} and ${maven.home},
+        // respectively. Using a simple replacement of these patterns will allow them
+        // to specify the absolute path to these files in a customized components.xml
+        // file. Ideally, we'd do full pattern-evaluation against the sysprops, but this
+        // is a first step. There are several replacements below, in order to normalize
+        // the path character before we operate on the string as a regex input, and
+        // in order to avoid surprises with the File construction...
+        // -------------------------------------------------------------------------------------
+
+        String path = System.getProperty( altLocationSysProp );
+
+        if ( StringUtils.isEmpty( path ) )
+        {
+            // TODO: This replacing shouldn't be necessary as user.home should be in the
+            // context of the container and thus the value would be interpolated by Plexus
+            String basedir = System.getProperty( basedirSysProp );
+            if ( basedir == null )
+            {
+                basedir = System.getProperty( "user.dir" );
+            }
 
-        if ( validationResult.getMessageCount() > 0 )
-        {
-            throw new IOException( "Failed to validate Settings file at " + location + "\n" + validationResult.render( "\n" ) );
-        }
-    }
+            basedir = basedir.replaceAll( "\\\\", "/" );
+            basedir = basedir.replaceAll( "\\$", "\\\\\\$" );
 
-    public SettingsValidationResult validateSettings( File settingsFile )
-    {
-        SettingsValidationResult result = new SettingsValidationResult();
-        if ( settingsFile != null && !settingsFile.canRead() )
-        {
-            try
-            {
-                Settings settings = readSettings( settingsFile );
+            path = pathPattern.replaceAll( "\\$\\{" + basedirSysProp + "\\}", basedir );
+            path = path.replaceAll( "\\\\", "/" );
+            // ---------------------------------------------------------------------------------
+            // I'm not sure if this last regexp was really intended to disallow the usage of
+            // network paths as user.home directory. Unfortunately it did. I removed it and
+            // have not detected any problems yet.
+            // ---------------------------------------------------------------------------------
+            // path = path.replaceAll( "//", "/" );
 
-                return validator.validate( settings );
-            }
-            catch ( IOException e )
-            {
-                result.addMessage( e.getMessage() );
-            }
-            catch ( XmlPullParserException e )
-            {
-                result.addMessage( e.getMessage() );
-            }
+            return new File( path ).getAbsoluteFile();
         }
         else
         {
-            // TODO do we have anything to say?
+            return new File( path ).getAbsoluteFile();
         }
-
-        return result;
     }
+
 }

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java?rev=925254&r1=925253&r2=925254&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java Fri Mar 19 15:02:22 2010
@@ -33,10 +33,52 @@ import org.codehaus.plexus.util.xml.pull
 @Deprecated
 public interface MavenSettingsBuilder
 {
+
     String ROLE = MavenSettingsBuilder.class.getName();
 
+    String ALT_USER_SETTINGS_XML_LOCATION = "org.apache.maven.user-settings";
+    String ALT_GLOBAL_SETTINGS_XML_LOCATION = "org.apache.maven.global-settings";
+    String ALT_LOCAL_REPOSITORY_LOCATION = "maven.repo.local";
+
     Settings buildSettings( MavenExecutionRequest request )
         throws IOException, XmlPullParserException;
 
     SettingsValidationResult validateSettings( File settingsFile );
+
+    /**
+     * @return a <code>Settings</code> object from the user settings file.
+     * @throws IOException if any
+     * @throws XmlPullParserException if any
+     */
+    Settings buildSettings()
+        throws IOException, XmlPullParserException;
+
+    /**
+     * @param useCachedSettings if true, doesn't reload the user settings
+     * @return a <code>Settings</code> object from the user settings file.
+     * @throws IOException if any
+     * @throws XmlPullParserException if any
+     */
+    Settings buildSettings( boolean useCachedSettings )
+        throws IOException, XmlPullParserException;
+
+    /**
+     * @param userSettingsFile a given user settings file
+     * @return a <code>Settings</code> object from the user settings file.
+     * @throws IOException if any
+     * @throws XmlPullParserException if any
+     */
+    Settings buildSettings( File userSettingsFile )
+        throws IOException, XmlPullParserException;
+
+    /**
+     * @param userSettingsFile a given user settings file
+     * @param useCachedSettings if true, doesn't reload the user settings
+     * @return a <code>Settings</code> object from the user settings file.
+     * @throws IOException if any
+     * @throws XmlPullParserException if any
+     */
+    Settings buildSettings( File userSettingsFile, boolean useCachedSettings )
+        throws IOException, XmlPullParserException;
+
 }

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java?rev=925254&r1=925253&r2=925254&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java Fri Mar 19 15:02:22 2010
@@ -166,8 +166,6 @@ public class DefaultSettingsBuilder
 
     private Settings interpolate( Settings settings, SettingsBuildingRequest request, List<SettingsProblem> problems )
     {
-        List<String> activeProfiles = settings.getActiveProfiles();
-
         StringWriter writer = new StringWriter( 1024 * 4 );
 
         try
@@ -222,8 +220,6 @@ public class DefaultSettingsBuilder
             return settings;
         }
 
-        result.setActiveProfiles( activeProfiles );
-
         return result;
     }