]> source.dussan.org Git - archiva.git/blob
e06f62e1c2ed770e4dbb8d80dca4089dfa729546
[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 org.apache.archiva.model.ArchivaArtifact;
23 import org.apache.archiva.model.ArtifactReference;
24 import org.apache.archiva.model.ProjectReference;
25 import org.apache.archiva.model.VersionedReference;
26 import org.apache.archiva.repository.content.Artifact;
27 import org.apache.archiva.repository.content.ContentItem;
28 import org.apache.archiva.repository.content.ItemNotFoundException;
29 import org.apache.archiva.repository.content.ItemSelector;
30 import org.apache.archiva.repository.content.Namespace;
31 import org.apache.archiva.repository.content.Project;
32 import org.apache.archiva.repository.content.Version;
33 import org.apache.archiva.repository.storage.StorageAsset;
34
35 import java.nio.file.Path;
36 import java.util.List;
37 import java.util.Set;
38 import java.util.stream.Stream;
39
40 /**
41  * ManagedRepositoryContent interface for interacting with a managed repository in an abstract way,
42  * without the need for processing based on filesystem paths, or working with the database.
43  *
44  * This interface
45  */
46 public interface ManagedRepositoryContent extends RepositoryContent
47 {
48
49     /// *****************   New generation interface **********************
50
51     /**
52      * Removes the specified content item and if the item is a container or directory,
53      * all content stored under the given item.
54      *
55      * @param item the item.
56      * @throws ItemNotFoundException if the item cannot be found
57      * @throws ContentAccessException if the deletion was not possible or only partly successful, because the access
58      *  to the artifacts failed
59      */
60     void deleteItem( ContentItem item) throws ItemNotFoundException, ContentAccessException;
61
62
63     /**
64      * Returns a item for the given selector. The type of the returned item depends on the
65      * selector.
66      *
67      * @param selector the item selector
68      * @return the content item that matches the given selector
69      * @throws ContentAccessException if an error occured while accessing the backend
70      * @throws IllegalArgumentException if the selector does not select a valid content item
71      */
72     ContentItem getItem(ItemSelector selector) throws ContentAccessException, IllegalArgumentException;
73
74     /**
75      * Returns the namespace for the given selected coordinates. The selector must specify a namespace. All other
76      * coordinates are ignored.
77      * The following coordinates must be set at the given selector:
78      * <ul>
79      *     <li>namespace</li>
80      * </ul>
81      * If not, a {@link IllegalArgumentException} will be thrown.
82      *
83      * @param namespaceSelector the selectory with the namespace coordinates
84      * @return the namespace
85      * @throws ItemNotFoundException if the item does not exist
86      * @throws ContentAccessException if the item cannot be accessed
87      * @throws IllegalArgumentException if the selector has no namespace specified
88      */
89     Namespace getNamespace( ItemSelector namespaceSelector ) throws ContentAccessException, IllegalArgumentException;
90
91     /**
92      * Returns the project for the given coordinates.
93      * The following coordinates must be set at the given selector:
94      * <ul>
95      *     <li>namespace</li>
96      *     <li>projectId</li>
97      * </ul>
98      * If not, a {@link IllegalArgumentException} will be thrown.
99      * Additional coordinates will be ignored.
100      *
101      * @param projectSelector
102      * @return the project instance
103      * @throws ItemNotFoundException if the project does not exist
104      * @throws ContentAccessException if the item cannot be accessed
105      * @throws IllegalArgumentException if the selector does not specify the required coordinates
106      */
107     Project getProject( ItemSelector projectSelector ) throws ContentAccessException, IllegalArgumentException;
108
109     /**
110      * Returns the version for the given coordinates.
111      * The following coordinates must be set at the given selector:
112      * <ul>
113      *     <li>namespace</li>
114      *     <li>projectId</li>
115      *     <li>version</li>
116      * </ul>
117      * If not, a {@link IllegalArgumentException} will be thrown.
118      *
119      * Additional coordinates will be ignored.
120      *
121      * @param versionCoordinates
122      * @return the version object
123      * @throws ItemNotFoundException
124      * @throws ContentAccessException
125      * @throws IllegalArgumentException
126      */
127     Version getVersion(ItemSelector versionCoordinates) throws ContentAccessException, IllegalArgumentException;
128
129
130     /**
131      * Returns the artifact object for the given coordinates.
132      *
133      * Normally the following coordinates should be set at the given selector:
134      * <ul>
135      *     <li>namespace</li>
136      *     <li>artifactVersion and or version</li>
137      *     <li>artifactId or projectId</li>
138      * </ul>
139      * If the coordinates do not provide enough information for selecting a artifact, a {@link IllegalArgumentException} will be thrown
140      * It depends on the repository type, what exactly is deleted for a given set of coordinates. Some repository type
141      * may have different required and optional coordinates. For further information please check the documentation for the
142      * type specific implementations.
143      *
144      * The following coordinates are optional and may further specify the artifact to delete.
145      * <ul>
146      *     <li>classifier</li>
147      *     <li>type</li>
148      *     <li>extension</li>
149      * </ul>
150      *
151      * The method always returns a artifact object, if the coordinates are valid. It does not guarantee that the artifact
152      * exists. To check if there is really a physical representation of the artifact, use the <code>{@link Artifact#exists()}</code>
153      * method of the artifact.
154      * For upload and data retrieval use the methods of the {@link StorageAsset} reference returned in the artifact.
155      *
156      *
157      * @param selector the selector with the artifact coordinates
158      * @return a artifact object
159      * @throws IllegalArgumentException if the selector coordinates do not specify a artifact
160      * @throws ContentAccessException if the access to the underlying storage failed
161      */
162     Artifact getArtifact(ItemSelector selector) throws ContentAccessException;
163
164
165     /**
166      * Returns the artifacts that match the given selector. It is up to the repository implementation
167      * what artifacts are returned for a given set of coordinates.
168      *
169      * @param selector the selector for the artifacts
170      * @return a list of artifacts.
171      * @throws IllegalArgumentException if the specified coordinates cannot be found in the repository
172      * @throws ContentAccessException if the access to the underlying storage failed
173      */
174     List<? extends Artifact> getArtifacts( ItemSelector selector) throws ContentAccessException;
175
176     /**
177      * Returns the artifacts that match the given selector. It is up to the repository implementation
178      * what artifacts are returned for a given set of coordinates.
179      *
180      * The returned stream is autoclosable and should always closed after using it.
181      *
182      * There is no guarantee about the order of the returned artifacts
183      *
184      * @param selector the selector for the artifacts
185      * @return a stream with artifact elements.
186      * @throws ItemNotFoundException if the specified coordinates cannot be found in the repository
187      * @throws ContentAccessException if the access to the underlying storage failed
188      */
189     Stream<? extends Artifact> newArtifactStream( ItemSelector selector) throws ContentAccessException;
190
191
192     /**
193      * Return the projects that are part of the given namespace.
194      *
195      * @param namespace the namespace
196      * @return the list of projects or a empty list, if there are no projects for the given namespace.
197      */
198     List<? extends Project> getProjects( Namespace namespace) throws ContentAccessException;
199
200     /**
201      * Returns the list of projects that match the given selector. The selector must at least specify a
202      * a namespace.
203      *
204      * @param selector the selector
205      * @return the list of projects that match the selector. A empty list of not project matches.
206      * @throws ContentAccessException if the access to the storage backend failed
207      * @throws IllegalArgumentException if the selector does not contain sufficient data for selecting projects
208      */
209     List<? extends Project> getProjects( ItemSelector selector ) throws ContentAccessException, IllegalArgumentException;
210
211     /**
212      * Return the existing versions of the given project.
213      *
214      * @param project the project
215      * @return a list of versions or a empty list, if not versions are available for the specified project
216      * @throws ContentAccessException if the access to the underlying storage failed
217      */
218     List<? extends Version> getVersions( Project project) throws ContentAccessException;
219
220
221     /**
222      * Return the versions that match the given selector. The selector must at least specify a namespace and a projectId.
223      *
224      * @param selector the item selector. At least namespace and projectId must be set.
225      * @return the list of version or a empty list, if no version matches the selector
226      * @throws ContentAccessException if the access to the backend failed
227      * @throws IllegalArgumentException if the selector does not contain enough information for selecting versions
228      */
229     List<? extends Version> getVersions( ItemSelector selector ) throws ContentAccessException, IllegalArgumentException;
230
231
232     /**
233      * Return all the artifacts of a given content item (namespace, project, version)
234      *
235      * @param item the item
236      * @return a list of artifacts or a empty list, if no artifacts are available for the specified item
237      */
238     List<? extends Artifact> getArtifacts( ContentItem item) throws ContentAccessException;
239
240     /**
241      * Return a stream of artifacts that are part of the given content item. The returned stream is
242      * auto closable. There is no guarantee about the order of returned artifacts.
243      *
244      * As the stream may access IO resources, you should always use call this method inside try-with-resources or
245      * make sure, that the stream is closed after using it.
246      *
247      * @param item the item from where the artifacts should be returned
248      * @return a stream of artifacts. The stream is auto closable. You should always make sure, that the stream
249      * is closed after use.
250      * @throws ContentAccessException if the access to the underlying storage failed
251      */
252     Stream<? extends Artifact> newArtifactStream( ContentItem item ) throws ContentAccessException;
253
254
255     /**
256      * Returns true, if the selector coordinates point to a existing item in the repository.
257      *
258      * @param selector the item selector
259      * @return <code>true</code>, if there exists such a item, otherwise <code>false</code>
260      */
261     boolean hasContent( ItemSelector selector );
262
263     /**
264      * Copies the artifact to the given destination coordinates
265      *
266      * @param sourceFile the path to the source file
267      * @param destination the coordinates of the destination
268      * @throws IllegalArgumentException if the destination is not valid
269      */
270     void addArtifact( Path sourceFile, Artifact destination ) throws IllegalArgumentException, ContentAccessException;
271
272
273     /**
274      * Returns the item that matches the given path. The item at the path must not exist.
275      *
276      * @param path the path string that points to the item
277      * @return the content item if the path is a valid item path
278      * @throws LayoutException if the path is not valid for the repository layout
279      */
280     ContentItem toItem(String path) throws LayoutException;
281
282
283     /**
284      * Returns the item that matches the given asset path. The asset must not exist.
285      *
286      * @param assetPath the path to the artifact or directory
287      * @return the item, if it is a valid path for the repository layout
288      * @throws LayoutException if the path is not valid for the repository
289      */
290     ContentItem toItem(StorageAsset assetPath) throws LayoutException;
291
292
293     /// *****************   End of new generation interface **********************
294
295
296
297     /**
298      * Returns the version reference for the given coordinates.
299      * @param groupId the group id
300      * @param artifactId the artifact id
301      * @param version the version number
302      * @return a version reference
303      */
304     VersionedReference toVersion( String groupId, String artifactId, String version );
305
306
307     /**
308      * Return the version reference that matches exactly the version string of the artifact
309      *
310      * @param artifactReference The artifact reference
311      * @return the version reference
312      */
313     VersionedReference toVersion( ArtifactReference artifactReference);
314
315
316     /**
317      * Delete from the managed repository all files / directories associated with the
318      * provided version reference.
319      *
320      * @param reference the version reference to delete.
321      * @throws ContentNotFoundException
322      */
323     void deleteVersion( VersionedReference reference )
324         throws ContentNotFoundException, ContentAccessException;
325
326
327
328     /**
329      * delete a specified artifact from the repository
330      *
331      * @param artifactReference
332      * @throws ContentNotFoundException
333      */
334     void deleteArtifact( ArtifactReference artifactReference )
335         throws ContentNotFoundException, ContentAccessException;
336
337
338
339     /**
340      * @param groupId
341      * @throws ContentNotFoundException
342      * @since 1.4-M3
343      */
344     void deleteGroupId( String groupId )
345         throws ContentNotFoundException, ContentAccessException;
346
347
348
349
350     /**
351      *
352      * @param namespace groupId for maven
353      * @param projectId artifactId for maven
354      * @throws ContentNotFoundException
355      */
356     void deleteProject( String namespace, String projectId )
357         throws ContentNotFoundException, ContentAccessException;
358
359
360     /**
361      * Deletes a project
362      * @param reference
363      */
364     void deleteProject(ProjectReference reference) throws ContentNotFoundException, ContentAccessException;
365
366
367
368
369     /**
370      * <p>
371      * Convenience method to get the repository id.
372      * </p>
373      * <p>
374      * Equivalent to calling <code>.getRepository().getId()</code>
375      * </p>
376      *
377      * @return the repository id.
378      */
379     String getId();
380
381     /**
382      * <p>
383      * Gather up the list of related artifacts to the ArtifactReference provided.
384      * This typically includes the pom files, and those things with
385      * classifiers (such as doc, source code, test libs, etc...). Even if the classifier
386      * is set in the artifact reference, it may return artifacts with different classifiers.
387      * </p>
388      * <p>
389      * <strong>NOTE:</strong> Some layouts (such as maven 1 "legacy") are not compatible with this query.
390      * </p>
391      *
392      * @param reference the reference to work off of.
393      * @return the list of ArtifactReferences for related artifacts, if
394      * @throws ContentNotFoundException if the initial artifact reference does not exist within the repository.
395      */
396     List<ArtifactReference> getRelatedArtifacts( VersionedReference reference )
397         throws ContentNotFoundException, LayoutException, ContentAccessException;
398
399
400     /**
401      * Returns all artifacts that belong to a given version
402      * @param reference the version reference
403      * @return the list of artifacts or a empty list
404      */
405     List<ArtifactReference> getArtifacts(VersionedReference reference) throws ContentNotFoundException, LayoutException, ContentAccessException;
406
407
408
409
410     /**
411      * <p>
412      * Convenience method to get the repository (on disk) root directory.
413      * </p>
414      * <p>
415      * Equivalent to calling <code>.getRepository().getLocation()</code>
416      * </p>
417      *
418      * @return the repository (on disk) root directory.
419      */
420     String getRepoRoot();
421
422     /**
423      * Get the repository configuration associated with this
424      * repository content.
425      *
426      * @return the repository that is associated with this repository content.
427      */
428     ManagedRepository getRepository();
429
430
431     /**
432      * Determines if the artifact referenced exists in the repository.
433      *
434      * @param reference the artifact reference to check for.
435      * @return true if the artifact referenced exists.
436      */
437     boolean hasContent( ArtifactReference reference ) throws ContentAccessException;
438
439     /**
440      * Determines if the version reference exists in the repository.
441      *
442      * @param reference the version reference to check for.
443      * @return true if the version referenced exists.
444      */
445     boolean hasContent( VersionedReference reference ) throws ContentAccessException;
446
447     /**
448      * Set the repository configuration to associate with this
449      * repository content.
450      *
451      * @param repo the repository to associate with this repository content.
452      */
453     void setRepository( ManagedRepository repo );
454
455     /**
456      * Given an {@link ArtifactReference}, return the file reference to the artifact.
457      *
458      * @param reference the artifact reference to use.
459      * @return the relative path to the artifact.
460      */
461     StorageAsset toFile( VersionedReference reference );
462
463     /**
464      * Given an {@link ArtifactReference}, return the file reference to the artifact.
465      *
466      * @param reference the artifact reference to use.
467      * @return the relative path to the artifact.
468      */
469     StorageAsset toFile( ArtifactReference reference );
470
471     /**
472      * Given an {@link ArchivaArtifact}, return the file reference to the artifact.
473      *
474      * @param reference the archiva artifact to use.
475      * @return the relative path to the artifact.
476      */
477     StorageAsset toFile( ArchivaArtifact reference );
478
479     /**
480      * Given a {@link ProjectReference}, return the path to the metadata for
481      * the project.
482      *
483      * @param reference the reference to use.
484      * @return the path to the metadata file, or null if no metadata is appropriate.
485      */
486     String toMetadataPath( ProjectReference reference );
487
488     /**
489      * Given a {@link VersionedReference}, return the path to the metadata for
490      * the specific version of the project.
491      *
492      * @param reference the reference to use.
493      * @return the path to the metadata file, or null if no metadata is appropriate.
494      */
495     String toMetadataPath( VersionedReference reference );
496
497     /**
498      * Given an {@link ArchivaArtifact}, return the relative path to the artifact.
499      *
500      * @param reference the archiva artifact to use.
501      * @return the relative path to the artifact.
502      */
503     String toPath( ArchivaArtifact reference );
504
505
506 }