You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2014/02/10 04:07:23 UTC

git commit: MNG-5578: Make the workspace reader pluggable by creating a session scope where the MavenSession created can be injected in implementations that have the @SessionScoped annotation

Updated Branches:
  refs/heads/master 276c7636d -> 1d84cbeff


MNG-5578: Make the workspace reader pluggable by creating a session scope where the MavenSession created can be injected in implementations that have the @SessionScoped annotation


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/1d84cbef
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/1d84cbef
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/1d84cbef

Branch: refs/heads/master
Commit: 1d84cbeffad39dcd57f85cb312e17c46c9d3dac7
Parents: 276c763
Author: Jason van Zyl <ja...@tesla.io>
Authored: Sun Feb 9 21:52:35 2014 -0500
Committer: Jason van Zyl <ja...@tesla.io>
Committed: Sun Feb 9 21:52:35 2014 -0500

----------------------------------------------------------------------
 .../java/org/apache/maven/DefaultMaven.java     |  38 ++++--
 .../java/org/apache/maven/ReactorReader.java    |  15 +-
 .../java/org/apache/maven/SessionModule.java    |  20 +++
 .../java/org/apache/maven/SessionScope.java     | 136 +++++++++++++++++++
 .../java/org/apache/maven/SessionScoped.java    |  41 ++++++
 .../apache/maven/execution/MavenSession.java    |  11 ++
 6 files changed, 246 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/1d84cbef/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
index 7afc2d9..abd0b9a 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -143,6 +143,9 @@ public class DefaultMaven
     @Requirement
     private EventSpyDispatcher eventSpyDispatcher;
 
+    @Requirement
+    private SessionScope sessionScope;
+        
     public MavenExecutionResult execute( MavenExecutionRequest request )
     {
         MavenExecutionResult result;
@@ -267,24 +270,35 @@ public class DefaultMaven
             return result;
         }
 
-        //
-        // Desired order of precedence for local artifact repositories
-        //
-        // Reactor
-        // Workspace
-        // User Local Repository
-        //        
-        ReactorReader reactorRepository = null;
         try
         {
-            reactorRepository = new ReactorReader( session, getProjectMap( session.getProjects() ) );
+            session.setProjectMap( getProjectMap( session.getProjects() ) );
         }
         catch ( DuplicateProjectException e )
         {
             return addExceptionToResult( result, e );
         }
-
-        repoSession.setWorkspaceReader( ChainedWorkspaceReader.newInstance( reactorRepository,
+        
+        WorkspaceReader reactorWorkspace;
+        sessionScope.enter();
+        sessionScope.seed( MavenSession.class, session );
+        try
+        {
+            reactorWorkspace = container.lookup( WorkspaceReader.class );
+        }
+        catch ( ComponentLookupException e )
+        {
+            return addExceptionToResult( result, e );
+        }
+        
+        //
+        // Desired order of precedence for local artifact repositories
+        //
+        // Reactor
+        // Workspace
+        // User Local Repository
+        //        
+        repoSession.setWorkspaceReader( ChainedWorkspaceReader.newInstance( reactorWorkspace,
                                                                             repoSession.getWorkspaceReader() ) );
 
         repoSession.setReadOnly();
@@ -358,6 +372,8 @@ public class DefaultMaven
             return addExceptionToResult( result, e );
         }
 
+        sessionScope.exit();
+
         return result;
     }
 

http://git-wip-us.apache.org/repos/asf/maven/blob/1d84cbef/maven-core/src/main/java/org/apache/maven/ReactorReader.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/ReactorReader.java b/maven-core/src/main/java/org/apache/maven/ReactorReader.java
index b96bbed..9aa8385 100644
--- a/maven-core/src/main/java/org/apache/maven/ReactorReader.java
+++ b/maven-core/src/main/java/org/apache/maven/ReactorReader.java
@@ -29,6 +29,10 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.project.MavenProject;
@@ -42,6 +46,8 @@ import org.eclipse.aether.util.artifact.ArtifactIdUtils;
  * 
  * @author Jason van Zyl
  */
