You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2007/02/22 02:01:55 UTC

svn commit: r510335 - in /maven/components/trunk: maven-build-context/src/main/java/org/apache/maven/context/ maven-embedder/src/main/java/org/apache/maven/embedder/ maven-embedder/src/main/java/org/apache/maven/embedder/execution/ maven-embedder/src/m...

Author: jdcasey
Date: Wed Feb 21 17:01:54 2007
New Revision: 510335

URL: http://svn.apache.org/viewvc?view=rev&rev=510335
Log:
Adding read/writeSettings() api to the maven-tools and the embedder along with unit tests in each place, and adding a cache object for the settings that is based on the build-context.

Added:
    maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/
    maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/SettingsCache.java   (with props)
    maven/components/trunk/maven-tools/src/test/
    maven/components/trunk/maven-tools/src/test/java/
    maven/components/trunk/maven-tools/src/test/java/org/
    maven/components/trunk/maven-tools/src/test/java/org/apache/
    maven/components/trunk/maven-tools/src/test/java/org/apache/maven/
    maven/components/trunk/maven-tools/src/test/java/org/apache/maven/AbstractMavenToolsTest.java   (with props)
    maven/components/trunk/maven-tools/src/test/java/org/apache/maven/DefaultMavenToolsTest.java   (with props)
Modified:
    maven/components/trunk/maven-build-context/src/main/java/org/apache/maven/context/DefaultBuildContextManager.java
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/DefaultMavenExecutionRequestDefaultsPopulator.java
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/MavenExecutionRequestDefaultsPopulator.java
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/writer/WriterUtils.java
    maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java
    maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/build/model/DefaultModelLineageBuilderTest.java
    maven/components/trunk/maven-settings/pom.xml
    maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java
    maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java
    maven/components/trunk/maven-settings/src/main/resources/META-INF/plexus/components.xml
    maven/components/trunk/maven-tools/src/main/java/org/apache/maven/DefaultMavenTools.java
    maven/components/trunk/maven-tools/src/main/java/org/apache/maven/MavenTools.java
    maven/components/trunk/maven-tools/src/main/resources/META-INF/plexus/components.xml

Modified: maven/components/trunk/maven-build-context/src/main/java/org/apache/maven/context/DefaultBuildContextManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-build-context/src/main/java/org/apache/maven/context/DefaultBuildContextManager.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-build-context/src/main/java/org/apache/maven/context/DefaultBuildContextManager.java (original)
+++ maven/components/trunk/maven-build-context/src/main/java/org/apache/maven/context/DefaultBuildContextManager.java Wed Feb 21 17:01:54 2007
@@ -18,7 +18,8 @@
     
     protected static final String BUILD_CONTEXT_MAP_KEY = ROLE + ":" + ROLE_HINT + ":contextMap";
     
