001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.eclipse.aether.repository;
020
021/**
022 * A policy controlling access to a repository.
023 */
024public final class RepositoryPolicy {
025
026    /**
027     * Never update locally cached data.
028     */
029    public static final String UPDATE_POLICY_NEVER = "never";
030
031    /**
032     * Always update locally cached data.
033     */
034    public static final String UPDATE_POLICY_ALWAYS = "always";
035
036    /**
037     * Update locally cached data once a day.
038     */
039    public static final String UPDATE_POLICY_DAILY = "daily";
040
041    /**
042     * Update locally cached data every X minutes as given by "interval:X".
043     */
044    public static final String UPDATE_POLICY_INTERVAL = "interval";
045
046    /**
047     * Enforce presence of checksums and fail the resolution if they do not match or are absent.
048     */
049    public static final String CHECKSUM_POLICY_FAIL = "fail";
050
051    /**
052     * Expect presence of checksums and warn if they do not match or are absent.
053     */
054    public static final String CHECKSUM_POLICY_WARN = "warn";
055
056    /**
057     * Ignore presence and verification of checksums.
058     */
059    public static final String CHECKSUM_POLICY_IGNORE = "ignore";
060
061    private final boolean enabled;
062
063    private final String artifactUpdatePolicy;
064
065    private final String metadataUpdatePolicy;
066
067    private final String checksumPolicy;
068
069    /**
070     * Creates a new policy with checksum warnings and daily update checks.
071     */
072    public RepositoryPolicy() {
073        this(true, UPDATE_POLICY_DAILY, UPDATE_POLICY_DAILY, CHECKSUM_POLICY_WARN);
074    }
075
076    /**
077     * Creates a new policy with the specified settings (uses same update policy for data and metadata, retains old
078     * resolver behaviour).
079     *
080     * @param enabled A flag whether the associated repository should be accessed or not.
081     * @param updatePolicy The update interval after which locally cached data from the repository is considered
082     *            stale and should be re-fetched, may be {@code null}.
083     * @param checksumPolicy The way checksum verification should be handled, may be {@code null}.
084     */
085    public RepositoryPolicy(boolean enabled, String updatePolicy, String checksumPolicy) {
086        this(enabled, updatePolicy, updatePolicy, checksumPolicy);
087    }
088
089    /**
090     * Creates a new policy with the specified settings.
091     *
092     * @param enabled A flag whether the associated repository should be accessed or not.
093     * @param artifactUpdatePolicy The update interval after which locally cached data from the repository is considered stale
094     *            and should be re-fetched, may be {@code null}.
095     * @param metadataUpdatePolicy The update interval after which locally cached metadata from the repository is considered stale
096     *            and should be re-fetched, may be {@code null}.
097     * @param checksumPolicy The way checksum verification should be handled, may be {@code null}.
098     * @since 2.0.0
099     */
100    public RepositoryPolicy(
101            boolean enabled, String artifactUpdatePolicy, String metadataUpdatePolicy, String checksumPolicy) {
102        this.enabled = enabled;
103        this.artifactUpdatePolicy = (artifactUpdatePolicy != null) ? artifactUpdatePolicy : "";
104        this.metadataUpdatePolicy = (metadataUpdatePolicy != null) ? metadataUpdatePolicy : "";
105        this.checksumPolicy = (checksumPolicy != null) ? checksumPolicy : "";
106    }
107
108    /**
109     * Indicates whether the associated repository should be contacted or not.
110     *
111     * @return {@code true} if the repository should be contacted, {@code false} otherwise.
112     */
113    public boolean isEnabled() {
114        return enabled;
115    }
116
117    /**
118     * This method is not used in Resolver, as resolver internally strictly distinguishes between artifact and metadata
119     * update policies.
120     *
121     * @see #getArtifactUpdatePolicy()
122     * @see #getMetadataUpdatePolicy()
123     * @return The update policy for locally cached artifacts, never {@code null}.
124     * @deprecated This method should not be used. Since version 2 Resolver internally distinguishes between artifact
125     * update policy and metadata update policy. This method was left only to preserve binary compatibility, and in
126     * reality invokes {@link #getArtifactUpdatePolicy()}.
127     */
128    @Deprecated
129    public String getUpdatePolicy() {
130        return getArtifactUpdatePolicy();
131    }
132
133    /**
134     * Gets the update policy for locally cached artifacts from the repository.
135     *
136     * @return The update policy, never {@code null}.
137     * @since 2.0.0
138     */
139    public String getArtifactUpdatePolicy() {
140        return artifactUpdatePolicy;
141    }
142
143    /**
144     * Gets the update policy for locally cached metadata from the repository.
145     *
146     * @return The update policy, never {@code null}.
147     * @since 2.0.0
148     */
149    public String getMetadataUpdatePolicy() {
150        return metadataUpdatePolicy;
151    }
152
153    /**
154     * Gets the policy for checksum validation.
155     *
156     * @return The checksum policy, never {@code null}.
157     */
158    public String getChecksumPolicy() {
159        return checksumPolicy;
160    }
161
162    @Override
163    public String toString() {
164        return "enabled=" + isEnabled()
165                + ", checksums=" + getChecksumPolicy()
166                + ", artifactUpdates=" + getArtifactUpdatePolicy()
167                + ", metadataUpdates=" + getMetadataUpdatePolicy();
168    }
169
170    @Override
171    public boolean equals(Object obj) {
172        if (this == obj) {
173            return true;
174        }
175
176        if (obj == null || !getClass().equals(obj.getClass())) {
177            return false;
178        }
179
180        RepositoryPolicy that = (RepositoryPolicy) obj;
181
182        return enabled == that.enabled
183                && artifactUpdatePolicy.equals(that.artifactUpdatePolicy)
184                && metadataUpdatePolicy.equals(that.metadataUpdatePolicy)
185                && checksumPolicy.equals(that.checksumPolicy);
186    }
187
188    @Override
189    public int hashCode() {
190        int hash = 17;
191        hash = hash * 31 + (enabled ? 1 : 0);
192        hash = hash * 31 + artifactUpdatePolicy.hashCode();
193        hash = hash * 31 + metadataUpdatePolicy.hashCode();
194        hash = hash * 31 + checksumPolicy.hashCode();
195        return hash;
196    }
197}