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 /** An object is too big to load into memory as a single byte array. */ 53 public class LargeObjectException extends RuntimeException { 54 private static final long serialVersionUID = 1L; 55 56 private ObjectId objectId; 57 58 /** Create a large object exception, where the object isn't known. */ 59 public LargeObjectException() { 60 // Do nothing. 61 } 62 63 /** 64 * Create a large object exception, naming the object that is too big. 65 * 66 * @param id 67 * identity of the object that is too big to be loaded as a byte 68 * array in this JVM. 69 */ 70 public LargeObjectException(AnyObjectId id) { 71 setObjectId(id); 72 } 73 74 /** @return identity of the object that is too large; may be null. */ 75 public ObjectId getObjectId() { 76 return objectId; 77 } 78 79 /** @return either the hex encoded name of the object, or 'unknown object'. */ 80 protected String getObjectName() { 81 if (getObjectId() != null) 82 return getObjectId().name(); 83 return JGitText.get().unknownObject; 84 } 85 86 /** 87 * Set the identity of the object, if its not already set. 88 * 89 * @param id 90 * the id of the object that is too large to process. 91 */ 92 public void setObjectId(AnyObjectId id) { 93 if (objectId == null) 94 objectId = id.copy(); 95 } 96 97 @Override 98 public String getMessage() { 99 return MessageFormat.format(JGitText.get().largeObjectException, 100 getObjectName()); 101 } 102 103 /** An error caused by the JVM being out of heap space. */ 104 public static class OutOfMemory extends LargeObjectException { 105 private static final long serialVersionUID = 1L; 106 107 /** 108 * Construct a wrapper around the original OutOfMemoryError. 109 * 110 * @param cause 111 * the original root cause. 112 */ 113 public OutOfMemory(OutOfMemoryError cause) { 114 initCause(cause); 115 } 116 117 @Override 118 public String getMessage() { 119 return MessageFormat.format(JGitText.get().largeObjectOutOfMemory, 120 getObjectName()); 121 } 122 } 123 124 /** Object size exceeds JVM limit of 2 GiB per byte array. */ 125 public static class ExceedsByteArrayLimit extends LargeObjectException { 126 private static final long serialVersionUID = 1L; 127 128 @Override 129 public String getMessage() { 130 return MessageFormat 131 .format(JGitText.get().largeObjectExceedsByteArray, 132 getObjectName()); 133 } 134 } 135 136 /** Object size exceeds the caller's upper limit. */ 137 public static class ExceedsLimit extends LargeObjectException { 138 private static final long serialVersionUID = 1L; 139 140 private final long limit; 141 142 private final long size; 143 144 /** 145 * Construct an exception for a particular size being exceeded. 146 * 147 * @param limit 148 * the limit the caller imposed on the object. 149 * @param size 150 * the actual size of the object. 151 */ 152 public ExceedsLimit(long limit, long size) { 153 this.limit = limit; 154 this.size = size; 155 } 156 157 @Override 158 public String getMessage() { 159 return MessageFormat.format(JGitText.get().largeObjectExceedsLimit, 160 getObjectName(), Long.valueOf(limit), Long.valueOf(size)); 161 } 162 } 163 }