You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by jo...@apache.org on 2007/10/05 00:29:50 UTC

svn commit: r582020 [1/3] - in /maven/archiva/trunk: archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ archiva-base...

Author: joakime
Date: Thu Oct  4 15:29:43 2007
New Revision: 582020

URL: http://svn.apache.org/viewvc?rev=582020&view=rev
Log:
[MRM-482] Saving a proxy connector after adding a new property results to HTTP 500 error
[MRM-477] Missing ability to manage proxy order.
[MRM-437] admin editing of proxy connectors fails in multiple instances
* Split giant ball of mud ConfigureProxyConnectorAction into seperate Add/Edit/Delete/Sort/List actions
* Added ability to maintain sort order.
* Added unit testing.
* Cleaned up Proxy Connector admin UI to allow for extra long Location / URL paths.
* Slideout Hide of the Advanced configuration options on the Proxy Connector list screen.


Added:
    maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java   (with props)
    maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java   (with props)
    maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/DeleteProxyConnectorAction.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorAction.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/SortProxyConnectorsAction.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addProxyConnector.jsp   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/proxyConnectorForm.jspf
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/images/icons/down.gif   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/images/icons/up.gif   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/AbstractWebworkTestCase.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorActionTest.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/DeleteProxyConnectorActionTest.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorActionTest.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/ProxyConnectorsActionTest.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/SortProxyConnectorsActionTest.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorActionTest.xml
      - copied, changed from r581314, maven/archiva/trunk/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/ConfigureProxyConnectorActionTest.xml
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorActionTest.xml   (with props)
Removed:
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/ConfigureProxyConnectorAction.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/SingleSelectTransformer.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/ConfigureProxyConnectorActionTest.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/ConfigureProxyConnectorActionTest.xml
Modified:
    maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
    maven/archiva/trunk/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
    maven/archiva/trunk/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java
    maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java
    maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java
    maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java
    maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java
    maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java
    maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/WagonDelegate.java
    maven/archiva/trunk/archiva-web/archiva-webapp/pom.xml
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/AbstractAppearanceAction.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/ProxyConnectorsAction.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editProxyConnector.jsp
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/proxyConnectors.jsp
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/css/site.css
    maven/archiva/trunk/archiva-web/archiva-webapp/src/test/resources/log4j.xml

Modified: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java Thu Oct  4 15:29:43 2007
@@ -20,6 +20,7 @@
  */
 
 import org.apache.commons.io.FileUtils;
+import org.apache.maven.archiva.configuration.functors.ProxyConnectorConfigurationOrderComparator;
 import org.apache.maven.archiva.configuration.io.registry.ConfigurationRegistryReader;
 import org.apache.maven.archiva.configuration.io.registry.ConfigurationRegistryWriter;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
@@ -33,9 +34,11 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Implementation of configuration holder that retrieves it from the registry.
@@ -145,7 +148,28 @@
                 }
             }
         }
-        
+
+        // Normalize the order fields in the proxy connectors.
+        if ( !config.getProxyConnectors().isEmpty() )
+        {
+            Map<String, java.util.List<ProxyConnectorConfiguration>> proxyConnectorMap = config
+                .getProxyConnectorAsMap();
+
+            for ( String key : proxyConnectorMap.keySet() )
+            {
+                List<ProxyConnectorConfiguration> connectors = proxyConnectorMap.get( key );
+                // Sort connectors by order field.
+                Collections.sort( connectors, ProxyConnectorConfigurationOrderComparator.getInstance() );
+
+                // Normalize the order field values.
+                int order = 1;
+                for ( ProxyConnectorConfiguration connector : connectors )
+                {
+                    connector.setOrder( order++ );
+                }
+            }
+        }
+
         return config;
     }
 
@@ -161,7 +185,8 @@
         catch ( RegistryException e )
         {
             throw new ConfigurationRuntimeException(
-                "Fatal error: Unable to find the built-in default configuration and load it into the registry", e );
+                                                     "Fatal error: Unable to find the built-in default configuration and load it into the registry",
+                                                     e );
         }
         return registry.getSubset( KEY );
     }
@@ -189,10 +214,10 @@
 
                 // a little aggressive with the repositoryScanning and databaseScanning - should be no need to split
                 // that configuration
-                if ( key.startsWith( "repositories" ) || key.startsWith( "proxyConnectors" ) ||
-                    key.startsWith( "networkProxies" ) || key.startsWith( "repositoryScanning" ) ||
-                    key.startsWith( "databaseScanning" ) || key.startsWith( "remoteRepositories" ) ||
-                    key.startsWith( "managedRepositories" ) )
+                if ( key.startsWith( "repositories" ) || key.startsWith( "proxyConnectors" )
+                    || key.startsWith( "networkProxies" ) || key.startsWith( "repositoryScanning" )
+                    || key.startsWith( "databaseScanning" ) || key.startsWith( "remoteRepositories" )
+                    || key.startsWith( "managedRepositories" ) )
                 {
                     foundList = true;
                 }
@@ -203,12 +228,13 @@
                 this.configuration = null;
 
                 throw new IndeterminateConfigurationException(
-                    "Configuration can not be saved when it is loaded from two sources" );
+                                                               "Configuration can not be saved when it is loaded from two sources" );
             }
         }
 
         // escape all cron expressions to handle ','
-        for ( Iterator<ManagedRepositoryConfiguration> i = configuration.getManagedRepositories().iterator(); i.hasNext(); )
+        for ( Iterator<ManagedRepositoryConfiguration> i = configuration.getManagedRepositories().iterator(); i
+            .hasNext(); )
         {
             ManagedRepositoryConfiguration c = i.next();
             c.setRefreshCronExpression( escapeCronExpression( c.getRefreshCronExpression() ) );
@@ -217,7 +243,8 @@
         if ( configuration.getDatabaseScanning() != null )
         {
             configuration.getDatabaseScanning().setCronExpression(
-                escapeCronExpression( configuration.getDatabaseScanning().getCronExpression() ) );
+                                                                   escapeCronExpression( configuration
+                                                                       .getDatabaseScanning().getCronExpression() ) );
         }
 
         new ConfigurationRegistryWriter().write( configuration, section );
@@ -299,10 +326,10 @@
 
     private String removeExpressions( String directory )
     {
-        String value = StringUtils.replace( directory, "${appserver.base}",
-                                            registry.getString( "appserver.base", "${appserver.base}" ) );
-        value = StringUtils.replace( value, "${appserver.home}",
-                                     registry.getString( "appserver.home", "${appserver.home}" ) );
+        String value = StringUtils.replace( directory, "${appserver.base}", registry.getString( "appserver.base",
+                                                                                                "${appserver.base}" ) );
+        value = StringUtils.replace( value, "${appserver.home}", registry.getString( "appserver.home",
+                                                                                     "${appserver.home}" ) );
         return value;
     }
 

