001    /*
002     * Copyright 2011 The Kuali Foundation.
003     * 
004     * Licensed under the Educational Community 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.opensource.org/licenses/ecl2.php
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.kuali.kfs.module.ar.batch.report;
017    
018    import java.util.List;
019    import java.util.Map;
020    import java.util.Set;
021    import java.util.TreeMap;
022    import java.util.TreeSet;
023    
024    import org.apache.commons.lang.StringUtils;
025    import org.kuali.rice.kns.util.TypedArrayList;
026    
027    /**
028     * 
029     * Contains a set of errors while attempting to run a batch of 
030     * AR Customer Load entries.
031     * 
032     */
033    public class CustomerLoadBatchErrors {
034    
035        //  key = CustomerName
036        private Map<String, List<CustomerLoadBatchError>> batchErrors;
037        private int errorCount;
038        
039        /**
040         * 
041         * Creates a new CustomerLoadBatchErrors object, with empty internal content.
042         */
043        public CustomerLoadBatchErrors() {
044            //  initialize the internal storage
045            batchErrors = new TreeMap<String, List<CustomerLoadBatchError>>();
046            errorCount = 0;
047        }
048        
049        public CustomerLoadBatchErrors(CustomerLoadBatchError error) {
050    
051            //  initialize the internal storage
052            batchErrors = new TreeMap<String, List<CustomerLoadBatchError>>();
053            errorCount = 0;
054    
055            //  short circuit if no content is passed in
056            if (error == null) return;
057            
058            //  stick the constructor-passed entry in
059            batchErrors.put(error.getCustomerName(), new TypedArrayList(CustomerLoadBatchError.class));
060            batchErrors.get(error.getCustomerName()).add(error);
061            errorCount++;
062        }
063    
064        /**
065         * 
066         * Constructs a CustomerLoadBatchErrors with the specified List of CustomerLoadBatchError 
067         * objects as the starting content.
068         * 
069         * @param errors A List of CustomerLoadBatchError objects, which handles nulls and 
070         */
071        public CustomerLoadBatchErrors(List<CustomerLoadBatchError> errors) {
072    
073            //  initialize the internal storage
074            batchErrors = new TreeMap<String, List<CustomerLoadBatchError>>();
075    
076            //  short circuit if no content is passed in
077            if (errors == null) return;
078            if (errors.isEmpty()) return;
079            
080            addErrors(errors);
081        }
082    
083        public void addAll(CustomerLoadBatchErrors otherErrors) {
084            if (otherErrors == null) {
085                throw new IllegalArgumentException("Parameter otherErrors passed in was null.");
086            }
087            for (String customerName : otherErrors.getCompanyNames()) {
088                List<CustomerLoadBatchError> customerErrors = otherErrors.getErrorsByCompany(customerName);
089                for (CustomerLoadBatchError customerLoadBatchError : customerErrors) {
090                    addError(customerLoadBatchError);
091                }
092            }
093        }
094        
095        public void addError(CustomerLoadBatchError error) {
096            if (error == null) {
097                throw new IllegalArgumentException("Parameter 'error' passed in was null.");
098            }
099            if (!batchErrors.containsKey(error.getCustomerName())) {
100                batchErrors.put(error.getCustomerName(), new TypedArrayList(CustomerLoadBatchError.class));
101            }
102            batchErrors.get(error.getCustomerName()).add(error);
103            errorCount++;
104        }
105    
106        public void addError(String customerName, String propertyName, Class<?> propertyClass, String value, String description) {
107            if (StringUtils.isBlank(customerName)) {
108                throw new IllegalArgumentException("Parameter customerName was empty or null.");
109            }
110            if (StringUtils.isBlank(propertyName)) {
111                throw new IllegalArgumentException("Parameter propertyName was empty or null.");
112            }
113            if (StringUtils.isBlank(description)) {
114                throw new IllegalArgumentException("Parameter description was empty or null.");
115            }
116            CustomerLoadBatchError error = new CustomerLoadBatchError(customerName, propertyName, propertyClass, value, description);
117            addError(error);
118        }
119        
120        public void addErrors(List<CustomerLoadBatchError> errors) {
121            if (errors == null) { 
122                throw new IllegalArgumentException("Parameter 'error' passed in was null.");
123            }
124            for (CustomerLoadBatchError error : errors) {
125                addError(error);
126            }
127        }
128        
129        /**
130         * 
131         * Returns the companyName's that have errors in this list.
132         * 
133         * Note that the set of CompanyNames returned should be in ascending order 
134         * for String ordering.
135         * 
136         * Note that the underlying implementation's return is undefined where there 
137         * are no elements in the storage yet, so test for null first.
138         * 
139         * @return The set of companyName's that have errors.  
140         */
141        public Set<String> getCompanyNames() {
142            return batchErrors.keySet();
143        }
144        
145        /**
146         * 
147         * Returns the list of CustomerLoadBatchError objects for the given 
148         * companyName.
149         * 
150         * Note that null will be returned if there are no errors for that companyName.
151         * 
152         * Note that ordering of CustomerLoadBatchError objects for a given companyName is 
153         * undefined.
154         * 
155         * @param companyName The companyName you want errors for.
156         * @return The (possibly null or empty) List of CustomerLoadBatchError objects for the given companyName.
157         */
158        public List<CustomerLoadBatchError> getErrorsByCompany(String companyName) {
159            if (!batchErrors.containsKey(companyName)) {
160                return null;
161            }
162            return batchErrors.get(companyName);
163        }
164        
165        /**
166         * 
167         * Returns true if there are no elements (errors) in this object.
168         * @return True if no errors have been added, False if any have been.
169         */
170        public boolean isEmpty() {
171            return batchErrors.isEmpty();
172        }
173        
174        /**
175         * 
176         * Returns a string error for each error, suitable to go into some other error container.
177         * 
178         * The returned Set is sorted by natural order, and the String constructed should naturally order 
179         * by companyName, then propertyName, though this is not absolutely guaranteed in all cases.
180         * 
181         * @return A set of error messages.
182         */
183        public Set<String> getErrorStrings() {
184            Set<String> errors = new TreeSet<String>();
185            for (String companyName : batchErrors.keySet()) {
186                for (CustomerLoadBatchError error : batchErrors.get(companyName)) {
187                    errors.add(error.toString());
188                }
189            }
190            return errors;
191        }
192        
193        public int getCompaniesWithErrors() {
194            return batchErrors.size();
195        }
196        
197        public int getTotalErrors() {
198            return errorCount;
199        }
200    }