You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wagon-commits@maven.apache.org by jo...@apache.org on 2007/02/14 00:05:34 UTC

svn commit: r507288 - in /maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager: DefaultWagonManager.java WagonManager.java

Author: joakime
Date: Tue Feb 13 15:05:33 2007
New Revision: 507288

URL: http://svn.apache.org/viewvc?view=rev&rev=507288
Log:
Adding ability to specify extension containers for wagon lookup.


Modified:
    maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/DefaultWagonManager.java
    maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/WagonManager.java

Modified: maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/DefaultWagonManager.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/DefaultWagonManager.java?view=diff&rev=507288&r1=507287&r2=507288
==============================================================================
--- maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/DefaultWagonManager.java (original)
+++ maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/DefaultWagonManager.java Tue Feb 13 15:05:33 2007
@@ -44,7 +44,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -85,7 +84,10 @@
 
     private PlexusContainer container;
 
-    private Set protocols = new HashSet();
+    /**
+     * Map of wagon hints to PlexusContainers.
+     */
+    private Map availableWagons = new HashMap();
 
     private Map proxies = new HashMap();
 
@@ -210,7 +212,7 @@
 
     public Set getProtocols()
     {
-        return Collections.unmodifiableSet( protocols );
+        return Collections.unmodifiableSet( availableWagons.keySet() );
     }
 
     public Map getProxies()
@@ -236,7 +238,7 @@
             throw new IllegalArgumentException( Messages.getString( "wagon.manager.protocol.may.not.be.empty" ) ); //$NON-NLS-1$
         }
 
-        if ( !protocols.contains( protocol ) )
+        if ( !availableWagons.containsKey( protocol ) )
         {
             throw new UnsupportedProtocolException( Messages
                 .getString( "wagon.manager.protocol.not.supported", protocol ) ); //$NON-NLS-1$
@@ -244,7 +246,7 @@
 
         try
         {
-            Wagon wagon = (Wagon) container.lookup( Wagon.ROLE, protocol );
+            Wagon wagon = (Wagon) getWagonContainer( protocol ).lookup( Wagon.ROLE, protocol );
             wagon.addSessionListener( stats );
             wagon.addTransferListener( stats );
             wagon.setProxyInfo( getProxy( protocol ) );
@@ -371,27 +373,69 @@
         this.online = online;
     }
 
+    public PlexusContainer getWagonContainer( String protocol )
+        throws UnsupportedProtocolException
+    {
+        PlexusContainer wagonContainer = (PlexusContainer) this.availableWagons.get( protocol );
+        if ( wagonContainer == null )
+        {
+            throw new UnsupportedProtocolException( "Unable to find wagon for protocol [" + protocol + "]" );
+        }
+
+        return wagonContainer;
+    }
+
     public void initialize()
         throws InitializationException
     {
-        List availableWagonProviders;
         try
         {
-            availableWagonProviders = container.lookupList( Wagon.ROLE );
-            Iterator it = availableWagonProviders.iterator();
+            registerAvailableWagons( container );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new InitializationException( "Unable to initialize: " + e.getMessage(), e );
+        }
+    }
+
+    public void registerAvailableWagons( PlexusContainer container )
+        throws ComponentLookupException
+    {
+        Map discoveredWagonProviders;
+        try
+        {
+            discoveredWagonProviders = container.lookupMap( Wagon.ROLE );
+            Iterator it = discoveredWagonProviders.keySet().iterator();
 
             while ( it.hasNext() )
             {
-                Wagon wagon = (Wagon) it.next();
-                protocols.add( wagon.getProtocol() );
+                String wagonHint = (String) it.next();
+                Wagon wagon = (Wagon) container.lookup( Wagon.ROLE, wagonHint );
+                if ( !StringUtils.equals( wagon.getProtocol(), wagonHint ) )
+                {
+                    throw new IllegalStateException( "Plexus Hint [" + wagonHint + "] and Wagon.getProtocol() ["
+                        + wagon.getProtocol() + "] do not agree." );
+                }
+
+                // TODO: need to address what to do when an extension container becomes unavailable.
+                // TODO: need to figure out how to remove a container.
+                // TODO: need to restore parent wagons if extension container overwrites them.
+
+                this.availableWagons.put( wagonHint, container );
             }
         }
         catch ( ComponentLookupException e )
         {
-            throw new InitializationException( "Unable to find list of available Wagons.", e );
+            throw new ComponentLookupException( "Unable to find list of available Wagons.", e );
         }
     }
 
+    public void registerExtensionContainer( PlexusContainer extContainer )
+        throws ComponentLookupException
+    {
+        registerAvailableWagons( extContainer );
+    }
+
     public WagonStatistics getStatistics()
     {
         return stats;
@@ -427,11 +471,15 @@
 
             try
             {
-                container.release( wagon );
+                getWagonContainer( wagon.getProtocol() ).release( wagon );
             }
             catch ( ComponentLifecycleException e )
             {
                 getLogger().warn( "Unable to release wagon (" + wagon.getClass().getName() + ")", e );
+            }
+            catch ( UnsupportedProtocolException e )
+            {
+                getLogger().warn( "Unable to release wagon (" + wagon.getClass().getName() + "): " + e.getMessage(), e );
             }
         }
     }

Modified: maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/WagonManager.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/WagonManager.java?view=diff&rev=507288&r1=507287&r2=507288
==============================================================================
--- maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/WagonManager.java (original)
+++ maven/wagon/trunk/wagon-manager/src/main/java/org/apache/maven/wagon/manager/WagonManager.java Tue Feb 13 15:05:33 2007
@@ -27,6 +27,8 @@
 import org.apache.maven.wagon.proxy.ProxyInfo;
 import org.apache.maven.wagon.repository.Repository;
 import org.apache.maven.wagon.repository.RepositoryPermissions;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
 import java.util.Map;
 import java.util.Set;
@@ -240,4 +242,13 @@
      */
     public void removeRepository( String repoId )
         throws RepositoryNotFoundException;
+
+    /**
+     * Register a Plexus Extension Container for wagon lookups.
+     * 
+     * @param extContainer the extension Container to use for lookups.
+     * @throws ComponentLookupException if there was a problem looking up Wagon implementations.
+     */
+    public void registerExtensionContainer( PlexusContainer extContainer )
+        throws ComponentLookupException;
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: wagon-commits-unsubscribe@maven.apache.org
For additional commands, e-mail: wagon-commits-help@maven.apache.org