]> source.dussan.org Git - archiva.git/blob
afda85ce64aa31dab25caefd16a48fb58a2fa63e
[archiva.git] /
1 package org.apache.maven.archiva.proxy;
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.maven.artifact.repository.ArtifactRepository;
23 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
24
25 import java.util.Calendar;
26 import java.util.HashMap;
27 import java.util.Map;
28
29 /**
30  * A proxied artifact repository - contains the artifact repository and additional information about
31  * the proxied repository.
32  *
33  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
34  */
35 public class ProxiedArtifactRepository
36 {
37     /**
38      * Whether to cache failures or not.
39      */
40     private boolean cacheFailures;
41
42     /**
43      * Whether failures on this repository cause the whole group to fail.
44      */
45     private boolean hardFail;
46
47     /**
48      * Whether to use the network proxy for any requests.
49      */
50     private boolean useNetworkProxy;
51
52     /**
53      * The artifact repository on the other end of the proxy.
54      */
55     private final ArtifactRepository repository;
56
57     /**
58      * Cache of failures that have already occurred, containing paths from the repository root. The value given
59      * specifies when the failure should expire.
60      */
61     private Map/*<String,Long>*/ failureCache = new HashMap/*<String,Long>*/();
62
63     /**
64      * A user friendly name for the repository.
65      */
66     private String name;
67
68     public ProxiedArtifactRepository( ArtifactRepository repository )
69     {
70         this.repository = repository;
71     }
72
73     public boolean isHardFail()
74     {
75         return hardFail;
76     }
77
78     public boolean isUseNetworkProxy()
79     {
80         return useNetworkProxy;
81     }
82
83     public boolean isCacheFailures()
84     {
85         return cacheFailures;
86     }
87
88     public ArtifactRepository getRepository()
89     {
90         return repository;
91     }
92
93     /**
94      * Check if there is a previously cached failure for requesting the given path.
95      *
96      * @param path the path
97      * @return whether there is a failure
98      */
99     public boolean isCachedFailure( String path )
100     {
101         boolean failed = false;
102         if ( cacheFailures )
103         {
104             Long time = (Long) failureCache.get( path );
105             if ( time != null )
106             {
107                 if ( System.currentTimeMillis() < time.longValue() )
108                 {
109                     failed = true;
110                 }
111                 else
112                 {
113                     clearFailure( path );
114                 }
115             }
116         }
117         return failed;
118     }
119
120     /**
121      * Add a failure to the cache.
122      *
123      * @param path   the path that failed
124      * @param policy the policy for when the failure should expire
125      */
126     public void addFailure( String path, ArtifactRepositoryPolicy policy )
127     {
128         failureCache.put( path, new Long( calculateExpiryTime( policy ) ) );
129     }
130
131     private long calculateExpiryTime( ArtifactRepositoryPolicy policy )
132     {
133         String updatePolicy = policy.getUpdatePolicy();
134         long time;
135         if ( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( updatePolicy ) )
136         {
137             time = 0;
138         }
139         else if ( ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY.equals( updatePolicy ) )
140         {
141             // Get midnight boundary
142             Calendar cal = Calendar.getInstance();
143             cal.set( Calendar.HOUR_OF_DAY, 0 );
144             cal.set( Calendar.MINUTE, 0 );
145             cal.set( Calendar.SECOND, 0 );
146             cal.set( Calendar.MILLISECOND, 0 );
147             cal.add( Calendar.DAY_OF_MONTH, 1 );
148             time = cal.getTime().getTime();
149         }
150         else if ( updatePolicy.startsWith( ArtifactRepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
151         {
152             String s = updatePolicy.substring( ArtifactRepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );
153             int minutes = Integer.valueOf( s ).intValue();
154             Calendar cal = Calendar.getInstance();
155             cal.add( Calendar.MINUTE, minutes );
156             time = cal.getTime().getTime();
157         }
158         else
159         {
160             // else assume "never"
161             time = Long.MAX_VALUE;
162         }
163         return time;
164     }
165
166     /**
167      * Remove a failure.
168      *
169      * @param path the path that had previously failed
170      */
171     public void clearFailure( String path )
172     {
173         failureCache.remove( path );
174     }
175
176     public String getName()
177     {
178         return name;
179     }
180
181     public void setCacheFailures( boolean cacheFailures )
182     {
183         this.cacheFailures = cacheFailures;
184     }
185
186     public void setHardFail( boolean hardFail )
187     {
188         this.hardFail = hardFail;
189     }
190
191     public void setUseNetworkProxy( boolean useNetworkProxy )
192     {
193         this.useNetworkProxy = useNetworkProxy;
194     }
195
196     public void setName( String name )
197     {
198         this.name = name;
199     }
200 }