Added: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java?rev=582020&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java Thu Oct  4 15:29:43 2007
@@ -0,0 +1,73 @@
+package org.apache.maven.archiva.configuration.functors;
+
+/*
+ * 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 org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
+
+import java.util.Comparator;
+
+/**
+ * ProxyConnectorConfigurationOrderComparator 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ProxyConnectorConfigurationOrderComparator
+    implements Comparator<ProxyConnectorConfiguration>
+{
+    private static ProxyConnectorConfigurationOrderComparator INSTANCE = new ProxyConnectorConfigurationOrderComparator();
+    
+    public int compare( ProxyConnectorConfiguration o1, ProxyConnectorConfiguration o2 )
+    {
+        if ( o1 == null && o2 == null )
+        {
+            return 0;
+        }
+
+        // Ensure null goes to end of list.
+        if ( o1 == null && o2 != null )
+        {
+            return 1;
+        }
+
+        if ( o1 != null && o2 == null )
+        {
+            return -1;
+        }
+
+        // Ensure 0 (unordered) goes to end of list.
+        if ( o1.getOrder() == 0 && o2.getOrder() != 0 )
+        {
+            return 1;
+        }
+        
+        if ( o1.getOrder() != 0 && o2.getOrder() == 0 )
+        {
+            return -1;
+        }
+
+        return o1.getOrder() - o2.getOrder();
+    }
+
+    public static ProxyConnectorConfigurationOrderComparator getInstance()
+    {
+        return INSTANCE;
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo (original)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo Thu Oct  4 15:29:43 2007
@@ -141,23 +141,49 @@
         java.util.Map<String, NetworkProxyConfiguration> map = new java.util.HashMap<String, NetworkProxyConfiguration>();
         if ( networkProxies != null )
         {
-            for ( java.util.Iterator i = networkProxies.iterator(); i.hasNext(); )
+            for ( java.util.Iterator<NetworkProxyConfiguration> i = networkProxies.iterator(); i.hasNext(); )
             {
-                NetworkProxyConfiguration proxy = (NetworkProxyConfiguration) i.next();
+                NetworkProxyConfiguration proxy = i.next();
                 map.put( proxy.getId(), proxy );
             }
         }
         return map;
-    }
+    }
+    
+    public java.util.Map<String, java.util.List<ProxyConnectorConfiguration>> getProxyConnectorAsMap()
+    {
+        java.util.Map<String, java.util.List<ProxyConnectorConfiguration>> proxyConnectorMap = 
+            new java.util.HashMap<String, java.util.List<ProxyConnectorConfiguration>>();
+
+        java.util.Iterator<ProxyConnectorConfiguration> it = proxyConnectors.iterator();
+        while ( it.hasNext() )
+        {
+            ProxyConnectorConfiguration proxyConfig = it.next();
+            String key = proxyConfig.getSourceRepoId();
+
+            java.util.List<ProxyConnectorConfiguration> connectors = proxyConnectorMap.get( key );
+            if ( connectors == null )
+            {
+                connectors = new java.util.ArrayList<ProxyConnectorConfiguration>();
+                proxyConnectorMap.put( key, connectors );
+            }
+
+            connectors.add( proxyConfig );
+            java.util.Collections.sort( connectors,
+                org.apache.maven.archiva.configuration.functors.ProxyConnectorConfigurationOrderComparator.getInstance() );
+        }
+
+        return proxyConnectorMap;
+    }    
 
     public java.util.Map<String, RemoteRepositoryConfiguration> getRemoteRepositoriesAsMap()
     {
         java.util.Map<String, RemoteRepositoryConfiguration> map = new java.util.HashMap<String, RemoteRepositoryConfiguration>();
         if ( remoteRepositories != null )
         {
-            for ( java.util.Iterator i = remoteRepositories.iterator(); i.hasNext(); )
+            for ( java.util.Iterator<RemoteRepositoryConfiguration> i = remoteRepositories.iterator(); i.hasNext(); )
             {
-                RemoteRepositoryConfiguration repo = (RemoteRepositoryConfiguration) i.next();
+                RemoteRepositoryConfiguration repo = i.next();
                 map.put( repo.getId(), repo );
             }
         }
@@ -168,9 +194,9 @@
     {
         if ( remoteRepositories != null )
         {
-            for ( java.util.Iterator i = remoteRepositories.iterator(); i.hasNext(); )
+            for ( java.util.Iterator<RemoteRepositoryConfiguration> i = remoteRepositories.iterator(); i.hasNext(); )
             {
-                RemoteRepositoryConfiguration repo = (RemoteRepositoryConfiguration) i.next();
+                RemoteRepositoryConfiguration repo = i.next();
                 if ( repo.getId().equals( id ) )
                 {
                     return repo;
@@ -185,9 +211,9 @@
         java.util.Map<String, ManagedRepositoryConfiguration> map = new java.util.HashMap<String, ManagedRepositoryConfiguration>();
         if ( managedRepositories != null )
         {
-            for ( java.util.Iterator i = managedRepositories.iterator(); i.hasNext(); )
+            for ( java.util.Iterator<ManagedRepositoryConfiguration> i = managedRepositories.iterator(); i.hasNext(); )
             {
-                ManagedRepositoryConfiguration repo = (ManagedRepositoryConfiguration) i.next();
+                ManagedRepositoryConfiguration repo = i.next();
                 map.put( repo.getId(), repo );
             }
         }
@@ -198,9 +224,9 @@
     {
         if ( managedRepositories != null )
         {
-            for ( java.util.Iterator i = managedRepositories.iterator(); i.hasNext(); )
+            for ( java.util.Iterator<ManagedRepositoryConfiguration> i = managedRepositories.iterator(); i.hasNext(); )
             {
-                ManagedRepositoryConfiguration repo = (ManagedRepositoryConfiguration) i.next();
+                ManagedRepositoryConfiguration repo = i.next();
                 if ( repo.getId().equals( id ) )
                 {
                     return repo;
@@ -517,11 +543,25 @@
       <name>ProxyConnectorConfiguration</name>
       <version>1.0.0+</version>
       <fields>
+        <field>
+          <name>order</name>
+          <version>1.0.0+</version>
+          <description>
+            The order of the proxy connectors. (0 means no order specified)
+          </description>
+          <type>int</type>
+          <defaultValue>0</defaultValue>
+        </field>
       </fields>
       <codeSegments>
         <codeSegment>
           <version>1.0.0+</version>
           <code><![CDATA[
+    /**
+     * The order id for UNORDERED
+     */
+    public static final int UNORDERED = 0;
+    
     /**
      * The policy key {@link #getPolicies()} for snapshot handling.
      * See {@link org.apache.maven.archiva.policies.SnapshotsPolicy} 

Added: maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java?rev=582020&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java Thu Oct  4 15:29:43 2007
@@ -0,0 +1,131 @@
+package org.apache.maven.archiva.configuration.functors;
+
+/*
+ * 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 org.apache.commons.lang.StringUtils;
+import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * ProxyConnectorConfigurationOrderComparatorTest 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ProxyConnectorConfigurationOrderComparatorTest
+    extends TestCase
+{
+    public void testSortOfAllZeros()
+    {
+        List<ProxyConnectorConfiguration> proxies = new ArrayList<ProxyConnectorConfiguration>();
+
+        proxies.add( createConnector( "corporate", 0 ) );
+        proxies.add( createConnector( "snapshots", 0 ) );
+        proxies.add( createConnector( "3rdparty", 0 ) );
+        proxies.add( createConnector( "sandbox", 0 ) );
+
+        Collections.sort( proxies, ProxyConnectorConfigurationOrderComparator.getInstance() );
+
+        assertProxyOrder( new String[] { "corporate", "snapshots", "3rdparty", "sandbox" }, proxies );
+    }
+
+    public void testSortNormal()
+    {
+        List<ProxyConnectorConfiguration> proxies = new ArrayList<ProxyConnectorConfiguration>();
+
+        proxies.add( createConnector( "corporate", 3 ) );
+        proxies.add( createConnector( "snapshots", 1 ) );
+        proxies.add( createConnector( "3rdparty", 2 ) );
+        proxies.add( createConnector( "sandbox", 4 ) );
+
+        Collections.sort( proxies, new ProxyConnectorConfigurationOrderComparator() );
+
+        assertProxyOrder( new String[] { "snapshots", "3rdparty", "corporate", "sandbox" }, proxies );
+    }
+
+    public void testSortPartial()
+    {
+        List<ProxyConnectorConfiguration> proxies = new ArrayList<ProxyConnectorConfiguration>();
+
+        proxies.add( createConnector( "corporate", 3 ) );
+        proxies.add( createConnector( "snapshots", 0 ) );
+        proxies.add( createConnector( "3rdparty", 2 ) );
+        proxies.add( createConnector( "sandbox", 0 ) );
+
+        Collections.sort( proxies, new ProxyConnectorConfigurationOrderComparator() );
+
+        assertProxyOrder( new String[] { "3rdparty", "corporate", "snapshots", "sandbox" }, proxies );
+    }
+
+    private void assertProxyOrder( String[] ids, List<ProxyConnectorConfiguration> proxies )
+    {
+        assertEquals( "Proxies.size() == ids.length", ids.length, proxies.size() );
+
+        int orderFailedAt = -1;
+
+        for ( int i = 0; i < ids.length; i++ )
+        {
+            if ( !StringUtils.equals( ids[i], proxies.get( i ).getProxyId() ) )
+            {
+                orderFailedAt = i;
+                break;
+            }
+        }
+
+        if ( orderFailedAt >= 0 )
+        {
+            StringBuffer msg = new StringBuffer();
+
+            msg.append( "Failed expected order of the proxies <" );
+            msg.append( StringUtils.join( ids, ", " ) );
+            msg.append( ">, actual <" );
+
+            boolean needsComma = false;
+            for ( ProxyConnectorConfiguration proxy : proxies )
+            {
+                if ( needsComma )
+                {
+                    msg.append( ", " );
+                }
+                msg.append( proxy.getProxyId() );
+                needsComma = true;
+            }
+            msg.append( "> failure at index <" ).append( orderFailedAt ).append( ">." );
+
+            fail( msg.toString() );
+        }
+    }
+
+    private ProxyConnectorConfiguration createConnector( String id, int order )
+    {
+        ProxyConnectorConfiguration proxy = new ProxyConnectorConfiguration();
+        proxy.setProxyId( id );
+        proxy.setOrder( order );
+        proxy.setSourceRepoId( id + "_m" );
+        proxy.setTargetRepoId( id + "_r" );
+
+        return proxy;
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/functors/ProxyConnectorConfigurationOrderComparatorTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java Thu Oct  4 15:29:43 2007
@@ -44,7 +44,7 @@
      * 
      * @return the list of options for this policy.
      */
