]> source.dussan.org Git - archiva.git/blob
ca15e5f31ab2b80cba0a4cd59a9f5d026de0c26f
[archiva.git] /
1 package org.apache.archiva.repository.base;
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 com.cronutils.model.CronType;
23 import com.cronutils.model.definition.CronDefinition;
24 import com.cronutils.model.definition.CronDefinitionBuilder;
25 import org.apache.archiva.event.Event;
26 import org.apache.archiva.event.EventHandler;
27 import org.apache.archiva.event.EventManager;
28 import org.apache.archiva.event.EventType;
29 import org.apache.archiva.indexer.ArchivaIndexingContext;
30 import org.apache.archiva.repository.EditableRepository;
31 import org.apache.archiva.repository.RepositoryCapabilities;
32 import org.apache.archiva.repository.RepositoryState;
33 import org.apache.archiva.repository.RepositoryType;
34 import org.apache.archiva.repository.UnsupportedFeatureException;
35 import org.apache.archiva.repository.event.*;
36 import org.apache.archiva.repository.storage.RepositoryStorage;
37 import org.apache.archiva.repository.storage.StorageAsset;
38 import org.apache.archiva.repository.features.RepositoryFeature;
39 import org.apache.archiva.repository.features.StagingRepositoryFeature;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 import java.io.IOException;
44 import java.io.InputStream;
45 import java.io.OutputStream;
46 import java.net.URI;
47 import java.nio.channels.ReadableByteChannel;
48 import java.nio.channels.WritableByteChannel;
49 import java.nio.file.CopyOption;
50 import java.util.Collections;
51 import java.util.HashMap;
52 import java.util.HashSet;
53 import java.util.Locale;
54 import java.util.Map;
55 import java.util.Set;
56 import java.util.concurrent.atomic.AtomicBoolean;
57 import java.util.function.Consumer;
58
59 /**
60  * Implementation of a repository with the necessary fields for a bare repository.
61  * No features are provided. Capabilities and features must be implemented by concrete classes.
62  *
63  */
64 public abstract class AbstractRepository implements EditableRepository, EventHandler<RepositoryEvent>
65 {
66
67
68     Logger log = LoggerFactory.getLogger(AbstractRepository.class);
69
70     private final AtomicBoolean openStatus = new AtomicBoolean(false);
71
72
73     private final RepositoryType type;
74     private final String id;
75     private Map<Locale, String> names = new HashMap<>(  );
76     private Map<Locale, String> descriptions = new HashMap<>(  );
77
78     private Locale primaryLocale = new Locale("en_US");
79     protected URI location;
80     private URI baseUri;
81     private Set<URI> failoverLocations = new HashSet<>(  );
82     private Set<URI> uFailoverLocations = Collections.unmodifiableSet( failoverLocations );
83     private boolean scanned = true;
84     String schedulingDefinition = "0 0 02 * * ?";
85     private String layout = "default";
86     public static final CronDefinition CRON_DEFINITION = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
87     private RepositoryState state;
88
89     private final EventManager eventManager;
90
91     Map<Class<? extends RepositoryFeature<?>>, RepositoryFeature<?>> featureMap = new HashMap<>(  );
92
93     private ArchivaIndexingContext indexingContext;
94     private RepositoryStorage storage;
95
96     public AbstractRepository(RepositoryType type, String id, String name, RepositoryStorage repositoryStorage) {
97         this.id = id;
98         this.names.put( primaryLocale, name);
99         this.type = type;
100         this.storage = repositoryStorage;
101         this.location = repositoryStorage.getLocation();
102         this.openStatus.compareAndSet(false, true);
103         this.eventManager = new EventManager(this);
104     }
105
106     public AbstractRepository(Locale primaryLocale, RepositoryType type, String id, String name, RepositoryStorage repositoryStorage) {
107         setPrimaryLocale( primaryLocale );
108         this.id = id;
109         this.names.put( primaryLocale, name);
110         this.type = type;
111         this.storage = repositoryStorage;
112         this.location = repositoryStorage.getLocation();
113         this.openStatus.compareAndSet(false, true);
114         this.eventManager = new EventManager(this);
115     }
116
117     protected void setPrimaryLocale(Locale locale) {
118         this.primaryLocale = locale;
119     }
120
121     @Override
122     public String getId( )
123     {
124         return id;
125     }
126
127     @Override
128     public String getName( )
129     {
130         return getName( primaryLocale );
131     }
132
133     @Override
134     public String getName( Locale locale )
135     {
136         return names.get(locale);
137     }
138
139     @Override
140     public String getDescription( )
141     {
142         return getDescription( primaryLocale );
143     }
144
145     @Override
146     public String getDescription( Locale locale )
147     {
148         return descriptions.get(primaryLocale);
149     }
150
151     @Override
152     public RepositoryType getType( )
153     {
154         return type;
155     }
156
157     @Override
158     public URI getLocation( )
159     {
160         return location;
161     }
162
163     @Override
164     public StorageAsset getRoot( )
165     {
166         return storage.getRoot( );
167     }
168
169     @Override
170     public Set<URI> getFailoverLocations( )
171     {
172         return uFailoverLocations;
173     }
174
175     @Override
176     public boolean isScanned( )
177     {
178         return scanned;
179     }
180
181     @Override
182     public String getSchedulingDefinition( )
183     {
184         return schedulingDefinition;
185     }
186
187     @Override
188     public abstract boolean hasIndex( );
189
190     @Override
191     public String getLayout( )
192     {
193         return layout;
194     }
195
196     @Override
197     public abstract RepositoryCapabilities getCapabilities( );
198
199     @SuppressWarnings( "unchecked" )
200     @Override
201     public <T extends RepositoryFeature<T>> T getFeature( Class<T> clazz ) throws UnsupportedFeatureException
202     {
203         if (featureMap.containsKey( clazz )) {
204             return (T) featureMap.get(clazz);
205         } else
206         {
207             throw new UnsupportedFeatureException( "Feature " + clazz + " not supported" );
208         }
209     }
210
211     @Override
212     public <T extends RepositoryFeature<T>> boolean supportsFeature( Class<T> clazz )
213     {
214         return featureMap.containsKey( clazz );
215     }
216
217     @Override
218     public Locale getPrimaryLocale( )
219     {
220         return primaryLocale;
221     }
222
223     @Override
224     public void setName( Locale locale, String name )
225     {
226         names.put(locale, name);
227     }
228
229     @Override
230     public void setDescription( Locale locale, String description )
231     {
232         descriptions.put(locale, description);
233     }
234
235     @Override
236     public void setLocation( final URI location )
237     {
238         if (location!=null && ( this.location == null || !this.location.equals(location))) {
239             try {
240                 updateLocation(location);
241             } catch (IOException e) {
242                 log.error("Could not update location of repository {} to {}", getId(), location, e);
243             }
244         }
245     }
246
247     @Override
248     public void updateLocation(URI newLocation) throws IOException {
249         storage.updateLocation(newLocation);
250         this.location = newLocation;
251     }
252
253     @Override
254     public void addFailoverLocation( URI location )
255     {
256         this.failoverLocations.add(location);
257     }
258
259     @Override
260     public void removeFailoverLocation( URI location )
261     {
262         this.failoverLocations.remove( location );
263     }
264
265     @Override
266     public void clearFailoverLocations( )
267     {
268         this.failoverLocations.clear();
269     }
270
271     @Override
272     public void setScanned( boolean scanned )
273     {
274         this.scanned = scanned;
275     }
276
277     @Override
278     public void setLayout( String layout )
279     {
280         this.layout = layout;
281     }
282
283     @Override
284     public void setBaseUri(URI baseUri) {
285         this.baseUri = baseUri;
286     }
287
288     @Override
289     public void setSchedulingDefinition(String cronExpression) {
290         this.schedulingDefinition = cronExpression;
291     }
292
293     @SuppressWarnings( "unchecked" )
294     protected <T extends RepositoryFeature<T>> void addFeature(RepositoryFeature<T> feature) {
295        featureMap.put( (Class<? extends RepositoryFeature<?>>) feature.getClass(), feature);
296     }
297
298     @Override
299     public void setIndexingContext(ArchivaIndexingContext context) {
300         this.indexingContext = context;
301     }
302
303     @Override
304     public ArchivaIndexingContext getIndexingContext() {
305         return indexingContext;
306     }
307
308     @Override
309     public void close() {
310         if (this.openStatus.compareAndSet(true, false)) {
311             ArchivaIndexingContext ctx = getIndexingContext();
312             if (ctx != null) {
313                 try {
314                     ctx.close();
315                 } catch (IOException e) {
316                     log.warn("Error during index context close.", e);
317                 }
318                 this.indexingContext = null;
319
320             }
321             if (supportsFeature(StagingRepositoryFeature.class)) {
322                 StagingRepositoryFeature sf = getFeature( StagingRepositoryFeature.class );
323                 if (sf.getStagingRepository() != null) {
324                     sf.getStagingRepository().close();
325                 }
326             }
327             setLastState( RepositoryState.CLOSED );
328         }
329
330     }
331
332     @Override
333     public boolean isOpen() {
334         return openStatus.get();
335     }
336
337     @Override
338     public void handle(RepositoryEvent event) {
339         // We just rethrow the events
340         eventManager.fireEvent(event);
341     }
342
343     @Override
344     public <T extends Event> void registerEventHandler( EventType<T> eventType, EventHandler<? super T> eventHandler) {
345         if (!EventType.isInstanceOf(eventType, RepositoryEvent.ANY)) {
346             throw new IllegalArgumentException("Can only register RepositoryEvent Handlers");
347         }
348         eventManager.registerEventHandler(eventType, eventHandler);
349     }
350
351     @Override
352     public <T extends Event> void unregisterEventHandler(EventType<T> type, EventHandler<? super T> eventHandler) {
353         eventManager.unregisterEventHandler(type, eventHandler);
354     }
355
356     @Override
357     public StorageAsset getAsset(String path )
358     {
359         return storage.getAsset(path);
360     }
361
362     @Override
363     public StorageAsset addAsset( String path, boolean container )
364     {
365         return storage.addAsset(path, container);
366     }
367
368     @Override
369     public void removeAsset( StorageAsset asset ) throws IOException
370     {
371         storage.removeAsset(asset);
372     }
373
374     @Override
375     public StorageAsset moveAsset( StorageAsset origin, String destination, CopyOption... copyOptions ) throws IOException
376     {
377         return storage.moveAsset(origin, destination);
378     }
379
380     @Override
381     public void moveAsset( StorageAsset origin, StorageAsset destination, CopyOption... copyOptions ) throws IOException
382     {
383         storage.moveAsset( origin, destination, copyOptions );
384     }
385
386     @Override
387     public StorageAsset copyAsset( StorageAsset origin, String destination, CopyOption... copyOptions ) throws IOException
388     {
389         return storage.copyAsset(origin, destination);
390     }
391
392     @Override
393     public void copyAsset( StorageAsset origin, StorageAsset destination, CopyOption... copyOptions ) throws IOException
394     {
395         storage.copyAsset( origin, destination, copyOptions);
396     }
397
398     @Override
399     public void consumeData(StorageAsset asset, Consumer<InputStream> consumerFunction, boolean readLock ) throws IOException
400     {
401         storage.consumeData(asset, consumerFunction, readLock);
402     }
403
404     @Override
405     public void consumeDataFromChannel( StorageAsset asset, Consumer<ReadableByteChannel> consumerFunction, boolean readLock ) throws IOException
406     {
407         storage.consumeDataFromChannel( asset, consumerFunction, readLock );
408     }
409
410     @Override
411     public void writeData( StorageAsset asset, Consumer<OutputStream> consumerFunction, boolean writeLock ) throws IOException
412     {
413         storage.writeData( asset, consumerFunction, writeLock );
414     }
415
416     @Override
417     public void writeDataToChannel( StorageAsset asset, Consumer<WritableByteChannel> consumerFunction, boolean writeLock ) throws IOException
418     {
419         storage.writeDataToChannel( asset, consumerFunction, writeLock );
420     }
421
422     protected void setStorage( RepositoryStorage storage) {
423         this.storage = storage;
424     }
425
426     protected RepositoryStorage getStorage() {
427         return storage;
428     }
429
430
431     @Override
432     public RepositoryState getLastState( )
433     {
434         return this.state;
435     }
436
437     @Override
438     public void setLastState( RepositoryState state )
439     {
440         this.state = state;
441     }
442 }