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 }