1 package org.apache.archiva.policies;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.archiva.common.utils.VersionUtil;
23 import org.apache.commons.lang.StringUtils;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import java.io.File;
28 import java.util.ArrayList;
29 import java.util.Calendar;
30 import java.util.List;
31 import java.util.Properties;
32
33
34
35
36
37
38 public abstract class AbstractUpdatePolicy
39 implements PreDownloadPolicy
40 {
41 private Logger log = LoggerFactory.getLogger( AbstractUpdatePolicy.class );
42
43
44
45
46 public static final String ALWAYS = "always";
47
48
49
50
51 public static final String NEVER = "never";
52
53
54
55
56
57
58
59
60
61
62
63 public static final String DAILY = "daily";
64
65
66
67
68
69
70
71
72
73
74
75 public static final String HOURLY = "hourly";
76
77
78
79
80
81
82 public static final String ONCE = "once";
83
84 private List<String> options = new ArrayList<>( 5 );
85
86 public AbstractUpdatePolicy()
87 {
88 options.add( ALWAYS );
89 options.add( HOURLY );
90 options.add( DAILY );
91 options.add( ONCE );
92 options.add( NEVER );
93 }
94
95 protected abstract boolean isSnapshotPolicy();
96
97 protected abstract String getUpdateMode();
98
99 @Override
100 public List<String> getOptions()
101 {
102 return options;
103 }
104
105 @Override
106 public void applyPolicy( String policySetting, Properties request, File localFile )
107 throws PolicyViolationException, PolicyConfigurationException
108 {
109 if ( !StringUtils.equals( request.getProperty( "filetype" ), "artifact" ) )
110 {
111
112 return;
113 }
114
115 String version = request.getProperty( "version", "" );
116 boolean isSnapshotVersion = false;
117
118 if ( StringUtils.isNotBlank( version ) )
119 {
120 isSnapshotVersion = VersionUtil.isSnapshot( version );
121 }
122
123 if ( !options.contains( policySetting ) )
124 {
125
126 throw new PolicyConfigurationException(
127 "Unknown " + getUpdateMode() + " policy setting [" + policySetting + "], valid settings are ["
128 + StringUtils.join( options.iterator(), "," ) + "]" );
129 }
130
131 if ( ALWAYS.equals( policySetting ) )
132 {
133
134 log.debug( "OK to update, {} policy set to ALWAYS.", getUpdateMode() );
135 return;
136 }
137
138
139 if ( !isSnapshotVersion && isSnapshotPolicy() )
140 {
141 log.debug( "OK to update, snapshot policy does not apply for non-snapshot versions." );
142 return;
143 }
144
145 if ( isSnapshotVersion && !isSnapshotPolicy() )
146 {
147 log.debug( "OK to update, release policy does not apply for snapshot versions." );
148 return;
149 }
150
151 if ( NEVER.equals( policySetting ) )
152 {
153
154 throw new PolicyViolationException( "NO to update, " + getUpdateMode() + " policy set to NEVER." );
155 }
156
157 if ( !localFile.exists() )
158 {
159
160 log.debug( "OK to update {}, local file does not exist.", getUpdateMode() );
161 return;
162 }
163
164 if ( ONCE.equals( policySetting ) )
165 {
166
167 throw new PolicyViolationException(
168 "NO to update " + getUpdateMode() + ", policy is ONCE, and local file exist." );
169 }
170
171 if ( DAILY.equals( policySetting ) )
172 {
173 Calendar cal = Calendar.getInstance();
174 cal.add( Calendar.DAY_OF_MONTH, -1 );
175 Calendar fileCal = Calendar.getInstance();
176 fileCal.setTimeInMillis( localFile.lastModified() );
177
178 if ( cal.after( fileCal ) )
179 {
180
181 return;
182 }
183 else
184 {
185 throw new PolicyViolationException( "NO to update " + getUpdateMode()
186 + ", policy is DAILY, local file exist, and has been updated within the last day." );
187 }
188 }
189
190 if ( HOURLY.equals( policySetting ) )
191 {
192 Calendar cal = Calendar.getInstance();
193 cal.add( Calendar.HOUR, -1 );
194 Calendar fileCal = Calendar.getInstance();
195 fileCal.setTimeInMillis( localFile.lastModified() );
196
197 if ( cal.after( fileCal ) )
198 {
199
200 return;
201 }
202 else
203 {
204 throw new PolicyViolationException( "NO to update " + getUpdateMode()
205 + ", policy is HOURLY, local file exist, and has been updated within the last hour." );
206 }
207 }
208
209 throw new PolicyConfigurationException(
210 "Unable to process " + getUpdateMode() + " policy of [" + policySetting + "], please file a bug report." );
211 }
212 }