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