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     * Verify checksums and fail the resolution if they do not match.
048     */
049    public static final String CHECKSUM_POLICY_FAIL = "fail";
050
051    /**
052     * Verify checksums and warn if they do not match.
053     */
054    public static final String CHECKSUM_POLICY_WARN = "warn";
055
056    /**
057     * Do not verify 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    public RepositoryPolicy(boolean enabled, String updatePolicy, String checksumPolicy) {
081        this(enabled, updatePolicy, updatePolicy, checksumPolicy);
082    }
083
084    /**
085     * Creates a new policy with the specified settings.
086     *
087     * @param enabled A flag whether the associated repository should be accessed or not.
088     * @param artifactUpdatePolicy The update interval after which locally cached data from the repository is considered stale
089     *            and should be re-fetched, may be {@code null}.
090     * @param metadataUpdatePolicy The update interval after which locally cached metadata from the repository is considered stale
091     *            and should be re-fetched, may be {@code null}.
092     * @param checksumPolicy The way checksum verification should be handled, may be {@code null}.
093     * @since TBD
094     */
095    public RepositoryPolicy(
096            boolean enabled, String artifactUpdatePolicy, String metadataUpdatePolicy, String checksumPolicy) {
097        this.enabled = enabled;
098        this.artifactUpdatePolicy = (artifactUpdatePolicy != null) ? artifactUpdatePolicy : "";
099        this.metadataUpdatePolicy = (metadataUpdatePolicy != null) ? metadataUpdatePolicy : "";
100        this.checksumPolicy = (checksumPolicy != null) ? checksumPolicy : "";
101    }
102
103    /**
104     * Indicates whether the associated repository should be contacted or not.
105     *
106     * @return {@code true} if the repository should be contacted, {@code false} otherwise.
107     */
108    public boolean isEnabled() {
109        return enabled;
110    }
111
112    /**
113     * This method is not used in Resolver, as resolver internally strictly distinguishes between artifact and metadata
114     * update policies.
115     *
116     * @see #getArtifactUpdatePolicy()
117     * @see #getMetadataUpdatePolicy()
118     * @deprecated This method should not be used. Since version 2 Resolver internally distinguishes between artifact
119     * update policy and metadata update policy. This method was left only to preserve binary compatibility, and in
120     * reality invokes {@link #getArtifactUpdatePolicy()}.
121     */
122    @Deprecated
123    public String getUpdatePolicy() {
124        return getArtifactUpdatePolicy();
125    }
126
127    /**
128     * Gets the update policy for locally cached artifacts from the repository.
129     *
130     * @return The update policy, never {@code null}.
131     * @since TBD
132     */
133    public String getArtifactUpdatePolicy() {
134        return artifactUpdatePolicy;
135    }
136
137    /**
138     * Gets the update policy for locally cached metadata from the repository.
139     *
140     * @return The update policy, never {@code null}.
141     * @since TBD
142     */
143    public String getMetadataUpdatePolicy() {
144        return metadataUpdatePolicy;
145    }
146
147    /**
148     * Gets the policy for checksum validation.
149     *
150     * @return The checksum policy, never {@code null}.
151     */
152    public String getChecksumPolicy() {
153        return checksumPolicy;
154    }
155
156    @Override
157    public String toString() {
158        return "enabled=" + isEnabled()
159                + ", checksums=" + getChecksumPolicy()
160                + ", artifactUpdates=" + getArtifactUpdatePolicy()
161                + ", metadataUpdates=" + getMetadataUpdatePolicy();
162    }
163
164    @Override
165    public boolean equals(Object obj) {
166        if (this == obj) {
167            return true;
168        }
169
170        if (obj == null || !getClass().equals(obj.getClass())) {
171            return false;
172        }
173
174        RepositoryPolicy that = (RepositoryPolicy) obj;
175
176        return enabled == that.enabled
177                && artifactUpdatePolicy.equals(that.artifactUpdatePolicy)
178                && metadataUpdatePolicy.equals(that.metadataUpdatePolicy)
179                && checksumPolicy.equals(that.checksumPolicy);
180    }
181
182    @Override
183    public int hashCode() {
184        int hash = 17;
185        hash = hash * 31 + (enabled ? 1 : 0);
186        hash = hash * 31 + artifactUpdatePolicy.hashCode();
187        hash = hash * 31 + metadataUpdatePolicy.hashCode();
188        hash = hash * 31 + checksumPolicy.hashCode();
189        return hash;
190    }
191}