View Javadoc
1   package org.eclipse.aether.transfer;
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  
24  import org.eclipse.aether.RequestTrace;
25  
26  /**
27   * Describes a resource being uploaded or downloaded by the repository system.
28   */
29  public final class TransferResource
30  {
31  
32      private final String repositoryId;
33  
34      private final String repositoryUrl;
35  
36      private final String resourceName;
37  
38      private final File file;
39  
40      private final long startTime;
41  
42      private final RequestTrace trace;
43  
44      private long contentLength = -1L;
45  
46      private long resumeOffset;
47  
48      /**
49       * Creates a new transfer resource with the specified properties.
50       *
51       * @param repositoryUrl The base URL of the repository, may be {@code null} or empty if unknown. If not empty, a
52       * trailing slash will automatically be added if missing.
53       * @param resourceName The relative path to the resource within the repository, may be {@code null}. A leading slash
54       * (if any) will be automatically removed.
55       * @param file The source/target file involved in the transfer, may be {@code null}.
56       * @param trace The trace information, may be {@code null}.
57       *
58       * @deprecated As of 1.1.0, replaced by {@link #TransferResource(java.lang.String, java.lang.String,
59       * java.lang.String, java.io.File, org.eclipse.aether.RequestTrace)}
60       */
61      @Deprecated
62      public TransferResource( String repositoryUrl, String resourceName, File file, RequestTrace trace )
63      {
64          this( null, repositoryUrl, resourceName, file, trace );
65      }
66  
67      /**
68       * Creates a new transfer resource with the specified properties.
69       *
70       * @param repositoryId The ID of the repository used to transfer the resource, may be {@code null} or empty if unknown.
71       * @param repositoryUrl The base URL of the repository, may be {@code null} or empty if unknown. If not empty, a
72       *            trailing slash will automatically be added if missing.
73       * @param resourceName The relative path to the resource within the repository, may be {@code null}. A leading slash
74       *            (if any) will be automatically removed.
75       * @param file The source/target file involved in the transfer, may be {@code null}.
76       * @param trace The trace information, may be {@code null}.
77       *
78       * @since 1.1.0
79       */
80      public TransferResource( String repositoryId, String repositoryUrl, String resourceName,
81          File file, RequestTrace trace )
82      {
83          if ( repositoryId == null || repositoryId.length() <= 0 )
84          {
85              this.repositoryId = "";
86          }
87          else
88          {
89              this.repositoryId = repositoryId;
90          }
91  
92          if ( repositoryUrl == null || repositoryUrl.length() <= 0 )
93          {
94              this.repositoryUrl = "";
95          }
96          else if ( repositoryUrl.endsWith( "/" ) )
97          {
98              this.repositoryUrl = repositoryUrl;
99          }
100         else
101         {
102             this.repositoryUrl = repositoryUrl + '/';
103         }
104 
105         if ( resourceName == null || resourceName.length() <= 0 )
106         {
107             this.resourceName = "";
108         }
109         else if ( resourceName.startsWith( "/" ) )
110         {
111             this.resourceName = resourceName.substring( 1 );
112         }
113         else
114         {
115             this.resourceName = resourceName;
116         }
117 
118         this.file = file;
119 
120         this.trace = trace;
121 
122         startTime = System.currentTimeMillis();
123     }
124 
125     /**
126      * The ID of the repository, e.g., "central".
127      *
128      * @return The ID of the repository or an empty string if unknown, never {@code null}.
129      *
130      * @since 1.1.0
131      */
132     public String getRepositoryId()
133     {
134         return repositoryId;
135     }
136 
137     /**
138      * The base URL of the repository, e.g. "http://repo1.maven.org/maven2/". Unless the URL is unknown, it will be
139      * terminated by a trailing slash.
140      *
141      * @return The base URL of the repository or an empty string if unknown, never {@code null}.
142      */
143     public String getRepositoryUrl()
144     {
145         return repositoryUrl;
146     }
147 
148     /**
149      * The path of the resource relative to the repository's base URL, e.g. "org/apache/maven/maven/3.0/maven-3.0.pom".
150      *
151      * @return The path of the resource, never {@code null}.
152      */
153     public String getResourceName()
154     {
155         return resourceName;
156     }
157 
158     /**
159      * Gets the local file being uploaded or downloaded. When the repository system merely checks for the existence of a
160      * remote resource, no local file will be involved in the transfer.
161      *
162      * @return The source/target file involved in the transfer or {@code null} if none.
163      */
164     public File getFile()
165     {
166         return file;
167     }
168 
169     /**
170      * The size of the resource in bytes. Note that the size of a resource during downloads might be unknown to the
171      * client which is usually the case when transfers employ compression like gzip. In general, the content length is
172      * not known until the transfer has {@link TransferListener#transferStarted(TransferEvent) started}.
173      *
174      * @return The size of the resource in bytes or a negative value if unknown.
175      */
176     public long getContentLength()
177     {
178         return contentLength;
179     }
180 
181     /**
182      * Sets the size of the resource in bytes.
183      *
184      * @param contentLength The size of the resource in bytes or a negative value if unknown.
185      * @return This resource for chaining, never {@code null}.
186      */
187     public TransferResource setContentLength( long contentLength )
188     {
189         this.contentLength = contentLength;
190         return this;
191     }
192 
193     /**
194      * Gets the byte offset within the resource from which the download starts. A positive offset indicates a previous
195      * download attempt is being resumed, {@code 0} means the transfer starts at the first byte.
196      *
197      * @return The zero-based index of the first byte being transferred, never negative.
198      */
199     public long getResumeOffset()
200     {
201         return resumeOffset;
202     }
203 
204     /**
205      * Sets the byte offset within the resource at which the download starts.
206      *
207      * @param resumeOffset The zero-based index of the first byte being transferred, must not be negative.
208      * @return This resource for chaining, never {@code null}.
209      */
210     public TransferResource setResumeOffset( long resumeOffset )
211     {
212         if ( resumeOffset < 0L )
213         {
214             throw new IllegalArgumentException( "resume offset cannot be negative" );
215         }
216         this.resumeOffset = resumeOffset;
217         return this;
218     }
219 
220     /**
221      * Gets the timestamp when the transfer of this resource was started.
222      *
223      * @return The timestamp when the transfer of this resource was started.
224      */
225     public long getTransferStartTime()
226     {
227         return startTime;
228     }
229 
230     /**
231      * Gets the trace information that describes the higher level request/operation during which this resource is
232      * transferred.
233      *
234      * @return The trace information about the higher level operation or {@code null} if none.
235      */
236     public RequestTrace getTrace()
237     {
238         return trace;
239     }
240 
241     @Override
242     public String toString()
243     {
244         return getRepositoryUrl() + getResourceName() + " <> " + getFile();
245     }
246 
247 }