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.impl; 20 21 import java.io.File; 22 23 import org.eclipse.aether.RepositoryException; 24 import org.eclipse.aether.repository.RemoteRepository; 25 26 /** 27 * A request to check if an update of an artifact/metadata from a remote repository is needed. 28 * 29 * @param <T> 30 * @param <E> 31 * @see UpdateCheckManager 32 * @provisional This type is provisional and can be changed, moved or removed without prior notice. 33 */ 34 public final class UpdateCheck<T, E extends RepositoryException> { 35 36 private long localLastUpdated; 37 38 private T item; 39 40 private File file; 41 42 private boolean fileValid = true; 43 44 private String policy; 45 46 private RemoteRepository repository; 47 48 private RemoteRepository authoritativeRepository; 49 50 private boolean required; 51 52 private E exception; 53 54 /** 55 * Creates an uninitialized update check request. 56 */ 57 public UpdateCheck() {} 58 59 /** 60 * Gets the last-modified timestamp of the corresponding item produced by a local installation. If non-zero, a 61 * remote update will be surpressed if the local item is up-to-date, even if the remote item has not been cached 62 * locally. 63 * 64 * @return The last-modified timestamp of the corresponding item produced by a local installation or {@code 0} to 65 * ignore any local item. 66 */ 67 public long getLocalLastUpdated() { 68 return localLastUpdated; 69 } 70 71 /** 72 * Sets the last-modified timestamp of the corresponding item produced by a local installation. If non-zero, a 73 * remote update will be surpressed if the local item is up-to-date, even if the remote item has not been cached 74 * locally. 75 * 76 * @param localLastUpdated The last-modified timestamp of the corresponding item produced by a local installation or 77 * {@code 0} to ignore any local item. 78 * @return This object for chaining. 79 */ 80 public UpdateCheck<T, E> setLocalLastUpdated(long localLastUpdated) { 81 this.localLastUpdated = localLastUpdated; 82 return this; 83 } 84 85 /** 86 * Gets the item of the check. 87 * 88 * @return The item of the check, never {@code null}. 89 */ 90 public T getItem() { 91 return item; 92 } 93 94 /** 95 * Sets the item of the check. 96 * 97 * @param item The item of the check, must not be {@code null}. 98 * @return This object for chaining. 99 */ 100 public UpdateCheck<T, E> setItem(T item) { 101 this.item = item; 102 return this; 103 } 104 105 /** 106 * Returns the local file of the item. 107 * 108 * @return The local file of the item. 109 */ 110 public File getFile() { 111 return file; 112 } 113 114 /** 115 * Sets the local file of the item. 116 * 117 * @param file The file of the item, never {@code null} . 118 * @return This object for chaining. 119 */ 120 public UpdateCheck<T, E> setFile(File file) { 121 this.file = file; 122 return this; 123 } 124 125 /** 126 * Indicates whether the local file given by {@link #getFile()}, if existent, should be considered valid or not. An 127 * invalid file is equivalent to a physically missing file. 128 * 129 * @return {@code true} if the file should be considered valid if existent, {@code false} if the file should be 130 * treated as if it was missing. 131 */ 132 public boolean isFileValid() { 133 return fileValid; 134 } 135 136 /** 137 * Controls whether the local file given by {@link #getFile()}, if existent, should be considered valid or not. An 138 * invalid file is equivalent to a physically missing file. 139 * 140 * @param fileValid {@code true} if the file should be considered valid if existent, {@code false} if the file 141 * should be treated as if it was missing. 142 * @return This object for chaining. 143 */ 144 public UpdateCheck<T, E> setFileValid(boolean fileValid) { 145 this.fileValid = fileValid; 146 return this; 147 } 148 149 /** 150 * Gets the policy to use for the check. 151 * 152 * @return The policy to use for the check. 153 * @see org.eclipse.aether.repository.RepositoryPolicy 154 */ 155 public String getPolicy() { 156 return policy; 157 } 158 159 /** 160 * Sets the policy to use for the check. 161 * 162 * @param policy The policy to use for the check, may be {@code null}. 163 * @return This object for chaining. 164 * @see org.eclipse.aether.repository.RepositoryPolicy 165 */ 166 public UpdateCheck<T, E> setPolicy(String policy) { 167 this.policy = policy; 168 return this; 169 } 170 171 /** 172 * Gets the repository from which a potential update/download will performed. 173 * 174 * @return The repository to use for the check. 175 */ 176 public RemoteRepository getRepository() { 177 return repository; 178 } 179 180 /** 181 * Sets the repository from which a potential update/download will performed. 182 * 183 * @param repository The repository to use for the check, must not be {@code null}. 184 * @return This object for chaining. 185 */ 186 public UpdateCheck<T, E> setRepository(RemoteRepository repository) { 187 this.repository = repository; 188 return this; 189 } 190 191 /** 192 * Gets the repository which ultimately hosts the metadata to update. This will be different from the repository 193 * given by {@link #getRepository()} in case the latter denotes a repository manager. 194 * 195 * @return The actual repository hosting the authoritative copy of the metadata to update, never {@code null} for a 196 * metadata update check. 197 */ 198 public RemoteRepository getAuthoritativeRepository() { 199 return authoritativeRepository != null ? authoritativeRepository : repository; 200 } 201 202 /** 203 * Sets the repository which ultimately hosts the metadata to update. This will be different from the repository 204 * given by {@link #getRepository()} in case the latter denotes a repository manager. 205 * 206 * @param authoritativeRepository The actual repository hosting the authoritative copy of the metadata to update, 207 * must not be {@code null} for a metadata update check. 208 * @return This object for chaining. 209 */ 210 public UpdateCheck<T, E> setAuthoritativeRepository(RemoteRepository authoritativeRepository) { 211 this.authoritativeRepository = authoritativeRepository; 212 return this; 213 } 214 215 /** 216 * Gets the result of a check, denoting whether the remote repository should be checked for updates. 217 * 218 * @return The result of a check. 219 */ 220 public boolean isRequired() { 221 return required; 222 } 223 224 /** 225 * Sets the result of an update check. 226 * 227 * @param required The result of an update check. In case of {@code false} and the local file given by 228 * {@link #getFile()} does actually not exist, {@link #setException(RepositoryException)} should be used 229 * to provide the previous/cached failure that explains the absence of the file. 230 * @return This object for chaining. 231 */ 232 public UpdateCheck<T, E> setRequired(boolean required) { 233 this.required = required; 234 return this; 235 } 236 237 /** 238 * Gets the exception that occurred during the update check. 239 * 240 * @return The occurred exception or {@code null} if the update check was successful. 241 */ 242 public E getException() { 243 return exception; 244 } 245 246 /** 247 * Sets the exception for this update check. 248 * 249 * @param exception The exception for this update check, may be {@code null} if the check was successful. 250 * @return This object for chaining. 251 */ 252 public UpdateCheck<T, E> setException(E exception) { 253 this.exception = exception; 254 return this; 255 } 256 257 @Override 258 public String toString() { 259 return getPolicy() + ": " + getFile() + " < " + getRepository(); 260 } 261 }