-    private InheritableThreadLocal tl = new InheritableThreadLocal();
+    // NOTE: this needs to be static so it can be found by new ctxMgr instances.
+    private static InheritableThreadLocal tl = new InheritableThreadLocal();
     
     public DefaultBuildContextManager()
     {

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java Wed Feb 21 17:01:54 2007
@@ -31,6 +31,7 @@
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.context.BuildContextManager;
 import org.apache.maven.embedder.execution.MavenExecutionRequestDefaultsPopulator;
 import org.apache.maven.embedder.writer.WriterUtils;
 import org.apache.maven.execution.DefaultMavenExecutionResult;
@@ -49,6 +50,7 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.settings.MavenSettingsBuilder;
 import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.DefaultPlexusContainer;
 import org.codehaus.plexus.MutablePlexusContainer;
@@ -69,6 +71,7 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.Reader;
 import java.io.Writer;
 import java.net.URL;
 import java.util.ArrayList;
@@ -144,6 +147,8 @@
 
     private MavenEmbedderConfiguration embedderRequest;
 
+    private BuildContextManager buildContextManager;
+
     // ----------------------------------------------------------------------------
     // Constructors
     // ----------------------------------------------------------------------------
@@ -209,7 +214,7 @@
     {
         return modelReader.read( new FileReader( model ) );
     }
-
+    
     public void writeModel( Writer writer,
                             Model model,
                             boolean namespaceDeclaration )
@@ -234,6 +239,112 @@
     {
         return mavenProjectBuilder.build( mavenProject, localRepository, profileManager );
     }
+    
+    // ----------------------------------------------------------------------
+    // Settings
+    // ----------------------------------------------------------------------
+
+    public static Settings readSettingsFromFile( Reader reader )
+        throws SettingsConfigurationException, MavenEmbedderException, IOException
+    {
+        return readSettingsFromFile( reader, null );
+    }
+
+    public static Settings readSettingsFromFile( Reader reader, MavenEmbedderLogger logger )
+        throws SettingsConfigurationException, MavenEmbedderException, IOException
+    {
+        DefaultPlexusContainer container = null;
+
+        try
+        {
+            try
+            {
+                container = new DefaultPlexusContainer();
+            }
+            catch ( PlexusContainerException e )
+            {
+                throw new MavenEmbedderException( "Error starting container.", e );
+            }
+
+            if ( logger != null )
+            {
+                MavenEmbedderLoggerManager loggerManager = new MavenEmbedderLoggerManager(
+                                                                                           new PlexusLoggerAdapter(
+                                                                                                                    logger ) );
+
+                container.setLoggerManager( loggerManager );
+            }
+
+            MavenTools mavenTools;
+            try
+            {
+                mavenTools = (MavenTools) container.lookup( MavenTools.ROLE, container.getContainerRealm() );
+            }
+            catch ( ComponentLookupException e )
+            {
+                throw new MavenEmbedderException( "Error retrieving Maven tools.", e );
+            }
+
+            return mavenTools.readSettings( reader );
+        }
+        finally
+        {
+            if ( container != null )
+            {
+                container.dispose();
+            }
+        }
+    }
+
+    public static void writeSettings( Writer writer, Settings settings )
+        throws IOException, MavenEmbedderException
+    {
+        writeSettings( writer, settings, null );
+    }
+    
+    public static void writeSettings( Writer writer, Settings settings, MavenEmbedderLogger logger )
+        throws IOException, MavenEmbedderException
+    {
+        DefaultPlexusContainer container = null;
+
+        try
+        {
+            try
+            {
+                container = new DefaultPlexusContainer();
+            }
+            catch ( PlexusContainerException e )
+            {
+                throw new MavenEmbedderException( "Error starting container.", e );
+            }
+
+            if ( logger != null )
+            {
+                MavenEmbedderLoggerManager loggerManager = new MavenEmbedderLoggerManager( new PlexusLoggerAdapter( logger ) );
+
+                container.setLoggerManager( loggerManager );
+            }
+
+            MavenTools mavenTools;
+            try
+            {
+                mavenTools = (MavenTools) container.lookup( MavenTools.ROLE, container.getContainerRealm() );
+            }
+            catch ( ComponentLookupException e )
+            {
+                throw new MavenEmbedderException( "Error retrieving Maven tools.", e );
+            }
+
+            mavenTools.writeSettings( settings, writer );
+        }
+        finally
+        {
+            if ( container != null )
+            {
+                container.dispose();
+            }
+        }
+    }
 
     /**
      * mkleint: protected so that IDE integrations can selectively allow downloading artifacts
@@ -312,7 +423,7 @@
 
         try
         {
-            request = defaultsPopulator.populateDefaults( request );
+            request = defaultsPopulator.populateDefaults( request, embedderRequest );
 
             project = readProject( new File( request.getPomFile() ) );
             //mkleint: copied from DefaultLifecycleExecutor    
@@ -440,6 +551,10 @@
 
     public static final String DEFAULT_LAYOUT_ID = "default";
 
+    public static final File DEFAULT_GLOBAL_SETTINGS_FILE = MavenSettingsBuilder.DEFAULT_GLOBAL_SETTINGS_FILE;
+    
+    public static final File DEFAULT_USER_SETTINGS_FILE = MavenSettingsBuilder.DEFAULT_USER_SETTINGS_FILE;
+
     public ArtifactRepository createLocalRepository( File localRepository )
         throws ComponentLookupException
     {
@@ -562,6 +677,8 @@
             profileManager.explicitlyDeactivate( req.getInactiveProfiles() );
 
             mavenProjectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.ROLE );
+            
+            buildContextManager = (BuildContextManager) container.lookup( BuildContextManager.ROLE );
 
             // ----------------------------------------------------------------------
             // Artifact related components
@@ -646,6 +763,10 @@
     {
         try
         {
+            buildContextManager.clearBuildContext();
+            
+            container.release( buildContextManager );
+            
             container.release( mavenProjectBuilder );
 
             container.release( artifactRepositoryFactory );
@@ -671,7 +792,7 @@
 
             try
             {
-                request = defaultsPopulator.populateDefaults( request );
+                request = defaultsPopulator.populateDefaults( request, embedderRequest );
             }
             catch ( MavenEmbedderException e )
             {

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/DefaultMavenExecutionRequestDefaultsPopulator.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/DefaultMavenExecutionRequestDefaultsPopulator.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/DefaultMavenExecutionRequestDefaultsPopulator.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/DefaultMavenExecutionRequestDefaultsPopulator.java Wed Feb 21 17:01:54 2007
@@ -23,6 +23,8 @@
 import org.apache.maven.SettingsConfigurationException;
 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.embedder.MavenEmbedder;
+import org.apache.maven.embedder.MavenEmbedderConfiguration;
 import org.apache.maven.embedder.MavenEmbedderException;
 import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.monitor.event.DefaultEventMonitor;
@@ -34,7 +36,6 @@
 import org.apache.maven.usability.SystemWarnings;
 import org.apache.maven.wagon.manager.RepositorySettings;
 import org.apache.maven.wagon.manager.WagonManager;
-import org.apache.maven.wagon.repository.Repository;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
@@ -43,7 +44,6 @@
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
-import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 import java.io.File;
@@ -66,7 +66,7 @@
 
     private WagonManager wagonManager;
 
-    public MavenExecutionRequest populateDefaults( MavenExecutionRequest request )
+    public MavenExecutionRequest populateDefaults( MavenExecutionRequest request, MavenEmbedderConfiguration embedderConfiguration )
         throws MavenEmbedderException
     {
         // Settings
@@ -74,10 +74,27 @@
         if ( request.getSettings() == null )
         {
             // A local repository set in the request should win over what's in a settings.xml file.
+            String userSettingsLocation = request.getSettingsFile();
+            if ( userSettingsLocation == null )
+            {
+                File userSettingsFile = embedderConfiguration.getUserSettingsFile();
+                if ( userSettingsFile != null )
+                {
+                    userSettingsLocation = userSettingsFile.getAbsolutePath();
+                }
+            }
 
-            File userSettingsPath = mavenTools.getUserSettingsPath( request.getSettingsFile() );
+            File userSettingsPath = mavenTools.getUserSettingsPath( userSettingsLocation );
 
             File globalSettingsFile = mavenTools.getGlobalSettingsPath();
+            if ( globalSettingsFile.equals( MavenEmbedder.DEFAULT_GLOBAL_SETTINGS_FILE ) )
+            {
+                File configGlobalSettings = embedderConfiguration.getGlobalSettingsFile();
+                if ( configGlobalSettings != null )
+                {
+                    globalSettingsFile = configGlobalSettings;
+                }
+            }
 
             try
             {

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/MavenExecutionRequestDefaultsPopulator.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/MavenExecutionRequestDefaultsPopulator.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/MavenExecutionRequestDefaultsPopulator.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/execution/MavenExecutionRequestDefaultsPopulator.java Wed Feb 21 17:01:54 2007
@@ -1,5 +1,6 @@
 package org.apache.maven.embedder.execution;
 
+import org.apache.maven.embedder.MavenEmbedderConfiguration;
 import org.apache.maven.embedder.MavenEmbedderException;
 import org.apache.maven.execution.MavenExecutionRequest;
 
@@ -7,6 +8,6 @@
 {
     String ROLE = MavenExecutionRequestDefaultsPopulator.class.getName();
 
-    MavenExecutionRequest populateDefaults( MavenExecutionRequest request )
+    MavenExecutionRequest populateDefaults( MavenExecutionRequest request, MavenEmbedderConfiguration embedderConfiguration )
         throws MavenEmbedderException;
 }

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/writer/WriterUtils.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/writer/WriterUtils.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/writer/WriterUtils.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/writer/WriterUtils.java Wed Feb 21 17:01:54 2007
@@ -19,19 +19,15 @@
 
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.jdom.MavenJDOMWriter;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.settings.io.jdom.SettingsJDOMWriter;
 import org.jdom.Document;
 import org.jdom.Element;
 import org.jdom.Namespace;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
 import org.jdom.output.Format;
-import org.codehaus.plexus.util.IOUtil;
 
 import java.io.IOException;
 import java.io.Writer;
-import java.io.OutputStreamWriter;
-import java.io.InputStream;
-import java.nio.channels.FileLock;
 
 //TODO: turn this into a component
 

Modified: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java (original)
+++ maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java Wed Feb 21 17:01:54 2007
@@ -1,14 +1,28 @@
 package org.apache.maven.embedder;
 
+import org.apache.maven.SettingsConfigurationException;
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.execution.DefaultMavenExecutionRequest;
 import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.execution.MavenExecutionResult;
 import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.settings.Profile;
+import org.apache.maven.settings.Repository;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
+import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
 import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
 import java.io.File;
+import java.io.FileReader;
 import java.io.FileWriter;
+import java.io.IOException;
 import java.io.Writer;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -16,11 +30,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import junit.framework.TestCase;
-import org.apache.maven.artifact.handler.ArtifactHandler;
-import org.apache.maven.artifact.handler.DefaultArtifactHandler;
-import org.apache.maven.model.Plugin;
-import org.apache.maven.plugin.PluginManagerException;
 
 public class MavenEmbedderTest
     extends TestCase
@@ -276,6 +287,169 @@
         model = maven.readModel( file );
 
         assertEquals( "org.apache.maven.new", model.getGroupId() );
+    }
+    
+    // ----------------------------------------------------------------------
+    // Settings-File Handling
+    // ----------------------------------------------------------------------
+    
+    public void testReadSettings()
+        throws IOException, SettingsConfigurationException, MavenEmbedderException
+    {
+        Settings s = new Settings();
+        s.setOffline( true );
+        
+        String localRepoPath = "/path/to/local/repo";
+        
+        s.setLocalRepository( localRepoPath );
+        
+        File settingsFile = File.createTempFile( "embedder-test.settings.", "" );
+        settingsFile.deleteOnExit();
+        
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            new SettingsXpp3Writer().write( writer, s );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+        
+        FileReader reader = null;
+        try
+        {
+            reader = new FileReader( settingsFile );
+            Settings result = MavenEmbedder.readSettingsFromFile( reader );
+            
+            assertEquals( localRepoPath, result.getLocalRepository() );
+            assertTrue( result.isOffline() );
+        }
+        finally
+        {
+            IOUtil.close( reader );
+        }
+    }
+
+    public void testReadSettings_shouldFailToValidate()
+        throws IOException, SettingsConfigurationException, MavenEmbedderException
+    {
+        Settings s = new Settings();
+        
+        Profile p = new Profile();
+        
+        Repository r = new Repository();
+        r.setUrl( "http://example.com" );
+        
+        p.addRepository( r );
+        s.addProfile( p );
+
+        File settingsFile = File.createTempFile( "embedder-test.settings.", "" );
+        settingsFile.deleteOnExit();
+
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            new SettingsXpp3Writer().write( writer, s );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+
+        FileReader reader = null;
+        try
+        {
+            reader = new FileReader( settingsFile );
+            Settings result = MavenEmbedder.readSettingsFromFile( reader );
+
+            fail( "Settings should not pass validation when being read." );
+        }
+        catch( IOException e )
+        {
+            String message = e.getMessage();
+            assertTrue( message.indexOf( "Failed to validate" ) > -1 );
+        }
+        finally
+        {
+            IOUtil.close( reader );
+        }
+    }
+
+    public void testWriteSettings()
+        throws IOException, SettingsConfigurationException, MavenEmbedderException, XmlPullParserException
+    {
+        Settings s = new Settings();
+        s.setOffline( true );
+
+        String localRepoPath = "/path/to/local/repo";
+
+        s.setLocalRepository( localRepoPath );
+
+        File settingsFile = File.createTempFile( "embedder-test.settings.", "" );
+        settingsFile.deleteOnExit();
+
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            MavenEmbedder.writeSettings( writer, s );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+
+        FileReader reader = null;
+        try
+        {
+            reader = new FileReader( settingsFile );
+            Settings result = new SettingsXpp3Reader().read( reader );
+
+            assertEquals( localRepoPath, result.getLocalRepository() );
+            assertTrue( result.isOffline() );
+        }
+        finally
+        {
+            IOUtil.close( reader );
+        }
+    }
+
+    public void testWriteSettings_shouldFailToValidate()
+        throws IOException, SettingsConfigurationException, MavenEmbedderException
+    {
+        Settings s = new Settings();
+
+        Profile p = new Profile();
+
+        Repository r = new Repository();
+        r.setUrl( "http://example.com" );
+
+        p.addRepository( r );
+        s.addProfile( p );
+
+        File settingsFile = File.createTempFile( "embedder-test.settings.", "" );
+        settingsFile.deleteOnExit();
+
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            MavenEmbedder.writeSettings( writer, s );
+            
+            fail( "Validation of settings should fail before settings are written." );
+        }
+        catch ( IOException e )
+        {
+            String message = e.getMessage();
+            assertTrue( message.indexOf( "Failed to validate" ) > -1 );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
     }
 
     // ----------------------------------------------------------------------

Modified: maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/build/model/DefaultModelLineageBuilderTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/build/model/DefaultModelLineageBuilderTest.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/build/model/DefaultModelLineageBuilderTest.java (original)
+++ maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/build/model/DefaultModelLineageBuilderTest.java Wed Feb 21 17:01:54 2007
@@ -39,6 +39,15 @@
 
         defaultLayout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );
     }
+    
+    public void tearDown()
+        throws Exception
+    {
+        BuildContextManager ctxMgr = (BuildContextManager) lookup( BuildContextManager.ROLE );
+        ctxMgr.clearBuildContext();
+        
+        super.tearDown();
+    }
 
     public void testShouldReadSinglePomWithNoParents()
         throws IOException, ProjectBuildingException

Modified: maven/components/trunk/maven-settings/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-settings/pom.xml?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-settings/pom.xml (original)
+++ maven/components/trunk/maven-settings/pom.xml Wed Feb 21 17:01:54 2007
@@ -49,6 +49,11 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
+      <artifactId>maven-build-context</artifactId>
+      <version>2.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
       <artifactId>maven-model</artifactId>
       <version>2.1-SNAPSHOT</version>
     </dependency>

Modified: maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java (original)
+++ maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java Wed Feb 21 17:01:54 2007
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 
+import org.apache.maven.context.BuildContextManager;
+import org.apache.maven.settings.cache.SettingsCache;
 import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.IOUtil;
@@ -43,21 +45,28 @@
     
     private SettingsValidator validator;
     
-    // ----------------------------------------------------------------------
-    // MavenProfilesBuilder Implementation
-    // ----------------------------------------------------------------------
-
+    private BuildContextManager buildContextManager;
+    
     /**
      * @since 2.1
      */
     public Settings buildSettings( File userSettingsFile, File globalSettingsFile )
         throws IOException, XmlPullParserException
     {
+        SettingsCache cache = SettingsCache.read( buildContextManager, userSettingsFile, globalSettingsFile );
+        
+        if ( cache != null )
+        {
+            return cache.getSettings();
+        }
+        
+        // NOTE: We're allowing users to hang themselves here...if the global settings file is null,
+        // the default location is NOT read.
         Settings globalSettings = readSettings( globalSettingsFile );
         
         if ( userSettingsFile == null )
         {
-            userSettingsFile = new File( new File( System.getProperty( "user.home" ) ), ".m2/settings.xml" );
+            userSettingsFile = DEFAULT_USER_SETTINGS_FILE;
         }
 
         Settings userSettings = readSettings( userSettingsFile );
@@ -81,6 +90,9 @@
         SettingsUtils.merge( userSettings, globalSettings, TrackableBase.GLOBAL_LEVEL );
 
         activateDefaultProfiles( userSettings );
+        
+        cache = new SettingsCache( userSettingsFile, globalSettingsFile, userSettings );
+        cache.store( buildContextManager );
 
         return userSettings;
     }
@@ -91,7 +103,7 @@
     public Settings buildSettings()
         throws IOException, XmlPullParserException
     {
-        return buildSettings( new File( new File( System.getProperty( "user.home" ) ), ".m2/settings.xml" ) );
+        return buildSettings( DEFAULT_USER_SETTINGS_FILE );
     }
 
     /**

Modified: maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java (original)
+++ maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java Wed Feb 21 17:01:54 2007
@@ -29,6 +29,11 @@
 {
     String ROLE = MavenSettingsBuilder.class.getName();
 
+    File DEFAULT_USER_SETTINGS_FILE = new File( System.getProperty( "user.home" ), ".m2/settings.xml" );
+
+    File DEFAULT_GLOBAL_SETTINGS_FILE = new File( System
+        .getProperty( "maven.home", System.getProperty( "user.dir", "" ) ), "conf/settings.xml" );
+
     /**
      * @deprecated
      */

Added: maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/SettingsCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/SettingsCache.java?view=auto&rev=510335
==============================================================================
--- maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/SettingsCache.java (added)
+++ maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/SettingsCache.java Wed Feb 21 17:01:54 2007
@@ -0,0 +1,103 @@
+package org.apache.maven.settings.cache;
+
+import org.apache.maven.context.BuildContext;
+import org.apache.maven.context.BuildContextManager;
+import org.apache.maven.context.ManagedBuildData;
+import org.apache.maven.settings.Settings;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SettingsCache
+    implements ManagedBuildData
+{
+    
+    private static final String BUILD_CONTEXT_KEY = SettingsCache.class.getName();
+    
+    private static final String USER_SETTINGS_FILE = "user-settings";
+    private static final String GLOBAL_SETTINGS_FILE = "global-settings";
+    private static final String SETTINGS = "settings";
+    
+    private File userSettingsFile;
+    private File globalSettingsFile;
+    
+    private Settings settings;
+    
+    private SettingsCache( File userSettingsFile, File globalSettingsFile )
+    {
+        this( userSettingsFile, globalSettingsFile, null );
+    }
+    
+    public SettingsCache( File userSettingsFile, File globalSettingsFile, Settings settings )
+    {
+        this.userSettingsFile = userSettingsFile;
+        this.globalSettingsFile = globalSettingsFile;
+        this.settings = settings;
+    }
+    
+    public File getUserSettingsSource()
+    {
+        return userSettingsFile;
+    }
+    
+    public File getGlobalSettingsSource()
+    {
+        return globalSettingsFile;
+    }
+    
+    public Settings getSettings()
+    {
+        return settings;
+    }
+
+    public Map getData()
+    {
+        Map data = new HashMap( 3 );
+        
+        data.put( USER_SETTINGS_FILE, userSettingsFile );
+        data.put( GLOBAL_SETTINGS_FILE, globalSettingsFile );
+        data.put( SETTINGS, settings );
+        
+        return data;
+    }
+
+    public String getStorageKey()
+    {
+        return BUILD_CONTEXT_KEY + "/" + String.valueOf( userSettingsFile ) + "/" + String.valueOf( globalSettingsFile );
+    }
+
+    public void setData( Map data )
+    {
+        this.userSettingsFile = (File) data.get( USER_SETTINGS_FILE );
+        this.globalSettingsFile = (File) data.get( GLOBAL_SETTINGS_FILE );
+        this.settings = (Settings) data.get( SETTINGS );
+    }
+    
+    public void store( BuildContextManager buildContextManager )
+    {
+        BuildContext buildContext = buildContextManager.readBuildContext( true );
+        buildContext.store( this );
+        buildContextManager.storeBuildContext( buildContext );
+    }
+
+    public static SettingsCache read( BuildContextManager buildContextManager, File userSettingsFile )
+    {
+        return read( buildContextManager, userSettingsFile, null );
+    }
+    
+    public static SettingsCache read( BuildContextManager buildContextManager, File userSettingsFile, File globalSettingsFile )
+    {
+        BuildContext buildContext = buildContextManager.readBuildContext( true );
+        
+        SettingsCache cache = new SettingsCache( userSettingsFile, globalSettingsFile );
+        
+        if ( !buildContext.retrieve( cache ) )
+        {
+            return null;
+        }
+        
+        return cache;
+    }
+
+}

Propchange: maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/SettingsCache.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-settings/src/main/java/org/apache/maven/settings/cache/SettingsCache.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/components/trunk/maven-settings/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-settings/src/main/resources/META-INF/plexus/components.xml?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-settings/src/main/resources/META-INF/plexus/components.xml (original)
+++ maven/components/trunk/maven-settings/src/main/resources/META-INF/plexus/components.xml Wed Feb 21 17:01:54 2007
@@ -13,6 +13,10 @@
         <requirement>
           <role>org.apache.maven.settings.validation.SettingsValidator</role>
         </requirement>
+        <requirement>
+          <role>org.apache.maven.context.BuildContextManager</role>
+          <role-hint>default</role-hint>
+        </requirement>
       </requirements>
       <!--
       <configuration>

Modified: maven/components/trunk/maven-tools/src/main/java/org/apache/maven/DefaultMavenTools.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-tools/src/main/java/org/apache/maven/DefaultMavenTools.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-tools/src/main/java/org/apache/maven/DefaultMavenTools.java (original)
+++ maven/components/trunk/maven-tools/src/main/java/org/apache/maven/DefaultMavenTools.java Wed Feb 21 17:01:54 2007
@@ -9,6 +9,10 @@
 import org.apache.maven.settings.MavenSettingsBuilder;
 import org.apache.maven.settings.RuntimeInfo;
 import org.apache.maven.settings.Settings;
+import org.apache.maven.settings.io.jdom.SettingsJDOMWriter;
+import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
+import org.apache.maven.settings.validation.SettingsValidationResult;
+import org.apache.maven.settings.validation.SettingsValidator;
 import org.apache.maven.model.Repository;
 import org.apache.maven.model.DeploymentRepository;
 import org.apache.maven.model.RepositoryPolicy;
@@ -20,9 +24,14 @@
 import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.output.Format;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -39,6 +48,8 @@
     private ArtifactRepositoryFactory artifactRepositoryFactory;
 
     private MavenSettingsBuilder settingsBuilder;
+    
+    private SettingsValidator settingsValidator;
 
     private PlexusContainer container;
 
@@ -344,4 +355,51 @@
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+
+    public void writeSettings( Settings settings, Writer w )
+        throws IOException
+    {
+        SettingsValidationResult validationResult = settingsValidator.validate( settings );
+
+        if ( validationResult.getMessageCount() > 0 )
+        {
+            throw new IOException( "Failed to validate Settings.\n" + validationResult.render("\n") );
+        }
+        
+        Element root = new Element( "settings" );
+
+        Document doc = new Document( root );
+
+        SettingsJDOMWriter writer = new SettingsJDOMWriter();
+
+        String encoding = settings.getModelEncoding() != null ? settings.getModelEncoding() : "UTF-8";
+
+        Format format = Format.getPrettyFormat().setEncoding( encoding );
+
+        writer.write( settings, doc, w, format );
+    }
+
+    public Settings readSettings( Reader r )
+        throws IOException, SettingsConfigurationException
+    {
+        SettingsXpp3Reader reader = new SettingsXpp3Reader();
+        try
+        {
+            Settings settings = reader.read( r );
+            
+            SettingsValidationResult validationResult = settingsValidator.validate( settings );
+
+            if ( validationResult.getMessageCount() > 0 )
+            {
+                throw new IOException( "Failed to validate Settings.\n" + validationResult.render("\n") );
+            }
+            
+            return settings;
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new SettingsConfigurationException( "Failed to parse settings.", e );
+        }
+    }
+
 }

