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