001: /*
002: * Copyright (c) 2003-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.validation.message;
032:
033: import java.io.Serializable;
034:
035: import com.jgoodies.validation.Severity;
036: import com.jgoodies.validation.ValidationMessage;
037:
038: /**
039: * An abstract class that minimizes the effort required to implement the
040: * {@link ValidationMessage} interface. Holds the severity, a text message,
041: * and the association key.<p>
042: *
043: * Subclasses should implement <code>#equals</code> and <code>#hashCode</code>
044: * to prevent unnecessary change notifications for the <em>result</em> property
045: * when a ValidationResultModel gets a new ValidationResult. See for example
046: * the implementation of method {@link PropertyValidationMessage#equals(Object)}.
047: *
048: * @author Karsten Lentzsch
049: * @version $Revision: 1.7 $
050: */
051: public abstract class AbstractValidationMessage implements
052: ValidationMessage, Serializable {
053:
054: /**
055: * Holds this message's severity, either error or warning.
056: */
057: private final Severity severity;
058:
059: /**
060: * Holds the text messages.
061: */
062: private final String text;
063:
064: /**
065: * Holds the association key that can be used to model a loose coupling
066: * between messages and views.
067: *
068: * @see ValidationMessage
069: * @see #key()
070: * @see com.jgoodies.validation.ValidationResult#subResult(Object)
071: * @see com.jgoodies.validation.ValidationResult#keyMap()
072: */
073: private Object key;
074:
075: // Instance Creation ******************************************************
076:
077: /**
078: * Constructs an AbstractValidationMessage for the given text and Severity.
079: *
080: * @param text describes this message
081: * @param severity this message's severity, either error or warning
082: *
083: * @throws IllegalArgumentException if severity is <code>Severity.OK</code>
084: */
085: protected AbstractValidationMessage(String text, Severity severity) {
086: this (text, severity, null);
087: }
088:
089: /**
090: * Constructs an AbstractValidationMessage for the given text,
091: * Severity, and association key.
092: *
093: * @param text describes this message
094: * @param severity this message's severity, either error or warning
095: * @param key used to determine whether this message belongs
096: * to a given view
097: *
098: * @throws IllegalArgumentException if severity is <code>Severity.OK</code>
099: */
100: protected AbstractValidationMessage(String text, Severity severity,
101: Object key) {
102: if (severity == Severity.OK) {
103: throw new IllegalArgumentException(
104: "Cannot create a validation messages with Severity.OK.");
105: }
106: this .text = text;
107: this .severity = severity;
108: setKey(key);
109: }
110:
111: // Implementation of the ValidationMessage API ****************************
112:
113: /**
114: * Returns this message's severity, either error or warning.
115: *
116: * @return message's severity, either error or warning
117: */
118: public final Severity severity() {
119: return severity;
120: }
121:
122: /**
123: * Returns a message description as formatted text. This default
124: * implementation just returns the message text.
125: * Subclasses may override to add information about the type and
126: * other message related information.
127: *
128: * @return a message description as formatted text
129: */
130: public String formattedText() {
131: return text();
132: }
133:
134: /**
135: * Returns this validation message's text.
136: *
137: * @return the message text
138: */
139: protected final String text() {
140: return text;
141: }
142:
143: /**
144: * Returns this message's association key that can be used to model
145: * a loose coupling between validation messages and views that present
146: * the validated data.<p>
147: *
148: * Subclasses may override this method to return keys that are built from
149: * other internal data. For example, the {@link PropertyValidationMessage}
150: * returns the <em>aspect</em> as key.<p>
151: *
152: * See the class comment for more information about this relation.
153: *
154: * @return this message's association key
155: */
156: public Object key() {
157: return key;
158: }
159:
160: /**
161: * Sets the given object as new association key.
162: *
163: * @param associationKey the key to be set
164: */
165: protected final void setKey(Object associationKey) {
166: key = associationKey;
167: }
168:
169: /**
170: * Returns a string representation of this validation message.
171: * Prints the class name and the formatted text.
172: *
173: * @return a string representation of this validation message
174: * @see Object#toString()
175: */
176: @Override
177: public String toString() {
178: return getClass().getName() + ": " + formattedText();
179: }
180:
181: }
|