Modified: maven/components/trunk/maven-tools/src/main/java/org/apache/maven/MavenTools.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-tools/src/main/java/org/apache/maven/MavenTools.java?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-tools/src/main/java/org/apache/maven/MavenTools.java (original)
+++ maven/components/trunk/maven-tools/src/main/java/org/apache/maven/MavenTools.java Wed Feb 21 17:01:54 2007
@@ -4,9 +4,13 @@
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.DeploymentRepository;
 import org.apache.maven.model.Repository;
+import org.apache.maven.settings.MavenSettingsBuilder;
 import org.apache.maven.settings.Settings;
 
 import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
 import java.util.List;
 
 /**
@@ -26,9 +30,9 @@
     // Settings
     // ----------------------------------------------------------------------
 
-    File defaultUserSettingsFile = new File( userMavenConfigurationHome, "settings.xml" );
+    File defaultUserSettingsFile = MavenSettingsBuilder.DEFAULT_USER_SETTINGS_FILE;
 
-    File defaultGlobalSettingsFile = new File( mavenHome, "conf/settings.xml" );
+    File defaultGlobalSettingsFile = MavenSettingsBuilder.DEFAULT_GLOBAL_SETTINGS_FILE;
 
     String ALT_USER_SETTINGS_XML_LOCATION = "org.apache.maven.user-settings";
 
@@ -69,7 +73,7 @@
     // ----------------------------------------------------------------------------
 
     File getUserSettingsPath( String optionalSettingsPath );
-
+    
     File getGlobalSettingsPath();
 
     String getLocalRepositoryPath( Settings settings );
@@ -89,5 +93,11 @@
 
     ArtifactRepository buildArtifactRepository( Repository repo )
         throws InvalidRepositoryException;
+
+    void writeSettings( Settings settings, Writer writer )
+        throws IOException;
+
+    Settings readSettings( Reader reader )
+        throws IOException, SettingsConfigurationException;
 
 }

Modified: maven/components/trunk/maven-tools/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-tools/src/main/resources/META-INF/plexus/components.xml?view=diff&rev=510335&r1=510334&r2=510335
==============================================================================
--- maven/components/trunk/maven-tools/src/main/resources/META-INF/plexus/components.xml (original)
+++ maven/components/trunk/maven-tools/src/main/resources/META-INF/plexus/components.xml Wed Feb 21 17:01:54 2007
@@ -14,6 +14,9 @@
         <requirement>
           <role>org.apache.maven.settings.MavenSettingsBuilder</role>
         </requirement>
+        <requirement>
+          <role>org.apache.maven.settings.validation.SettingsValidator</role>
+        </requirement>
       </requirements>
     </component>
   </components>

Added: maven/components/trunk/maven-tools/src/test/java/org/apache/maven/AbstractMavenToolsTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-tools/src/test/java/org/apache/maven/AbstractMavenToolsTest.java?view=auto&rev=510335
==============================================================================
--- maven/components/trunk/maven-tools/src/test/java/org/apache/maven/AbstractMavenToolsTest.java (added)
+++ maven/components/trunk/maven-tools/src/test/java/org/apache/maven/AbstractMavenToolsTest.java Wed Feb 21 17:01:54 2007
@@ -0,0 +1,192 @@
+package org.apache.maven;
+
+import org.apache.maven.settings.Profile;
+import org.apache.maven.settings.Repository;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
+import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public abstract class AbstractMavenToolsTest
+    extends PlexusTestCase
+{
+    
+    private MavenTools mavenTools;
+    
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+        
+        mavenTools = (MavenTools) lookup( MavenTools.ROLE, getMavenToolsRoleHint() );
+    }
+
+    protected abstract String getMavenToolsRoleHint();
+
+    public void testReadSettings()
+        throws IOException, SettingsConfigurationException
+    {
+        Settings s = new Settings();
+        s.setOffline( true );
+
+        String localRepoPath = "/path/to/local/repo";
+
+        s.setLocalRepository( localRepoPath );
+
+        File settingsFile = File.createTempFile( "mavenTools-test.settings.", "" );
+        settingsFile.deleteOnExit();
+
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            new SettingsXpp3Writer().write( writer, s );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+
+        FileReader reader = null;
+        try
+        {
+            reader = new FileReader( settingsFile );
+            Settings result = mavenTools.readSettings( reader );
+
+            assertEquals( localRepoPath, result.getLocalRepository() );
+            assertTrue( result.isOffline() );
+        }
+        finally
+        {
+            IOUtil.close( reader );
+        }
+    }
+
+    public void testReadSettings_shouldFailToValidate()
+        throws IOException, SettingsConfigurationException
+    {
+        Settings s = new Settings();
+
+        Profile p = new Profile();
+
+        Repository r = new Repository();
+        r.setUrl( "http://example.com" );
+
+        p.addRepository( r );
+        s.addProfile( p );
+
+        File settingsFile = File.createTempFile( "mavenTools-test.settings.", "" );
+        settingsFile.deleteOnExit();
+
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            new SettingsXpp3Writer().write( writer, s );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+
+        FileReader reader = null;
+        try
+        {
+            reader = new FileReader( settingsFile );
+            mavenTools.readSettings( reader );
+
+            fail( "Settings should not pass validation when being read." );
+        }
+        catch ( IOException e )
+        {
+            String message = e.getMessage();
+            assertTrue( message.indexOf( "Failed to validate" ) > -1 );
+        }
+        finally
+        {
+            IOUtil.close( reader );
+        }
+    }
+
+    public void testWriteSettings()
+        throws IOException, SettingsConfigurationException, XmlPullParserException
+    {
+        Settings s = new Settings();
+        s.setOffline( true );
+
+        String localRepoPath = "/path/to/local/repo";
+
+        s.setLocalRepository( localRepoPath );
+
+        File settingsFile = File.createTempFile( "mavenTools-test.settings.", "" );
+        settingsFile.deleteOnExit();
+
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            mavenTools.writeSettings( s, writer );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+
+        FileReader reader = null;
+        try
+        {
+            reader = new FileReader( settingsFile );
+            Settings result = new SettingsXpp3Reader().read( reader );
+
+            assertEquals( localRepoPath, result.getLocalRepository() );
+            assertTrue( result.isOffline() );
+        }
+        finally
+        {
+            IOUtil.close( reader );
+        }
+    }
+
+    public void testWriteSettings_shouldFailToValidate()
+        throws IOException, SettingsConfigurationException
+    {
+        Settings s = new Settings();
+
+        Profile p = new Profile();
+
+        Repository r = new Repository();
+        r.setUrl( "http://example.com" );
+
+        p.addRepository( r );
+        s.addProfile( p );
+
+        File settingsFile = File.createTempFile( "mavenTools-test.settings.", "" );
+        settingsFile.deleteOnExit();
+
+        FileWriter writer = null;
+        try
+        {
+            writer = new FileWriter( settingsFile );
+            mavenTools.writeSettings( s, writer );
+
+            fail( "Validation of settings should fail before settings are written." );
+        }
+        catch ( IOException e )
+        {
+            String message = e.getMessage();
+            assertTrue( message.indexOf( "Failed to validate" ) > -1 );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+    }
+
+}

Propchange: maven/components/trunk/maven-tools/src/test/java/org/apache/maven/AbstractMavenToolsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-tools/src/test/java/org/apache/maven/AbstractMavenToolsTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-tools/src/test/java/org/apache/maven/DefaultMavenToolsTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-tools/src/test/java/org/apache/maven/DefaultMavenToolsTest.java?view=auto&rev=510335
==============================================================================
--- maven/components/trunk/maven-tools/src/test/java/org/apache/maven/DefaultMavenToolsTest.java (added)
+++ maven/components/trunk/maven-tools/src/test/java/org/apache/maven/DefaultMavenToolsTest.java Wed Feb 21 17:01:54 2007
@@ -0,0 +1,12 @@
+package org.apache.maven;
+
+public class DefaultMavenToolsTest
+    extends AbstractMavenToolsTest
+{
+
+    protected String getMavenToolsRoleHint()
+    {
+        return "";
+    }
+
+}

Propchange: maven/components/trunk/maven-tools/src/test/java/org/apache/maven/DefaultMavenToolsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-tools/src/test/java/org/apache/maven/DefaultMavenToolsTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"