This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git


The following commit(s) were added to refs/heads/master by this push:
     new bc6065c  Update of policies. Adding descriptions and using locale.
bc6065c is described below

commit bc6065c1411229ba124283efa7fd4fce31f144f4
Author: Martin Stockhammer <[email protected]>
AuthorDate: Wed Sep 4 23:16:25 2019 +0200

    Update of policies. Adding descriptions and using locale.
---
 .../apache/archiva/policies/AbstractPolicy.java    | 98 ++++++++++++++++++++++
 .../archiva/policies/AbstractUpdatePolicy.java     |  8 +-
 .../archiva/policies/CachedFailuresPolicy.java     | 11 +--
 .../apache/archiva/policies/ChecksumPolicy.java    | 13 ++-
 .../archiva/policies/DownloadErrorPolicy.java      |  2 +-
 .../java/org/apache/archiva/policies/Policy.java   | 44 +++++++++-
 .../policies/PropagateErrorsDownloadPolicy.java    | 13 +--
 .../PropagateErrorsOnUpdateDownloadPolicy.java     | 15 ++--
 .../apache/archiva/policies/ReleasesPolicy.java    |  9 +-
 .../apache/archiva/policies/SnapshotsPolicy.java   | 10 +--
 .../src/main/resources/archiva_policies.properties | 74 ++++++++++++++++
 .../main/resources/archiva_policies_de.properties  | 18 ++++
 .../main/resources/archiva_policies_en.properties  | 18 ++++
 .../main/resources/archiva_policies_fr.properties  | 18 ++++
 .../archiva/policies/CachedFailuresPolicyTest.java | 28 ++++++-
 .../archiva/policies/ChecksumPolicyTest.java       | 25 ++++++
 ...java => PropagateErrorsDownloadPolicyTest.java} | 75 +++++++++++------
 ...PropagateErrorsOnUpdateDownloadPolicyTest.java} | 68 +++++++++------
 .../apache/archiva/policies/ReleasePolicyTest.java | 32 +++++++
 .../archiva/policies/SnapshotsPolicyTest.java      | 29 +++++++
 20 files changed, 505 insertions(+), 103 deletions(-)

diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/AbstractPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/AbstractPolicy.java
new file mode 100644
index 0000000..2c61886
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/AbstractPolicy.java
@@ -0,0 +1,98 @@
+package org.apache.archiva.policies;
+
+/*
+ * 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.text.MessageFormat;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.stream.Collectors;
+
+/**
+ * Abstract policy class that handles the name and description loading with 
message bundles.
+ *
+ * The prefix for the keys is normally:
+ * <ul>
+ *     <li>Policies: POLICY-ID.policy.</li>
+ *     <li>Options: POLICY-ID.option.</li>
+ * </ul>
+ *
+ * This prefix can be changed by subclasses.
+ *
+ * For each policy and each option there must exist a name and description 
entry in the message bundle.
+ *
+ */
+public abstract class AbstractPolicy implements Policy {
+
+    private String policyPrefix;
+    private String optionPrefix;
+
+    public AbstractPolicy() {
+        policyPrefix = getId() + ".policy.";
+        optionPrefix = getId() + ".option.";
+    }
+
+    protected String getPolicyPrefix() {
+        return policyPrefix;
+    }
+
+    protected String getOptionPrefix() {
+        return optionPrefix;
+    }
+
+    protected void setPolicyPrefix(String policyPrefix) {
+        this.policyPrefix = policyPrefix;
+    }
+
+    public void setOptionPrefix(String optionPrefix) {
+        this.optionPrefix = optionPrefix;
+    }
+
+    private static final ResourceBundle getBundle(Locale locale) {
+        return ResourceBundle.getBundle(RESOURCE_BUNDLE, locale);
+    }
+
+
+    @Override
+    public String getName() {
+        return getName(Locale.getDefault());
+    }
+
+    @Override
+    public String getName(Locale locale) {
+        return getBundle(locale).getString(getPolicyPrefix() + "name");
+    }
+
+    @Override
+    public String getDescription(Locale locale) {
+        return 
MessageFormat.format(getBundle(locale).getString(getPolicyPrefix() + 
"description")
+                , getOptions().stream().collect(Collectors.joining(",")));
+    }
+
+    @Override
+    public String getOptionDescription(Locale locale, String option) {
+        return 
getBundle(locale).getString(getOptionPrefix()+option+".description");
+    }
+
+    @Override
+    public String getOptionName(Locale locale, String option) {
+        return getBundle(locale).getString(getOptionPrefix()+option+".name");
+    }
+
+}
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/AbstractUpdatePolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/AbstractUpdatePolicy.java
index cb42e56..ef2bc7b 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/AbstractUpdatePolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/AbstractUpdatePolicy.java
@@ -36,12 +36,12 @@ import java.util.Properties;
  *
  */
 public abstract class AbstractUpdatePolicy
