View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.transfer;
20  
21  import java.io.File;
22  
23  import org.eclipse.aether.RequestTrace;
24  
25  /**
26   * Describes a resource being uploaded or downloaded by the repository system.
27   */
28  public final class TransferResource {
29  
30      private final String repositoryId;
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 = -1L;
43  
44      private long resumeOffset;
45  
46      /**
47       * Creates a new transfer resource with the specified properties.
48       *
49       * @param repositoryId The ID of the repository used to transfer the resource, may be {@code null} or
50       *                     empty if unknown.
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       * @since 1.1.0
59       */
60      public TransferResource(
61              String repositoryId, String repositoryUrl, String resourceName, File file, RequestTrace trace) {
62          if (repositoryId == null || repositoryId.isEmpty()) {
63              this.repositoryId = "";
64          } else {
65              this.repositoryId = repositoryId;
66          }
67  
68          if (repositoryUrl == null || repositoryUrl.isEmpty()) {
69              this.repositoryUrl = "";
70          } else if (repositoryUrl.endsWith("/")) {
71              this.repositoryUrl = repositoryUrl;
72          } else {
73              this.repositoryUrl = repositoryUrl + '/';
74          }
75  
76          if (resourceName == null || resourceName.isEmpty()) {
77              this.resourceName = "";
78          } else if (resourceName.startsWith("/")) {
79              this.resourceName = resourceName.substring(1);
80          } else {
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 ID of the repository, e.g., "central".
93       *
94       * @return The ID of the repository or an empty string if unknown, never {@code null}.
95       *
96       * @since 1.1.0
97       */
98      public String getRepositoryId() {
99          return repositoryId;
100     }
101 
102     /**
103      * The base URL of the repository, e.g. "http://repo1.maven.org/maven2/". Unless the URL is unknown, it will be
104      * terminated by a trailing slash.
105      *
106      * @return The base URL of the repository or an empty string if unknown, never {@code null}.
107      */
108     public String getRepositoryUrl() {
109         return repositoryUrl;
110     }
111 
112     /**
113      * The path of the resource relative to the repository's base URL, e.g. "org/apache/maven/maven/3.0/maven-3.0.pom".
114      *
115      * @return The path of the resource, never {@code null}.
116      */
117     public String getResourceName() {
118         return resourceName;
119     }
120 
121     /**
122      * Gets the local file being uploaded or downloaded. When the repository system merely checks for the existence of a
123      * remote resource, no local file will be involved in the transfer.
124      *
125      * @return The source/target file involved in the transfer or {@code null} if none.
126      */
127     public File getFile() {
128         return file;
129     }
130 
131     /**
132      * The size of the resource in bytes. Note that the size of a resource during downloads might be unknown to the
133      * client which is usually the case when transfers employ compression like gzip. In general, the content length is
134      * not known until the transfer has {@link TransferListener#transferStarted(TransferEvent) started}.
135      *
136      * @return The size of the resource in bytes or a negative value if unknown.
137      */
138     public long getContentLength() {
139         return contentLength;
140     }
141 
142     /**
143      * Sets the size of the resource in bytes.
144      *
145      * @param contentLength The size of the resource in bytes or a negative value if unknown.
146      * @return This resource for chaining, never {@code null}.
147      */
148     public TransferResource setContentLength(long contentLength) {
149         this.contentLength = contentLength;
150         return this;
151     }
152 
153     /**
154      * Gets the byte offset within the resource from which the download starts. A positive offset indicates a previous
155      * download attempt is being resumed, {@code 0} means the transfer starts at the first byte.
156      *
157      * @return The zero-based index of the first byte being transferred, never negative.
158      */
159     public long getResumeOffset() {
160         return resumeOffset;
161     }
162 
163     /**
164      * Sets the byte offset within the resource at which the download starts.
165      *
166      * @param resumeOffset The zero-based index of the first byte being transferred, must not be negative.
167      * @return This resource for chaining, never {@code null}.
168      */
169     public TransferResource setResumeOffset(long resumeOffset) {
170         if (resumeOffset < 0L) {
171             throw new IllegalArgumentException("resume offset cannot be negative");
172         }
173         this.resumeOffset = resumeOffset;
174         return this;
175     }
176 
177     /**
178      * Gets the timestamp when the transfer of this resource was started.
179      *
180      * @return The timestamp when the transfer of this resource was started.
181      */
182     public long getTransferStartTime() {
183         return startTime;
184     }
185 
186     /**
187      * Gets the trace information that describes the higher level request/operation during which this resource is
188      * transferred.
189      *
190      * @return The trace information about the higher level operation or {@code null} if none.
191      */
192     public RequestTrace getTrace() {
193         return trace;
194     }
195 
196     @Override
197     public String toString() {
198         return getRepositoryUrl() + getResourceName() + " <> " + getFile();
199     }
200 }