1 /* 2 * Copyright (C) 2010, Google Inc. 3 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> 4 * and other copyright owners as documented in the project's IP log. 5 * 6 * This program and the accompanying materials are made available 7 * under the terms of the Eclipse Distribution License v1.0 which 8 * accompanies this distribution, is reproduced below, and is 9 * available at http://www.eclipse.org/org/documents/edl-v10.php 10 * 11 * All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or 14 * without modification, are permitted provided that the following 15 * conditions are met: 16 * 17 * - Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 20 * - Redistributions in binary form must reproduce the above 21 * copyright notice, this list of conditions and the following 22 * disclaimer in the documentation and/or other materials provided 23 * with the distribution. 24 * 25 * - Neither the name of the Eclipse Foundation, Inc. nor the 26 * names of its contributors may be used to endorse or promote 27 * products derived from this software without specific prior 28 * written permission. 29 * 30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 31 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 32 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 33 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 34 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 35 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 36 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 37 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 38 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 39 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 42 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 43 */ 44 45 package org.eclipse.jgit.lib; 46 47 import org.eclipse.jgit.annotations.NonNull; 48 import org.eclipse.jgit.annotations.Nullable; 49 50 /** 51 * A {@link org.eclipse.jgit.lib.Ref} that points directly at an 52 * {@link org.eclipse.jgit.lib.ObjectId}. 53 */ 54 public abstract class ObjectIdRef implements Ref { 55 /** Any reference whose peeled value is not yet known. */ 56 public static class Unpeeled extends ObjectIdRef { 57 /** 58 * Create a new ref pairing. 59 * 60 * @param st 61 * method used to store this ref. 62 * @param name 63 * name of this ref. 64 * @param id 65 * current value of the ref. May be {@code null} to indicate 66 * a ref that does not exist yet. 67 */ 68 public Unpeeled(@NonNull Storage st, @NonNull String name, 69 @Nullable ObjectId id) { 70 super(st, name, id, -1); 71 } 72 73 /** 74 * Create a new ref pairing with update index. 75 * 76 * @param st 77 * method used to store this ref. 78 * @param name 79 * name of this ref. 80 * @param id 81 * current value of the ref. May be {@code null} to indicate 82 * a ref that does not exist yet. 83 * @param updateIndex 84 * number increasing with each update to the reference. 85 * @since 5.3 86 */ 87 public Unpeeled(@NonNull Storage st, @NonNull String name, 88 @Nullable ObjectId id, long updateIndex) { 89 super(st, name, id, updateIndex); 90 } 91 92 @Override 93 @Nullable 94 public ObjectId getPeeledObjectId() { 95 return null; 96 } 97 98 @Override 99 public boolean isPeeled() { 100 return false; 101 } 102 } 103 104 /** An annotated tag whose peeled object has been cached. */ 105 public static class PeeledTag extends ObjectIdRef { 106 private final ObjectId peeledObjectId; 107 108 /** 109 * Create a new ref pairing. 110 * 111 * @param st 112 * method used to store this ref. 113 * @param name 114 * name of this ref. 115 * @param id 116 * current value of the ref. 117 * @param p 118 * the first non-tag object that tag {@code id} points to. 119 */ 120 public PeeledTag(@NonNull Storage st, @NonNull String name, 121 @Nullable ObjectId/../../org/eclipse/jgit/lib/ObjectId.html#ObjectId">ObjectId id, @NonNull ObjectId p) { 122 super(st, name, id, -1); 123 peeledObjectId = p; 124 } 125 126 /** 127 * Create a new ref pairing with update index. 128 * 129 * @param st 130 * method used to store this ref. 131 * @param name 132 * name of this ref. 133 * @param id 134 * current value of the ref. May be {@code null} to indicate 135 * a ref that does not exist yet. 136 * @param p 137 * the first non-tag object that tag {@code id} points to. 138 * @param updateIndex 139 * number increasing with each update to the reference. 140 * @since 5.3 141 */ 142 public PeeledTag(@NonNull Storage st, @NonNull String name, 143 @Nullable ObjectId/../../org/eclipse/jgit/lib/ObjectId.html#ObjectId">ObjectId id, @NonNull ObjectId p, long updateIndex) { 144 super(st, name, id, updateIndex); 145 peeledObjectId = p; 146 } 147 148 @Override 149 @NonNull 150 public ObjectId getPeeledObjectId() { 151 return peeledObjectId; 152 } 153 154 @Override 155 public boolean isPeeled() { 156 return true; 157 } 158 } 159 160 /** A reference to a non-tag object coming from a cached source. */ 161 public static class PeeledNonTag extends ObjectIdRef { 162 /** 163 * Create a new ref pairing. 164 * 165 * @param st 166 * method used to store this ref. 167 * @param name 168 * name of this ref. 169 * @param id 170 * current value of the ref. May be {@code null} to indicate 171 * a ref that does not exist yet. 172 */ 173 public PeeledNonTag(@NonNull Storage st, @NonNull String name, 174 @Nullable ObjectId id) { 175 super(st, name, id, -1); 176 } 177 178 /** 179 * Create a new ref pairing with update index. 180 * 181 * @param st 182 * method used to store this ref. 183 * @param name 184 * name of this ref. 185 * @param id 186 * current value of the ref. May be {@code null} to indicate 187 * a ref that does not exist yet. 188 * @param updateIndex 189 * number increasing with each update to the reference. 190 * @since 5.3 191 */ 192 public PeeledNonTag(@NonNull Storage st, @NonNull String name, 193 @Nullable ObjectId id, long updateIndex) { 194 super(st, name, id, updateIndex); 195 } 196 197 @Override 198 @Nullable 199 public ObjectId getPeeledObjectId() { 200 return null; 201 } 202 203 @Override 204 public boolean isPeeled() { 205 return true; 206 } 207 } 208 209 private final String name; 210 211 private final Storage storage; 212 213 private final ObjectId objectId; 214 215 private final long updateIndex; 216 217 /** 218 * Create a new ref pairing. 219 * 220 * @param st 221 * method used to store this ref. 222 * @param name 223 * name of this ref. 224 * @param id 225 * current value of the ref. May be {@code null} to indicate a 226 * ref that does not exist yet. 227 * @param updateIndex 228 * number that increases with each ref update. Set to -1 if the 229 * storage doesn't support versioning. 230 * @since 5.3 231 */ 232 protected ObjectIdRef(@NonNull Storage st, @NonNull String name, 233 @Nullable ObjectId id, long updateIndex) { 234 this.name = name; 235 this.storage = st; 236 this.objectId = id; 237 this.updateIndex = updateIndex; 238 } 239 240 /** {@inheritDoc} */ 241 @Override 242 @NonNull 243 public String getName() { 244 return name; 245 } 246 247 /** {@inheritDoc} */ 248 @Override 249 public boolean isSymbolic() { 250 return false; 251 } 252 253 /** {@inheritDoc} */ 254 @Override 255 @NonNull 256 public Ref getLeaf() { 257 return this; 258 } 259 260 /** {@inheritDoc} */ 261 @Override 262 @NonNull 263 public Ref getTarget() { 264 return this; 265 } 266 267 /** {@inheritDoc} */ 268 @Override 269 @Nullable 270 public ObjectId getObjectId() { 271 return objectId; 272 } 273 274 /** {@inheritDoc} */ 275 @Override 276 @NonNull 277 public Storage getStorage() { 278 return storage; 279 } 280 281 /** 282 * {@inheritDoc} 283 * @since 5.3 284 */ 285 @Override 286 public long getUpdateIndex() { 287 if (updateIndex == -1) { 288 throw new UnsupportedOperationException(); 289 } 290 return updateIndex; 291 } 292 293 /** {@inheritDoc} */ 294 @NonNull 295 @Override 296 public String toString() { 297 StringBuilder r = new StringBuilder(); 298 r.append("Ref["); //$NON-NLS-1$ 299 r.append(getName()); 300 r.append('='); 301 r.append(ObjectId.toString(getObjectId())); 302 r.append('('); 303 r.append(updateIndex); // Print value, even if -1 304 r.append(")]"); //$NON-NLS-1$ 305 return r.toString(); 306 } 307 }