blob: c895e5170a942e569e181694b7abc311244d89e1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.util;
import org.opengis.referencing.IdentifiedObject;
/**
* May be thrown on attempt to use an object which has been corrupted by a previous operation.
* Apache SIS throws this exception only on a <em>best effort</em> basis, when it detected an
* object in an inconsistent state <em>after</em> the original problem.
*
* <div class="note"><b>Analogy:</b>
* this exception has a similar goal than {@link java.util.ConcurrentModificationException}: to reduce the risk of
* non-deterministic behavior at an undetermined time in the future after an event has compromised the data integrity.
* Like {@code ConcurrentModificationException}, this {@code CorruptedObjectException} should be used only to detect
* bugs; it would be wrong to write a program that depends on this exception for its correctness.
*
* <p>This exception is different than {@link AssertionError} in that {@code CorruptedObjectException} is not
* necessarily caused by a bug in the library. An object may become corrupted because of external factors, as
* illustrated in the use cases below.</p></div>
*
* Some use cases for this exception are:
* <ul class="verbose">
* <li><b>Attempt to use an aborted calculation:</b><br>
* if an operation failed in the middle of a structural modification, some specific exception (<strong>not</strong>
* this {@code CorruptedObjectException}) should be thrown and the object discarded. But if the user does not discard
* the object and try to use it again, unpredictable behavior may happen. Some implementations are robust enough for
* detecting such unsafe usage: their methods may throw this {@code CorruptedObjectException} on attempt to use the
* object after the original failure.</li>
*
* <li><b>Change in an “immutable” object:</b><br>
* some objects are expected to be immutable. For example the same Coordinate Reference System (CRS) instance is
* typically shared by thousands of objects. However {@link org.opengis.referencing.crs.CoordinateReferenceSystem}
* is an interface, Therefore, nothing prevent users from providing a mutable instance. For example if the value
* returned by {@link org.opengis.referencing.cs.CoordinateSystem#getDimension()} changes between two invocations,
* many objects that use that coordinate system will fall in an inconsistent state. If an operation detects such
* inconsistency, it may throw this {@code CorruptedObjectException}.</li>
* </ul>
*
* <h2>Exception cause</h2>
* Since this exception may be thrown an undetermined amount of time after the data corruption, the root cause is
* often unknown at this point. Sometime a more descriptive exception has been thrown earlier, but may have been
* ignored by the user.
*
* @author Martin Desruisseaux (Geomatys)
* @version 1.0
* @since 0.5
* @module
*/
public class CorruptedObjectException extends RuntimeException {
/**
* For cross-version compatibility.
*/
private static final long serialVersionUID = -7595678373605419502L;
/**
* Constructs a new exception with no message.
*/
public CorruptedObjectException() {
super();
}
/**
* Constructs a new exception with the specified detail message.
*
* @param message the detail message, or {@code null} if none.
*/
public CorruptedObjectException(final String message) {
super(message);
}
/**
* Constructs a new exception with the specified cause.
*
* @param cause the cause, or {@code null} if none.
*
* @since 1.0
*/
public CorruptedObjectException(final Exception cause) {
super(cause);
}
/**
* Constructs a new exception with the name of the given object.
*
* @param object the corrupted object, or {@code null} if unknown.
*
* @since 0.6
*/
public CorruptedObjectException(final IdentifiedObject object) {
super(object != null ? String.valueOf(object.getName()) : null);
}
}