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