001package org.apache.maven.artifact.repository;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.util.Calendar;
023import java.util.Date;
024
025/**
026 * Describes a set of policies for a repository to use under certain conditions.
027 *
028 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
029 */
030public class ArtifactRepositoryPolicy
031{
032    public static final String UPDATE_POLICY_NEVER = "never";
033
034    public static final String UPDATE_POLICY_ALWAYS = "always";
035
036    public static final String UPDATE_POLICY_DAILY = "daily";
037
038    public static final String UPDATE_POLICY_INTERVAL = "interval";
039
040    public static final String CHECKSUM_POLICY_FAIL = "fail";
041
042    public static final String CHECKSUM_POLICY_WARN = "warn";
043
044    public static final String CHECKSUM_POLICY_IGNORE = "ignore";
045
046    private boolean enabled;
047
048    private String updatePolicy;
049
050    private String checksumPolicy;
051
052    public ArtifactRepositoryPolicy()
053    {
054        this( true, null, null );
055    }
056
057    public ArtifactRepositoryPolicy( ArtifactRepositoryPolicy policy )
058    {
059        this( policy.isEnabled(), policy.getUpdatePolicy(), policy.getChecksumPolicy() );
060    }
061
062    public ArtifactRepositoryPolicy( boolean enabled, String updatePolicy, String checksumPolicy )
063    {
064        this.enabled = enabled;
065
066        if ( updatePolicy == null )
067        {
068            updatePolicy = UPDATE_POLICY_DAILY;
069        }
070        this.updatePolicy = updatePolicy;
071
072        if ( checksumPolicy == null )
073        {
074            checksumPolicy = CHECKSUM_POLICY_WARN;
075        }
076        this.checksumPolicy = checksumPolicy;
077    }
078
079    public void setEnabled( boolean enabled )
080    {
081        this.enabled = enabled;
082    }
083
084    public void setUpdatePolicy( String updatePolicy )
085    {
086        if ( updatePolicy != null )
087        {
088            this.updatePolicy = updatePolicy;
089        }
090    }
091
092    public void setChecksumPolicy( String checksumPolicy )
093    {
094        if ( checksumPolicy != null )
095        {
096            this.checksumPolicy = checksumPolicy;
097        }
098    }
099
100    public boolean isEnabled()
101    {
102        return enabled;
103    }
104
105    public String getUpdatePolicy()
106    {
107        return updatePolicy;
108    }
109
110    public String getChecksumPolicy()
111    {
112        return checksumPolicy;
113    }
114
115    public boolean checkOutOfDate( Date lastModified )
116    {
117        boolean checkForUpdates = false;
118
119        if ( UPDATE_POLICY_ALWAYS.equals( updatePolicy ) )
120        {
121            checkForUpdates = true;
122        }
123        else if ( UPDATE_POLICY_DAILY.equals( updatePolicy ) )
124        {
125            // Get local midnight boundary
126            Calendar cal = Calendar.getInstance();
127
128            cal.set( Calendar.HOUR_OF_DAY, 0 );
129            cal.set( Calendar.MINUTE, 0 );
130            cal.set( Calendar.SECOND, 0 );
131            cal.set( Calendar.MILLISECOND, 0 );
132
133            if ( cal.getTime().after( lastModified ) )
134            {
135                checkForUpdates = true;
136            }
137        }
138        else if ( updatePolicy.startsWith( UPDATE_POLICY_INTERVAL ) )
139        {
140            String s = updatePolicy.substring( UPDATE_POLICY_INTERVAL.length() + 1 );
141            int minutes = Integer.valueOf( s );
142            Calendar cal = Calendar.getInstance();
143            cal.add( Calendar.MINUTE, -minutes );
144            if ( cal.getTime().after( lastModified ) )
145            {
146                checkForUpdates = true;
147            }
148        }
149        // else assume "never"
150        return checkForUpdates;
151    }
152
153    @Override
154    public String toString()
155    {
156        StringBuilder buffer = new StringBuilder( 64 );
157        buffer.append( "{enabled=" );
158        buffer.append( enabled );
159        buffer.append( ", checksums=" );
160        buffer.append( checksumPolicy );
161        buffer.append( ", updates=" );
162        buffer.append( updatePolicy );
163        buffer.append( "}" );
164        return buffer.toString();
165    }
166
167    public void merge( ArtifactRepositoryPolicy policy )
168    {
169        if ( policy != null && policy.isEnabled() )
170        {
171            setEnabled( true );
172
173            if ( ordinalOfChecksumPolicy( policy.getChecksumPolicy() ) < ordinalOfChecksumPolicy( getChecksumPolicy() ) )
174            {
175                setChecksumPolicy( policy.getChecksumPolicy() );
176            }
177
178            if ( ordinalOfUpdatePolicy( policy.getUpdatePolicy() ) < ordinalOfUpdatePolicy( getUpdatePolicy() ) )
179            {
180                setUpdatePolicy( policy.getUpdatePolicy() );
181            }
182        }
183    }
184
185    private int ordinalOfChecksumPolicy( String policy )
186    {
187        if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( policy ) )
188        {
189            return 2;
190        }
191        else if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( policy ) )
192        {
193            return 0;
194        }
195        else
196        {
197            return 1;
198        }
199    }
200
201    private int ordinalOfUpdatePolicy( String policy )
202    {
203        if ( ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) )
204        {
205            return 1440;
206        }
207        else if ( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) )
208        {
209            return 0;
210        }
211        else if ( policy != null && policy.startsWith( ArtifactRepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
212        {
213            String s = policy.substring( UPDATE_POLICY_INTERVAL.length() + 1 );
214            return Integer.valueOf( s );
215        }
216        else
217        {
218            return Integer.MAX_VALUE;
219        }
220    }
221
222}