+@Named
+@SessionScoped
 class ReactorReader
     implements WorkspaceReader
 {
@@ -53,12 +59,13 @@ class ReactorReader
 
     private WorkspaceRepository repository;
 
-    public ReactorReader( MavenSession session, Map<String, MavenProject> reactorProjects )
+    @Inject
+    public ReactorReader( MavenSession session )
     {
-        projectsByGAV = reactorProjects;
+        projectsByGAV = session.getProjectMap();
 
-        projectsByGA = new HashMap<String, List<MavenProject>>( reactorProjects.size() * 2 );
-        for ( MavenProject project : reactorProjects.values() )
+        projectsByGA = new HashMap<String, List<MavenProject>>( projectsByGAV.size() * 2 );
+        for ( MavenProject project : projectsByGAV.values() )
         {
             String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
 

http://git-wip-us.apache.org/repos/asf/maven/blob/1d84cbef/maven-core/src/main/java/org/apache/maven/SessionModule.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/SessionModule.java b/maven-core/src/main/java/org/apache/maven/SessionModule.java
new file mode 100644
index 0000000..76c31b6
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/SessionModule.java
@@ -0,0 +1,20 @@
+package org.apache.maven;
+
+import javax.inject.Named;
+
+import org.apache.maven.execution.MavenSession;
+
+import com.google.inject.AbstractModule;
+
+@Named
+public class SessionModule extends AbstractModule
+{            
+    @Override
+    protected void configure()
+    {
+        SessionScope scope = new SessionScope();
+        bindScope( SessionScoped.class, scope );
+        bind( SessionScope.class).toInstance( scope );
+        bind( MavenSession.class ).toProvider( SessionScope.<MavenSession> seededKeyProvider() ).in( scope );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/1d84cbef/maven-core/src/main/java/org/apache/maven/SessionScope.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/SessionScope.java b/maven-core/src/main/java/org/apache/maven/SessionScope.java
new file mode 100644
index 0000000..9c16fec
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/SessionScope.java
@@ -0,0 +1,136 @@
+package org.apache.maven;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.LinkedList;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Key;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.Scope;
+import com.google.inject.util.Providers;
+
+public class SessionScope
+    implements Scope
+{    
+    private static final Provider<Object> SEEDED_KEY_PROVIDER = new Provider<Object>()
+    {
+        public Object get()
+        {
+            throw new IllegalStateException();
+        }
+    };
+
+    private static final class ScopeState
+    {
+        public final Map<Key<?>, Provider<?>> seeded = Maps.newHashMap();
+
+        public final Map<Key<?>, Object> provided = Maps.newHashMap();
+    }
+
+    private final ThreadLocal<LinkedList<ScopeState>> values = new ThreadLocal<LinkedList<ScopeState>>();
+
+    public void enter()
+    {
+        LinkedList<ScopeState> stack = values.get();
+        if ( stack == null )
+        {
+            stack = new LinkedList<ScopeState>();
+            values.set( stack );
+        }
+        stack.addFirst( new ScopeState() );
+    }
+
+    private ScopeState getScopeState()
+    {
+        LinkedList<ScopeState> stack = values.get();
+        if ( stack == null || stack.isEmpty() )
+        {
+            throw new IllegalStateException();
+        }
+        return stack.getFirst();
+    }
+
+    public void exit()
+    {
+        final LinkedList<ScopeState> stack = values.get();
+        if ( stack == null || stack.isEmpty() )
+        {
+            throw new IllegalStateException();
+        }
+        stack.removeFirst();
+        if ( stack.isEmpty() )
+        {
+            values.remove();
+        }
+    }
+
+    public <T> void seed( Class<T> clazz, Provider<T> value )
+    {
+        getScopeState().seeded.put( Key.get( clazz ), value );
+    }
+
+    public <T> void seed( Class<T> clazz, final T value )
+    {
+        getScopeState().seeded.put( Key.get( clazz ), Providers.of( value ) );
+    }
+
+    public <T> Provider<T> scope( final Key<T> key, final Provider<T> unscoped )
+    {
+        return new Provider<T>()
+        {
+            @SuppressWarnings( "unchecked" )
+            public T get()
+            {
+                LinkedList<ScopeState> stack = values.get();
+                if ( stack == null || stack.isEmpty() )
+                {
+                    throw new OutOfScopeException( "Cannot access " + key + " outside of a scoping block" );
+                }
+
+                ScopeState state = stack.getFirst();
+
+                Provider<?> seeded = state.seeded.get( key );
+
+                if ( seeded != null )
+                {
+                    return (T) seeded.get();
+                }
+
+                T provided = (T) state.provided.get( key );
+                if ( provided == null && unscoped != null )
+                {
+                    provided = unscoped.get();
+                    state.provided.put( key, provided );
+                }
+
+                return provided;
+            }
+        };
+    }
+
+    @SuppressWarnings( { "unchecked" } )
+    public static <T> Provider<T> seededKeyProvider()
+    {
+        return (Provider<T>) SEEDED_KEY_PROVIDER;
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/1d84cbef/maven-core/src/main/java/org/apache/maven/SessionScoped.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/SessionScoped.java b/maven-core/src/main/java/org/apache/maven/SessionScoped.java
new file mode 100644
index 0000000..3a1692f
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/SessionScoped.java
@@ -0,0 +1,41 @@
+package org.apache.maven;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import com.google.inject.ScopeAnnotation;
+
+/**
+ * Indicates that annotated component should be instantiated before session starts and discarded after session execution completes.
+ * 
+ * @author Jason van Zyl
+ * @since 3.2.0
+ */
+@Target( { TYPE } )
+@Retention( RUNTIME )
+@ScopeAnnotation
+public @interface SessionScoped
+{
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/1d84cbef/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
index 93a1c7a..a59244d 100644
--- a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
+++ b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
@@ -393,4 +393,15 @@ public class MavenSession
         return null;
     }
 
+    private Map<String, MavenProject> projectMap;
+    
+    public void setProjectMap( Map<String, MavenProject> projectMap )
+    {
+        this.projectMap = projectMap;
+    }
+    
+    public Map<String, MavenProject> getProjectMap() 
+    {
+        return projectMap;
+    }
 }