/*
* Copyright 2001-2006 Stephen Colebourne
*
* Licensed 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.joda.time;
/**
* Exception thrown when attempting to set a field outside its supported range.
*
* @author Brian S O'Neill
* @since 1.1
*/
public class
IllegalFieldValueException extends
IllegalArgumentException {
/** Serialization lock. */
private static final long
serialVersionUID = 6305711765985447737L;
/**
* Creates a message for the exception.
*
* @param fieldName the field name
* @param value the value rejected
* @param lowerBound the lower bound allowed
* @param upperBound the upper bound allowed
* @param explain an explanation
* @return the message
*/
private static
String createMessage(
String fieldName,
Number value,
Number lowerBound,
Number upperBound,
String explain) {
StringBuilder buf = new
StringBuilder()
.
append("Value ").
append(
value).
append(" for ").
append(
fieldName).
append(' ');
if (
lowerBound == null) {
if (
upperBound == null) {
buf.
append("is not supported");
} else {
buf.
append("must not be larger than ").
append(
upperBound);
}
} else if (
upperBound == null) {
buf.
append("must not be smaller than ").
append(
lowerBound);
} else {
buf.
append("must be in the range [")
.
append(
lowerBound)
.
append(',')
.
append(
upperBound)
.
append(']');
}
if (
explain != null) {
buf.
append(": ").
append(
explain);
}
return
buf.
toString();
}
/**
* Creates a message for the exception.
*
* @param fieldName the field name
* @param value the value rejected
* @return the message
*/
private static
String createMessage(
String fieldName,
String value) {
StringBuffer buf = new
StringBuffer().
append("Value ");
if (
value == null) {
buf.
append("null");
} else {
buf.
append('"');
buf.
append(
value);
buf.
append('"');
}
buf.
append(" for ").
append(
fieldName).
append(' ').
append("is not supported");
return
buf.
toString();
}
private final
DateTimeFieldType iDateTimeFieldType;
private final
DurationFieldType iDurationFieldType;
private final
String iFieldName;
private final
Number iNumberValue;
private final
String iStringValue;
private final
Number iLowerBound;
private final
Number iUpperBound;
private
String iMessage;
/**
* Constructor.
*
* @param fieldType type of field being set
* @param value illegal value being set
* @param lowerBound lower legal field value, or null if not applicable
* @param upperBound upper legal field value, or null if not applicable
*/
public
IllegalFieldValueException(
DateTimeFieldType fieldType,
Number value,
Number lowerBound,
Number upperBound) {
super(
createMessage(
fieldType.
getName(),
value,
lowerBound,
upperBound, null));
iDateTimeFieldType =
fieldType;
iDurationFieldType = null;
iFieldName =
fieldType.
getName();
iNumberValue =
value;
iStringValue = null;
iLowerBound =
lowerBound;
iUpperBound =
upperBound;
iMessage = super.getMessage();
}
/**
* Constructor.
*
* @param fieldType type of field being set
* @param value illegal value being set
* @param explain an explanation
* @since 1.5
*/
public
IllegalFieldValueException(
DateTimeFieldType fieldType,
Number value,
String explain) {
super(
createMessage(
fieldType.
getName(),
value, null, null,
explain));
iDateTimeFieldType =
fieldType;
iDurationFieldType = null;
iFieldName =
fieldType.
getName();
iNumberValue =
value;
iStringValue = null;
iLowerBound = null;
iUpperBound = null;
iMessage = super.getMessage();
}
/**
* Constructor.
*
* @param fieldType type of field being set
* @param value illegal value being set
* @param lowerBound lower legal field value, or null if not applicable
* @param upperBound upper legal field value, or null if not applicable
*/
public
IllegalFieldValueException(
DurationFieldType fieldType,
Number value,
Number lowerBound,
Number upperBound) {
super(
createMessage(
fieldType.
getName(),
value,
lowerBound,
upperBound, null));
iDateTimeFieldType = null;
iDurationFieldType =
fieldType;
iFieldName =
fieldType.
getName();
iNumberValue =
value;
iStringValue = null;
iLowerBound =
lowerBound;
iUpperBound =
upperBound;
iMessage = super.getMessage();
}
/**
* Constructor.
*
* @param fieldName name of field being set
* @param value illegal value being set
* @param lowerBound lower legal field value, or null if not applicable
* @param upperBound upper legal field value, or null if not applicable
*/
public
IllegalFieldValueException(
String fieldName,
Number value,
Number lowerBound,
Number upperBound) {
super(
createMessage(
fieldName,
value,
lowerBound,
upperBound, null));
iDateTimeFieldType = null;
iDurationFieldType = null;
iFieldName =
fieldName;
iNumberValue =
value;
iStringValue = null;
iLowerBound =
lowerBound;
iUpperBound =
upperBound;
iMessage = super.getMessage();
}
/**
* Constructor.
*
* @param fieldType type of field being set
* @param value illegal value being set
*/
public
IllegalFieldValueException(
DateTimeFieldType fieldType,
String value) {
super(
createMessage(
fieldType.
getName(),
value));
iDateTimeFieldType =
fieldType;
iDurationFieldType = null;
iFieldName =
fieldType.
getName();
iStringValue =
value;
iNumberValue = null;
iLowerBound = null;
iUpperBound = null;
iMessage = super.getMessage();
}
/**
* Constructor.
*
* @param fieldType type of field being set
* @param value illegal value being set
*/
public
IllegalFieldValueException(
DurationFieldType fieldType,
String value) {
super(
createMessage(
fieldType.
getName(),
value));
iDateTimeFieldType = null;
iDurationFieldType =
fieldType;
iFieldName =
fieldType.
getName();
iStringValue =
value;
iNumberValue = null;
iLowerBound = null;
iUpperBound = null;
iMessage = super.getMessage();
}
/**
* Constructor.
*
* @param fieldName name of field being set
* @param value illegal value being set
*/
public
IllegalFieldValueException(
String fieldName,
String value) {
super(
createMessage(
fieldName,
value));
iDateTimeFieldType = null;
iDurationFieldType = null;
iFieldName =
fieldName;
iStringValue =
value;
iNumberValue = null;
iLowerBound = null;
iUpperBound = null;
iMessage = super.getMessage();
}
//-----------------------------------------------------------------------
/**
* Returns the DateTimeFieldType whose value was invalid, or null if not applicable.
*
* @return the datetime field type
*/
public
DateTimeFieldType getDateTimeFieldType() {
return
iDateTimeFieldType;
}
/**
* Returns the DurationFieldType whose value was invalid, or null if not applicable.
*
* @return the duration field type
*/
public
DurationFieldType getDurationFieldType() {
return
iDurationFieldType;
}
/**
* Returns the name of the field whose value was invalid.
*
* @return the field name
*/
public
String getFieldName() {
return
iFieldName;
}
/**
* Returns the illegal integer value assigned to the field, or null if not applicable.
*
* @return the value
*/
public
Number getIllegalNumberValue() {
return
iNumberValue;
}
/**
* Returns the illegal string value assigned to the field, or null if not applicable.
*
* @return the value
*/
public
String getIllegalStringValue() {
return
iStringValue;
}
/**
* Returns the illegal value assigned to the field as a non-null string.
*
* @return the value
*/
public
String getIllegalValueAsString() {
String value =
iStringValue;
if (
value == null) {
value =
String.
valueOf(
iNumberValue);
}
return
value;
}
/**
* Returns the lower bound of the legal value range, or null if not applicable.
*
* @return the lower bound
*/
public
Number getLowerBound() {
return
iLowerBound;
}
/**
* Returns the upper bound of the legal value range, or null if not applicable.
*
* @return the upper bound
*/
public
Number getUpperBound() {
return
iUpperBound;
}
public
String getMessage() {
return
iMessage;
}
/**
* Provide additional detail by prepending a message to the existing message.
* A colon is separator is automatically inserted between the messages.
* @since 1.3
*/
public void
prependMessage(
String message) {
if (
iMessage == null) {
iMessage =
message;
} else if (
message != null) {
iMessage =
message + ": " +
iMessage;
}
}
}