View Javadoc
1   package org.eclipse.aether.spi.connector;
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 java.io.File;
23  import java.util.Collection;
24  import java.util.Collections;
25  import java.util.List;
26  
27  import org.eclipse.aether.RequestTrace;
28  import org.eclipse.aether.artifact.Artifact;
29  import org.eclipse.aether.repository.RemoteRepository;
30  import org.eclipse.aether.transfer.ArtifactTransferException;
31  import org.eclipse.aether.transfer.TransferListener;
32  
33  /**
34   * A download of an artifact from a remote repository. A repository connector processing this download has to use
35   * {@link #setException(ArtifactTransferException)} and {@link #setSupportedContexts(Collection)} (if applicable) to
36   * report the results of the transfer.
37   */
38  public final class ArtifactDownload
39      extends ArtifactTransfer
40  {
41  
42      private boolean existenceCheck;
43  
44      private String checksumPolicy = "";
45  
46      private String context = "";
47  
48      private Collection<String> contexts;
49  
50      private List<RemoteRepository> repositories = Collections.emptyList();
51  
52      /**
53       * Creates a new uninitialized download.
54       */
55      public ArtifactDownload()
56      {
57          // enables default constructor
58      }
59  
60      /**
61       * Creates a new download with the specified properties.
62       * 
63       * @param artifact The artifact to download, may be {@code null}.
64       * @param context The context in which this download is performed, may be {@code null}.
65       * @param file The local file to download the artifact to, may be {@code null}.
66       * @param checksumPolicy The checksum policy, may be {@code null}.
67       */
68      public ArtifactDownload( Artifact artifact, String context, File file, String checksumPolicy )
69      {
70          setArtifact( artifact );
71          setRequestContext( context );
72          setFile( file );
73          setChecksumPolicy( checksumPolicy );
74      }
75  
76      @Override
77      public ArtifactDownload setArtifact( Artifact artifact )
78      {
79          super.setArtifact( artifact );
80          return this;
81      }
82  
83      /**
84       * {@inheritDoc} <em>Note:</em> In case of {@link #isExistenceCheck()}, this method may return {@code null}.
85       */
86      @Override
87      public File getFile()
88      {
89          return super.getFile();
90      }
91  
92      @Override
93      public ArtifactDownload setFile( File file )
94      {
95          super.setFile( file );
96          return this;
97      }
98  
99      /**
100      * Indicates whether this transfer shall only verify the existence of the artifact in the remote repository rather
101      * than actually downloading the file. Just like with an actual transfer, a connector is expected to signal the
102      * non-existence of the artifact by associating an {@link org.eclipse.aether.transfer.ArtifactNotFoundException
103      * ArtifactNotFoundException} with this download. <em>Note:</em> If an existence check is requested,
104      * {@link #getFile()} may be {@code null}, i.e. the connector must not try to access the local file.
105      * 
106      * @return {@code true} if only the artifact existence shall be verified, {@code false} to actually download the
107      *         artifact.
108      */
109     public boolean isExistenceCheck()
110     {
111         return existenceCheck;
112     }
113 
114     /**
115      * Controls whether this transfer shall only verify the existence of the artifact in the remote repository rather
116      * than actually downloading the file.
117      * 
118      * @param existenceCheck {@code true} if only the artifact existence shall be verified, {@code false} to actually
119      *            download the artifact.
120      * @return This transfer for chaining, never {@code null}.
121      */
122     public ArtifactDownload setExistenceCheck( boolean existenceCheck )
123     {
124         this.existenceCheck = existenceCheck;
125         return this;
126     }
127 
128     /**
129      * Gets the checksum policy for this transfer.
130      * 
131      * @return The checksum policy, never {@code null}.
132      */
133     public String getChecksumPolicy()
134     {
135         return checksumPolicy;
136     }
137 
138     /**
139      * Sets the checksum policy for this transfer.
140      * 
141      * @param checksumPolicy The checksum policy, may be {@code null}.
142      * @return This transfer for chaining, never {@code null}.
143      */
144     public ArtifactDownload setChecksumPolicy( String checksumPolicy )
145     {
146         this.checksumPolicy = ( checksumPolicy != null ) ? checksumPolicy : "";
147         return this;
148     }
149 
150     /**
151      * Gets the context of this transfer.
152      * 
153      * @return The context id, never {@code null}.
154      */
155     public String getRequestContext()
156     {
157         return context;
158     }
159 
160     /**
161      * Sets the context of this transfer.
162      * 
163      * @param context The context id, may be {@code null}.
164      * @return This transfer for chaining, never {@code null}.
165      */
166     public ArtifactDownload setRequestContext( String context )
167     {
168         this.context = ( context != null ) ? context : "";
169         return this;
170     }
171 
172     /**
173      * Gets the set of request contexts in which the artifact is generally available. Repository managers can indicate
174      * that an artifact is available in more than the requested context to avoid future remote trips for the same
175      * artifact in a different context.
176      * 
177      * @return The set of requests context in which the artifact is available, never {@code null}.
178      */
179     public Collection<String> getSupportedContexts()
180     {
181         return ( contexts != null ) ? contexts : Collections.singleton( context );
182     }
183 
184     /**
185      * Sets the set of request contexts in which the artifact is generally available. Repository managers can indicate
186      * that an artifact is available in more than the requested context to avoid future remote trips for the same
187      * artifact in a different context. The set of supported contexts defaults to the original request context if not
188      * overridden by the repository connector.
189      * 
190      * @param contexts The set of requests context in which the artifact is available, may be {@code null}.
191      * @return This transfer for chaining, never {@code null}.
192      */
193     public ArtifactDownload setSupportedContexts( Collection<String> contexts )
194     {
195         if ( contexts == null || contexts.isEmpty() )
196         {
197             this.contexts = Collections.singleton( context );
198         }
199         else
200         {
201             this.contexts = contexts;
202         }
203         return this;
204     }
205 
206     /**
207      * Gets the remote repositories that are being aggregated by the physically contacted remote repository (i.e. a
208      * repository manager).
209      * 
210      * @return The remote repositories being aggregated, never {@code null}.
211      */
212     public List<RemoteRepository> getRepositories()
213     {
214         return repositories;
215     }
216 
217     /**
218      * Sets the remote repositories that are being aggregated by the physically contacted remote repository (i.e. a
219      * repository manager).
220      * 
221      * @param repositories The remote repositories being aggregated, may be {@code null}.
222      * @return This transfer for chaining, never {@code null}.
223      */
224     public ArtifactDownload setRepositories( List<RemoteRepository> repositories )
225     {
226         if ( repositories == null )
227         {
228             this.repositories = Collections.emptyList();
229         }
230         else
231         {
232             this.repositories = repositories;
233         }
234         return this;
235     }
236 
237     @Override
238     public ArtifactDownload setException( ArtifactTransferException exception )
239     {
240         super.setException( exception );
241         return this;
242     }
243 
244     @Override
245     public ArtifactDownload setListener( TransferListener listener )
246     {
247         super.setListener( listener );
248         return this;
249     }
250 
251     @Override
252     public ArtifactDownload setTrace( RequestTrace trace )
253     {
254         super.setTrace( trace );
255         return this;
256     }
257 
258     @Override
259     public String toString()
260     {
261         return getArtifact() + " - " + ( isExistenceCheck() ? "?" : "" ) + getFile();
262     }
263 
264 }