]> source.dussan.org Git - archiva.git/blob
bd1e2933cf32e43d90579dd616a4f6b3f54884fc
[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.DataItem;
29 import org.apache.archiva.repository.content.ItemNotFoundException;
30 import org.apache.archiva.repository.content.ItemSelector;
31 import org.apache.archiva.repository.content.Namespace;
32 import org.apache.archiva.repository.content.Project;
33 import org.apache.archiva.repository.content.Version;
34 import org.apache.archiva.repository.storage.StorageAsset;
35
36 import java.nio.file.Path;
37 import java.util.List;
38 import java.util.stream.Stream;
39
40 /**
41  * Layout 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  * 
45  */
46 public interface BaseRepositoryContentLayout extends ManagedRepositoryContentLayout
47 {
48
49     /// *****************   New generation interface **********************
50
51
52
53     /**
54      * Returns the namespace for the given selected coordinates. The selector must specify a namespace. All other
55      * coordinates are ignored.
56      * The following coordinates must be set at the given selector:
57      * <ul>
58      *     <li>namespace</li>
59      * </ul>
60      * If not, a {@link IllegalArgumentException} will be thrown.
61      *
62      * @param namespaceSelector the selectory with the namespace coordinates
63      * @return the namespace
64      * @throws ItemNotFoundException if the item does not exist
65      * @throws ContentAccessException if the item cannot be accessed
66      * @throws IllegalArgumentException if the selector has no namespace specified
67      */
68     Namespace getNamespace( ItemSelector namespaceSelector ) throws ContentAccessException, IllegalArgumentException;
69
70     /**
71      * Returns the project for the given coordinates.
72      * The following coordinates must be set at the given selector:
73      * <ul>
74      *     <li>namespace</li>
75      *     <li>projectId</li>
76      * </ul>
77      * If not, a {@link IllegalArgumentException} will be thrown.
78      * Additional coordinates will be ignored.
79      *
80      * @param projectSelector
81      * @return the project instance
82      * @throws ItemNotFoundException if the project does not exist
83      * @throws ContentAccessException if the item cannot be accessed
84      * @throws IllegalArgumentException if the selector does not specify the required coordinates
85      */
86     Project getProject( ItemSelector projectSelector ) throws ContentAccessException, IllegalArgumentException;
87
88     /**
89      * Returns the version for the given coordinates.
90      * The following coordinates must be set at the given selector:
91      * <ul>
92      *     <li>namespace</li>
93      *     <li>projectId</li>
94      *     <li>version</li>
95      * </ul>
96      * If not, a {@link IllegalArgumentException} will be thrown.
97      *
98      * Additional coordinates will be ignored.
99      *
100      * @param versionCoordinates
101      * @return the version object
102      * @throws ItemNotFoundException
103      * @throws ContentAccessException
104      * @throws IllegalArgumentException
105      */
106     Version getVersion(ItemSelector versionCoordinates) throws ContentAccessException, IllegalArgumentException;
107
108
109     /**
110      * Returns the artifact object for the given coordinates.
111      *
112      * Normally the following coordinates should be set at the given selector:
113      * <ul>
114      *     <li>namespace</li>
115      *     <li>artifactVersion and or version</li>
116      *     <li>artifactId or projectId</li>
117      * </ul>
118      * If the coordinates do not provide enough information for selecting a artifact, a {@link IllegalArgumentException} will be thrown
119      * It depends on the repository type, what exactly is returned for a given set of coordinates. Some repository type
120      * may have different required and optional coordinates. For further information please check the documentation for the
121      * type specific implementations.
122      *
123      * The following coordinates are optional and may further specify the artifact to return.
124      * <ul>
125      *     <li>classifier</li>
126      *     <li>type</li>
127      *     <li>extension</li>
128      * </ul>
129      *
130      * The method always returns a artifact object, if the coordinates are valid. It does not guarantee that the artifact
131      * exists. To check if there is really a physical representation of the artifact, use the <code>{@link Artifact#exists()}</code>
132      * method of the artifact.
133      * For upload and data retrieval use the methods of the {@link StorageAsset} reference returned in the artifact.
134      *
135      *
136      * @param selector the selector with the artifact coordinates
137      * @return a artifact object
138      * @throws IllegalArgumentException if the selector coordinates do not specify a artifact
139      * @throws ContentAccessException if the access to the underlying storage failed
140      */
141     Artifact getArtifact(ItemSelector selector) throws ContentAccessException;
142
143
144     /**
145      * Returns the artifacts that match the given selector. It is up to the repository implementation
146      * what artifacts are returned for a given set of coordinates.
147      *
148      * @param selector the selector for the artifacts
149      * @return a list of artifacts.
150      * @throws IllegalArgumentException if the specified coordinates cannot be found in the repository
151      * @throws ContentAccessException if the access to the underlying storage failed
152      */
153     List<? extends Artifact> getArtifacts( ItemSelector selector) throws ContentAccessException;
154
155     /**
156      * Returns the artifacts that match the given selector. It is up to the repository implementation
157      * what artifacts are returned for a given set of coordinates.
158      *
159      * The returned stream is autoclosable and should always closed after using it.
160      *
161      * There is no guarantee about the order of the returned artifacts
162      *
163      * @param selector the selector for the artifacts
164      * @return a stream with artifact elements.
165      * @throws ItemNotFoundException if the specified coordinates cannot be found in the repository
166      * @throws ContentAccessException if the access to the underlying storage failed
167      */
168     Stream<? extends Artifact> newArtifactStream( ItemSelector selector) throws ContentAccessException;
169
170
171     /**
172      * Return the projects that are part of the given namespace.
173      *
174      * @param namespace the namespace
175      * @return the list of projects or a empty list, if there are no projects for the given namespace.
176      */
177     List<? extends Project> getProjects( Namespace namespace) throws ContentAccessException;
178
179     /**
180      * Returns the list of projects that match the given selector. The selector must at least specify a
181      * a namespace.
182      *
183      * @param selector the selector
184      * @return the list of projects that match the selector. A empty list of not project matches.
185      * @throws ContentAccessException if the access to the storage backend failed
186      * @throws IllegalArgumentException if the selector does not contain sufficient data for selecting projects
187      */
188     List<? extends Project> getProjects( ItemSelector selector ) throws ContentAccessException, IllegalArgumentException;
189
190     /**
191      * Return the existing versions of the given project.
192      *
193      * @param project the project
194      * @return a list of versions or a empty list, if not versions are available for the specified project
195      * @throws ContentAccessException if the access to the underlying storage failed
196      */
197     List<? extends Version> getVersions( Project project) throws ContentAccessException;
198
199
200     /**
201      * Return the versions that match the given selector. The selector must at least specify a namespace and a projectId.
202      *
203      * @param selector the item selector. At least namespace and projectId must be set.
204      * @return the list of version or a empty list, if no version matches the selector
205      * @throws ContentAccessException if the access to the backend failed
206      * @throws IllegalArgumentException if the selector does not contain enough information for selecting versions
207      */
208     List<? extends Version> getVersions( ItemSelector selector ) throws ContentAccessException, IllegalArgumentException;
209
210     /**
211      * Returns all found artifact versions that can be found for the given selector. The selector must specify at least
212      * a project.
213      *
214      * @param selector the item selector that must specify at least a project
215      * @return the list of artifact versions
216      * @throws ContentAccessException if the access to the underlying storage failed
217      * @throws IllegalArgumentException if the selector does not have project information
218      */
219     List<String> getArtifactVersions( ItemSelector selector ) throws ContentAccessException, IllegalArgumentException;
220
221     /**
222      * Return all the artifacts of a given content item (namespace, project, version)
223      *
224      * @param item the item
225      * @return a list of artifacts or a empty list, if no artifacts are available for the specified item
226      */
227     List<? extends Artifact> getArtifacts( ContentItem item) throws ContentAccessException;
228
229     /**
230      * Return a stream of artifacts that are part of the given content item. The returned stream is
231      * auto closable. There is no guarantee about the order of returned artifacts.
232      *
233      * As the stream may access IO resources, you should always use call this method inside try-with-resources or
234      * make sure, that the stream is closed after using it.
235      *
236      * @param item the item from where the artifacts should be returned
237      * @return a stream of artifacts. The stream is auto closable. You should always make sure, that the stream
238      * is closed after use.
239      * @throws ContentAccessException if the access to the underlying storage failed
240      */
241     Stream<? extends Artifact> newArtifactStream( ContentItem item ) throws ContentAccessException;
242
243
244     /**
245      * Copies the artifact to the given destination coordinates
246      *
247      * @param sourceFile the path to the source file
248      * @param destination the coordinates of the destination
249      * @throws IllegalArgumentException if the destination is not valid
250      */
251     void addArtifact( Path sourceFile, Artifact destination ) throws IllegalArgumentException, ContentAccessException;
252
253     /**
254      * Returns the metadata file for the given version.
255      *
256      * @param version the version
257      * @return the metadata file
258      */
259     DataItem getMetadataItem( Version version );
260
261     /**
262      * Returns the metadata file for the given project
263      *
264      * @param project the project
265      * @return the metadata file
266      */
267     DataItem getMetadataItem( Project project );
268
269
270     /// *****************   End of new generation interface **********************
271
272
273
274     /**
275      * Returns the version reference for the given coordinates.
276      * @param groupId the group id
277      * @param artifactId the artifact id
278      * @param version the version number
279      * @return a version reference
280      */
281     VersionedReference toVersion( String groupId, String artifactId, String version );
282
283
284     /**
285      * Return the version reference that matches exactly the version string of the artifact
286      *
287      * @param artifactReference The artifact reference
288      * @return the version reference
289      */
290     VersionedReference toVersion( ArtifactReference artifactReference);
291
292
293     /**
294      * Delete from the managed repository all files / directories associated with the
295      * provided version reference.
296      *
297      * @param reference the version reference to delete.
298      * @throws ContentNotFoundException
299      */
300     void deleteVersion( VersionedReference reference )
301         throws ContentNotFoundException, ContentAccessException;
302
303
304
305     /**
306      * delete a specified artifact from the repository
307      *
308      * @param artifactReference
309      * @throws ContentNotFoundException
310      */
311     void deleteArtifact( ArtifactReference artifactReference )
312         throws ContentNotFoundException, ContentAccessException;
313
314
315
316     /**
317      * @param groupId
318      * @throws ContentNotFoundException
319      * @since 1.4-M3
320      */
321     void deleteGroupId( String groupId )
322         throws ContentNotFoundException, ContentAccessException;
323
324
325
326
327     /**
328      *
329      * @param namespace groupId for maven
330      * @param projectId artifactId for maven
331      * @throws ContentNotFoundException
332      */
333     void deleteProject( String namespace, String projectId )
334         throws ContentNotFoundException, ContentAccessException;
335
336
337     /**
338      * Deletes a project
339      * @param reference
340      */
341     void deleteProject(ProjectReference reference) throws ContentNotFoundException, ContentAccessException;
342
343
344
345
346
347
348     /**
349      * <p>
350      * Gather up the list of related artifacts to the ArtifactReference provided.
351      * This typically includes the pom files, and those things with
352      * classifiers (such as doc, source code, test libs, etc...). Even if the classifier
353      * is set in the artifact reference, it may return artifacts with different classifiers.
354      * </p>
355      * <p>
356      * <strong>NOTE:</strong> Some layouts (such as maven 1 "legacy") are not compatible with this query.
357      * </p>
358      *
359      * @param reference the reference to work off of.
360      * @return the list of ArtifactReferences for related artifacts, if
361      * @throws ContentNotFoundException if the initial artifact reference does not exist within the repository.
362      */
363     List<ArtifactReference> getRelatedArtifacts( VersionedReference reference )
364         throws ContentNotFoundException, LayoutException, ContentAccessException;
365
366
367     /**
368      * Returns all artifacts that belong to a given version
369      * @param reference the version reference
370      * @return the list of artifacts or a empty list
371      */
372     List<ArtifactReference> getArtifacts(VersionedReference reference) throws ContentNotFoundException, LayoutException, ContentAccessException;
373
374
375
376
377     /**
378      * <p>
379      * Convenience method to get the repository (on disk) root directory.
380      * </p>
381      * <p>
382      * Equivalent to calling <code>.getRepository().getLocation()</code>
383      * </p>
384      *
385      * @return the repository (on disk) root directory.
386      */
387     String getRepoRoot();
388
389
390     /**
391      * Given an {@link ArtifactReference}, return the file reference to the artifact.
392      *
393      * @param reference the artifact reference to use.
394      * @return the relative path to the artifact.
395      */
396     StorageAsset toFile( VersionedReference reference );
397
398     /**
399      * Given an {@link ArtifactReference}, return the file reference to the artifact.
400      *
401      * @param reference the artifact reference to use.
402      * @return the relative path to the artifact.
403      */
404     StorageAsset toFile( ArtifactReference reference );
405
406
407 }