1 package org.apache.archiva.policies;
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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
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;
28 import java.util.ArrayList;
29 import java.util.Calendar;
30 import java.util.List;
31 import java.util.Properties;
34 * AbstractUpdatePolicy
38 public abstract class AbstractUpdatePolicy
39 implements PreDownloadPolicy
41 private Logger log = LoggerFactory.getLogger( AbstractUpdatePolicy.class );
44 * The ALWAYS policy setting means that the artifact is always uipdated from the remote repo.
46 public static final String ALWAYS = "always";
49 * The NEVER policy setting means that the artifact is never updated from the remote repo.
51 public static final String NEVER = "never";
55 * The DAILY policy means that the artifact retrieval occurs only if one of
56 * the following conditions are met...
59 * <li>The local artifact is not present.</li>
60 * <li>The local artifact has a last modified timestamp older than (now - 1 day).</li>
63 public static final String DAILY = "daily";
67 * The HOURLY policy means that the artifact retrieval occurs only if one of
68 * the following conditions are met...
71 * <li>The local artifact is not present.</li>
72 * <li>The local artifact has a last modified timestamp older than (now - 1 hour).</li>
75 public static final String HOURLY = "hourly";
78 * The ONCE policy means that the artifact retrieval occurs only if the
79 * local artifact is not present. This means that the retreival can only
82 public static final String ONCE = "once";
84 private List<String> options = new ArrayList<>( 5 );
86 public AbstractUpdatePolicy()
88 options.add( ALWAYS );
89 options.add( HOURLY );
95 protected abstract boolean isSnapshotPolicy();
97 protected abstract String getUpdateMode();
100 public List<String> getOptions()
106 public void applyPolicy( String policySetting, Properties request, StorageAsset localFile )
107 throws PolicyViolationException, PolicyConfigurationException
109 if ( !StringUtils.equals( request.getProperty( "filetype" ), "artifact" ) )
111 // Only process artifact file types.
115 String version = request.getProperty( "version", "" );
116 boolean isSnapshotVersion = false;
118 if ( StringUtils.isNotBlank( version ) )
120 isSnapshotVersion = VersionUtil.isSnapshot( version );
123 if ( !options.contains( policySetting ) )
126 throw new PolicyConfigurationException(
127 "Unknown " + getUpdateMode() + " policy setting [" + policySetting + "], valid settings are ["
128 + StringUtils.join( options.iterator(), "," ) + "]" );
131 if ( ALWAYS.equals( policySetting ) )
133 // Skip means ok to update.
134 log.debug( "OK to update, {} policy set to ALWAYS.", getUpdateMode() );
138 // Test for mismatches.
139 if ( !isSnapshotVersion && isSnapshotPolicy() )
141 log.debug( "OK to update, snapshot policy does not apply for non-snapshot versions." );
145 if ( isSnapshotVersion && !isSnapshotPolicy() )
147 log.debug( "OK to update, release policy does not apply for snapshot versions." );
151 if ( NEVER.equals( policySetting ) )
154 throw new PolicyViolationException( "NO to update, " + getUpdateMode() + " policy set to NEVER." );
157 if ( !localFile.exists() )
159 // No file means it's ok.
160 log.debug( "OK to update {}, local file does not exist.", getUpdateMode() );
164 if ( ONCE.equals( policySetting ) )
166 // File exists, but policy is once.
167 throw new PolicyViolationException(
168 "NO to update " + getUpdateMode() + ", policy is ONCE, and local file exist." );
171 if ( DAILY.equals( policySetting ) )
173 Calendar cal = Calendar.getInstance();
174 cal.add( Calendar.DAY_OF_MONTH, -1 );
175 Calendar fileCal = Calendar.getInstance();
176 fileCal.setTimeInMillis( localFile.getModificationTime().toEpochMilli() );
178 if ( cal.after( fileCal ) )
185 throw new PolicyViolationException( "NO to update " + getUpdateMode()
186 + ", policy is DAILY, local file exist, and has been updated within the last day." );
190 if ( HOURLY.equals( policySetting ) )
192 Calendar cal = Calendar.getInstance();
193 cal.add( Calendar.HOUR, -1 );
194 Calendar fileCal = Calendar.getInstance();
195 fileCal.setTimeInMillis( localFile.getModificationTime().toEpochMilli());
197 if ( cal.after( fileCal ) )
204 throw new PolicyViolationException( "NO to update " + getUpdateMode()
205 + ", policy is HOURLY, local file exist, and has been updated within the last hour." );
209 throw new PolicyConfigurationException(
210 "Unable to process " + getUpdateMode() + " policy of [" + policySetting + "], please file a bug report." );