-    public List getOptions();
+    public List<String> getOptions();
 
     /**
      * Get the default option for this policy.

Modified: maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java Thu Oct  4 15:29:43 2007
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
@@ -32,6 +33,8 @@
 import org.apache.maven.archiva.model.ProjectReference;
 import org.apache.maven.archiva.model.VersionedReference;
 import org.apache.maven.archiva.policies.DownloadPolicy;
+import org.apache.maven.archiva.policies.PostDownloadPolicy;
+import org.apache.maven.archiva.policies.PreDownloadPolicy;
 import org.apache.maven.archiva.policies.urlcache.UrlFailureCache;
 import org.apache.maven.archiva.repository.ArchivaConfigurationAdaptor;
 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
@@ -58,14 +61,12 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Properties;
+import java.util.Map.Entry;
 
 /**
  * DefaultRepositoryProxyConnectors
@@ -86,7 +87,7 @@
     /**
      * @plexus.requirement role="org.apache.maven.wagon.Wagon"
      */
-    private Map/*<String,Wagon>*/wagons;
+    private Map<String, Wagon> wagons;
 
     /**
      * @plexus.requirement
@@ -101,21 +102,21 @@
     /**
      * @plexus.requirement role="org.apache.maven.archiva.policies.PreDownloadPolicy"
      */
-    private Map preDownloadPolicies;
+    private Map<String, PreDownloadPolicy> preDownloadPolicies;
 
     /**
      * @plexus.requirement role="org.apache.maven.archiva.policies.PostDownloadPolicy"
      */
-    private Map postDownloadPolicies;
+    private Map<String, PostDownloadPolicy> postDownloadPolicies;
 
     /**
      * @plexus.requirement role-hint="default"
      */
     private UrlFailureCache urlFailureCache;
 
-    private Map proxyConnectorMap = new HashMap();
+    private Map<String, List<ProxyConnector>> proxyConnectorMap = new HashMap<String, List<ProxyConnector>>();
 
