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 }