]> source.dussan.org Git - archiva.git/commitdiff
MRM-212 : configure checksum policy for proxied repository
authorArnaud Heritier <aheritier@apache.org>
Thu, 10 May 2007 21:39:56 +0000 (21:39 +0000)
committerArnaud Heritier <aheritier@apache.org>
Thu, 10 May 2007 21:39:56 +0000 (21:39 +0000)
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/branches/archiva-0.9@537005 13f79535-47bb-0310-9956-ffa450edef68

archiva-configuration/src/main/mdo/configuration.mdo
archiva-core/src/main/java/org/apache/maven/archiva/configuration/DefaultConfiguredRepositoryFactory.java
archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultProxyRequestHandler.java
archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ProxyRequestHandlerTest.java
archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/proxiedRepositoryForm.jspf
archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/proxiedRepositories.jsp

index 2893e289cf48566ff5bef7fefdd8b1ff8bd5cd49..204fb7b281cdd2023c096858f1dd675c859e1325 100644 (file)
-<!--\r
-  ~ Licensed to the Apache Software Foundation (ASF) under one\r
-  ~ or more contributor license agreements.  See the NOTICE file\r
-  ~ distributed with this work for additional information\r
-  ~ regarding copyright ownership.  The ASF licenses this file\r
-  ~ to you under the Apache License, Version 2.0 (the\r
-  ~ "License"); you may not use this file except in compliance\r
-  ~ with the License.  You may obtain a copy of the License at\r
-  ~\r
-  ~   http://www.apache.org/licenses/LICENSE-2.0\r
-  ~\r
-  ~ Unless required by applicable law or agreed to in writing,\r
-  ~ software distributed under the License is distributed on an\r
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
-  ~ KIND, either express or implied.  See the License for the\r
-  ~ specific language governing permissions and limitations\r
-  ~ under the License.\r
-  -->\r
-\r
-<model>\r
-  <id>configuration</id>\r
-  <name>Configuration</name>\r
-  <description>\r
-    Configuration for the Maven Repository Manager.\r
-  </description>\r
-  <defaults>\r
-    <default>\r
-      <key>package</key>\r
-      <value>org.apache.maven.archiva.configuration</value>\r
-    </default>\r
-  </defaults>\r
-  <classes>\r
-    <class rootElement="true" xml.tagName="configuration">\r
-      <name>Configuration</name>\r
-      <version>1.0.0</version>\r
-      <fields>\r
-        <field>\r
-          <name>repositories</name>\r
-          <version>1.0.0</version>\r
-          <association>\r
-            <type>RepositoryConfiguration</type>\r
-            <multiplicity>*</multiplicity>\r
-          </association>\r
-        </field>\r
-        <field>\r
-          <name>proxiedRepositories</name>\r
-          <version>1.0.0</version>\r
-          <association>\r
-            <type>ProxiedRepositoryConfiguration</type>\r
-            <multiplicity>*</multiplicity>\r
-          </association>\r
-        </field>\r
-        <field>\r
-          <name>syncedRepositories</name>\r
-          <version>1.0.0</version>\r
-          <association>\r
-            <type>SyncedRepositoryConfiguration</type>\r
-            <multiplicity>*</multiplicity>\r
-          </association>\r
-        </field>\r
-        <field>\r
-          <name>localRepository</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <description>\r
-            The location of the local repository.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>indexPath</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <description>\r
-            The location of the Lucene index to use for the repository. The default is the .index subdirectory of\r
-            the repository.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>minimalIndexPath</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <description>\r
-            The location of the reduced Lucene index to use for the repository. The default is the .small-index\r
-            subdirectory of the repository.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>dataRefreshCronExpression</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <description>When to run the data refresh task. Default is every 30 mins (translated as every 0 and 30 minute reading of every hour)</description>\r
-          <defaultValue>0 0,30 * * * ?</defaultValue>\r
+<!--
+  ~ 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.
+  -->
+
+<model>
+  <id>configuration</id>
+  <name>Configuration</name>
+  <description>
+    Configuration for the Maven Repository Manager.
+  </description>
+  <defaults>
+    <default>
+      <key>package</key>
+      <value>org.apache.maven.archiva.configuration</value>
+    </default>
+  </defaults>
+  <classes>
+    <class rootElement="true" xml.tagName="configuration">
+      <name>Configuration</name>
+      <version>1.0.0</version>
+      <fields>
+        <field>
+          <name>repositories</name>
+          <version>1.0.0</version>
+          <association>
+            <type>RepositoryConfiguration</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>proxiedRepositories</name>
+          <version>1.0.0</version>
+          <association>
+            <type>ProxiedRepositoryConfiguration</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>syncedRepositories</name>
+          <version>1.0.0</version>
+          <association>
+            <type>SyncedRepositoryConfiguration</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>localRepository</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>
+            The location of the local repository.
+          </description>
+        </field>
+        <field>
+          <name>indexPath</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>
+            The location of the Lucene index to use for the repository. The default is the .index subdirectory of
+            the repository.
+          </description>
+        </field>
+        <field>
+          <name>minimalIndexPath</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>
+            The location of the reduced Lucene index to use for the repository. The default is the .small-index
+            subdirectory of the repository.
+          </description>
+        </field>
+        <field>
+          <name>dataRefreshCronExpression</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>When to run the data refresh task. Default is every 30 mins (translated as every 0 and 30 minute reading of every hour)</description>
+          <defaultValue>0 0,30 * * * ?</defaultValue>
         </field>
         <!-- 
