Author: jdcasey Date: Wed Oct 24 14:14:27 2007 New Revision: 588029 URL: http://svn.apache.org/viewvc?rev=588029&view=rev Log: Cleaning up extension and plugin realms for a project once the build completes.
Modified: maven/components/trunk/build.properties maven/components/trunk/maven-core/pom.xml maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java maven/components/trunk/pom.xml Modified: maven/components/trunk/build.properties URL: http://svn.apache.org/viewvc/maven/components/trunk/build.properties?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- maven/components/trunk/build.properties (original) +++ maven/components/trunk/build.properties Wed Oct 24 14:14:27 2007 @@ -16,7 +16,7 @@ # under the License. classworlds.version=1.2-alpha-10 -plexus.version=1.0-alpha-34 +plexus.version=1.0-alpha-35-SNAPSHOT plexus-utils.version=1.4.5 maven-artifact.version=3.0-SNAPSHOT commons-cli.version=1.0 Modified: maven/components/trunk/maven-core/pom.xml URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/pom.xml?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- maven/components/trunk/maven-core/pom.xml (original) +++ maven/components/trunk/maven-core/pom.xml Wed Oct 24 14:14:27 2007 @@ -88,6 +88,7 @@ <artifactId>maven-plugin-api</artifactId> <version>2.1-SNAPSHOT</version> </dependency> + <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-interactivity-api</artifactId> Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java Wed Oct 24 14:14:27 2007 @@ -192,59 +192,66 @@ dispatcher, projectSessions ); - for ( Iterator i = request.getGoals().iterator(); i.hasNext(); ) + try { - String goal = (String) i.next(); + for ( Iterator i = request.getGoals().iterator(); i.hasNext(); ) + { + String goal = (String) i.next(); - TaskValidationResult tvr = lifecycleExecutor.isTaskValid( goal, session, reactorManager.getTopLevelProject() ); + TaskValidationResult tvr = lifecycleExecutor.isTaskValid( goal, session, reactorManager.getTopLevelProject() ); - if ( !tvr.isTaskValid() ) - { - result.addBuildFailureException( new InvalidTaskException( tvr ) ); + if ( !tvr.isTaskValid() ) + { + result.addBuildFailureException( new InvalidTaskException( tvr ) ); - return result; + return result; + } } - } - - getLogger().info( "Scanning for projects..." ); - if ( reactorManager.hasMultipleProjects() ) - { - getLogger().info( "Reactor build order: " ); + getLogger().info( "Scanning for projects..." ); - for ( Iterator i = reactorManager.getSortedProjects().iterator(); i.hasNext(); ) + if ( reactorManager.hasMultipleProjects() ) { - MavenProject project = (MavenProject) i.next(); + getLogger().info( "Reactor build order: " ); - getLogger().info( " " + project.getName() ); + for ( Iterator i = reactorManager.getSortedProjects().iterator(); i.hasNext(); ) + { + MavenProject project = (MavenProject) i.next(); + + getLogger().info( " " + project.getName() ); + } } - } - initializeBuildContext( request ); + initializeBuildContext( request ); + + try + { + lifecycleExecutor.execute( + session, + reactorManager, + dispatcher ); + } + catch ( LifecycleExecutionException e ) + { + result.addLifecycleExecutionException( e ); + return result; + } + catch ( BuildFailureException e ) + { + result.addBuildFailureException( e ); + return result; + } + + result.setTopologicallySortedProjects( reactorManager.getSortedProjects() ); + + result.setProject( reactorManager.getTopLevelProject() ); - try - { - lifecycleExecutor.execute( - session, - reactorManager, - dispatcher ); - } - catch ( LifecycleExecutionException e ) - { - result.addLifecycleExecutionException( e ); return result; } - catch ( BuildFailureException e ) + finally { - result.addBuildFailureException( e ); - return result; + session.dispose(); } - - result.setTopologicallySortedProjects( reactorManager.getSortedProjects() ); - - result.setProject( reactorManager.getTopLevelProject() ); - - return result; } /** Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java Wed Oct 24 14:14:27 2007 @@ -12,6 +12,7 @@ import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; /** @@ -54,6 +55,40 @@ projectRealm = container.createComponentRealm( projectId, Collections.EMPTY_LIST ); } + public void dispose() + { + for ( Iterator it = componentRealms.values().iterator(); it.hasNext(); ) + { + ClassRealm realm = (ClassRealm) it.next(); + disposeRealm( realm ); + } + + disposeRealm( projectRealm ); + try + { + container.removeComponentRealm( projectRealm ); + } + catch( PlexusContainerException e ) + { + e.printStackTrace(); + } + + componentRealms.clear(); + projectRealm = null; + } + + private void disposeRealm( ClassRealm realm ) + { + try + { + realm.getWorld().disposeRealm( realm.getId() ); + } + catch ( NoSuchRealmException e ) + { + // impossible + } + } + public String getProjectId() { return projectId; @@ -66,12 +101,24 @@ public boolean containsExtensionRealm( Artifact extensionArtifact ) { + checkDisposed(); + String id = createExtensionRealmId( extensionArtifact ); return componentRealms.containsKey( id ); } + private void checkDisposed() + { + if ( projectRealm == null ) + { + throw new IllegalStateException( "MavenProjectSession for: " + projectId + " with hashcode: " + hashCode() + " has been disposed, and is no longer valid for use." ); + } + } + public boolean containsPluginRealm( Plugin plugin ) { + checkDisposed(); + String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ) ); return componentRealms.containsKey( realmId ); @@ -96,6 +143,8 @@ public ClassRealm createExtensionRealm( Artifact extensionArtifact ) throws DuplicateRealmException { + checkDisposed(); + String realmId = createExtensionRealmId( extensionArtifact ); ClassRealm extRealm = container.getContainerRealm().createChildRealm( realmId ); @@ -124,6 +173,8 @@ public ClassRealm getPluginRealm( Plugin plugin ) throws NoSuchRealmException { + checkDisposed(); + String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ) ); return projectRealm.getWorld().getRealm( realmId ); @@ -133,6 +184,8 @@ public ClassRealm createPluginRealm( Plugin plugin ) throws DuplicateRealmException { + checkDisposed(); + String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ) ); ClassRealm extRealm = projectRealm.createChildRealm( realmId ); @@ -150,6 +203,8 @@ public ClassRealm getPluginRealm( PluginDescriptor pd ) throws NoSuchRealmException { + checkDisposed(); + String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( pd.getGroupId(), pd.getArtifactId() ) ); ClassRealm extRealm = projectRealm.getWorld().getRealm( realmId ); Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java Wed Oct 24 14:14:27 2007 @@ -29,6 +29,8 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -68,7 +70,16 @@ this.reactorManager = reactorManager; - this.projectSessions = projectSessions; + this.projectSessions = projectSessions == null ? new HashMap() : projectSessions; + } + + public void dispose() + { + for ( Iterator it = projectSessions.values().iterator(); it.hasNext(); ) + { + MavenProjectSession session = (MavenProjectSession) it.next(); + session.dispose(); + } } // TODO: Figure out how/when we can shut down all the realms for extensions/plugins connected to each project session... Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java Wed Oct 24 14:14:27 2007 @@ -664,7 +664,28 @@ ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); - ClassRealm pluginRealm = pluginDescriptor.getClassRealm(); + MavenProjectSession projectSession; + try + { + projectSession = session.getProjectSession( project ); + } + catch ( PlexusContainerException e ) + { + throw new PluginManagerException( mojoDescriptor, "Failed to create project-specific session for project: " + project.getId() + + ".", project, e ); + } + + ClassRealm pluginRealm; + try + { + pluginRealm = projectSession.getPluginRealm( pluginDescriptor ); + } + catch ( NoSuchRealmException e ) + { + getLogger().debug( "Plugin realm: " + pluginDescriptor.getId() + " not found in project session for: " + project.getId() + ". Using project realm instead." ); + pluginRealm = projectSession.getProjectRealm(); + } + ClassRealm oldRealm = null; try @@ -707,6 +728,7 @@ } finally { + pluginDescriptor.setClassRealm( null ); if ( oldRealm != null ) { container.setLookupRealm( oldRealm ); @@ -810,6 +832,7 @@ // lookups that occur in contextualize calls in line with the right realm. ClassRealm oldRealm = container.setLookupRealm( realm ); + pluginDescriptor.setClassRealm( realm ); getLogger().debug( "Looking up mojo " + mojoDescriptor.getRoleHint() + " in realm " 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?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- 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 Oct 24 14:14:27 2007 @@ -321,7 +321,14 @@ MavenSession session = new MavenSession( container, request, null, null, new HashMap() ); - pluginManager.verifyPlugin( plugin, project, session ); + try + { + pluginManager.verifyPlugin( plugin, project, session ); + } + finally + { + session.dispose(); + } } /** protected for tests only.. */ @@ -471,7 +478,7 @@ Map handlers = findArtifactTypeHandlers( project ); - //TODO: ok this is crappy, now there are active collections so when new artifact handlers + //TODO: ok this is crappy, now there are active collections so when new artifact handlers // enter the system they should be available. artifactHandlerManager.addHandlers( handlers ); @@ -645,8 +652,8 @@ try { - ContainerConfiguration cc = new DefaultContainerConfiguration() - .addComponentDiscoverer( new MavenPluginDiscoverer() ) + ContainerConfiguration cc = new DefaultContainerConfiguration() + .addComponentDiscoverer( new MavenPluginDiscoverer() ) .addComponentDiscoveryListener( new MavenPluginCollector() ) .setClassWorld( classWorld ).setParentContainer( configuration.getParentContainer() ).setName( "embedder" ); Modified: maven/components/trunk/pom.xml URL: http://svn.apache.org/viewvc/maven/components/trunk/pom.xml?rev=588029&r1=588028&r2=588029&view=diff ============================================================================== --- maven/components/trunk/pom.xml (original) +++ maven/components/trunk/pom.xml Wed Oct 24 14:14:27 2007 @@ -138,7 +138,7 @@ <module>maven-embedder</module> </modules> <properties> - <plexusVersion>1.0-alpha-34</plexusVersion> + <plexusVersion>1.0-alpha-35-SNAPSHOT</plexusVersion> <wagonVersion>1.0-beta-2</wagonVersion> </properties> <dependencies>