Author: jvanzyl Date: Tue Feb 27 17:32:38 2007 New Revision: 512554 URL: http://svn.apache.org/viewvc?view=rev&rev=512554 Log: o settings simplication o removing old configuration, cleaned up and moved to another package
Removed: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/DefaultMavenEmbedderConfiguration.java maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedderConfiguration.java Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java 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=512554&r1=512553&r2=512554 ============================================================================== --- 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 Tue Feb 27 17:32:38 2007 @@ -17,7 +17,6 @@ */ import org.apache.maven.Maven; -import org.apache.maven.MavenTools; import org.apache.maven.SettingsConfigurationException; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; @@ -32,11 +31,16 @@ 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.configuration.Configuration; +import org.apache.maven.embedder.configuration.ConfigurationValidationResult; +import org.apache.maven.embedder.configuration.DefaultConfigurationValidationResult; import org.apache.maven.embedder.execution.MavenExecutionRequestDefaultsPopulator; import org.apache.maven.embedder.writer.WriterUtils; import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionResult; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.execution.DefaultMavenExecutionRequest; import org.apache.maven.lifecycle.LifecycleExecutor; import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; @@ -56,6 +60,11 @@ import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.settings.MavenSettingsBuilder; 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.DefaultSettingsValidator; +import org.apache.maven.settings.validation.SettingsValidationResult; +import org.apache.maven.settings.validation.SettingsValidator; import org.codehaus.plexus.DefaultPlexusContainer; import org.codehaus.plexus.MutablePlexusContainer; import org.codehaus.plexus.PlexusContainerException; @@ -70,15 +79,19 @@ import org.codehaus.plexus.configuration.PlexusConfiguration; import org.codehaus.plexus.configuration.PlexusConfigurationException; import org.codehaus.plexus.logging.LoggerManager; -import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; +import org.codehaus.plexus.util.StringUtils; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.output.Format; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.io.Writer; import java.io.Reader; +import java.io.Writer; import java.net.URL; import java.util.ArrayList; import java.util.Collections; @@ -94,6 +107,24 @@ */ public class MavenEmbedder { + public static final String DEFAULT_LOCAL_REPO_ID = "local"; + + public static final String DEFAULT_LAYOUT_ID = "default"; + + public static final String userHome = System.getProperty( "user.home" ); + + public static final File userMavenConfigurationHome = new File( userHome, ".m2" ); + + public static final String mavenHome = System.getProperty( "maven.home" ); + + public static final File defaultUserLocalRepository = new File( userMavenConfigurationHome, "repository" ); + + public static final File DEFAULT_USER_SETTINGS_FILE = new File( userMavenConfigurationHome, "settings.xml" ); + + // ---------------------------------------------------------------------------- + // + // ---------------------------------------------------------------------------- + private MutablePlexusContainer container; // ---------------------------------------------------------------------- @@ -122,7 +153,7 @@ private Maven maven; - private MavenTools mavenTools; + private MavenSettingsBuilder settingsBuilder; private MavenExecutionRequestDefaultsPopulator defaultsPopulator; @@ -146,7 +177,7 @@ // User options // ---------------------------------------------------------------------- - private MavenEmbedderConfiguration embedderRequest; + private Configuration configuration; private BuildContextManager buildContextManager; @@ -154,33 +185,7 @@ // Constructors // ---------------------------------------------------------------------------- - public MavenEmbedder( ClassWorld classWorld ) - throws MavenEmbedderException - { - this( classWorld, null ); - } - - public MavenEmbedder( ClassWorld classWorld, - MavenEmbedderLogger logger ) - throws MavenEmbedderException - { - this( new DefaultMavenEmbedderConfiguration().setClassWorld( classWorld ).setMavenEmbedderLogger( logger ) ); - } - - public MavenEmbedder( ClassLoader classLoader ) - throws MavenEmbedderException - { - this( classLoader, null ); - } - - public MavenEmbedder( ClassLoader classLoader, - MavenEmbedderLogger logger ) - throws MavenEmbedderException - { - this( new ClassWorld( "plexus.core", classLoader ), logger ); - } - - public MavenEmbedder( MavenEmbedderConfiguration embedderConfiguration ) + public MavenEmbedder( Configuration embedderConfiguration ) throws MavenEmbedderException { start( embedderConfiguration ); @@ -200,6 +205,11 @@ return localRepository; } + public Settings getSettings() + { + return settings; + } + public MavenEmbedderLogger getLogger() { return logger; @@ -245,132 +255,73 @@ } // ---------------------------------------------------------------------- - // Project - // ---------------------------------------------------------------------- - - public MavenProject readProject( File mavenProject ) - throws ProjectBuildingException - { - return mavenProjectBuilder.build( mavenProject, localRepository, profileManager ); - } - - // ---------------------------------------------------------------------- // Settings // ---------------------------------------------------------------------- - public static Settings readSettings( File settingsFile ) - throws SettingsConfigurationException, MavenEmbedderException, IOException + public static void writeSettings( File file, + Settings settings ) + throws IOException { - return readSettings( settingsFile, null ); - } + Writer fileWriter = new FileWriter( file ); - public static Settings readSettings( File settingsFile, - MavenEmbedderLogger logger ) - throws SettingsConfigurationException, MavenEmbedderException, IOException - { - DefaultPlexusContainer container = null; + SettingsValidator settingsValidator = new DefaultSettingsValidator(); - FileReader reader = null; - try + SettingsValidationResult validationResult = settingsValidator.validate( settings ); + + if ( validationResult.getMessageCount() > 0 ) { - reader = new FileReader( settingsFile ); + throw new IOException( "Failed to validate Settings.\n" + validationResult.render( "\n" ) ); + } - try - { - container = new DefaultPlexusContainer(); - } - catch ( PlexusContainerException e ) - { - throw new MavenEmbedderException( "Error starting container.", e ); - } + Element root = new Element( "settings" ); - if ( logger != null ) - { - MavenEmbedderLoggerManager loggerManager = - new MavenEmbedderLoggerManager( new PlexusLoggerAdapter( logger ) ); + Document doc = new Document( root ); - container.setLoggerManager( loggerManager ); - } + SettingsJDOMWriter writer = new SettingsJDOMWriter(); - MavenTools mavenTools; - try - { - mavenTools = (MavenTools) container.lookup( MavenTools.ROLE, container.getContainerRealm() ); - } - catch ( ComponentLookupException e ) - { - throw new MavenEmbedderException( "Error retrieving Maven tools.", e ); - } + String encoding = settings.getModelEncoding() != null ? settings.getModelEncoding() : "UTF-8"; - return mavenTools.readSettings( reader ); + Format format = Format.getPrettyFormat().setEncoding( encoding ); + + try + { + writer.write( settings, doc, fileWriter, format ); } finally { - IOUtil.close( reader ); - - if ( container != null ) - { - container.dispose(); - } + fileWriter.close(); } } - public static void writeSettings( File settingsFile, - Settings settings ) - throws IOException, MavenEmbedderException + public static Settings readSettings( File file ) + throws IOException, SettingsConfigurationException { - writeSettings( settingsFile, settings, null ); - } + Reader fileReader = new FileReader( file ); - public static void writeSettings( File settingsFile, - Settings settings, - MavenEmbedderLogger logger ) - throws IOException, MavenEmbedderException - { - DefaultPlexusContainer container = null; + SettingsValidator settingsValidator = new DefaultSettingsValidator(); + + SettingsXpp3Reader reader = new SettingsXpp3Reader(); - FileWriter writer = null; try { - writer = new FileWriter( settingsFile ); - - try - { - container = new DefaultPlexusContainer(); - } - catch ( PlexusContainerException e ) - { - throw new MavenEmbedderException( "Error starting container.", e ); - } - - if ( logger != null ) - { - MavenEmbedderLoggerManager loggerManager = - new MavenEmbedderLoggerManager( new PlexusLoggerAdapter( logger ) ); + Settings settings = reader.read( fileReader ); - container.setLoggerManager( loggerManager ); - } + SettingsValidationResult validationResult = settingsValidator.validate( settings ); - MavenTools mavenTools; - try + if ( validationResult.getMessageCount() > 0 ) { - mavenTools = (MavenTools) container.lookup( MavenTools.ROLE, container.getContainerRealm() ); - } - catch ( ComponentLookupException e ) - { - throw new MavenEmbedderException( "Error retrieving Maven tools.", e ); + throw new IOException( "Failed to validate Settings.\n" + validationResult.render( "\n" ) ); } - mavenTools.writeSettings( settings, writer ); + return settings; + } + catch ( XmlPullParserException e ) + { + throw new SettingsConfigurationException( "Failed to parse settings.", e ); } finally { - IOUtil.close( writer ); - - if ( container != null ) - { - container.dispose(); - } + fileReader.close(); } } @@ -385,7 +336,14 @@ PluginNotFoundException, PluginVersionNotFoundException { PluginManager pluginManager = (PluginManager) container.lookup( PluginManager.ROLE ); - pluginManager.verifyPlugin( plugin, project, settings, localRepository ); + + MavenExecutionRequest request = new DefaultMavenExecutionRequest() + .setSettings( settings ) + .setLocalRepository( localRepository ); + + MavenSession session = new MavenSession( container, request, null, null ); + + pluginManager.verifyPlugin( plugin, project, session ); } /** protected for tests only.. */ @@ -423,6 +381,7 @@ if ( plugin.isExtensions() ) { verifyPlugin( plugin, project ); + map.putAll( getPluginExtensionComponents( plugin ) ); // shudder... @@ -436,9 +395,19 @@ } } } + return map; } + // ---------------------------------------------------------------------- + // Project + // ---------------------------------------------------------------------- + + public MavenProject readProject( File mavenProject ) + throws ProjectBuildingException + { + return mavenProjectBuilder.build( mavenProject, localRepository, profileManager ); + } /** * This method is used to grab the list of dependencies that belong to a project so that a UI @@ -451,43 +420,16 @@ try { - request = defaultsPopulator.populateDefaults( request, embedderRequest ); - + request = defaultsPopulator.populateDefaults( request, this ); + //mkleint: copied from DefaultLifecycleExecutor project = readProject( new File( request.getPomFile() ) ); - //mkleint: copied from DefaultLifecycleExecutor Map handlers = findArtifactTypeHandlers( project ); //is this necessary in this context, I doubt it..mkleint artifactHandlerManager.addHandlers( handlers ); - project = mavenProjectBuilder.buildWithDependencies( new File( request.getPomFile() ), request.getLocalRepository(), profileManager, request.getTransferListener() ); } - catch ( PluginManagerException e ) - { - return new DefaultMavenExecutionResult( project, Collections.singletonList( e ) ); - } - catch ( PluginNotFoundException e ) - { - return new DefaultMavenExecutionResult( project, Collections.singletonList( e ) ); - } - catch ( MavenEmbedderException e ) - { - return new DefaultMavenExecutionResult( project, Collections.singletonList( e ) ); - } - catch ( ProjectBuildingException e ) - { - return new DefaultMavenExecutionResult( project, Collections.singletonList( e ) ); - } - catch ( ArtifactResolutionException e ) - { - return new DefaultMavenExecutionResult( project, Collections.singletonList( e ) ); - } - catch ( ArtifactNotFoundException e ) - { - return new DefaultMavenExecutionResult( project, Collections.singletonList( e ) ); - } - //mkleint: why do we have so many various exception handlings with same result? catch ( Exception e ) { return new DefaultMavenExecutionResult( project, Collections.singletonList( e ) ); @@ -571,72 +513,17 @@ // ---------------------------------------------------------------------- // Remote Repository // ---------------------------------------------------------------------- - // ---------------------------------------------------------------------- - // Local Repository - // ---------------------------------------------------------------------- - - public static final String DEFAULT_LOCAL_REPO_ID = "local"; - - 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 - { - return createLocalRepository( localRepository.getAbsolutePath(), DEFAULT_LOCAL_REPO_ID ); - } - - public ArtifactRepository createLocalRepository( Settings settings ) - { - return createLocalRepository( mavenTools.getLocalRepositoryPath( settings ), DEFAULT_LOCAL_REPO_ID ); - } - - public ArtifactRepository createLocalRepository( String url, - String repositoryId ) - { - if ( !url.startsWith( "file:" ) ) - { - url = "file://" + url; - } - - return createRepository( url, repositoryId ); - } - - public ArtifactRepository createRepository( String url, - String repositoryId ) - { - // snapshots vs releases - // offline = to turning the update policy off - - //TODO: we'll need to allow finer grained creation of repositories but this will do for now - - String updatePolicyFlag = ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS; - - String checksumPolicyFlag = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN; - - ArtifactRepositoryPolicy snapshotsPolicy = - new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag ); - - ArtifactRepositoryPolicy releasesPolicy = - new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag ); - - return artifactRepositoryFactory.createArtifactRepository( repositoryId, url, defaultArtifactRepositoryLayout, - snapshotsPolicy, releasesPolicy ); - } // ---------------------------------------------------------------------- // Lifecycle // ---------------------------------------------------------------------- - private void start( MavenEmbedderConfiguration req ) + private void start( Configuration configuration ) throws MavenEmbedderException { - this.classWorld = req.getClassWorld(); + this.classWorld = configuration.getClassWorld(); - this.logger = req.getMavenEmbedderLogger(); + this.logger = configuration.getMavenEmbedderLogger(); // ---------------------------------------------------------------------------- // Don't override any existing SecurityManager if one has been installed. Our @@ -655,7 +542,7 @@ logger.warn( "Error trying to set the SecurityManager: " + e.getMessage() ); } - this.embedderRequest = req; + this.configuration = configuration; try { @@ -676,12 +563,12 @@ try { - if ( req.getContainerCustomizer() != null ) + if ( configuration.getContainerCustomizer() != null ) { - req.getContainerCustomizer().customize( container ); + configuration.getContainerCustomizer().customize( container ); } - handleExtensions( req.getExtensions() ); + handleExtensions( configuration.getExtensions() ); // ---------------------------------------------------------------------- // Lookup each of the components we need to provide the desired @@ -694,15 +581,15 @@ maven = (Maven) container.lookup( Maven.ROLE ); - mavenTools = (MavenTools) container.lookup( MavenTools.ROLE ); + settingsBuilder = (MavenSettingsBuilder) container.lookup( MavenSettingsBuilder.ROLE ); pluginDescriptorBuilder = new PluginDescriptorBuilder(); - profileManager = new DefaultProfileManager( container, req.getSystemProperties() ); + profileManager = new DefaultProfileManager( container, configuration.getSystemProperties() ); - profileManager.explicitlyActivate( req.getActiveProfiles() ); + profileManager.explicitlyActivate( configuration.getActiveProfiles() ); - profileManager.explicitlyDeactivate( req.getInactiveProfiles() ); + profileManager.explicitlyDeactivate( configuration.getInactiveProfiles() ); mavenProjectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.ROLE ); @@ -726,22 +613,31 @@ artifactHandlerManager = (ArtifactHandlerManager) container.lookup( ArtifactHandlerManager.ROLE ); - // These three things can be cached for a single session of the embedder - settings = mavenTools.buildSettings( req.getUserSettingsFile(), req.getGlobalSettingsFile(), false, - req.getSettingsBuilderAdvice() ); + try + { + if ( configuration.getUserSettingsFile() == null ) + { + configuration.setUserSettingsFile( DEFAULT_USER_SETTINGS_FILE ); + } + + settings = settingsBuilder.buildSettings( configuration.getUserSettingsFile(), + configuration.getGlobalSettingsFile() ); + } + catch ( Exception e ) + { + // If something goes wrong with parsing the settings + settings = new Settings(); + } localRepository = createLocalRepository( settings ); profileManager.loadSettingsProfiles( settings ); + } catch ( ComponentLookupException e ) { throw new MavenEmbedderException( "Cannot lookup required component.", e ); } - catch ( SettingsConfigurationException e ) - { - throw new MavenEmbedderException( "Cannot create settings configuration", e ); - } } // ---------------------------------------------------------------------- @@ -806,6 +702,184 @@ } } + // ---------------------------------------------------------------------------- + // Validation + // ---------------------------------------------------------------------------- + + // ---------------------------------------------------------------------------- + // Options for settings + // + // 1. No settings + // 2. User settings only + // 3. Global settings only + // 4. Both Users settings and Global settings. In the case that both are present + // the User settings take priority. + // + // What we would like to provide is a way that the client code does not have + // to deal with settings configuration at all. + // ---------------------------------------------------------------------------- + + public static ConfigurationValidationResult validateConfiguration( Configuration configuration ) + { + ConfigurationValidationResult result = new DefaultConfigurationValidationResult(); + + if ( configuration.getUserSettingsFile() == null ) + { + configuration.setUserSettingsFile( MavenEmbedder.DEFAULT_USER_SETTINGS_FILE ); + } + + Reader fileReader; + + // User settings + + try + { + fileReader = new FileReader( configuration.getUserSettingsFile() ); + + new SettingsXpp3Reader().read( fileReader ); + } + catch ( FileNotFoundException e ) + { + result.setUserSettingsFilePresent( false ); + } + catch ( IOException e ) + { + result.setUserSettingsFileParses( false ); + } + catch ( XmlPullParserException e ) + { + result.setUserSettingsFileParses( false ); + } + + // Global settings + + if ( configuration.getGlobalSettingsFile() != null ) + { + + try + { + fileReader = new FileReader( configuration.getGlobalSettingsFile() ); + + new SettingsXpp3Reader().read( fileReader ); + } + catch ( FileNotFoundException e ) + { + result.setGlobalSettingsFilePresent( false ); + } + catch ( IOException e ) + { + result.setGlobalSettingsFileParses( false ); + } + catch ( XmlPullParserException e ) + { + result.setGlobalSettingsFileParses( false ); + } + } + + return result; + } + + // ---------------------------------------------------------------------- + // Local Repository + // ---------------------------------------------------------------------- + + public ArtifactRepository createLocalRepository( Settings settings ) + throws MavenEmbedderException + { + String localRepositoryPath = null; + + if ( configuration.getLocalRepository() != null ) + { + localRepositoryPath = configuration.getLocalRepository().getAbsolutePath(); + } + + if ( StringUtils.isEmpty( localRepositoryPath ) ) + { + localRepositoryPath = settings.getLocalRepository(); + } + + if ( StringUtils.isEmpty( localRepositoryPath ) ) + { + localRepositoryPath = MavenEmbedder.defaultUserLocalRepository.getAbsolutePath(); + } + + return createLocalRepository( localRepositoryPath, MavenEmbedder.DEFAULT_LOCAL_REPO_ID ); + } + + public ArtifactRepository createLocalRepository( String url, + String repositoryId ) + throws MavenEmbedderException + { + try + { + return createRepository( canonicalFileUrl( url ), repositoryId ); + } + catch ( IOException e ) + { + throw new MavenEmbedderException( "Unable to resolve canonical path for local repository " + url, e ); + } + } + + private String canonicalFileUrl( String url ) + throws IOException + { + if ( !url.startsWith( "file:" ) ) + { + url = "file://" + url; + } + else if ( url.startsWith( "file:" ) && !url.startsWith( "file://" ) ) + { + url = "file://" + url.substring( "file:".length() ); + } + + // So now we have an url of the form file://<path> + + // We want to eliminate any relative path nonsense and lock down the path so we + // need to fully resolve it before any sub-modules use the path. This can happen + // when you are using a custom settings.xml that contains a relative path entry + // for the local repository setting. + + File localRepository = new File( url.substring( "file://".length() ) ); + + if ( !localRepository.isAbsolute() ) + { + url = "file://" + localRepository.getCanonicalPath(); + } + + return url; + } + + public ArtifactRepository createRepository( String url, + String repositoryId ) + { + // snapshots vs releases + // offline = to turning the update policy off + + //TODO: we'll need to allow finer grained creation of repositories but this will do for now + + String updatePolicyFlag = ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS; + + String checksumPolicyFlag = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN; + + ArtifactRepositoryPolicy snapshotsPolicy = + new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag ); + + ArtifactRepositoryPolicy releasesPolicy = + new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag ); + + return artifactRepositoryFactory.createArtifactRepository( repositoryId, url, defaultArtifactRepositoryLayout, + snapshotsPolicy, releasesPolicy ); + } + + // ---------------------------------------------------------------------------- + // Configuration + // ---------------------------------------------------------------------------- + + public Configuration getConfiguration() + { + return configuration; + } + // ---------------------------------------------------------------------- // Start of new embedder API // ---------------------------------------------------------------------- @@ -813,6 +887,7 @@ public MavenExecutionResult execute( MavenExecutionRequest request ) { LoggerManager loggerManager = container.getLoggerManager(); + int oldThreshold = loggerManager.getThreshold(); try @@ -821,7 +896,7 @@ try { - request = defaultsPopulator.populateDefaults( request, embedderRequest ); + request = defaultsPopulator.populateDefaults( request, this ); } catch ( MavenEmbedderException e ) {