-        <field>\r
-          <name>globalBlackListPatterns</name>\r
-          <version>1.0.0</version>\r
-          <description>Blacklisted patterns in the discovery process</description>\r
-          <association>\r
-            <type>String</type>\r
-            <multiplicity>*</multiplicity>\r
-          </association>\r
-        </field>
-           -->\r
-        <field>\r
-          <name>proxy</name>\r
-          <version>1.0.0</version>\r
-          <association>\r
-            <type>Proxy</type>\r
-          </association>\r
-          <description>The network proxy to use for outgoing requests.</description>\r
-        </field>\r
-      </fields>\r
-      <codeSegments>\r
-        <codeSegment>\r
-          <version>1.0.0</version>\r
-          <code><![CDATA[\r
-    public Configuration()\r
-    {\r
-        localRepository = new java.io.File( System.getProperty( "user.home" ), ".m2/repository" ).getAbsolutePath();\r
-    }\r
-\r
-    public boolean isValid()\r
-    {\r
-        boolean valid = true;\r
-\r
-        if ( indexPath == null )\r
-        {\r
-            valid = false;\r
-        }\r
-        else if ( getRepositories().isEmpty() )\r
-        {\r
-            valid = false;\r
-        }\r
-        return valid;\r
-    }\r
-\r
-    /**\r
-     * Perform any Upgrades and Adjustments needed to bring configuration up to the\r
-     * current configuration format.\r
-     */\r
-    public void sanitize()\r
-    {\r
-        for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )\r
-        {\r
-            RepositoryConfiguration repo = (RepositoryConfiguration) i.next();\r
-\r
-            // Ensure that the repo.urlName is set.\r
-            if ( org.codehaus.plexus.util.StringUtils.isEmpty( repo.getUrlName() ) )\r
-            {\r
-                repo.setUrlName( repo.getId() );\r
-            }\r
-        }\r
-    }\r
-\r
-    public RepositoryConfiguration getRepositoryByUrlName( String urlName )\r
-    {\r
-        for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )\r
-        {\r
-            RepositoryConfiguration repository = (RepositoryConfiguration) i.next();\r
-            if ( urlName != null ? urlName.equals( repository.getUrlName() ) : repository.getUrlName() == null )\r
-            {\r
-                return repository;\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-    \r
-    public RepositoryConfiguration getRepositoryById( String id )\r
-    {\r
-        for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )\r
-        {\r
-            RepositoryConfiguration repository = (RepositoryConfiguration) i.next();\r
-            if ( id != null ? id.equals( repository.getId() ) : repository.getId() == null )\r
-            {\r
-                return repository;\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public SyncedRepositoryConfiguration getSyncedRepositoryById( String id )\r
-    {\r
-        for ( java.util.Iterator i = getSyncedRepositories().iterator(); i.hasNext(); )\r
-        {\r
-            SyncedRepositoryConfiguration repository = (SyncedRepositoryConfiguration) i.next();\r
-            if ( id != null ? id.equals( repository.getId() ) : repository.getId() == null )\r
-            {\r
-                return repository;\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public ProxiedRepositoryConfiguration getProxiedRepositoryById( String id )\r
-    {\r
-        for ( java.util.Iterator i = getProxiedRepositories().iterator(); i.hasNext(); )\r
-        {\r
-            ProxiedRepositoryConfiguration repository = (ProxiedRepositoryConfiguration) i.next();\r
-            if ( id != null ? id.equals( repository.getId() ) : repository.getId() == null )\r
-            {\r
-                return repository;\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-\r
-    private java.util.Map repositoriesMap;\r
-\r
-    public java.util.Map getRepositoriesMap()\r
-    {\r
-        if ( repositoriesMap == null )\r
-        {\r
-            repositoriesMap = new java.util.HashMap();\r
-            for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )\r
-            {\r
-                RepositoryConfiguration repository = (RepositoryConfiguration) i.next();\r
-                repositoriesMap.put( repository.getId(), repository );\r
-            }\r
-        }\r
-        return repositoriesMap;\r
-    }\r
-\r
-    private java.util.Map proxiedRepositoriesMap;\r
-\r
-    public java.util.Map getProxiedRepositoriesMap()\r
-    {\r
-        if ( proxiedRepositoriesMap == null )\r
-        {\r
-            proxiedRepositoriesMap = new java.util.HashMap();\r
-            for ( java.util.Iterator i = getProxiedRepositories().iterator(); i.hasNext(); )\r
-            {\r
-                ProxiedRepositoryConfiguration repository = (ProxiedRepositoryConfiguration) i.next();\r
-                proxiedRepositoriesMap.put( repository.getId(), repository );\r
-            }\r
-        }\r
-        return proxiedRepositoriesMap;\r
-    }\r
-\r
-    private java.util.Map syncedRepositoriesMap;\r
-\r
-    public java.util.Map getSyncedRepositoriesMap()\r
-    {\r
-        if ( syncedRepositoriesMap == null )\r
-        {\r
-            syncedRepositoriesMap = new java.util.HashMap();\r
-            for ( java.util.Iterator i = getSyncedRepositories().iterator(); i.hasNext(); )\r
-            {\r
-                SyncedRepositoryConfiguration repository = (SyncedRepositoryConfiguration) i.next();\r
-                syncedRepositoriesMap.put( repository.getId(), repository );\r
-            }\r
-        }\r
-        return syncedRepositoriesMap;\r
-    }\r
-          ]]></code>\r
-        </codeSegment>\r
-      </codeSegments>\r
-    </class>\r
-    <class>\r
-      <name>AbstractRepositoryConfiguration</name>\r
-      <abstract>true</abstract>\r
-      <version>1.0.0</version>\r
-      <fields>\r
-        <field>\r
-          <name>id</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <required>true</required>\r
-          <description>\r
-            The repository identifier.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>name</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <required>true</required>\r
-          <description>\r
-            The descriptive name of the repository.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>layout</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <required>true</required>\r
-          <description>\r
-            The layout of the repository. Valid values are "default" and "legacy".\r
-          </description>\r
-          <!-- TODO: should be able to detect this from the repository (perhaps by metadata at the root) -->\r
-          <defaultValue>default</defaultValue>\r
-        </field>\r
-      </fields>\r
-      <codeSegments>\r
-        <codeSegment>\r
-          <version>1.0.0</version>\r
-          <code><![CDATA[\r
-    public String toString()\r
-    {\r
-        return name + " (" + id + ")";\r
-    }\r
-          ]]></code>\r
-        </codeSegment>\r
-      </codeSegments>\r
-    </class>\r
-    <class>\r
-      <superClass>AbstractRepositoryConfiguration</superClass>\r
-      <name>RepositoryConfiguration</name>\r
-      <version>1.0.0</version>\r
-      <fields>\r
-        <field>\r
-          <name>urlName</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <required>true</required>\r
-          <description>\r
-            The URL name for this repository.\r
-            Used to create the WebDAV URL for the repository such like - http://hostname.com/repository/${urlName}/\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>directory</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <required>true</required>\r
-          <description>\r
-            The location of the repository to monitor.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>includeSnapshots</name>\r
-          <version>1.0.0</version>\r
-          <type>boolean</type>\r
-          <description>Whether to include snapshot versions in the discovery process</description>\r
-          <defaultValue>false</defaultValue>\r
-        </field>\r
-        <field>\r
-          <name>indexed</name>\r
-          <version>1.0.0</version>\r
-          <type>boolean</type>\r
-          <description>Whether to index the artifacts in this repository.</description>\r
-          <defaultValue>true</defaultValue>\r
-        </field>\r
-        <field>\r
-          <name>blackListPatterns</name>\r
-          <version>1.0.0</version>\r
-          <description>Blacklisted patterns in the discovery process</description>\r
-          <association>\r
-            <type>String</type>\r
-            <multiplicity>*</multiplicity>\r
-          </association>\r
-        </field>\r
-      </fields>\r
-    </class>\r
-    <class>\r
-      <superClass>AbstractRepositoryConfiguration</superClass>\r
-      <name>ProxiedRepositoryConfiguration</name>\r
-      <version>1.0.0</version>\r
-      <fields>\r
-        <field>\r
-          <name>url</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <required>true</required>\r
-          <description>\r
-            The URL of the remote repository to proxy.\r
-          </description>\r
-        </field>\r
-        <!-- TODO: would be much easier to have an association here, as long as it could be specified as a reference -->\r
-        <field>\r
-          <name>managedRepository</name>\r
-          <version>1.0.0</version>\r
-          <required>true</required>\r
-          <type>String</type>\r
-          <description>\r
-            The ID of the managed repository to use as the local storage for proxied artifacts.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>snapshotsPolicy</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <defaultValue>disabled</defaultValue>\r
-          <description>\r
-            The policy for snapshots: one of disabled, daily, hourly, interval, never\r
-            (allow snapshots, but never update once retrieved).\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>snapshotsInterval</name>\r
-          <version>1.0.0</version>\r
-          <type>int</type>\r
-          <description>\r
-            The interval in minutes before updating snapshots if the policy is set to 'interval'.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>releasesPolicy</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <defaultValue>daily</defaultValue>\r
-          <description>\r
-            The policy for releases: one of disabled, daily, hourly, interval, never\r
-            (allow releases, but never update once retrieved).\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>releasesInterval</name>\r
-          <version>1.0.0</version>\r
-          <type>int</type>\r
-          <description>\r
-            The interval in minutes before updating releases if the policy is set to 'interval'.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>useNetworkProxy</name>\r
-          <version>1.0.0</version>\r
-          <type>boolean</type>\r
-          <defaultValue>false</defaultValue>\r
-          <description>\r
-            Whether to use the network proxy, if one is configured for the protocol of this repository.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>cacheFailures</name>\r
-          <version>1.0.0</version>\r
-          <type>boolean</type>\r
-          <defaultValue>false</defaultValue>\r
-          <description>\r
-            Whether to cache failures to avoid re-attempting them over the network. The cache will last for the duration\r
-            of the intervals specified above depending on whether it a release or snapshot.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>hardFail</name>\r
-          <version>1.0.0</version>\r
-          <type>boolean</type>\r
-          <defaultValue>false</defaultValue>\r
-          <description>\r
-            Whether to cause the entire request to fail if attempts to retrieve from this proxy fail.\r
-          </description>\r
-        </field>\r
-      </fields>\r
-    </class>\r
-    <class>\r
-      <superClass>AbstractRepositoryConfiguration</superClass>\r
-      <name>SyncedRepositoryConfiguration</name>\r
-      <abstract>true</abstract>\r
-      <version>1.0.0</version>\r
-      <fields>\r
-        <!-- TODO: would be much easier to have an association here, as long as it could be specified as a reference -->\r
-        <field>\r
-          <name>managedRepository</name>\r
-          <version>1.0.0</version>\r
-          <required>true</required>\r
-          <type>String</type>\r
-          <description>\r
-            The ID of the managed repository to use as the local storage for proxied artifacts.\r
-          </description>\r
-        </field>\r
-        <field>\r
-          <name>cronExpression</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <description>When to run the sync mechanism. Default is every hour on the hour.</description>\r
-          <defaultValue>0 0 * * * ?</defaultValue>\r
-        </field>\r
-        <field>\r
-          <name>method</name>\r
-          <version>1.0.0</version>\r
-          <type>String</type>\r
-          <description>The type of synchronization to use.</description>\r
-          <defaultValue>rsync</defaultValue>\r
-        </field>\r
-        <field>\r
-          <name>properties</name>\r
-          <version>1.0.0</version>\r
-          <type>Properties</type>\r
-          <description>Configuration for the repository synchronization.</description>\r
-          <association xml.mapStyle="inline">\r
-            <type>String</type>\r
-            <multiplicity>*</multiplicity>\r
-          </association>\r
-        </field>\r
-      </fields>\r
-    </class>\r
-    <class>\r
-      <name>Proxy</name>\r
-      <version>1.0.0</version>\r
-      <fields>\r
-        <field>\r
-          <name>protocol</name>\r
-          <version>1.0.0</version>\r
-          <description><![CDATA[The proxy protocol.]]></description>\r
-          <type>String</type>\r
-          <defaultValue>http</defaultValue>\r
-        </field>\r
-        <field>\r
-          <name>username</name>\r
-          <version>1.0.0</version>\r
-          <description><![CDATA[The proxy user.]]></description>\r
-          <type>String</type>\r
-        </field>\r
-        <field>\r
-          <name>password</name>\r
-          <version>1.0.0</version>\r
-          <description><![CDATA[The proxy password.]]></description>\r
-          <type>String</type>\r
-        </field>\r
-        <field>\r
-          <name>port</name>\r
-          <version>1.0.0</version>\r
-          <description><![CDATA[The proxy port.]]></description>\r
-          <type>int</type>\r
-          <defaultValue>8080</defaultValue>\r
-        </field>\r
-        <field>\r
-          <name>host</name>\r
-          <version>1.0.0</version>\r
-          <description><![CDATA[The proxy host.]]></description>\r
-          <type>String</type>\r
-          <required>true</required>\r
-        </field>\r
-        <field>\r
-          <name>nonProxyHosts</name>\r
-          <version>1.0.0</version>\r
-          <description><![CDATA[\r
-                The list of non-proxied hosts (delimited by |).\r
-          ]]></description>\r
-          <type>String</type>\r
-        </field>\r
-      </fields>\r
-    </class>\r
-  </classes>\r
-</model>\r
-\r
-\r
+        <field>
+          <name>globalBlackListPatterns</name>
+          <version>1.0.0</version>
+          <description>Blacklisted patterns in the discovery process</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+           -->
+        <field>
+          <name>proxy</name>
+          <version>1.0.0</version>
+          <association>
+            <type>Proxy</type>
+          </association>
+          <description>The network proxy to use for outgoing requests.</description>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>1.0.0</version>
+          <code><![CDATA[
+    public Configuration()
+    {
+        localRepository = new java.io.File( System.getProperty( "user.home" ), ".m2/repository" ).getAbsolutePath();
+    }
+
+    public boolean isValid()
+    {
+        boolean valid = true;
+
+        if ( indexPath == null )
+        {
+            valid = false;
+        }
+        else if ( getRepositories().isEmpty() )
+        {
+            valid = false;
+        }
+        return valid;
+    }
+
+    /**
+     * Perform any Upgrades and Adjustments needed to bring configuration up to the
+     * current configuration format.
+     */
+    public void sanitize()
+    {
+        for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )
+        {
+            RepositoryConfiguration repo = (RepositoryConfiguration) i.next();
+
+            // Ensure that the repo.urlName is set.
+            if ( org.codehaus.plexus.util.StringUtils.isEmpty( repo.getUrlName() ) )
+            {
+                repo.setUrlName( repo.getId() );
+            }
+        }
+    }
+
+    public RepositoryConfiguration getRepositoryByUrlName( String urlName )
+    {
+        for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )
+        {
+            RepositoryConfiguration repository = (RepositoryConfiguration) i.next();
+            if ( urlName != null ? urlName.equals( repository.getUrlName() ) : repository.getUrlName() == null )
+            {
+                return repository;
+            }
+        }
+        return null;
+    }
+    
+    public RepositoryConfiguration getRepositoryById( String id )
+    {
+        for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )
+        {
+            RepositoryConfiguration repository = (RepositoryConfiguration) i.next();
+            if ( id != null ? id.equals( repository.getId() ) : repository.getId() == null )
+            {
+                return repository;
+            }
+        }
+        return null;
+    }
+
+    public SyncedRepositoryConfiguration getSyncedRepositoryById( String id )
+    {
+        for ( java.util.Iterator i = getSyncedRepositories().iterator(); i.hasNext(); )
+        {
+            SyncedRepositoryConfiguration repository = (SyncedRepositoryConfiguration) i.next();
+            if ( id != null ? id.equals( repository.getId() ) : repository.getId() == null )
+            {
+                return repository;
+            }
+        }
+        return null;
+    }
+
+    public ProxiedRepositoryConfiguration getProxiedRepositoryById( String id )
+    {
+        for ( java.util.Iterator i = getProxiedRepositories().iterator(); i.hasNext(); )
+        {
+            ProxiedRepositoryConfiguration repository = (ProxiedRepositoryConfiguration) i.next();
+            if ( id != null ? id.equals( repository.getId() ) : repository.getId() == null )
+            {
+                return repository;
+            }
+        }
+        return null;
+    }
+
+    private java.util.Map repositoriesMap;
+
+    public java.util.Map getRepositoriesMap()
+    {
+        if ( repositoriesMap == null )
+        {
+            repositoriesMap = new java.util.HashMap();
+            for ( java.util.Iterator i = getRepositories().iterator(); i.hasNext(); )
+            {
+                RepositoryConfiguration repository = (RepositoryConfiguration) i.next();
+                repositoriesMap.put( repository.getId(), repository );
+            }
+        }
+        return repositoriesMap;
+    }
+
+    private java.util.Map proxiedRepositoriesMap;
+
+    public java.util.Map getProxiedRepositoriesMap()
+    {
+        if ( proxiedRepositoriesMap == null )
+        {
+            proxiedRepositoriesMap = new java.util.HashMap();
+            for ( java.util.Iterator i = getProxiedRepositories().iterator(); i.hasNext(); )
+            {
+                ProxiedRepositoryConfiguration repository = (ProxiedRepositoryConfiguration) i.next();
+                proxiedRepositoriesMap.put( repository.getId(), repository );
+            }
+        }
+        return proxiedRepositoriesMap;
+    }
+
+    private java.util.Map syncedRepositoriesMap;
+
+    public java.util.Map getSyncedRepositoriesMap()
+    {
+        if ( syncedRepositoriesMap == null )
+        {
+            syncedRepositoriesMap = new java.util.HashMap();
+            for ( java.util.Iterator i = getSyncedRepositories().iterator(); i.hasNext(); )
+            {
+                SyncedRepositoryConfiguration repository = (SyncedRepositoryConfiguration) i.next();
+                syncedRepositoriesMap.put( repository.getId(), repository );
+            }
+        }
+        return syncedRepositoriesMap;
+    }
+          ]]></code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <name>AbstractRepositoryConfiguration</name>
+      <abstract>true</abstract>
+      <version>1.0.0</version>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <required>true</required>
+          <description>
+            The repository identifier.
+          </description>
+        </field>
+        <field>
+          <name>name</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <required>true</required>
+          <description>
+            The descriptive name of the repository.
+          </description>
+        </field>
+        <field>
+          <name>layout</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <required>true</required>
+          <description>
+            The layout of the repository. Valid values are "default" and "legacy".
+          </description>
+          <!-- TODO: should be able to detect this from the repository (perhaps by metadata at the root) -->
+          <defaultValue>default</defaultValue>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>1.0.0</version>
+          <code><![CDATA[
+    public String toString()
+    {
+        return name + " (" + id + ")";
+    }
+          ]]></code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <superClass>AbstractRepositoryConfiguration</superClass>
+      <name>RepositoryConfiguration</name>
+      <version>1.0.0</version>
+      <fields>
+        <field>
+          <name>urlName</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <required>true</required>
+          <description>
+            The URL name for this repository.
+            Used to create the WebDAV URL for the repository such like - http://hostname.com/repository/${urlName}/
+          </description>
+        </field>
+        <field>
+          <name>directory</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <required>true</required>
+          <description>
+            The location of the repository to monitor.
+          </description>
+        </field>
+        <field>
+          <name>includeSnapshots</name>
+          <version>1.0.0</version>
+          <type>boolean</type>
+          <description>Whether to include snapshot versions in the discovery process</description>
+          <defaultValue>false</defaultValue>
+        </field>
+        <field>
+          <name>indexed</name>
+          <version>1.0.0</version>
+          <type>boolean</type>
+          <description>Whether to index the artifacts in this repository.</description>
+          <defaultValue>true</defaultValue>
+        </field>
+        <field>
+          <name>blackListPatterns</name>
+          <version>1.0.0</version>
+          <description>Blacklisted patterns in the discovery process</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <superClass>AbstractRepositoryConfiguration</superClass>
+      <name>ProxiedRepositoryConfiguration</name>
+      <version>1.0.0</version>
+      <fields>
+        <field>
+          <name>url</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <required>true</required>
+          <description>
+            The URL of the remote repository to proxy.
+          </description>
+        </field>
+        <!-- TODO: would be much easier to have an association here, as long as it could be specified as a reference -->
+        <field>
+          <name>managedRepository</name>
+          <version>1.0.0</version>
+          <required>true</required>
+          <type>String</type>
+          <description>
+            The ID of the managed repository to use as the local storage for proxied artifacts.
+          </description>
+        </field>
+        <field>
+          <name>snapshotsPolicy</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <defaultValue>disabled</defaultValue>
+          <description>
+            The policy for snapshots: one of disabled, daily, hourly, interval, never
+            (allow snapshots, but never update once retrieved).
+          </description>
+        </field>
+        <field>
+          <name>snapshotsInterval</name>
+          <version>1.0.0</version>
+          <type>int</type>
+          <description>
+            The interval in minutes before updating snapshots if the policy is set to 'interval'.
+          </description>
+        </field>
+        <field>
+          <name>releasesPolicy</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <defaultValue>daily</defaultValue>
+          <description>
+            The policy for releases: one of disabled, daily, hourly, interval, never
+            (allow releases, but never update once retrieved).
+          </description>
+        </field>
+        <field>
+          <name>checksumPolicy</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <defaultValue>fail</defaultValue>
+          <description>
+            The policy for checksum: one of fail, warn, ignore.
+          </description>
+        </field>
+        <field>
+          <name>releasesInterval</name>
+          <version>1.0.0</version>
+          <type>int</type>
+          <description>
+            The interval in minutes before updating releases if the policy is set to 'interval'.
+          </description>
+        </field>
+        <field>
+          <name>useNetworkProxy</name>
+          <version>1.0.0</version>
+          <type>boolean</type>
+          <defaultValue>false</defaultValue>
+          <description>
+            Whether to use the network proxy, if one is configured for the protocol of this repository.
+          </description>
+        </field>
+        <field>
+          <name>cacheFailures</name>
+          <version>1.0.0</version>
+          <type>boolean</type>
+          <defaultValue>false</defaultValue>
+          <description>
+            Whether to cache failures to avoid re-attempting them over the network. The cache will last for the duration
+            of the intervals specified above depending on whether it a release or snapshot.
+          </description>
+        </field>
+        <field>
+          <name>hardFail</name>
+          <version>1.0.0</version>
+          <type>boolean</type>
+          <defaultValue>false</defaultValue>
+          <description>
+            Whether to cause the entire request to fail if attempts to retrieve from this proxy fail.
+          </description>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <superClass>AbstractRepositoryConfiguration</superClass>
+      <name>SyncedRepositoryConfiguration</name>
+      <abstract>true</abstract>
+      <version>1.0.0</version>
+      <fields>
+        <!-- TODO: would be much easier to have an association here, as long as it could be specified as a reference -->
+        <field>
+          <name>managedRepository</name>
+          <version>1.0.0</version>
+          <required>true</required>
+          <type>String</type>
+          <description>
+            The ID of the managed repository to use as the local storage for proxied artifacts.
+          </description>
+        </field>
+        <field>
+          <name>cronExpression</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>When to run the sync mechanism. Default is every hour on the hour.</description>
+          <defaultValue>0 0 * * * ?</defaultValue>
+        </field>
+        <field>
+          <name>method</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>The type of synchronization to use.</description>
+          <defaultValue>rsync</defaultValue>
+        </field>
+        <field>
+          <name>properties</name>
+          <version>1.0.0</version>
+          <type>Properties</type>
+          <description>Configuration for the repository synchronization.</description>
+          <association xml.mapStyle="inline">
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>Proxy</name>
+      <version>1.0.0</version>
+      <fields>
+        <field>
+          <name>protocol</name>
+          <version>1.0.0</version>
+          <description><![CDATA[The proxy protocol.]]></description>
+          <type>String</type>
+          <defaultValue>http</defaultValue>
+        </field>
+        <field>
+          <name>username</name>
+          <version>1.0.0</version>
+          <description><![CDATA[The proxy user.]]></description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>password</name>
+          <version>1.0.0</version>
+          <description><![CDATA[The proxy password.]]></description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>port</name>
+          <version>1.0.0</version>
+          <description><![CDATA[The proxy port.]]></description>
+          <type>int</type>
+          <defaultValue>8080</defaultValue>
+        </field>
+        <field>
+          <name>host</name>
+          <version>1.0.0</version>
+          <description><![CDATA[The proxy host.]]></description>
+          <type>String</type>
+          <required>true</required>
+        </field>
+        <field>
+          <name>nonProxyHosts</name>
+          <version>1.0.0</version>
+          <description><![CDATA[
+                The list of non-proxied hosts (delimited by |).
+          ]]></description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+  </classes>
+</model>
+
+
+
+
index 4c7e05e5ac298266be6b065dd8891e57f1b80fd6..ce44f9e4edb73e93d3f14ff504fd5b321512bdd4 100644 (file)
@@ -62,12 +62,12 @@ public class DefaultConfiguredRepositoryFactory
         String updatePolicy =
             getUpdatePolicy( configuration.getSnapshotsPolicy(), configuration.getSnapshotsInterval() );
         ArtifactRepositoryPolicy snapshotsPolicy =
-            new ArtifactRepositoryPolicy( enabled, updatePolicy, ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL );
+            new ArtifactRepositoryPolicy( enabled, updatePolicy, configuration.getChecksumPolicy() );
 
         enabled = isEnabled( configuration.getReleasesPolicy() );
         updatePolicy = getUpdatePolicy( configuration.getReleasesPolicy(), configuration.getReleasesInterval() );
         ArtifactRepositoryPolicy releasesPolicy =
-            new ArtifactRepositoryPolicy( enabled, updatePolicy, ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL );
+            new ArtifactRepositoryPolicy( enabled, updatePolicy, configuration.getChecksumPolicy() );
 
         ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) repositoryLayouts.get( configuration.getLayout() );
 
index a22fdb872c9b479a0dbb698c12d4da9eeaad9f0e..9ebb457af4b7e523a68a8bad84f2a8785443a23c 100644 (file)
@@ -545,7 +545,7 @@ public class DefaultProxyRequestHandler
 
                     if ( downloaded )
                     {
-                        success = checkChecksum( checksums, path, wagon, repositoryCachePath );
+                        success = checkChecksum( checksums, path, wagon, repositoryCachePath, policy );
 
                         if ( tries > 1 && !success )
                         {
@@ -671,11 +671,15 @@ public class DefaultProxyRequestHandler
         return connected;
     }
 
-    private boolean checkChecksum( Map checksumMap, String path, Wagon wagon, String repositoryCachePath )
+    private boolean checkChecksum( Map checksumMap, String path, Wagon wagon, String repositoryCachePath, ArtifactRepositoryPolicy policy )
         throws ProxyException
     {
         releaseChecksumListeners( wagon, checksumMap );
-
+        
+        // Ignore checksum errors. Returns always true.
+        if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( policy.getChecksumPolicy() ) )
+            return true;
+        
         boolean correctChecksum = false;
 
         boolean allNotFound = true;
@@ -713,7 +717,8 @@ public class DefaultProxyRequestHandler
                 else
                 {
                     getLogger().warn(
-                        "The checksum '" + actualChecksum + "' did not match the remote value: " + remoteChecksum );
+                                      "The checksum '" + actualChecksum + "' did not match the remote value: "
+                                          + remoteChecksum );
                 }
             }
             catch ( TransferFailedException e )
@@ -759,7 +764,15 @@ public class DefaultProxyRequestHandler
                 tempChecksumFile.delete();
             }
         }
-        return correctChecksum || allNotFound;
+        if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN.equals( policy.getChecksumPolicy() ) )
+        {
+            // We are only interested to the warnings. The result is always true.
+            return true;
+        }
+        else
+        {
+            return correctChecksum || allNotFound;
+        }
     }
 
     /**
index 0bd15b1d7948af2826a0bc14659b202a481be496..d9eee6e40674bea95a077e98ab58e75b3553e85e 100644 (file)
@@ -100,7 +100,8 @@ public class ProxyRequestHandlerTest
         requestHandler = (ProxyRequestHandler) lookup( ProxyRequestHandler.ROLE );
 
         factory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
-
+        factory.setGlobalChecksumPolicy( ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL );
+        
         File repoLocation = getTestFile( "target/test-repository/managed" );
         // faster only to delete this one before copying, the others are done case by case
         FileUtils.deleteDirectory( new File( repoLocation, "org/apache/maven/test/get-merged-metadata" ) );
index ba6a76452ecd3aba78d1f6747781301c8fa17326..da18fe3e1e3ef3fda832956af25345758593dbf7 100644 (file)
         'daily' : 'Enabled, updated daily',
         'hourly' : 'Enabled, updated hourly',
         'never' : 'Enabled, never updated',
-        'interval' : 'Enabled, updated on given interval'}"/>
-<ww:textfield label="Release update interval" name="releasesInterval" size="4"/>
-<ww:select list="configuration.repositoriesMap" name="managedRepository" label="Proxied through"/>
-<ww:checkbox name="useNetworkProxy" fieldValue="true" label="Use HTTP Proxy"/>
-<ww:checkbox name="cacheFailures" fieldValue="true" label="Cache Failures"/>
-<ww:checkbox name="hardFail" fieldValue="true" label="Fail Whole Group"/>
+        'interval' : 'Enabled, updated on given interval'}" />
+<ww:textfield label="Release update interval" name="releasesInterval" size="4" />
+<ww:select list="configuration.repositoriesMap" name="managedRepository" label="Proxied through" />
+<ww:radio list="#@java.util.LinkedHashMap@{'fail' : 'Failure', 'warn' : 'Warning', 'ignore' : 'Ignore'}" name="checksumPolicy" label="Checksum Policy"/>
+<ww:checkbox name="useNetworkProxy" fieldValue="true" label="Use HTTP Proxy" />
+<ww:checkbox name="cacheFailures" fieldValue="true" label="Cache Failures" />
+<ww:checkbox name="hardFail" fieldValue="true" label="Fail Whole Group" />
index de647987373d1ffa5823e298e1595255f034fdbf..751881bc8aa7160af4655a1eca1649c93b6c3570 100644 (file)
             (<code>${repositoriesMap[repository.managedRepository].id}</code>)
           </td>
         </tr>
+        <tr>
+          <th>Checksum policy</th>
+          <td>
+            <c:choose>
+              <c:when test="${repository.checksumPolicy == 'fail'}">Failure</c:when>
+              <c:when test="${repository.checksumPolicy == 'warn'}">Warning</c:when>
+              <c:otherwise>Ignore</c:otherwise>
+            </c:choose>
+          </td>
+        </tr>
         <tr>
           <th>Use HTTP Proxy</th>
           <td class="${repository.useNetworkProxy ? 'donemark' : 'errormark'} booleanIcon"></td>
 </div>
 
 </body>
-</html>
\ No newline at end of file
+</html>