/* * Copyright (C) 2010, Google Inc. and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at * https://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: BSD-3-Clause */ package org.eclipse.jgit.errors; import java.text.MessageFormat; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.ObjectId; /** * An object is too big to load into memory as a single byte array. */ public class LargeObjectException extends RuntimeException { private static final long serialVersionUID = 1L; private ObjectId objectId; /** * Create a large object exception, where the object isn't known. */ public LargeObjectException() { // Do nothing. } /** * Create a large object exception, where the object isn't known. * * @param cause * the cause * @since 4.10 */ public LargeObjectException(Throwable cause) { initCause(cause); } /** * Create a large object exception, naming the object that is too big. * * @param id * identity of the object that is too big to be loaded as a byte * array in this JVM. */ public LargeObjectException(AnyObjectId id) { setObjectId(id); } /** * Get identity of the object that is too large; may be null * * @return identity of the object that is too large; may be null */ public ObjectId getObjectId() { return objectId; } /** * Get the hex encoded name of the object, or 'unknown object' * * @return either the hex encoded name of the object, or 'unknown object' */ protected String getObjectName() { if (getObjectId() != null) return getObjectId().name(); return JGitText.get().unknownObject; } /** * Set the identity of the object, if its not already set. * * @param id * the id of the object that is too large to process. */ public void setObjectId(AnyObjectId id) { if (objectId == null) objectId = id.copy(); } @Override public String getMessage() { return MessageFormat.format(JGitText.get().largeObjectException, getObjectName()); } /** An error caused by the JVM being out of heap space. */ public static class OutOfMemory extends LargeObjectException { private static final long serialVersionUID = 1L; /** * Construct a wrapper around the original OutOfMemoryError. * * @param cause * the original root cause. */ public OutOfMemory(OutOfMemoryError cause) { initCause(cause); } @Override public String getMessage() { return MessageFormat.format(JGitText.get().largeObjectOutOfMemory, getObjectName()); } } /** Object size exceeds JVM limit of 2 GiB per byte array. */ public static class ExceedsByteArrayLimit extends LargeObjectException { private static final long serialVersionUID = 1L; @Override public String getMessage() { return MessageFormat .format(JGitText.get().largeObjectExceedsByteArray, getObjectName()); } } /** Object size exceeds the caller's upper limit. */ public static class ExceedsLimit extends LargeObjectException { private static final long serialVersionUID = 1L; private final long limit; private final long size; /** * Construct an exception for a particular size being exceeded. * * @param limit * the limit the caller imposed on the object. * @param size * the actual size of the object. */ public ExceedsLimit(long limit, long size) { this.limit = limit; this.size = size; } @Override public String getMessage() { return MessageFormat.format(JGitText.get().largeObjectExceedsLimit, getObjectName(), Long.valueOf(limit), Long.valueOf(size)); } } }