001: /* *************************************************************************
002:
003: Millstone(TM)
004: Open Sourced User Interface Library for
005: Internet Development with Java
006:
007: Millstone is a registered trademark of IT Mill Ltd
008: Copyright (C) 2000-2005 IT Mill Ltd
009:
010: *************************************************************************
011:
012: This library is free software; you can redistribute it and/or
013: modify it under the terms of the GNU Lesser General Public
014: license version 2.1 as published by the Free Software Foundation.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: *************************************************************************
026:
027: For more information, contact:
028:
029: IT Mill Ltd phone: +358 2 4802 7180
030: Ruukinkatu 2-4 fax: +358 2 4802 7181
031: 20540, Turku email: info@itmill.com
032: Finland company www: www.itmill.com
033:
034: Primary source for MillStone information and releases: www.millstone.org
035:
036: ********************************************************************** */
037:
038: package org.millstone.base.data;
039:
040: import org.millstone.base.terminal.ErrorMessage;
041: import org.millstone.base.terminal.PaintException;
042: import org.millstone.base.terminal.PaintTarget;
043:
044: /** Object validator interface. Implementors of this class can be added to
045: * any {@link org.millstone.base.data.Validatable} object to verify
046: * its value. The <code>Validatable#isValid(Object)</code> iterates all
047: * registered <code>Validator</code>s, calling their {@link #validate(Object)}
048: * methods. <code>validate(Object)</code> should throw the
049: * {@link Validator.InvalidValueException} if the given value is not valid
050: * by its standards.
051: *
052: * @author IT Mill Ltd.
053: * @version 3.1.1
054: * @since 3.0
055: */
056: public interface Validator {
057:
058: /** Checks the given value against this validator. If the value is valid
059: * this method should do nothing, and if it's not valid, it should throw
060: * <code>Validator.InvalidValueException</code>
061: *
062: * @param value the value to check
063: * @throws Validator.InvalidValueException if the value is not valid
064: */
065: public void validate(Object value)
066: throws Validator.InvalidValueException;
067:
068: /** Test if the the given value is valid.
069: * @param value the value to check
070: */
071: public boolean isValid(Object value);
072:
073: /** Adds the proposing functionality to a {@link Validator}. A
074: * <code>Suggestive</code> validator can propose a valid value for the
075: * object it is attached to validate. This way the {@link Validatable}
076: * object may avoid situations where it contains a value that could
077: * lead to a error.
078: * @author IT Mill Ltd.
079: * @version 3.1.1
080: * @since 3.0
081: */
082: public interface Suggestive extends Validator {
083:
084: /** Suggest another value that can be used instead of
085: * <code>proposedValue</code> if it is invalid. If it is valid
086: * in the opinion of this validator, however, it is returned as is.
087: *
088: * @param proposedValue Originally proposed value that could be
089: * invalid.
090: * @return Suggested value that's not invalid against this validator
091: */
092: public Object suggestValidValue(Object proposedValue);
093: }
094:
095: /** Invalid value exception can be thrown by {@link Validator} when a
096: * given value is not valid.
097: * @author IT Mill Ltd.
098: * @version 3.1.1
099: * @since 3.0
100: */
101: public class InvalidValueException extends RuntimeException
102: implements ErrorMessage {
103:
104: /**
105: * Serial generated by eclipse.
106: */
107: private static final long serialVersionUID = 3689073941163422257L;
108: /** Array of validation errors that are causing the problem. */
109: private InvalidValueException[] causes = null;
110:
111: /** Constructs a new <code>InvalidValueException</code> with the
112: * specified detail message.
113: *
114: * @param message The detail message of the problem.
115: */
116: public InvalidValueException(String message) {
117: this (message, new InvalidValueException[] {});
118: }
119:
120: /** Constructs a new <code>InvalidValueException</code> with a set
121: * of causing validation exceptions. The
122: * error message contains first the given message and then a list
123: * of validation errors in the given validatables.
124: *
125: * @param message The detail message of the problem.
126: * @param causes Array of validatables whos invalidities are possiblity causing the invalidity.
127: */
128: public InvalidValueException(String message,
129: InvalidValueException[] causes) {
130: super (message);
131: if (causes == null)
132: throw new NullPointerException(
133: "Possible causes array must not be null");
134: this .causes = causes;
135: }
136:
137: public final int getErrorLevel() {
138: return ErrorMessage.ERROR;
139: }
140:
141: public void paint(PaintTarget target) throws PaintException {
142: target.startTag("error");
143: target.addAttribute("level", "error");
144:
145: // Error message
146: String message = getLocalizedMessage();
147: if (message != null)
148: target.addText(message);
149:
150: // Paint all the causes
151: for (int i = 0; i < causes.length; i++) {
152: causes[i].paint(target);
153: }
154:
155: target.endTag("error");
156: }
157:
158: /* Documented in super interface */
159: public void addListener(RepaintRequestListener listener) {
160: }
161:
162: /* Documented in super interface */
163: public void removeListener(RepaintRequestListener listener) {
164: }
165:
166: /* Documented in super interface */
167: public void requestRepaint() {
168: }
169:
170: /* Documented in super interface */
171: public void requestRepaintRequests() {
172: }
173:
174: }
175: }
|