-    private Map networkProxyMap = new HashMap();
+    private Map<String, ProxyInfo> networkProxyMap = new HashMap<String, ProxyInfo>();
 
     /**
      * @plexus.requirement
@@ -139,11 +140,9 @@
         Properties requestProperties = new Properties();
         requestProperties.setProperty( "version", artifact.getVersion() );
 
-        List connectors = getProxyConnectors( repository );
-        Iterator it = connectors.iterator();
-        while ( it.hasNext() )
+        List<ProxyConnector> connectors = getProxyConnectors( repository );
+        for( ProxyConnector connector: connectors )
         {
-            ProxyConnector connector = (ProxyConnector) it.next();
             ArchivaRepository targetRepository = connector.getTargetRepository();
             String targetPath = getLayout( targetRepository ).toPath( artifact );
 
@@ -172,17 +171,15 @@
         Properties requestProperties = new Properties();
         boolean hasFetched = false;
 
-        List connectors = getProxyConnectors( repository );
-        Iterator it = connectors.iterator();
-        while ( it.hasNext() )
+        List<ProxyConnector> connectors = getProxyConnectors( repository );
+        for( ProxyConnector connector: connectors )
         {
-            ProxyConnector connector = (ProxyConnector) it.next();
             ArchivaRepository targetRepository = connector.getTargetRepository();
             String targetPath = metadataTools.toPath( metadata );
 
             File localRepoFile = toLocalRepoFile( repository, targetRepository, targetPath );
-            File downloadedFile =
-                transferFile( connector, targetRepository, targetPath, localRepoFile, requestProperties );
+            File downloadedFile = transferFile( connector, targetRepository, targetPath, localRepoFile,
+                                                requestProperties );
 
             if ( fileExists( downloadedFile ) )
             {
@@ -237,17 +234,15 @@
         Properties requestProperties = new Properties();
         boolean hasFetched = false;
 
-        List connectors = getProxyConnectors( repository );
-        Iterator it = connectors.iterator();
-        while ( it.hasNext() )
+        List<ProxyConnector> connectors = getProxyConnectors( repository );
+        for( ProxyConnector connector: connectors )
         {
-            ProxyConnector connector = (ProxyConnector) it.next();
             ArchivaRepository targetRepository = connector.getTargetRepository();
             String targetPath = metadataTools.toPath( metadata );
 
             File localRepoFile = toLocalRepoFile( repository, targetRepository, targetPath );
-            File downloadedFile =
-                transferFile( connector, targetRepository, targetPath, localRepoFile, requestProperties );
+            File downloadedFile = transferFile( connector, targetRepository, targetPath, localRepoFile,
+                                                requestProperties );
 
             if ( fileExists( downloadedFile ) )
             {
@@ -345,8 +340,8 @@
         }
         catch ( LayoutException e )
         {
-            throw new ProxyException( "Unable to proxy due to bad repository layout definition [" + repository.getId() +
-                "] had a layout defined as [" + repository.getLayoutType() + "] : " + e.getMessage(), e );
+            throw new ProxyException( "Unable to proxy due to bad repository layout definition [" + repository.getId()
+                + "] had a layout defined as [" + repository.getLayoutType() + "] : " + e.getMessage(), e );
         }
     }
 
@@ -395,7 +390,7 @@
         requestProperties.setProperty( "url", url );
 
         // Is a whitelist defined?
-        if ( !isEmpty( connector.getWhitelist() ) )
+        if ( CollectionUtils.isNotEmpty( connector.getWhitelist() ) )
         {
             // Path must belong to whitelist.
             if ( !matchesPattern( remotePath, connector.getWhitelist() ) )
@@ -442,8 +437,8 @@
 
                 transferChecksum( wagon, remoteRepository, remotePath, localFile, ".sha1" );
                 transferChecksum( wagon, remoteRepository, remotePath, localFile, ".md5" );
-            
-			}
+
+            }
         }
         catch ( ResourceDoesNotExistException e )
         {
@@ -542,8 +537,7 @@
      * @throws ProxyException if there was a problem moving the downloaded file into place.
      * @throws WagonException if there was a problem tranfering the file.
      */
