001 /*
002 * Copyright 2002-2005 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.springframework.binding.validation.support;
017
018 import java.util.Collection;
019 import java.util.Collections;
020 import java.util.HashSet;
021 import java.util.Iterator;
022 import java.util.Set;
023
024 import org.springframework.binding.validation.ValidationMessage;
025 import org.springframework.binding.validation.ValidationResults;
026 import org.springframework.core.style.ToStringCreator;
027 import org.springframework.richclient.core.Severity;
028 import org.springframework.util.CachingMapDecorator;
029 import org.springframework.util.ObjectUtils;
030
031 public class DefaultValidationResults implements ValidationResults {
032
033 private final Set messages = new HashSet();
034
035 private CachingMapDecorator messagesSubSets = new CachingMapDecorator() {
036
037 protected Object create(Object key) {
038 Set messagesSubSet = new HashSet();
039 for (Iterator i = messages.iterator(); i.hasNext();) {
040 ValidationMessage message = (ValidationMessage)i.next();
041 if (key instanceof Severity && message.getSeverity().equals(key)) {
042 messagesSubSet.add(message);
043 }
044 else if (ObjectUtils.nullSafeEquals(message.getProperty(), key)) {
045 messagesSubSet.add(message);
046 }
047 }
048 return Collections.unmodifiableSet(messagesSubSet);
049 }
050
051 };
052
053 public DefaultValidationResults() {
054 }
055
056 public DefaultValidationResults(ValidationResults validationResults) {
057 addAllMessages(validationResults);
058 }
059
060 public DefaultValidationResults(Collection validationMessages) {
061 addAllMessages(validationMessages);
062 }
063
064 public void addAllMessages(ValidationResults validationResults) {
065 addAllMessages(validationResults.getMessages());
066 }
067
068 public void addAllMessages(Collection validationMessages) {
069 if (messages.addAll(validationMessages)) {
070 messagesSubSets.clear();
071 }
072 }
073
074 public void addMessage(ValidationMessage validationMessage) {
075 if (messages.add(validationMessage)) {
076 messagesSubSets.clear();
077 }
078 }
079
080 public void addMessage(String field, Severity severity, String message) {
081 addMessage(new DefaultValidationMessage(field, severity, message));
082 }
083
084 public void removeMessage(ValidationMessage message) {
085 messages.remove(message);
086 messagesSubSets.clear();
087 }
088
089 public boolean getHasErrors() {
090 return getMessageCount(Severity.ERROR) > 0;
091 }
092
093 public boolean getHasWarnings() {
094 return getMessageCount(Severity.WARNING) > 0;
095 }
096
097 public boolean getHasInfo() {
098 return getMessageCount(Severity.INFO) > 0;
099 }
100
101 public int getMessageCount() {
102 return messages.size();
103 }
104
105 public int getMessageCount(Severity severity) {
106 return getMessages(severity).size();
107 }
108
109 public int getMessageCount(String fieldName) {
110 return getMessages(fieldName).size();
111 }
112
113 public Set getMessages() {
114 return Collections.unmodifiableSet(messages);
115 }
116
117 public Set getMessages(Severity severity) {
118 return (Set)messagesSubSets.get(severity);
119 }
120
121 public Set getMessages(String fieldName) {
122 return (Set)messagesSubSets.get(fieldName);
123 }
124
125 public String toString() {
126 return new ToStringCreator(this).append("messages", getMessages()).toString();
127 }
128
129 /**
130 * Clear all messages.
131 *
132 * @see RulesValidator#clearMessages()
133 */
134 public void clearMessages()
135 {
136 messages.clear();
137 messagesSubSets.clear();
138 }
139
140 /**
141 * Clear all messages of the given fieldName.
142 */
143 public void clearMessages(String fieldName) {
144 Set messagesForFieldName = getMessages(fieldName);
145 for (Iterator mi = messagesForFieldName.iterator(); mi.hasNext();) {
146 messages.remove(mi.next());
147 }
148 messagesSubSets.clear();
149 }
150 }