]> source.dussan.org Git - archiva.git/blob
6cb2aef6088b6a53f2b7c6376af3819508afb43a
[archiva.git] /
1 package org.apache.maven.archiva.policies;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.commons.lang.StringUtils;
23 import org.apache.maven.archiva.common.utils.VersionUtil;
24 import org.codehaus.plexus.logging.AbstractLogEnabled;
25
26 import java.io.File;
27 import java.util.ArrayList;
28 import java.util.Calendar;
29 import java.util.List;
30 import java.util.Properties;
31
32 /**
33  * AbstractUpdatePolicy 
34  *
35  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
36  * @version $Id$
37  */
38 public abstract class AbstractUpdatePolicy
39     extends AbstractLogEnabled
40     implements PreDownloadPolicy
41 {
42     /**
43      * The DISABLED policy means that the artifact retrieval isn't even attempted,
44      * let alone updated locally.
45      */
46     public static final String DISABLED = "disabled";
47
48     /**
49      * <p>
50      * The DAILY policy means that the artifact retrieval occurs only if one of
51      * the following conditions are met...
52      * </p>
53      * <ul>
54      *   <li>The local artifact is not present.</li>
55      *   <li>The local artifact has a last modified timestamp older than (now - 1 day).</li>
56      * </ul>
57      */
58     public static final String DAILY = "daily";
59
60     /**
61      * <p>
62      * The HOURLY policy means that the artifact retrieval occurs only if one of
63      * the following conditions are met...
64      * </p>
65      * <ul>
66      *   <li>The local artifact is not present.</li>
67      *   <li>The local artifact has a last modified timestamp older than (now - 1 hour).</li>
68      * </ul>
69      */
70     public static final String HOURLY = "hourly";
71
72     /**
73      * The ONCE policy means that the artifact retrieval occurs only if the
74      * local artifact is not present.  This means that the retreival can only
75      * occur once.
76      */
77     public static final String ONCE = "once";
78
79     private List options = new ArrayList();
80
81     public AbstractUpdatePolicy()
82     {
83         options.add( IGNORED );
84         options.add( DISABLED );
85         options.add( DAILY );
86         options.add( HOURLY );
87         options.add( ONCE );
88     }
89
90     protected abstract boolean isSnapshotPolicy();
91     
92     protected abstract String getUpdateMode();
93     
94     public List getOptions()
95     {
96         return options;
97     }
98
99     public boolean applyPolicy( String policySetting, Properties request, File localFile )
100     {
101         String version = request.getProperty( "version", "" );
102         boolean isSnapshotVersion = false;
103
104         if ( StringUtils.isNotBlank( version ) )
105         {
106             isSnapshotVersion = VersionUtil.isSnapshot( version );
107         }
108
109         if ( !options.contains( policySetting ) )
110         {
111             // No valid code? false it is then.
112             getLogger().error( "Unknown artifact-update policyCode [" + policySetting + "]" );
113             return false;
114         }
115
116         if ( IGNORED.equals( policySetting ) )
117         {
118             // Ignored means ok to update.
119             getLogger().debug( "OK to update, " + getUpdateMode() + " policy set to IGNORED." );
120             return true;
121         }
122
123         // Test for mismatches.
124         if ( !isSnapshotVersion && isSnapshotPolicy() )
125         {
126             getLogger().debug( "OK to update, snapshot policy does not apply for non-snapshot versions." );
127             return true;
128         }
129
130         if ( isSnapshotVersion && !isSnapshotPolicy() )
131         {
132             getLogger().debug( "OK to update, release policy does not apply for snapshot versions." );
133             return true;
134         }
135
136         if ( DISABLED.equals( policySetting ) )
137         {
138             // Disabled means no.
139             getLogger().debug( "NO to update, " + getUpdateMode() + " policy set to DISABLED." );
140             return false;
141         }
142
143         if ( !localFile.exists() )
144         {
145             // No file means it's ok.
146             getLogger().debug( "OK to update " + getUpdateMode() + ", local file does not exist." );
147             return true;
148         }
149
150         if ( ONCE.equals( policySetting ) )
151         {
152             // File exists, but policy is once.
153             getLogger().debug( "NO to update" + getUpdateMode() + ", local file exist (and policy is ONCE)." );
154             return false;
155         }
156
157         if ( DAILY.equals( policySetting ) )
158         {
159             Calendar cal = Calendar.getInstance();
160             cal.add( Calendar.DAY_OF_MONTH, -1 );
161             Calendar fileCal = Calendar.getInstance();
162             fileCal.setTimeInMillis( localFile.lastModified() );
163
164             return cal.after( fileCal );
165         }
166
167         if ( HOURLY.equals( policySetting ) )
168         {
169             Calendar cal = Calendar.getInstance();
170             cal.add( Calendar.HOUR, -1 );
171             Calendar fileCal = Calendar.getInstance();
172             fileCal.setTimeInMillis( localFile.lastModified() );
173
174             return cal.after( fileCal );
175         }
176
177         getLogger().error( "Unhandled policyCode [" + policySetting + "]" );
178         return false;
179     }
180 }