001    /*
002     * Copyright 2002-2004 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * 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, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.form;
017    
018    import java.util.Iterator;
019    
020    import org.springframework.binding.validation.ValidationMessage;
021    import org.springframework.binding.validation.ValidationResults;
022    import org.springframework.binding.validation.ValidationResultsModel;
023    import org.springframework.richclient.dialog.Messagable;
024    import org.springframework.util.Assert;
025    
026    /**
027     * An implementation of ValidationResultsReporter that reports only a single
028     * message from the configured validation results model to the associated
029     * message receiver. More details of the searching process can be found in the
030     * {@link #getValidationMessage(ValidationResults)} method.
031     *
032     * @author Keith Donald
033     * @author Jan Hoskens
034     */
035    public class SimpleValidationResultsReporter implements ValidationResultsReporter {
036    
037            /** ResultsModel containing the messages. */
038            private ValidationResultsModel resultsModel;
039    
040            /** Recipient for the message. */
041            private Messagable messageReceiver;
042    
043            /**
044             * Constructor.
045             *
046             * @param resultsModel ValidationResultsModel to monitor and report on.
047             * @param messageReceiver The receiver for validation messages.
048             */
049            public SimpleValidationResultsReporter(ValidationResultsModel resultsModel, Messagable messageReceiver) {
050                    Assert.notNull(resultsModel, "resultsModel is required");
051                    Assert.notNull(messageReceiver, "messagePane is required");
052                    this.resultsModel = resultsModel;
053                    this.messageReceiver = messageReceiver;
054                    init();
055            }
056    
057            /**
058             * Initialize listener and trigger a first-time check.
059             */
060            private void init() {
061                    resultsModel.addValidationListener(this);
062                    validationResultsChanged(null);
063            }
064    
065            /**
066             * Clear the messageReceiver.
067             */
068            public void clearErrors() {
069                    messageReceiver.setMessage(null);
070            }
071    
072            /**
073             * Handle a change in the validation results model. Update the message
074             * receiver based on our current results model state.
075             */
076            public void validationResultsChanged(ValidationResults results) {
077                    if (resultsModel.getMessageCount() == 0) {
078                            messageReceiver.setMessage(null);
079                    }
080                    else {
081                            ValidationMessage message = getValidationMessage(resultsModel);
082                            messageReceiver.setMessage(message);
083                    }
084            }
085    
086            /**
087             * <p>
088             * Get the message that should be reported.
089             * </p>
090             *
091             * Searching takes following rules into account:
092             * <ul>
093             * <li>Severity of the selected message is the most severe one (INFO <
094             * WARNING < ERROR).</li>
095             * <li>Timestamp of the selected message is the most recent one of the
096             * result of the previous rule.</li>
097             * </ul>
098             *
099             * Any custom Severities will be placed in order according to their given
100             * magnitude.
101             *
102             * @param resultsModel Search this model to find the message.
103             * @return the message to display on the Messagable.
104             */
105            protected ValidationMessage getValidationMessage(ValidationResults resultsModel) {
106                    ValidationMessage validationMessage = null;
107            for (Iterator i = resultsModel.getMessages().iterator(); i.hasNext();) {
108                ValidationMessage tmpMessage = (ValidationMessage) i.next();
109                if (validationMessage == null
110                        || (validationMessage.getSeverity().compareTo(tmpMessage.getSeverity()) < 0)
111                        || ((validationMessage.getTimestamp() < tmpMessage.getTimestamp()) && (validationMessage
112                                .getSeverity() == tmpMessage.getSeverity()))) {
113                    validationMessage = tmpMessage;
114                }
115            }
116            return validationMessage;
117            }
118    
119            /**
120             * @see org.springframework.richclient.form.ValidationResultsReporter#hasErrors()
121             */
122            public boolean hasErrors() {
123                    return resultsModel.getHasErrors();
124            }
125    }