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
017 package org.kuali.kfs.gl.businessobject;
018
019 import java.util.ArrayList;
020 import java.util.Collections;
021 import java.util.Comparator;
022 import java.util.Iterator;
023 import java.util.LinkedHashMap;
024 import java.util.List;
025
026 import org.kuali.kfs.sys.KFSPropertyConstants;
027 import org.kuali.rice.kns.bo.PersistableBusinessObjectBase;
028
029 /**
030 * This class represents a GLCP correction change group
031 */
032 public class CorrectionChangeGroup extends PersistableBusinessObjectBase implements Comparable {
033 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CorrectionChangeGroup.class);
034
035 private String documentNumber;
036 private Integer correctionChangeGroupLineNumber;
037 private Integer correctionCriteriaNextLineNumber;
038 private Integer correctionChangeNextLineNumber;
039 private List<CorrectionCriteria> correctionCriteria;
040 private List<CorrectionChange> correctionChange;
041
042 public CorrectionChangeGroup(String documentNumber, Integer correctionChangeGroupLineNumber) {
043 setCorrectionChangeGroupLineNumber(correctionChangeGroupLineNumber);
044
045 correctionCriteria = new ArrayList();
046 correctionChange = new ArrayList();
047 correctionCriteriaNextLineNumber = new Integer(0);
048 correctionChangeNextLineNumber = new Integer(0);
049
050 setDocumentNumber(documentNumber);
051 }
052
053 public CorrectionChangeGroup() {
054 super();
055 correctionCriteria = new ArrayList();
056 correctionChange = new ArrayList();
057 correctionCriteriaNextLineNumber = new Integer(0);
058 correctionChangeNextLineNumber = new Integer(0);
059 }
060
061 /**
062 * Add correction change to this correction change group
063 *
064 * @param cc correction change to add
065 */
066 public void addCorrectionChange(CorrectionChange cc) {
067 LOG.debug("addCorrectionChange() started");
068
069 cc.setDocumentNumber(documentNumber);
070 cc.setCorrectionChangeGroupLineNumber(correctionChangeGroupLineNumber);
071 cc.setCorrectionChangeLineNumber(correctionChangeNextLineNumber++);
072 correctionChange.add(cc);
073 }
074
075 /**
076 * Add correction criteria to this correction change group
077 *
078 * @param cc correction criteria to add to this correction change group
079 */
080 public void addCorrectionCriteria(CorrectionCriteria cc) {
081 cc.setDocumentNumber(documentNumber);
082 cc.setCorrectionChangeGroupLineNumber(correctionChangeGroupLineNumber);
083 cc.setCorrectionCriteriaLineNumber(correctionCriteriaNextLineNumber++);
084 correctionCriteria.add(cc);
085 }
086
087 /**
088 * Remove correction change item
089 *
090 * @param changeNumber correction change line number used to determine which correction change item to remove
091 */
092 public void removeCorrectionChangeItem(int changeNumber) {
093 for (Iterator iter = correctionChange.iterator(); iter.hasNext();) {
094 CorrectionChange element = (CorrectionChange) iter.next();
095 if (changeNumber == element.getCorrectionChangeLineNumber().intValue()) {
096 iter.remove();
097 }
098 }
099 }
100
101 /**
102 * Remove correction criteria item
103 *
104 * @param criteriaNumber correction criteria line number used to determine which correction change to remove
105 */
106 public void removeCorrectionCriteriaItem(int criteriaNumber) {
107 for (Iterator iter = correctionCriteria.iterator(); iter.hasNext();) {
108 CorrectionCriteria element = (CorrectionCriteria) iter.next();
109 if (criteriaNumber == element.getCorrectionCriteriaLineNumber().intValue()) {
110 iter.remove();
111 }
112 }
113 }
114
115 /**
116 * Get correction change item
117 *
118 * @param changeNumber correction change line number of object to return
119 * @return CorrectionChange correction change object with specified line number to return
120 */
121 public CorrectionChange getCorrectionChangeItem(int changeNumber) {
122 for (Iterator iter = correctionChange.iterator(); iter.hasNext();) {
123 CorrectionChange element = (CorrectionChange) iter.next();
124 if (changeNumber == element.getCorrectionChangeLineNumber().intValue()) {
125 return element;
126 }
127 }
128
129 CorrectionChange cc = new CorrectionChange(getDocumentNumber(), correctionChangeGroupLineNumber, changeNumber);
130 correctionChange.add(cc);
131
132 return cc;
133 }
134
135
136 /**
137 * Get correction criteria item
138 *
139 * @param criteriaNumber correction change line number of object to return
140 * @return CorrectionChange correction change object with specified line number to return
141 */
142 public CorrectionCriteria getCorrectionCriteriaItem(int criteriaNumber) {
143 for (Iterator iter = correctionCriteria.iterator(); iter.hasNext();) {
144 CorrectionCriteria element = (CorrectionCriteria) iter.next();
145 if (criteriaNumber == element.getCorrectionCriteriaLineNumber().intValue()) {
146 return element;
147 }
148 }
149
150 CorrectionCriteria cc = new CorrectionCriteria(getDocumentNumber(), correctionChangeGroupLineNumber, criteriaNumber);
151 correctionCriteria.add(cc);
152 return cc;
153 }
154
155 public String getDocumentNumber() {
156 return documentNumber;
157 }
158
159 /**
160 * Set document number for this correction change group. This also sets the document number for this correction change group's
161 * correction criteria and correction change
162 *
163 * @param documentNumber new document number
164 */
165 public void setDocumentNumber(String documentNumber) {
166 this.documentNumber = documentNumber;
167
168 for (Iterator iter = correctionCriteria.iterator(); iter.hasNext();) {
169 CorrectionCriteria element = (CorrectionCriteria) iter.next();
170 element.setDocumentNumber(documentNumber);
171 }
172 for (Iterator iter = correctionChange.iterator(); iter.hasNext();) {
173 CorrectionChange element = (CorrectionChange) iter.next();
174 element.setDocumentNumber(documentNumber);
175 }
176 }
177
178 public Integer getCorrectionChangeGroupLineNumber() {
179 return correctionChangeGroupLineNumber;
180 }
181
182 public void setCorrectionChangeGroupLineNumber(Integer correctionChangeGroupLineNumber) {
183 this.correctionChangeGroupLineNumber = correctionChangeGroupLineNumber;
184 }
185
186 public Integer getCorrectionCriteriaNextLineNumber() {
187 return correctionCriteriaNextLineNumber;
188 }
189
190 public void setCorrectionCriteriaNextLineNumber(Integer correctionCriteriaNextLineNumber) {
191 this.correctionCriteriaNextLineNumber = correctionCriteriaNextLineNumber;
192 }
193
194 public Integer getCorrectionChangeNextLineNumber() {
195 return correctionChangeNextLineNumber;
196 }
197
198 public void setCorrectionChangeNextLineNumber(Integer correctionChangeNextLineNumber) {
199 this.correctionChangeNextLineNumber = correctionChangeNextLineNumber;
200 }
201
202 public List<CorrectionCriteria> getCorrectionCriteria() {
203 Collections.sort(correctionCriteria);
204 return correctionCriteria;
205 }
206
207 public void setCorrectionCriteria(List<CorrectionCriteria> correctionCriteria) {
208 this.correctionCriteria = correctionCriteria;
209 }
210
211 public List<CorrectionChange> getCorrectionChange() {
212 Collections.sort(correctionChange);
213 return correctionChange;
214 }
215
216 public void setCorrectionChange(List<CorrectionChange> correctionChange) {
217 this.correctionChange = correctionChange;
218 }
219
220 /**
221 * Compares this correction change group to another correction change group object by comparing document number and correction group line number
222 *
223 * @see java.lang.Comparable#compareTo(java.lang.Object)
224 */
225 public int compareTo(Object o) {
226 CorrectionChangeGroup other = (CorrectionChangeGroup) o;
227
228 String thisFdocNbr = documentNumber == null ? "" : documentNumber;
229 String thatFdocNbr = other.documentNumber == null ? "" : other.documentNumber;
230
231 int c = thisFdocNbr.compareTo(thatFdocNbr);
232 if (c == 0) {
233 Integer thisNbr = correctionChangeGroupLineNumber == null ? 0 : correctionChangeGroupLineNumber;
234 Integer thatNbr = other.correctionChangeGroupLineNumber == null ? 0 : other.correctionChangeGroupLineNumber;
235 return thisNbr.compareTo(thatNbr);
236 }
237 else {
238 return c;
239 }
240 }
241
242 /**
243 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
244 */
245 protected LinkedHashMap toStringMapper() {
246 LinkedHashMap m = new LinkedHashMap();
247 m.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.documentNumber);
248 if (this.correctionChangeGroupLineNumber != null) {
249 m.put("correctionChangeGroupLineNumber", this.correctionChangeGroupLineNumber.toString());
250 }
251 return m;
252 }
253
254 /**
255 * A comparator that compares to GLCP correction change groups based on their group line numbers
256 * within the GLCP document
257 */
258 public static class CorrectionGroupLineNumberComparator implements Comparator {
259
260 /**
261 * Constructs a CorrectionGroupLineNumberComparator instance
262 */
263 public CorrectionGroupLineNumberComparator() {
264 }
265
266 /**
267 * Compares two CorrectionChangeGroups based on thier line numbers within a GLCP document
268 *
269 * @param c1 a correction change group to compare
270 * @param c2 another correction change group to compare the first one to
271 * @return a negative integer if c1 has a lower line number than c2, 0 if the two line numbers are equal, a positive number if c1 has a greater line number than c2
272 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
273 */
274 public int compare(Object c1, Object c2) {
275
276 CorrectionChangeGroup ccg1 = (CorrectionChangeGroup) c1;
277 CorrectionChangeGroup ccg2 = (CorrectionChangeGroup) c2;
278
279 return ccg1.getCorrectionChangeGroupLineNumber().compareTo(ccg2.getCorrectionChangeGroupLineNumber());
280 }
281
282 }
283 }