1 /* 2 * Copyright (C) 2010, Google Inc. 3 * and other copyright owners as documented in the project's IP log. 4 * 5 * This program and the accompanying materials are made available 6 * under the terms of the Eclipse Distribution License v1.0 which 7 * accompanies this distribution, is reproduced below, and is 8 * available at http://www.eclipse.org/org/documents/edl-v10.php 9 * 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or 13 * without modification, are permitted provided that the following 14 * conditions are met: 15 * 16 * - Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials provided 22 * with the distribution. 23 * 24 * - Neither the name of the Eclipse Foundation, Inc. nor the 25 * names of its contributors may be used to endorse or promote 26 * products derived from this software without specific prior 27 * written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 30 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 32 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 34 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 35 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 41 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 */ 43 44 package org.eclipse.jgit.errors; 45 46 import java.text.MessageFormat; 47 48 import org.eclipse.jgit.internal.JGitText; 49 import org.eclipse.jgit.lib.AnyObjectId; 50 import org.eclipse.jgit.lib.ObjectId; 51 52 /** 53 * An object is too big to load into memory as a single byte array. 54 */ 55 public class LargeObjectException extends RuntimeException { 56 private static final long serialVersionUID = 1L; 57 58 private ObjectId objectId; 59 60 /** 61 * Create a large object exception, where the object isn't known. 62 */ 63 public LargeObjectException() { 64 // Do nothing. 65 } 66 67 /** 68 * Create a large object exception, where the object isn't known. 69 * 70 * @param cause 71 * the cause 72 * @since 4.10 73 */ 74 public LargeObjectException(Throwable cause) { 75 initCause(cause); 76 } 77 78 /** 79 * Create a large object exception, naming the object that is too big. 80 * 81 * @param id 82 * identity of the object that is too big to be loaded as a byte 83 * array in this JVM. 84 */ 85 public LargeObjectException(AnyObjectId id) { 86 setObjectId(id); 87 } 88 89 /** 90 * Get identity of the object that is too large; may be null 91 * 92 * @return identity of the object that is too large; may be null 93 */ 94 public ObjectId getObjectId() { 95 return objectId; 96 } 97 98 /** 99 * Get the hex encoded name of the object, or 'unknown object' 100 * 101 * @return either the hex encoded name of the object, or 'unknown object' 102 */ 103 protected String getObjectName() { 104 if (getObjectId() != null) 105 return getObjectId().name(); 106 return JGitText.get().unknownObject; 107 } 108 109 /** 110 * Set the identity of the object, if its not already set. 111 * 112 * @param id 113 * the id of the object that is too large to process. 114 */ 115 public void setObjectId(AnyObjectId id) { 116 if (objectId == null) 117 objectId = id.copy(); 118 } 119 120 /** {@inheritDoc} */ 121 @Override 122 public String getMessage() { 123 return MessageFormat.format(JGitText.get().largeObjectException, 124 getObjectName()); 125 } 126 127 /** An error caused by the JVM being out of heap space. */ 128 public static class OutOfMemory extends LargeObjectException { 129 private static final long serialVersionUID = 1L; 130 131 /** 132 * Construct a wrapper around the original OutOfMemoryError. 133 * 134 * @param cause 135 * the original root cause. 136 */ 137 public OutOfMemory(OutOfMemoryError cause) { 138 initCause(cause); 139 } 140 141 @Override 142 public String getMessage() { 143 return MessageFormat.format(JGitText.get().largeObjectOutOfMemory, 144 getObjectName()); 145 } 146 } 147 148 /** Object size exceeds JVM limit of 2 GiB per byte array. */ 149 public static class ExceedsByteArrayLimit extends LargeObjectException { 150 private static final long serialVersionUID = 1L; 151 152 @Override 153 public String getMessage() { 154 return MessageFormat 155 .format(JGitText.get().largeObjectExceedsByteArray, 156 getObjectName()); 157 } 158 } 159 160 /** Object size exceeds the caller's upper limit. */ 161 public static class ExceedsLimit extends LargeObjectException { 162 private static final long serialVersionUID = 1L; 163 164 private final long limit; 165 166 private final long size; 167 168 /** 169 * Construct an exception for a particular size being exceeded. 170 * 171 * @param limit 172 * the limit the caller imposed on the object. 173 * @param size 174 * the actual size of the object. 175 */ 176 public ExceedsLimit(long limit, long size) { 177 this.limit = limit; 178 this.size = size; 179 } 180 181 @Override 182 public String getMessage() { 183 return MessageFormat.format(JGitText.get().largeObjectExceedsLimit, 184 getObjectName(), Long.valueOf(limit), Long.valueOf(size)); 185 } 186 } 187 }