-    implements PreDownloadPolicy
+    extends AbstractPolicy implements PreDownloadPolicy
 {
     private Logger log = LoggerFactory.getLogger( AbstractUpdatePolicy.class );
 
     /**
-     * The ALWAYS policy setting means that the artifact is always uipdated 
from the remote repo.
+     * The ALWAYS policy setting means that the artifact is always updated 
from the remote repo.
      */
     public static final String ALWAYS = "always";
 
@@ -76,7 +76,7 @@ public abstract class AbstractUpdatePolicy
 
     /**
      * The ONCE policy means that the artifact retrieval occurs only if the
-     * local artifact is not present.  This means that the retreival can only
+     * local artifact is not present.  This means that the retrieval can only
      * occur once.
      */
     public static final String ONCE = "once";
@@ -85,6 +85,8 @@ public abstract class AbstractUpdatePolicy
 
     public AbstractUpdatePolicy()
     {
+        super();
+        super.setOptionPrefix("update.option.");
         options.add( ALWAYS );
         options.add( HOURLY );
         options.add( DAILY );
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/CachedFailuresPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/CachedFailuresPolicy.java
index 0a15c4a..98176fb 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/CachedFailuresPolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/CachedFailuresPolicy.java
@@ -36,9 +36,10 @@ import java.util.Properties;
  */
 @Service( "preDownloadPolicy#cache-failures" )
 public class CachedFailuresPolicy
-    implements PreDownloadPolicy
+    extends AbstractPolicy implements PreDownloadPolicy
 {
     private Logger log = LoggerFactory.getLogger( CachedFailuresPolicy.class );
+    private static final String ID = "cache-failures";
 
     /**
      * The NO policy setting means that the the existence of old failures is 
<strong>not</strong> checked.
@@ -59,6 +60,7 @@ public class CachedFailuresPolicy
 
     public CachedFailuresPolicy()
     {
+        super();
         options.add( NO );
         options.add( YES );
     }
@@ -105,14 +107,9 @@ public class CachedFailuresPolicy
     @Override
     public String getId()
     {
-        return "cache-failures";
+        return ID;
     }
 
-    @Override
-    public String getName()
-    {
-        return "Cache failures";
-    }
 
     @Override
     public List<String> getOptions()
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ChecksumPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ChecksumPolicy.java
index 2a15811..940e54c 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ChecksumPolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ChecksumPolicy.java
@@ -44,10 +44,12 @@ import java.util.Properties;
  */
 @Service( "postDownloadPolicy#checksum" )
 public class ChecksumPolicy
-    implements PostDownloadPolicy
+    extends AbstractPolicy implements PostDownloadPolicy
 {
     private Logger log = LoggerFactory.getLogger( ChecksumPolicy.class );
 
+    private static final String ID = "checksum";
+
     /**
      * The IGNORE policy indicates that if the checksum policy is ignored, and
      * the state of, contents of, or validity of the checksum files are not
@@ -75,6 +77,7 @@ public class ChecksumPolicy
 
     public ChecksumPolicy()
     {
+        super();
         options.add( FAIL );
         options.add( FIX );
         options.add( IGNORE );
@@ -174,13 +177,7 @@ public class ChecksumPolicy
     @Override
     public String getId()
     {
-        return "checksum";
-    }
-
-    @Override
-    public String getName()
-    {
-        return "Checksum";
+        return ID;
     }
 
     @Override
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/DownloadErrorPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/DownloadErrorPolicy.java
index 43ae03e..63111a3 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/DownloadErrorPolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/DownloadErrorPolicy.java
@@ -41,7 +41,7 @@ public interface DownloadErrorPolicy
      * @param localFile
      * @param exception          the exception that triggered the error
      * @param previousExceptions any previously triggered exceptions
-     * @return whether to process the exception or not
+     * @return True, if the exception should be processed, False if the 
exception should be ignored.
      * @throws PolicyConfigurationException if the policy is improperly 
configured
      */
     boolean applyPolicy( String policySetting, Properties request, 
StorageAsset localFile, Exception exception,
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/Policy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/Policy.java
index cb96048..3b3d066 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/Policy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/Policy.java
@@ -20,9 +20,19 @@ package org.apache.archiva.policies;
  */
 
 import java.util.List;
+import java.util.Locale;
+import java.util.MissingResourceException;
 
+
+/**
+ * This is a generic interface for policies. Policies define different actions 
to apply to artifacts during the
+ * repository lifecycle, e.g. download, upload, errors.
+ */
 public interface Policy
 {
+
+    String RESOURCE_BUNDLE = "archiva_policies";
+
     /**
      * Get the list of options for this policy.
      *
@@ -47,9 +57,39 @@ public interface Policy
     /**
      * Get the display name for this policy.
      *
-     * TODO todo i18n
-     *
      * @return the name for this policy
      */
     String getName();
+
+    /**
+     * Get the policy name in the language of the given locale.
+     * @param locale The locale
+     * @return The policy name
+     */
+    String getName(Locale locale);
+
+    /**
+     * Return a description of the policy.
+     * @param locale The language
+     * @return The description
+     */
+    String getDescription(Locale locale);
+
+    /**
+     * Returns a description for the given option.
+     * @param locale The locale for the description.
+     * @param option The option to ask the description for.
+     * @return A description of the option in the requested language.
+     * @throws MissingResourceException if the option is not known by this 
policy.
+     */
+    String getOptionDescription(Locale locale, String option) throws 
MissingResourceException;
+
+    /**
+     * Returns a name for the given option.
+     * @param locale The locale for the name
+     * @param option  The option identifier
+     * @return  A name in the requested language.
+     * @throws MissingResourceException if the option is not known by this 
policy.
+     */
+    String getOptionName(Locale locale, String option) throws 
MissingResourceException;
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsDownloadPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsDownloadPolicy.java
index 3fdf475..a3ea381 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsDownloadPolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsDownloadPolicy.java
@@ -35,9 +35,10 @@ import java.util.Properties;
  */
 @Service( "downloadErrorPolicy#propagate-errors" )
 public class PropagateErrorsDownloadPolicy
-    implements DownloadErrorPolicy
+    extends AbstractPolicy implements DownloadErrorPolicy
 {
     private Logger log = LoggerFactory.getLogger( 
PropagateErrorsDownloadPolicy.class );
+    private static final String ID = "propagate-errors";
 
     /**
      * Signifies any error should stop searching for other proxies.
@@ -47,7 +48,7 @@ public class PropagateErrorsDownloadPolicy
     /**
      * Propagate errors at the end after all are gathered, if there was no 
successful download from other proxies.
      */
-    public static final String QUEUE = "queue error";
+    public static final String QUEUE = "queue-error";
 
     /**
      * Ignore errors and treat as if it were not found.
@@ -108,13 +109,7 @@ public class PropagateErrorsDownloadPolicy
     @Override
     public String getId()
     {
-        return "propagate-errors";
-    }
-
-    @Override
-    public String getName()
-    {
-        return "On remote error";
+        return ID ;
     }
 
     @Override
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsOnUpdateDownloadPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsOnUpdateDownloadPolicy.java
index 7f349d3..5799806 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsOnUpdateDownloadPolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/PropagateErrorsOnUpdateDownloadPolicy.java
@@ -33,8 +33,10 @@ import java.util.Properties;
  */
 @Service( "downloadErrorPolicy#propagate-errors-on-update" )
 public class PropagateErrorsOnUpdateDownloadPolicy
-    implements DownloadErrorPolicy
+    extends AbstractPolicy implements DownloadErrorPolicy
 {
+    private static final String ID = "propagate-errors-on-update";
+
     /**
      * Signifies any error should cause a failure whether the artifact is 
already present or not.
      */
@@ -43,9 +45,9 @@ public class PropagateErrorsOnUpdateDownloadPolicy
     /**
      * Signifies any error should cause a failure only if the artifact is not 
already present.
      */
-    public static final String NOT_PRESENT = "artifact not already present";
+    public static final String NOT_PRESENT = "artifact-not-present";
 
-    private List<String> options = new ArrayList<>( 2 );
+    private static final List<String> options = new ArrayList<>( 2 );
 
     public PropagateErrorsOnUpdateDownloadPolicy()
     {
@@ -91,14 +93,9 @@ public class PropagateErrorsOnUpdateDownloadPolicy
     @Override
     public String getId()
     {
-        return "propagate-errors-on-update";
+        return ID;
     }
 
-    @Override
-    public String getName()
-    {
-        return "Return error when";
-    }
 
     @Override
     public List<String> getOptions()
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ReleasesPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ReleasesPolicy.java
index e757918..bd863a5 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ReleasesPolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/ReleasesPolicy.java
@@ -32,6 +32,8 @@ public class ReleasesPolicy
     extends AbstractUpdatePolicy
     implements PreDownloadPolicy
 {
+
+    private static final String ID = "releases";
     /**
      * Defaults to {@link AbstractUpdatePolicy#HOURLY}
      */
@@ -56,12 +58,7 @@ public class ReleasesPolicy
     @Override
     public String getId()
     {
-        return "releases";
+        return ID;
     }
 
-    @Override
-    public String getName()
-    {
-        return "Releases";
-    }
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/SnapshotsPolicy.java
 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/SnapshotsPolicy.java
index 58f287c..2c37b80 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/SnapshotsPolicy.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/java/org/apache/archiva/policies/SnapshotsPolicy.java
@@ -32,6 +32,9 @@ public class SnapshotsPolicy
     extends AbstractUpdatePolicy
     implements PreDownloadPolicy
 {
+
+    private static final String ID = "snapshots";
+
     /**
      * Defaults to {@link AbstractUpdatePolicy#HOURLY}
      */
@@ -56,12 +59,7 @@ public class SnapshotsPolicy
     @Override
     public String getId()
     {
-        return "snapshots";
+        return ID;
     }
 
-    @Override
-    public String getName()
-    {
-        return "Snapshots";
-    }
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies.properties
 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies.properties
new file mode 100644
index 0000000..f654614
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies.properties
@@ -0,0 +1,74 @@
+#
+# 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.
+#
+
+releases.policy.name=Release Artifact Update Policy
+releases.policy.description=This policy tells, when a release artifact will be 
updated. This policy is applied before the artifact is downloaded.\
+  It allows to set the following options: {0}.
+snapshots.policy.name=Snapshot Artifact Update Policy
+snapshots.policy.description=This policy tells, when a snapshot artifact will 
be updated. This policy is applied before the artifact is downloaded. \
+  It allows to set the following options: {0}.
+update.option.always.description=Updates the artifact on each download from 
the remote repository.
+update.option.always.name=Update always
+update.option.never.description=Update the artifact never from the remote 
repository.
+update.option.never.name=Do not download from remote
+update.option.daily.description=Downloads the artifact if it does not exist 
locally, or if the local modification timestamp is older than one day.
+update.option.daily.name=Update, if older than a day
+update.option.hourly.description=Downloads the artifact if it does not exist 
locally, or if the local modification timestamp is older than one hour.
+update.option.hourly.name=Update, if older than a hour
+update.option.once.description=Downloads the artifact only, if it does not 
exist locally.
+update.option.once.name=Download only once
+
+cache-failures.policy.name=Cache Failures Policy
+cache-failures.policy.description=This policies decides, if download failures 
will be cached. The policy is applied before the artifact is downloaded. \
+  The option 'yes' enables the cache.
+cache-failures.option.yes.description=Download failures are cached and 
download is not attempted, if it failed before.
+cache-failures.option.yes.name=Yes
+cache-failures.option.no.description=Download failures are not cached. It will 
try the download again, if the file is requested.
+cache-failures.option.no.name=No
+
+checksum.policy.name=Checksum Policy
+checksum.policy.description=This policy tells, what happens if the downloaded 
checksum of a artifact does not match. \
+  The policy is applied after downloading the artifact. The following options 
can be set: {0}.
+checksum.option.fail.description=The download fails and the artifact is 
removed locally.
+checksum.option.fail.name=Fail, if no match
+checksum.option.fix.description=The artifact will remain and the checksum will 
be generated locally.
+checksum.option.fix.name=Fix, if no match
+checksum.option.ignore.description=The error will be ignored.
+checksum.option.ignore.name=Ignore, if no match
+
+propagate-errors.policy.name=Propagate Download Errors Policy
+propagate-errors.policy.description=This policy tells, what happens, if an 
error occurs during download of the artifact.
+propagate-errors.option.stop.name=Stop on error
+propagate-errors.option.stop.description=Stops the artifact download. Further 
remote repositories will not be checked. 
+propagate-errors.option.queue-error.name=Continue on error
+propagate-errors.option.queue-error.description=Checks further remote 
repositories for the artifact. If all downloads fail, the error is propagated.
+propagate-errors.option.ignore.name=Ignore errors
+propagate-errors.option.ignore.description=Treat the error as 'not found'. 
Check following repositories if defined.
+
+propagate-errors-on-update.policy.name=Propagate Errors on Update Policy
+propagate-errors-on-update.policy.description=This policy tells what happens, 
if an error occurs during download of an artifact that exists already locally.
+propagate-errors-on-update.option.always.name=Propagate always
+propagate-errors-on-update.option.always.description=Propagates the error, 
even if the file exists already locally.
+propagate-errors-on-update.option.not-present.name=Propagate only, if not 
exists
+propagate-errors-on-update.option.not-present.description=Propagates the error 
only, if the file does not exist already locally.
+
+
+
+
+
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_de.properties
 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_de.properties
new file mode 100644
index 0000000..30097ef
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_de.properties
@@ -0,0 +1,18 @@
+#
+# 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.
+#
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_en.properties
 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_en.properties
new file mode 100644
index 0000000..30097ef
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_en.properties
@@ -0,0 +1,18 @@
+#
+# 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.
+#
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_fr.properties
 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_fr.properties
new file mode 100644
index 0000000..30097ef
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/main/resources/archiva_policies_fr.properties
@@ -0,0 +1,18 @@
+#
+# 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.
+#
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
index d9919a5..f103f94 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
@@ -33,6 +33,8 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import java.io.IOException;
 import java.nio.file.Paths;
+import java.util.Locale;
+import java.util.MissingResourceException;
 import java.util.Properties;
 
 /**
@@ -103,7 +105,12 @@ public class CachedFailuresPolicyTest
         request.setProperty( "url", url );
 
         // should not fail
-        policy.applyPolicy( CachedFailuresPolicy.YES, request, localFile );
+        try {
+            policy.applyPolicy(CachedFailuresPolicy.YES, request, localFile);
+        } catch (PolicyViolationException e) {
+            // Converting to runtime exception, because it should be thrown 
later
+            throw new RuntimeException(e);
+        }
         // status Yes Not In cache
 
         // Yes in Cache
@@ -114,4 +121,23 @@ public class CachedFailuresPolicyTest
 
         policy.applyPolicy( CachedFailuresPolicy.YES, request, localFile );    
   
     }
+
+    @Test
+    public void testNamesAndDescriptions() throws Exception {
+        DownloadPolicy policy = lookupPolicy();
+        assertEquals("Cache Failures Policy", policy.getName());
+        assertTrue(policy.getDescription(Locale.US).contains("if download 
failures will be cached"));
+        assertEquals("Yes", policy.getOptionName(Locale.US, "yes"));
+        assertEquals("No", policy.getOptionName(Locale.US, "no"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"yes").contains("failures are cached and download is not attempted"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"no").contains("failures are not cached"));
+        try {
+            policy.getOptionName(Locale.US, "xxxx");
+            // Exception should be thrown
+            assertTrue(false);
+        } catch (MissingResourceException e) {
+            //
+        }
+
+    }
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ChecksumPolicyTest.java
 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ChecksumPolicyTest.java
index d4ebf9f..e136645 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ChecksumPolicyTest.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ChecksumPolicyTest.java
@@ -38,6 +38,8 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Locale;
+import java.util.MissingResourceException;
 import java.util.Properties;
 
 import static org.junit.Assert.*;
@@ -379,4 +381,27 @@ public class ChecksumPolicyTest
         return filesystemStorage.getAsset( path );
     }
 
+
+    @Test
+    public void testNamesAndDescriptions() throws Exception {
+
+        PostDownloadPolicy policy = lookupPolicy();
+        assertEquals("Checksum Policy", policy.getName());
+        assertTrue(policy.getDescription(Locale.US).contains("if the 
downloaded checksum of a artifact does not match"));
+        assertEquals("Fail, if no match", policy.getOptionName(Locale.US, 
"fail"));
+        assertEquals("Fix, if no match", policy.getOptionName(Locale.US, 
"fix"));
+        assertEquals("Ignore, if no match", policy.getOptionName(Locale.US, 
"ignore"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"fail").contains("download fails"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"fix").contains("artifact will remain"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"ignore").contains("error will be ignored"));
+        try {
+            policy.getOptionName(Locale.US, "xxxx");
+            // Exception should be thrown
+            assertTrue(false);
+        } catch (MissingResourceException e) {
+            //
+        }
+
+    }
+
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/PropagateErrorsDownloadPolicyTest.java
similarity index 51%
copy from 
archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
copy to 
archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/PropagateErrorsDownloadPolicyTest.java
index d9919a5..c169361 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/PropagateErrorsDownloadPolicyTest.java
@@ -33,7 +33,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import java.io.IOException;
 import java.nio.file.Paths;
-import java.util.Properties;
+import java.util.*;
 
 /**
  * CachedFailuresPolicyTest
@@ -42,7 +42,7 @@ import java.util.Properties;
  */
 @RunWith( ArchivaSpringJUnit4ClassRunner.class )
 @ContextConfiguration( locations = { 
"classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
-public class CachedFailuresPolicyTest
+public class PropagateErrorsDownloadPolicyTest
     extends TestCase
 {
 
@@ -53,10 +53,10 @@ public class CachedFailuresPolicyTest
     private FilesystemStorage filesystemStorage;
 
     @Inject
-    @Named( value = "preDownloadPolicy#cache-failures" )
-    DownloadPolicy downloadPolicy;
+    @Named( value = "downloadErrorPolicy#propagate-errors" )
+    DownloadErrorPolicy downloadPolicy;
 
-    private DownloadPolicy lookupPolicy()
+    private DownloadErrorPolicy lookupPolicy()
         throws Exception
     {
         return downloadPolicy;
@@ -77,41 +77,66 @@ public class CachedFailuresPolicyTest
     }
 
     @Test
-    public void testPolicyNo()
+    public void testPolicyStop()
         throws Exception
     {
-        DownloadPolicy policy = lookupPolicy();
+        DownloadErrorPolicy policy = lookupPolicy();
         StorageAsset localFile = getFile();
         Properties request = createRequest();
 
-        request.setProperty( "url", 
"http://a.bad.hostname.maven.org/path/to/resource.txt"; );
+        Exception ex = new RuntimeException();
+        Map<String, Exception> exMap = new HashMap<>();
 
-        policy.applyPolicy( CachedFailuresPolicy.NO, request, localFile );
+        assertTrue(policy.applyPolicy( PropagateErrorsDownloadPolicy.STOP, 
request, localFile, ex, exMap ));
     }
 
-    @Test( expected = PolicyViolationException.class )
-    public void testPolicyYes()
-        throws Exception
+    @Test
+    public void testPolicyQueue()
+            throws Exception
     {
+        DownloadErrorPolicy policy = lookupPolicy();
+        StorageAsset localFile = getFile();
+        Properties request = createRequest();
+
+        Exception ex = new RuntimeException();
+        Map<String, Exception> exMap = new HashMap<>();
+
+        assertTrue(policy.applyPolicy( PropagateErrorsDownloadPolicy.QUEUE, 
request, localFile, ex, exMap ));
+    }
 
-        DownloadPolicy policy = lookupPolicy();
+    @Test
+    public void testPolicyIgnore()
+            throws Exception
+    {
+        DownloadErrorPolicy policy = lookupPolicy();
         StorageAsset localFile = getFile();
         Properties request = createRequest();
-        // make unique name
-        String url = "http://a.bad.hostname.maven.org/path/to/resource"+ 
System.currentTimeMillis() +".txt";
-        
-        request.setProperty( "url", url );
 
-        // should not fail
-        policy.applyPolicy( CachedFailuresPolicy.YES, request, localFile );
-        // status Yes Not In cache
+        Exception ex = new RuntimeException();
+        Map<String, Exception> exMap = new HashMap<>();
 
-        // Yes in Cache
-        
-        urlFailureCache.cacheFailure( url );
+        assertFalse(policy.applyPolicy( PropagateErrorsDownloadPolicy.IGNORE, 
request, localFile, ex, exMap ));
+    }
 
-        request.setProperty( "url", url );
+    @Test
+    public void testNamesAndDescriptions() throws Exception {
+
+        DownloadErrorPolicy policy = lookupPolicy();
+        assertEquals("Propagate Download Errors Policy", policy.getName());
+        assertTrue(policy.getDescription(Locale.US).contains("error occurs 
during download"));
+        assertEquals("Stop on error", policy.getOptionName(Locale.US, "stop"));
+        assertEquals("Continue on error", policy.getOptionName(Locale.US, 
"queue-error"));
+        assertEquals("Ignore errors", policy.getOptionName(Locale.US, 
"ignore"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"stop").contains("Stops the artifact download"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"queue-error").contains("Checks further"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"ignore").contains("not found"));
+        try {
+            policy.getOptionName(Locale.US, "xxxx");
+            // Exception should be thrown
+            assertTrue(false);
+        } catch (MissingResourceException e) {
+            //
+        }
 
-        policy.applyPolicy( CachedFailuresPolicy.YES, request, localFile );    
   
     }
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/PropagateErrorsOnUpdateDownloadPolicyTest.java
similarity index 54%
copy from 
archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
copy to 
archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/PropagateErrorsOnUpdateDownloadPolicyTest.java
index d9919a5..303e7a0 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/CachedFailuresPolicyTest.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/PropagateErrorsOnUpdateDownloadPolicyTest.java
@@ -33,7 +33,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import java.io.IOException;
 import java.nio.file.Paths;
-import java.util.Properties;
+import java.util.*;
 
 /**
  * CachedFailuresPolicyTest
@@ -42,7 +42,7 @@ import java.util.Properties;
  */
 @RunWith( ArchivaSpringJUnit4ClassRunner.class )
 @ContextConfiguration( locations = { 
"classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
-public class CachedFailuresPolicyTest
+public class PropagateErrorsOnUpdateDownloadPolicyTest
     extends TestCase
 {
 
@@ -53,10 +53,10 @@ public class CachedFailuresPolicyTest
     private FilesystemStorage filesystemStorage;
 
     @Inject
-    @Named( value = "preDownloadPolicy#cache-failures" )
-    DownloadPolicy downloadPolicy;
+    @Named( value = "downloadErrorPolicy#propagate-errors-on-update" )
+    DownloadErrorPolicy downloadPolicy;
 
-    private DownloadPolicy lookupPolicy()
+    private DownloadErrorPolicy lookupPolicy()
         throws Exception
     {
         return downloadPolicy;
@@ -77,41 +77,57 @@ public class CachedFailuresPolicyTest
     }
 
     @Test
-    public void testPolicyNo()
+    public void testPolicyStop()
         throws Exception
     {
-        DownloadPolicy policy = lookupPolicy();
+        DownloadErrorPolicy policy = lookupPolicy();
         StorageAsset localFile = getFile();
         Properties request = createRequest();
 
-        request.setProperty( "url", 
"http://a.bad.hostname.maven.org/path/to/resource.txt"; );
+        Exception ex = new RuntimeException();
+        Map<String, Exception> exMap = new HashMap<>();
 
-        policy.applyPolicy( CachedFailuresPolicy.NO, request, localFile );
+        assertTrue(policy.applyPolicy( 
PropagateErrorsOnUpdateDownloadPolicy.ALWAYS, request, localFile, ex, exMap ));
     }
 
-    @Test( expected = PolicyViolationException.class )
-    public void testPolicyYes()
-        throws Exception
+    @Test
+    public void testPolicyQueue()
+            throws Exception
     {
-
-        DownloadPolicy policy = lookupPolicy();
+        DownloadErrorPolicy policy = lookupPolicy();
         StorageAsset localFile = getFile();
         Properties request = createRequest();
-        // make unique name
-        String url = "http://a.bad.hostname.maven.org/path/to/resource"+ 
System.currentTimeMillis() +".txt";
-        
-        request.setProperty( "url", url );
 
-        // should not fail
-        policy.applyPolicy( CachedFailuresPolicy.YES, request, localFile );
-        // status Yes Not In cache
+        Exception ex = new RuntimeException();
+        Map<String, Exception> exMap = new HashMap<>();
 
-        // Yes in Cache
-        
-        urlFailureCache.cacheFailure( url );
+        if (localFile.exists()) {
+            localFile.getStorage().removeAsset(localFile);
+        }
+        assertTrue(policy.applyPolicy( 
PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT, request, localFile, ex, 
exMap ));
 
-        request.setProperty( "url", url );
+        localFile.create();
+        assertFalse(policy.applyPolicy( 
PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT, request, localFile, ex, 
exMap ));
+    }
+
+
+    @Test
+    public void testNamesAndDescriptions() throws Exception {
+
+        DownloadErrorPolicy policy = lookupPolicy();
+        assertEquals("Propagate Errors on Update Policy", policy.getName());
+        assertTrue(policy.getDescription(Locale.US).contains("during download 
of an artifact that exists already"));
+        assertEquals("Propagate always", policy.getOptionName(Locale.US, 
"always"));
+        assertEquals("Propagate only, if not exists", 
policy.getOptionName(Locale.US, "not-present"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"always").contains("even if the file exists"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"not-present").contains("if the file does not exist"));
+        try {
+            policy.getOptionName(Locale.US, "xxxx");
+            // Exception should be thrown
+            assertTrue(false);
+        } catch (MissingResourceException e) {
+            //
+        }
 
-        policy.applyPolicy( CachedFailuresPolicy.YES, request, localFile );    
   
     }
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ReleasePolicyTest.java
 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ReleasePolicyTest.java
index 3c5bae0..92d2ece 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ReleasePolicyTest.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/ReleasePolicyTest.java
@@ -33,8 +33,13 @@ import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.attribute.FileTime;
+import java.util.Locale;
+import java.util.MissingResourceException;
 import java.util.Properties;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 /**
  * ReleasePolicyTest
  *
@@ -381,4 +386,31 @@ public class ReleasePolicyTest
         // reset delta to 0.
         generatedLocalFileUpdateDelta = 0;
     }
+
+
+    @Test
+    public void testNamesAndDescriptions() throws Exception {
+
+        PreDownloadPolicy policy = lookupPolicy();
+        assertEquals("Release Artifact Update Policy", policy.getName());
+        assertTrue(policy.getDescription(Locale.US).contains("when a release 
artifact will be updated"));
+        assertEquals("Update always", policy.getOptionName(Locale.US, 
"always"));
+        assertEquals("Do not download from remote", 
policy.getOptionName(Locale.US, "never"));
+        assertEquals("Update, if older than a day", 
policy.getOptionName(Locale.US, "daily"));
+        assertEquals("Update, if older than a hour", 
policy.getOptionName(Locale.US, "hourly"));
+        assertEquals("Download only once", policy.getOptionName(Locale.US, 
"once"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"always").contains("each download"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"never").contains("never from the remote"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"daily").contains("older than one day"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"hourly").contains("older than one hour"));
+        assertTrue(policy.getOptionDescription(Locale.US, "once").contains("if 
it does not exist"));
+        try {
+            policy.getOptionName(Locale.US, "xxxx");
+            // Exception should be thrown
+            assertTrue(false);
+        } catch (MissingResourceException e) {
+            //
+        }
+
+    }
 }
diff --git 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/SnapshotsPolicyTest.java
 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/SnapshotsPolicyTest.java
index a68ae8d..39a8afe 100644
--- 
a/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/SnapshotsPolicyTest.java
+++ 
b/archiva-modules/archiva-base/archiva-policies/src/test/java/org/apache/archiva/policies/SnapshotsPolicyTest.java
@@ -34,6 +34,8 @@ import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.attribute.FileTime;
+import java.util.Locale;
+import java.util.MissingResourceException;
 import java.util.Properties;
 
 /**
@@ -383,4 +385,31 @@ public class SnapshotsPolicyTest
         // reset delta to 0.
         generatedLocalFileUpdateDelta = 0;
     }
+
+
+    @Test
+    public void testNamesAndDescriptions() throws Exception {
+
+        PreDownloadPolicy policy = lookupPolicy();
+        assertEquals("Snapshot Artifact Update Policy", policy.getName());
+        assertTrue(policy.getDescription(Locale.US).contains("when a snapshot 
artifact will be updated"));
+        assertEquals("Update always", policy.getOptionName(Locale.US, 
"always"));
+        assertEquals("Do not download from remote", 
policy.getOptionName(Locale.US, "never"));
+        assertEquals("Update, if older than a day", 
policy.getOptionName(Locale.US, "daily"));
+        assertEquals("Update, if older than a hour", 
policy.getOptionName(Locale.US, "hourly"));
+        assertEquals("Download only once", policy.getOptionName(Locale.US, 
"once"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"always").contains("each download"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"never").contains("never from the remote"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"daily").contains("older than one day"));
+        assertTrue(policy.getOptionDescription(Locale.US, 
"hourly").contains("older than one hour"));
+        assertTrue(policy.getOptionDescription(Locale.US, "once").contains("if 
it does not exist"));
+        try {
+            policy.getOptionName(Locale.US, "xxxx");
+            // Exception should be thrown
+            assertTrue(false);
+        } catch (MissingResourceException e) {
+            //
+        }
+
+    }
 }

Reply via email to