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    }