/** * Copyright (C) 2015 Valkyrie RCP * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.valkyriercp.binding.validation.support; import org.springframework.binding.collection.AbstractCachingMapDecorator; import org.springframework.core.style.ToStringCreator; import org.springframework.util.ObjectUtils; import org.valkyriercp.binding.validation.ValidationMessage; import org.valkyriercp.binding.validation.ValidationResults; import org.valkyriercp.core.Severity; import java.util.*; public class DefaultValidationResults implements ValidationResults { private final Set messages = new HashSet(); private AbstractCachingMapDecorator messagesSubSets = new AbstractCachingMapDecorator() { protected Object create(Object key) { Set messagesSubSet = new HashSet(); for (Iterator i = messages.iterator(); i.hasNext();) { ValidationMessage message = (ValidationMessage)i.next(); if (key instanceof Severity && message.getSeverity().equals(key)) { messagesSubSet.add(message); } else if (ObjectUtils.nullSafeEquals(message.getProperty(), key)) { messagesSubSet.add(message); } } return Collections.unmodifiableSet(messagesSubSet); } }; public DefaultValidationResults() { } public DefaultValidationResults(ValidationResults validationResults) { addAllMessages(validationResults); } public DefaultValidationResults(Collection validationMessages) { addAllMessages(validationMessages); } public void addAllMessages(ValidationResults validationResults) { addAllMessages(validationResults.getMessages()); } public void addAllMessages(Collection validationMessages) { if (messages.addAll(validationMessages)) { messagesSubSets.clear(); } } public void addMessage(ValidationMessage validationMessage) { if (messages.add(validationMessage)) { messagesSubSets.clear(); } } public void addMessage(String field, Severity severity, String message) { addMessage(new DefaultValidationMessage(field, severity, message)); } public void removeMessage(ValidationMessage message) { messages.remove(message); messagesSubSets.clear(); } public boolean getHasErrors() { return getMessageCount(Severity.ERROR) > 0; } public boolean getHasWarnings() { return getMessageCount(Severity.WARNING) > 0; } public boolean getHasInfo() { return getMessageCount(Severity.INFO) > 0; } public int getMessageCount() { return messages.size(); } public int getMessageCount(Severity severity) { return getMessages(severity).size(); } public int getMessageCount(String fieldName) { return getMessages(fieldName).size(); } public Set getMessages() { return Collections.unmodifiableSet(messages); } public Set getMessages(Severity severity) { return (Set)messagesSubSets.get(severity); } public Set getMessages(String fieldName) { return (Set)messagesSubSets.get(fieldName); } public String toString() { return new ToStringCreator(this).append("messages", getMessages()).toString(); } /** * Clear all messages. */ public void clearMessages() { messages.clear(); messagesSubSets.clear(); } /** * Clear all messages of the given fieldName. */ public void clearMessages(String fieldName) { Set messagesForFieldName = getMessages(fieldName); for (Iterator mi = messagesForFieldName.iterator(); mi.hasNext();) { messages.remove(mi.next()); } messagesSubSets.clear(); } }