-    private File transferSimpleFile( Wagon wagon, ArchivaRepository remoteRepository, String remotePath,
-                                     File localFile )
+    private File transferSimpleFile( Wagon wagon, ArchivaRepository remoteRepository, String remotePath, File localFile )
         throws ProxyException, WagonException
     {
         assert ( remotePath != null );
@@ -578,7 +572,8 @@
                 if ( !success )
                 {
                     getLogger().info(
-                        "Not downloaded, as local file is newer than remote side: " + localFile.getAbsolutePath() );
+                                      "Not downloaded, as local file is newer than remote side: "
+                                          + localFile.getAbsolutePath() );
                 }
                 else if ( temp.exists() )
                 {
@@ -617,14 +612,12 @@
      * @param localFile the local file (utilized by the {@link DownloadPolicy#applyPolicy(String,Properties,File)})
      * @return true if all of the policies passed, false if a policy failed.
      */
-    private boolean applyPolicies( Map policies, Map settings, Properties request, File localFile )
+    private boolean applyPolicies( Map<String, ? extends DownloadPolicy> policies, Map<String, String> settings, Properties request, File localFile )
     {
-        Iterator it = policies.entrySet().iterator();
-        while ( it.hasNext() )
+        for( Entry<String, ? extends DownloadPolicy> entry: policies.entrySet() )
         {
-            Map.Entry entry = (Entry) it.next();
             String key = (String) entry.getKey();
-            DownloadPolicy policy = (DownloadPolicy) entry.getValue();
+            DownloadPolicy policy = entry.getValue();
             String defaultSetting = policy.getDefaultOption();
             String setting = StringUtils.defaultString( (String) settings.get( key ), defaultSetting );
 
@@ -693,24 +686,24 @@
 
         try
         {
-        	AuthenticationInfo authInfo = null;
-        	String username = remoteRepository.getUsername();
-        	String password = remoteRepository.getPassword();
-        	if (username != null && password != null)
-        	{
-			getLogger().info("Using username " + username + " to connect to remote repository "
-				+ remoteRepository.getUrl());
-        		authInfo = new AuthenticationInfo();
-        		authInfo.setUserName(username);
-        		authInfo.setPassword(password);
-        	}
-		else
-		{
-			getLogger().info("No authentication for remote repository needed");
-		}
+            AuthenticationInfo authInfo = null;
+            String username = remoteRepository.getUsername();
+            String password = remoteRepository.getPassword();
+            if ( username != null && password != null )
+            {
+                getLogger().info(
+                                  "Using username " + username + " to connect to remote repository "
+                                      + remoteRepository.getUrl() );
+                authInfo = new AuthenticationInfo();
+                authInfo.setUserName( username );
+                authInfo.setPassword( password );
+            }
+            else
+            {
+                getLogger().info( "No authentication for remote repository needed" );
+            }
 
-            Repository wagonRepository =
-                new Repository( remoteRepository.getId(), remoteRepository.getUrl().toString() );
+            Repository wagonRepository = new Repository( remoteRepository.getId(), remoteRepository.getUrl().toString() );
             if ( networkProxy != null )
             {
                 wagon.connect( wagonRepository, authInfo, networkProxy );
@@ -742,17 +735,15 @@
      * @param patterns the list of patterns to check.
      * @return true if the path matches at least 1 pattern in the provided patterns list.
      */
-    private boolean matchesPattern( String path, List patterns )
+    private boolean matchesPattern( String path, List<String> patterns )
     {
-        if ( isEmpty( patterns ) )
+        if ( CollectionUtils.isEmpty( patterns ) )
         {
             return false;
         }
 
-        Iterator it = patterns.iterator();
-        while ( it.hasNext() )
+        for( String pattern: patterns )
         {
-            String pattern = (String) it.next();
             if ( SelectorUtils.matchPath( pattern, path, false ) )
             {
                 return true;
@@ -765,11 +756,11 @@
     /**
      * TODO: Ensure that list is correctly ordered based on configuration. See MRM-477
      */
-    public List getProxyConnectors( ArchivaRepository repository )
+    public List<ProxyConnector> getProxyConnectors( ArchivaRepository repository )
     {
         synchronized ( this.proxyConnectorMap )
         {
-            List ret = (List) this.proxyConnectorMap.get( repository.getId() );
+            List<ProxyConnector> ret = (List<ProxyConnector>) this.proxyConnectorMap.get( repository.getId() );
             if ( ret == null )
             {
                 return Collections.EMPTY_LIST;
@@ -780,10 +771,10 @@
 
     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
     {
-        if ( ConfigurationNames.isNetworkProxy( propertyName ) ||
-            ConfigurationNames.isManagedRepositories( propertyName ) ||
-            ConfigurationNames.isRemoteRepositories( propertyName ) ||
-            ConfigurationNames.isProxyConnector( propertyName ) )
+        if ( ConfigurationNames.isNetworkProxy( propertyName )
+            || ConfigurationNames.isManagedRepositories( propertyName )
+            || ConfigurationNames.isRemoteRepositories( propertyName )
+            || ConfigurationNames.isProxyConnector( propertyName ) )
         {
             initConnectorsAndNetworkProxies();
         }
@@ -796,17 +787,14 @@
 
     private void initConnectorsAndNetworkProxies()
     {
-        Iterator it;
-
         synchronized ( this.proxyConnectorMap )
         {
+            ProxyConnectorOrderComparator proxyOrderSorter = new ProxyConnectorOrderComparator();
             this.proxyConnectorMap.clear();
 
-            List proxyConfigs = archivaConfiguration.getConfiguration().getProxyConnectors();
-            it = proxyConfigs.iterator();
-            while ( it.hasNext() )
+            List<ProxyConnectorConfiguration> proxyConfigs = archivaConfiguration.getConfiguration().getProxyConnectors();
+            for( ProxyConnectorConfiguration proxyConfig: proxyConfigs )
             {
-                ProxyConnectorConfiguration proxyConfig = (ProxyConnectorConfiguration) it.next();
                 String key = proxyConfig.getSourceRepoId();
 
                 // Create connector object.
@@ -815,48 +803,52 @@
                 connector.setTargetRepository( getRemoteRepository( proxyConfig.getTargetRepoId() ) );
                 connector.setProxyId( proxyConfig.getProxyId() );
                 connector.setPolicies( proxyConfig.getPolicies() );
+                connector.setOrder( proxyConfig.getOrder() );
 
                 // Copy any blacklist patterns.
-                List blacklist = new ArrayList();
-                if ( !isEmpty( proxyConfig.getBlackListPatterns() ) )
+                List<String> blacklist = new ArrayList<String>();
+                if ( CollectionUtils.isNotEmpty( proxyConfig.getBlackListPatterns() ) )
                 {
                     blacklist.addAll( proxyConfig.getBlackListPatterns() );
                 }
                 connector.setBlacklist( blacklist );
 
                 // Copy any whitelist patterns.
-                List whitelist = new ArrayList();
-                if ( !isEmpty( proxyConfig.getWhiteListPatterns() ) )
+                List<String> whitelist = new ArrayList<String>();
+                if ( CollectionUtils.isNotEmpty( proxyConfig.getWhiteListPatterns() ) )
                 {
                     whitelist.addAll( proxyConfig.getWhiteListPatterns() );
                 }
                 connector.setWhitelist( whitelist );
 
                 // Get other connectors
-                List connectors = (List) this.proxyConnectorMap.get( key );
+                List<ProxyConnector> connectors = this.proxyConnectorMap.get( key );
                 if ( connectors == null )
                 {
                     // Create if we are the first.
-                    connectors = new ArrayList();
+                    connectors = new ArrayList<ProxyConnector>();
                 }
 
                 // Add the connector.
                 connectors.add( connector );
+                
+                // Ensure the list is sorted.
+                Collections.sort( connectors, proxyOrderSorter );
 
                 // Set the key to the list of connectors.
                 this.proxyConnectorMap.put( key, connectors );
             }
+            
+            
         }
 
         synchronized ( this.networkProxyMap )
         {
             this.networkProxyMap.clear();
 
-            List networkProxies = archivaConfiguration.getConfiguration().getNetworkProxies();
-            it = networkProxies.iterator();
-            while ( it.hasNext() )
+            List<NetworkProxyConfiguration> networkProxies = archivaConfiguration.getConfiguration().getNetworkProxies();
+            for( NetworkProxyConfiguration networkProxyConfig: networkProxies )
             {
-                NetworkProxyConfiguration networkProxyConfig = (NetworkProxyConfiguration) it.next();
                 String key = networkProxyConfig.getId();
 
                 ProxyInfo proxy = new ProxyInfo();
@@ -872,32 +864,22 @@
         }
     }
 
-    private boolean isEmpty( Collection collection )
-    {
-        if ( collection == null )
-        {
-            return true;
-        }
-
-        return collection.size() == 0;
-    }
-
     private ArchivaRepository getRemoteRepository( String repoId )
     {
-        RemoteRepositoryConfiguration repoConfig =
-            archivaConfiguration.getConfiguration().findRemoteRepositoryById( repoId );
+        RemoteRepositoryConfiguration repoConfig = archivaConfiguration.getConfiguration()
+            .findRemoteRepositoryById( repoId );
 
         ArchivaRepository repo = new ArchivaRepository( repoConfig.getId(), repoConfig.getName(), repoConfig.getUrl() );
         repo.getModel().setLayoutName( repoConfig.getLayout() );
-        repo.setUsername(repoConfig.getUsername());
-        repo.setPassword(repoConfig.getPassword());
+        repo.setUsername( repoConfig.getUsername() );
+        repo.setPassword( repoConfig.getPassword() );
         return repo;
     }
 
     private ArchivaRepository getManagedRepository( String repoId )
     {
-        ManagedRepositoryConfiguration repoConfig =
-            archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId );
+        ManagedRepositoryConfiguration repoConfig = archivaConfiguration.getConfiguration()
+            .findManagedRepositoryById( repoId );
 
         return ArchivaConfigurationAdaptor.toArchivaRepository( repoConfig );
     }

Modified: maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java Thu Oct  4 15:29:43 2007
@@ -39,20 +39,22 @@
 
     private ArchivaRepository targetRepository;
 
-    private List blacklist;
+    private List<String> blacklist;
 
-    private List whitelist;
+    private List<String> whitelist;
 
     private String proxyId;
+    
+    private int order;
 
-    private Map policies;
+    private Map<String, String> policies;
 
-    public List getBlacklist()
+    public List<String> getBlacklist()
     {
         return blacklist;
     }
 
-    public void setBlacklist( List blacklist )
+    public void setBlacklist( List<String> blacklist )
     {
         this.blacklist = blacklist;
     }
@@ -77,22 +79,22 @@
         this.targetRepository = targetRepository;
     }
 
-    public List getWhitelist()
+    public List<String> getWhitelist()
     {
         return whitelist;
     }
 
-    public void setWhitelist( List whitelist )
+    public void setWhitelist( List<String> whitelist )
     {
         this.whitelist = whitelist;
     }
 
-    public Map getPolicies()
+    public Map<String, String> getPolicies()
     {
         return policies;
     }
 
-    public void setPolicies( Map policies )
+    public void setPolicies( Map<String, String> policies )
     {
         this.policies = policies;
     }
@@ -116,10 +118,10 @@
         sb.append( "  target:" ).append( this.targetRepository ).append( "\n" );
         sb.append( "  proxyId:" ).append( this.proxyId ).append( "\n" );
 
-        Iterator keys = this.policies.keySet().iterator();
+        Iterator<String> keys = this.policies.keySet().iterator();
         while ( keys.hasNext() )
         {
-            String name = (String) keys.next();
+            String name = keys.next();
             sb.append( "  policy[" ).append( name ).append( "]:" );
             sb.append( this.policies.get( name ) ).append( "\n" );
         }
@@ -132,5 +134,15 @@
     public void setPolicy( String policyId, String policySetting )
     {
         this.policies.put( policyId, policySetting );
+    }
+
+    public int getOrder()
+    {
+        return order;
+    }
+
+    public void setOrder( int order )
+    {
+        this.order = order;
     }
 }

Added: maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java?rev=582020&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java Thu Oct  4 15:29:43 2007
@@ -0,0 +1,71 @@
+package org.apache.maven.archiva.proxy;
+
+/*
+ * 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.Comparator;
+
+/**
+ * ProxyConnectorOrderComparator 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ProxyConnectorOrderComparator
+    implements Comparator<ProxyConnector>
+{
+    private static ProxyConnectorOrderComparator INSTANCE = new ProxyConnectorOrderComparator();
+
+    public static ProxyConnectorOrderComparator getInstance()
+    {
+        return INSTANCE;
+    }
+
+    public int compare( ProxyConnector o1, ProxyConnector o2 )
+    {
+        if ( o1 == null && o2 == null )
+        {
+            return 0;
+        }
+
+        // Ensure null goes to end of list.
+        if ( o1 == null && o2 != null )
+        {
+            return 1;
+        }
+
+        if ( o1 != null && o2 == null )
+        {
+            return -1;
+        }
+
+        // Ensure 0 (unordered) goes to end of list.
+        if ( o1.getOrder() == 0 && o2.getOrder() != 0 )
+        {
+            return 1;
+        }
+
+        if ( o1.getOrder() != 0 && o2.getOrder() == 0 )
+        {
+            return -1;
+        }
+
+        return o1.getOrder() - o2.getOrder();
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnectorOrderComparator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java Thu Oct  4 15:29:43 2007
@@ -86,7 +86,7 @@
      * @param repository the source repository to look for.
      * @return the List of {@link ProxyConnector} objects.
      */
-    public List getProxyConnectors( ArchivaRepository repository );
+    public List<ProxyConnector> getProxyConnectors( ArchivaRepository repository );
 
     /**
      * Tests to see if the provided repository is a source repository for

Modified: maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java Thu Oct  4 15:29:43 2007
@@ -44,7 +44,6 @@
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.Locale;
 
 /**
@@ -162,15 +161,13 @@
             return;
         }
 
-        Collection tmpFiles = FileUtils.listFiles( workingDir, new String[]{"tmp"}, false );
+        Collection<File> tmpFiles = FileUtils.listFiles( workingDir, new String[]{"tmp"}, false );
         if ( !tmpFiles.isEmpty() )
         {
             StringBuffer emsg = new StringBuffer();
             emsg.append( "Found Temp Files in dir: " ).append( workingDir.getPath() );
-            Iterator it = tmpFiles.iterator();
-            while ( it.hasNext() )
+            for( File tfile: tmpFiles )
             {
-                File tfile = (File) it.next();
                 emsg.append( "\n   " ).append( tfile.getName() );
             }
             fail( emsg.toString() );

Modified: maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java Thu Oct  4 15:29:43 2007
@@ -27,7 +27,6 @@
 import org.easymock.MockControl;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -44,7 +43,7 @@
 {
     private Configuration configuration = new Configuration();
 
-    private List listeners = new ArrayList();
+    private List<RegistryListener> listeners = new ArrayList<RegistryListener>();
 
     private MockControl registryControl;
 
@@ -74,10 +73,8 @@
 
     public void triggerChange( String name, String value )
     {
-        Iterator it = listeners.iterator();
-        while ( it.hasNext() )
+        for( RegistryListener listener: listeners )
         {
-            RegistryListener listener = (RegistryListener) it.next();
             try
             {
                 listener.afterConfigurationChange( registryMock, name, value );

Modified: maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/WagonDelegate.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/WagonDelegate.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/WagonDelegate.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/WagonDelegate.java Thu Oct  4 15:29:43 2007
@@ -86,7 +86,7 @@
         return delegate.resourceExists( resourceName );
     }
 
-    public List getFileList( String destinationDirectory )
+    public List<String> getFileList( String destinationDirectory )
         throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
     {
         return delegate.getFileList( destinationDirectory );

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/pom.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/pom.xml?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/pom.xml (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/pom.xml Thu Oct  4 15:29:43 2007
@@ -317,6 +317,10 @@
           </connectors>
           <systemProperties>
             <systemProperty>
+              <name>plexus.home</name>
+              <value>${project.build.directory}/appserver-base</value>
+            </systemProperty>
+            <systemProperty>
               <name>appserver.base</name>
               <value>${project.build.directory}/appserver-base</value>
             </systemProperty>

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/AbstractAppearanceAction.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/AbstractAppearanceAction.java?rev=582020&r1=582019&r2=582020&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/AbstractAppearanceAction.java (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/AbstractAppearanceAction.java Thu Oct  4 15:29:43 2007
@@ -40,7 +40,7 @@
     /**
      * @plexus.requirement role="org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout"
      */
-    private Map repositoryLayouts;
+    private Map<String, ArtifactRepositoryLayout> repositoryLayouts;
 
     /**
      * @plexus.requirement

Added: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java?rev=582020&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java (added)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java Thu Oct  4 15:29:43 2007
@@ -0,0 +1,137 @@
+package org.apache.maven.archiva.web.action.admin.connectors.proxy;
+
+/*
+ * 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 org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.functors.NotPredicate;
+import org.apache.commons.lang.StringUtils;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.IndeterminateConfigurationException;
+import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
+import org.apache.maven.archiva.configuration.functors.ProxyConnectorSelectionPredicate;
+import org.apache.maven.archiva.security.ArchivaRoleConstants;
+import org.codehaus.plexus.redback.rbac.Resource;
+import org.codehaus.plexus.redback.xwork.interceptor.SecureAction;
+import org.codehaus.plexus.redback.xwork.interceptor.SecureActionBundle;
+import org.codehaus.plexus.redback.xwork.interceptor.SecureActionException;
+import org.codehaus.plexus.registry.RegistryException;
+import org.codehaus.plexus.xwork.action.PlexusActionSupport;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * AbstractProxyConnectorAction 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public abstract class AbstractProxyConnectorAction
+    extends PlexusActionSupport
+    implements SecureAction
+{
+    public static final String DIRECT_CONNECTION = "(direct connection)";
+
+    /**
+     * @plexus.requirement
+     */
+    protected ArchivaConfiguration archivaConfiguration;
+
+    public SecureActionBundle getSecureActionBundle()
+        throws SecureActionException
+    {
+        SecureActionBundle bundle = new SecureActionBundle();
+
+        bundle.setRequiresAuthentication( true );
+        bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
+
+        return bundle;
+    }
+
+    public void setArchivaConfiguration( ArchivaConfiguration archivaConfiguration )
+    {
+        this.archivaConfiguration = archivaConfiguration;
+    }
+
+    protected void addProxyConnector( ProxyConnectorConfiguration proxyConnector )
+    {
+        getConfig().addProxyConnector( proxyConnector );
+    }
+
+    protected ProxyConnectorConfiguration findProxyConnector( String sourceId, String targetId )
+    {
+        if ( StringUtils.isBlank( sourceId ) )
+        {
+            return null;
+        }
+
+        if ( StringUtils.isBlank( targetId ) )
+        {
+            return null;
+        }
+
+        ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
+        return (ProxyConnectorConfiguration) CollectionUtils.find( getConfig().getProxyConnectors(), selectedProxy );
+    }
+
+    protected Configuration getConfig()
+    {
+        return this.archivaConfiguration.getConfiguration();
+    }
+
+    protected Map<String, List<ProxyConnectorConfiguration>> createProxyConnectorMap()
+    {
+        return getConfig().getProxyConnectorAsMap();
+    }
+
+    protected void removeConnector( String sourceId, String targetId )
+    {
+        ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
+        NotPredicate notSelectedProxy = new NotPredicate( selectedProxy );
+        CollectionUtils.filter( getConfig().getProxyConnectors(), notSelectedProxy );
+    }
+
+    protected void removeProxyConnector( ProxyConnectorConfiguration connector )
+    {
+        getConfig().removeProxyConnector( connector );
+    }
+
+    protected String saveConfiguration()
+    {
+        try
+        {
+            archivaConfiguration.save( getConfig() );
+            addActionMessage( "Successfully saved configuration" );
+        }
+        catch ( RegistryException e )
+        {
+            addActionError( "Unable to save configuration: " + e.getMessage() );
+            return INPUT;
+        }
+        catch ( IndeterminateConfigurationException e )
+        {
+            addActionError( e.getMessage() );
+            return INPUT;
+        }
+
+        return SUCCESS;
+    }
+}

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorAction.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java?rev=582020&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java (added)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java Thu Oct  4 15:29:43 2007
@@ -0,0 +1,432 @@
+package org.apache.maven.archiva.web.action.admin.connectors.proxy;
+
+/*
+ * 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 com.opensymphony.xwork.Preparable;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
+import org.apache.maven.archiva.policies.DownloadPolicy;
+import org.apache.maven.archiva.policies.PostDownloadPolicy;
+import org.apache.maven.archiva.policies.PreDownloadPolicy;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * AbstractProxyConnectorFormAction - generic fields and methods for either add or edit actions related with the 
+ * Proxy Connector. 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public abstract class AbstractProxyConnectorFormAction
+    extends AbstractProxyConnectorAction
+    implements Preparable
+{
+
+    /**
+     * @plexus.requirement role="org.apache.maven.archiva.policies.PreDownloadPolicy"
+     */
+    private Map<String, PreDownloadPolicy> preDownloadPolicyMap;
+
+    /**
+     * @plexus.requirement role="org.apache.maven.archiva.policies.PostDownloadPolicy"
+     */
+    private Map<String, PostDownloadPolicy> postDownloadPolicyMap;
+
+    /**
+     * The list of network proxy ids that are available.
+     */
+    private List<String> proxyIdOptions;
+
+    /**
+     * The list of managed repository ids that are available.
+     */
+    private List<String> managedRepoIdList;
+
+    /**
+     * The list of remove repository ids that are available.
+     */
+    private List<String> remoteRepoIdList;
+
+    /**
+     * The map of policies that are available to be set.
+     */
+    private Map<String, DownloadPolicy> policyMap;
+
+    /**
+     * The property key to add or remove.
+     */
+    private String propertyKey;
+
+    /**
+     * The property value to add.
+     */
+    private String propertyValue;
+
+    /**
+     * The blacklist pattern to add.
+     */
+    private String blackListPattern;
+
+    /**
+     * The whitelist pattern to add.
+     */
+    private String whiteListPattern;
+
+    /**
+     * The pattern to add or remove (black or white).
+     */
+    private String pattern;
+
+    /**
+     * The model for this action.
+     */
+    protected ProxyConnectorConfiguration connector;
+
+    public String addBlackListPattern()
+    {
+        String pattern = getBlackListPattern();
+
+        if ( StringUtils.isBlank( pattern ) )
+        {
+            addActionError( "Cannot add a blank black list pattern." );
+        }
+
+        if ( !hasActionErrors() )
+        {
+            getConnector().getBlackListPatterns().add( pattern );
+            setBlackListPattern( null );
+        }
+
+        return INPUT;
+    }
+
+    public String addProperty()
+    {
+        String key = getPropertyKey();
+        String value = getPropertyValue();
+
+        if ( StringUtils.isBlank( key ) )
+        {
+            addActionError( "Unable to add property with blank key." );
+        }
+
+        if ( StringUtils.isBlank( value ) )
+        {
+            addActionError( "Unable to add property with blank value." );
+        }
+
+        if ( !hasActionErrors() )
+        {
+            getConnector().getProperties().put( key, value );
+            setPropertyKey( null );
+            setPropertyValue( null );
+        }
+
+        return INPUT;
+    }
+
+    public String addWhiteListPattern()
+    {
+        String pattern = getWhiteListPattern();
+
+        if ( StringUtils.isBlank( pattern ) )
+        {
+            addActionError( "Cannot add a blank white list pattern." );
+        }
+
+        if ( !hasActionErrors() )
+        {
+            getConnector().getWhiteListPatterns().add( pattern );
+            setWhiteListPattern( null );
+        }
+
+        return INPUT;
+    }
+
+    public String getBlackListPattern()
+    {
+        return blackListPattern;
+    }
+
+    public ProxyConnectorConfiguration getConnector()
+    {
+        return connector;
+    }
+
+    public List<String> getManagedRepoIdList()
+    {
+        return managedRepoIdList;
+    }
+
+    public String getPattern()
+    {
+        return pattern;
+    }
+
+    public Map<String, DownloadPolicy> getPolicyMap()
+    {
+        return policyMap;
+    }
+
+    public String getPropertyKey()
+    {
+        return propertyKey;
+    }
+
+    public String getPropertyValue()
+    {
+        return propertyValue;
+    }
+
+    public List<String> getProxyIdOptions()
+    {
+        return proxyIdOptions;
+    }
+
+    public List<String> getRemoteRepoIdList()
+    {
+        return remoteRepoIdList;
+    }
+
+    public String getWhiteListPattern()
+    {
+        return whiteListPattern;
+    }
+
+    public void prepare()
+    {
+        proxyIdOptions = createNetworkProxyOptions();
+        managedRepoIdList = createManagedRepoOptions();
+        remoteRepoIdList = createRemoteRepoOptions();
+        policyMap = createPolicyMap();
+    }
+
+    public String removeBlackListPattern()
+    {
+        String pattern = getPattern();
+
+        if ( StringUtils.isBlank( pattern ) )
+        {
+            addActionError( "Cannot remove a blank black list pattern." );
+        }
+
+        if ( !getConnector().getBlackListPatterns().contains( pattern ) )
+        {
+            addActionError( "Non-existant black list pattern [" + pattern + "], no black list pattern removed." );
+        }
+
+        if ( !hasActionErrors() )
+        {
+            getConnector().getBlackListPatterns().remove( pattern );
+        }
+
+        setBlackListPattern( null );
+        setPattern( null );
+
+        return INPUT;
+    }
+
+    public String removeProperty()
+    {
+        String key = getPropertyKey();
+
+        if ( StringUtils.isBlank( key ) )
+        {
+            addActionError( "Unable to remove property with blank key." );
+        }
+
+        if ( !getConnector().getProperties().containsKey( key ) )
+        {
+            addActionError( "Non-existant property key [" + pattern + "], no property was removed." );
+        }
+
+        if ( !hasActionErrors() )
+        {
+            getConnector().getProperties().remove( key );
+        }
+
+        setPropertyKey( null );
+        setPropertyValue( null );
+
+        return INPUT;
+    }
+
+    public String removeWhiteListPattern()
+    {
+        String pattern = getPattern();
+
+        if ( StringUtils.isBlank( pattern ) )
+        {
+            addActionError( "Cannot remove a blank white list pattern." );
+        }
+
+        if ( !getConnector().getWhiteListPatterns().contains( pattern ) )
+        {
+            addActionError( "Non-existant white list pattern [" + pattern + "], no white list pattern removed." );
+        }
+
+        if ( !hasActionErrors() )
+        {
+            getConnector().getWhiteListPatterns().remove( pattern );
+        }
+
+        setWhiteListPattern( null );
+        setPattern( null );
+
+        return INPUT;
+    }
+
+    public void setBlackListPattern( String blackListPattern )
+    {
+        this.blackListPattern = blackListPattern;
+    }
+
+    public void setConnector( ProxyConnectorConfiguration connector )
+    {
+        this.connector = connector;
+    }
+
+    public void setManagedRepoIdList( List<String> managedRepoIdList )
+    {
+        this.managedRepoIdList = managedRepoIdList;
+    }
+
+    public void setPattern( String pattern )
+    {
+        this.pattern = pattern;
+    }
+
+    public void setPolicyMap( Map<String, DownloadPolicy> policyMap )
+    {
+        this.policyMap = policyMap;
+    }
+
+    public void setPropertyKey( String propertyKey )
+    {
+        this.propertyKey = propertyKey;
+    }
+
+    public void setPropertyValue( String propertyValue )
+    {
+        this.propertyValue = propertyValue;
+    }
+
+    public void setProxyIdOptions( List<String> proxyIdOptions )
+    {
+        this.proxyIdOptions = proxyIdOptions;
+    }
+
+    public void setRemoteRepoIdList( List<String> remoteRepoIdList )
+    {
+        this.remoteRepoIdList = remoteRepoIdList;
+    }
+
+    public void setWhiteListPattern( String whiteListPattern )
+    {
+        this.whiteListPattern = whiteListPattern;
+    }
+
+    protected List<String> createManagedRepoOptions()
+    {
+        return new ArrayList<String>( getConfig().getManagedRepositoriesAsMap().keySet() );
+    }
+
+    protected List<String> createNetworkProxyOptions()
+    {
+        List<String> options = new ArrayList<String>();
+
+        options.add( DIRECT_CONNECTION );
+        options.addAll( getConfig().getNetworkProxiesAsMap().keySet() );
+
+        return options;
+    }
+
+    protected Map<String, DownloadPolicy> createPolicyMap()
+    {
+        Map<String, DownloadPolicy> policyMap = new HashMap<String, DownloadPolicy>();
+
+        policyMap.putAll( preDownloadPolicyMap );
+        policyMap.putAll( postDownloadPolicyMap );
+
+        return policyMap;
+    }
+
+    protected List<String> createRemoteRepoOptions()
+    {
+        return new ArrayList<String>( getConfig().getRemoteRepositoriesAsMap().keySet() );
+    }
+
+    protected void validateConnector()
+    {
+        if ( connector.getPolicies() == null )
+        {
+            addActionError( "Policies must be set." );
+        }
+        else
+        {
+            // Validate / Fix policy settings arriving from browser.
+            for ( Map.Entry<String, DownloadPolicy> entry : getPolicyMap().entrySet() )
+            {
+                String policyId = (String) entry.getKey();
+                DownloadPolicy policy = (DownloadPolicy) entry.getValue();
+                List<String> options = policy.getOptions();
+
+                if ( !connector.getPolicies().containsKey( policyId ) )
+                {
+                    addActionError( "Policy [" + policyId + "] must be set (missing id)." );
+                    continue;
+                }
+
+                // Ugly hack to compensate for ugly browsers.
+                Object o = connector.getPolicies().get( policyId );
+                String value;
+                if ( o.getClass().isArray() )
+                {
+                    String arr[] = (String[]) o;
+                    value = arr[0];
+                }
+                else
+                {
+                    value = (String) o;
+                }
+
+                connector.getPolicies().put( policyId, value );
+
+                if ( StringUtils.isBlank( value ) )
+                {
+                    addActionError( "Policy [" + policyId + "] must be set (missing value)." );
+                    continue;
+                }
+
+                if ( !options.contains( value ) )
+                {
+                    addActionError( "Value of [" + value + "] is invalid for policy [" + policyId + "], valid values: "
+                        + options );
+                    continue;
+                }
+            }
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java?rev=582020&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java (added)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java Thu Oct  4 15:29:43 2007
@@ -0,0 +1,81 @@
+package org.apache.maven.archiva.web.action.admin.connectors.proxy;
+
+/*
+ * 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 org.apache.commons.lang.StringUtils;
+import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
+
+/**
+ * AddProxyConnectorAction 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component role="com.opensymphony.xwork.Action" role-hint="addProxyConnectorAction"
+ */
+public class AddProxyConnectorAction
+    extends AbstractProxyConnectorFormAction
+{
+    @Override
+    public void prepare()
+    {
+        super.prepare();
+        connector = new ProxyConnectorConfiguration();
+    }
+    
+    public String input()
+    {
+        return INPUT;
+    }
+
+    public String commit()
+    {
+        /* Too complex for webwork's ${Action}-validation.xml techniques.
+         * Not appropriate for use with webwork's implements Validatable, as that validates regardless of
+         * the request method, such as .addProperty() or .addWhiteList().
+         * 
+         * This validation is ultimately only useful on this one request method.
+         */
+        String sourceId = connector.getSourceRepoId();
+        String targetId = connector.getTargetRepoId();
+
+        ProxyConnectorConfiguration otherConnector = findProxyConnector( sourceId, targetId );
+        if ( otherConnector != null )
+        {
+            addActionError( "Unable to add proxy connector, as one already exists with source repository id ["
+                + sourceId + "] and target repository id [" + targetId + "]." );
+        }
+        
+        validateConnector();
+
+        if ( hasActionErrors() )
+        {
+            return INPUT;
+        }
+        
+        if( StringUtils.equals( DIRECT_CONNECTION, connector.getProxyId() ) )
+        {
+            connector.setProxyId( null );
+        }
+
+        addProxyConnector( connector );
+        return saveConfiguration();
+    }
+}

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorAction.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain