/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.gl.businessobject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
/**
* This class represents a GLCP correction change group
*/
public class CorrectionChangeGroup extends PersistableBusinessObjectBase implements Comparable {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CorrectionChangeGroup.class);
private String documentNumber;
private Integer correctionChangeGroupLineNumber;
private Integer correctionCriteriaNextLineNumber;
private Integer correctionChangeNextLineNumber;
private List<CorrectionCriteria> correctionCriteria;
private List<CorrectionChange> correctionChange;
public CorrectionChangeGroup(String documentNumber, Integer correctionChangeGroupLineNumber) {
setCorrectionChangeGroupLineNumber(correctionChangeGroupLineNumber);
correctionCriteria = new ArrayList();
correctionChange = new ArrayList();
correctionCriteriaNextLineNumber = new Integer(0);
correctionChangeNextLineNumber = new Integer(0);
setDocumentNumber(documentNumber);
}
public CorrectionChangeGroup() {
super();
correctionCriteria = new ArrayList();
correctionChange = new ArrayList();
correctionCriteriaNextLineNumber = new Integer(0);
correctionChangeNextLineNumber = new Integer(0);
}
/**
* Add correction change to this correction change group
*
* @param cc correction change to add
*/
public void addCorrectionChange(CorrectionChange cc) {
LOG.debug("addCorrectionChange() started");
cc.setDocumentNumber(documentNumber);
cc.setCorrectionChangeGroupLineNumber(correctionChangeGroupLineNumber);
cc.setCorrectionChangeLineNumber(correctionChangeNextLineNumber++);
correctionChange.add(cc);
}
/**
* Add correction criteria to this correction change group
*
* @param cc correction criteria to add to this correction change group
*/
public void addCorrectionCriteria(CorrectionCriteria cc) {
cc.setDocumentNumber(documentNumber);
cc.setCorrectionChangeGroupLineNumber(correctionChangeGroupLineNumber);
cc.setCorrectionCriteriaLineNumber(correctionCriteriaNextLineNumber++);
correctionCriteria.add(cc);
}
/**
* Remove correction change item
*
* @param changeNumber correction change line number used to determine which correction change item to remove
*/
public void removeCorrectionChangeItem(int changeNumber) {
for (Iterator iter = correctionChange.iterator(); iter.hasNext();) {
CorrectionChange element = (CorrectionChange) iter.next();
if (changeNumber == element.getCorrectionChangeLineNumber().intValue()) {
iter.remove();
}
}
}
/**
* Remove correction criteria item
*
* @param criteriaNumber correction criteria line number used to determine which correction change to remove
*/
public void removeCorrectionCriteriaItem(int criteriaNumber) {
for (Iterator iter = correctionCriteria.iterator(); iter.hasNext();) {
CorrectionCriteria element = (CorrectionCriteria) iter.next();
if (criteriaNumber == element.getCorrectionCriteriaLineNumber().intValue()) {
iter.remove();
}
}
}
/**
* Get correction change item
*
* @param changeNumber correction change line number of object to return
* @return CorrectionChange correction change object with specified line number to return
*/
public CorrectionChange getCorrectionChangeItem(int changeNumber) {
for (Iterator iter = correctionChange.iterator(); iter.hasNext();) {
CorrectionChange element = (CorrectionChange) iter.next();
if (changeNumber == element.getCorrectionChangeLineNumber().intValue()) {
return element;
}
}
CorrectionChange cc = new CorrectionChange(getDocumentNumber(), correctionChangeGroupLineNumber, changeNumber);
correctionChange.add(cc);
return cc;
}
/**
* Get correction criteria item
*
* @param criteriaNumber correction change line number of object to return
* @return CorrectionChange correction change object with specified line number to return
*/
public CorrectionCriteria getCorrectionCriteriaItem(int criteriaNumber) {
for (Iterator iter = correctionCriteria.iterator(); iter.hasNext();) {
CorrectionCriteria element = (CorrectionCriteria) iter.next();
if (criteriaNumber == element.getCorrectionCriteriaLineNumber().intValue()) {
return element;
}
}
CorrectionCriteria cc = new CorrectionCriteria(getDocumentNumber(), correctionChangeGroupLineNumber, criteriaNumber);
correctionCriteria.add(cc);
return cc;
}
public String getDocumentNumber() {
return documentNumber;
}
/**
* Set document number for this correction change group. This also sets the document number for this correction change group's
* correction criteria and correction change
*
* @param documentNumber new document number
*/
public void setDocumentNumber(String documentNumber) {
this.documentNumber = documentNumber;
for (Iterator iter = correctionCriteria.iterator(); iter.hasNext();) {
CorrectionCriteria element = (CorrectionCriteria) iter.next();
element.setDocumentNumber(documentNumber);
}
for (Iterator iter = correctionChange.iterator(); iter.hasNext();) {
CorrectionChange element = (CorrectionChange) iter.next();
element.setDocumentNumber(documentNumber);
}
}
public Integer getCorrectionChangeGroupLineNumber() {
return correctionChangeGroupLineNumber;
}
public void setCorrectionChangeGroupLineNumber(Integer correctionChangeGroupLineNumber) {
this.correctionChangeGroupLineNumber = correctionChangeGroupLineNumber;
}
public Integer getCorrectionCriteriaNextLineNumber() {
return correctionCriteriaNextLineNumber;
}
public void setCorrectionCriteriaNextLineNumber(Integer correctionCriteriaNextLineNumber) {
this.correctionCriteriaNextLineNumber = correctionCriteriaNextLineNumber;
}
public Integer getCorrectionChangeNextLineNumber() {
return correctionChangeNextLineNumber;
}
public void setCorrectionChangeNextLineNumber(Integer correctionChangeNextLineNumber) {
this.correctionChangeNextLineNumber = correctionChangeNextLineNumber;
}
public List<CorrectionCriteria> getCorrectionCriteria() {
Collections.sort(correctionCriteria);
return correctionCriteria;
}
public void setCorrectionCriteria(List<CorrectionCriteria> correctionCriteria) {
this.correctionCriteria = correctionCriteria;
}
public List<CorrectionChange> getCorrectionChange() {
Collections.sort(correctionChange);
return correctionChange;
}
public void setCorrectionChange(List<CorrectionChange> correctionChange) {
this.correctionChange = correctionChange;
}
/**
* Compares this correction change group to another correction change group object by comparing document number and correction group line number
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(Object o) {
CorrectionChangeGroup other = (CorrectionChangeGroup) o;
String thisFdocNbr = documentNumber == null ? "" : documentNumber;
String thatFdocNbr = other.documentNumber == null ? "" : other.documentNumber;
int c = thisFdocNbr.compareTo(thatFdocNbr);
if (c == 0) {
Integer thisNbr = correctionChangeGroupLineNumber == null ? 0 : correctionChangeGroupLineNumber;
Integer thatNbr = other.correctionChangeGroupLineNumber == null ? 0 : other.correctionChangeGroupLineNumber;
return thisNbr.compareTo(thatNbr);
}
else {
return c;
}
}
/**
* @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper()
*/
protected LinkedHashMap toStringMapper_RICE20_REFACTORME() {
LinkedHashMap m = new LinkedHashMap();
m.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.documentNumber);
if (this.correctionChangeGroupLineNumber != null) {
m.put("correctionChangeGroupLineNumber", this.correctionChangeGroupLineNumber.toString());
}
return m;
}
/**
* A comparator that compares to GLCP correction change groups based on their group line numbers
* within the GLCP document
*/
public static class CorrectionGroupLineNumberComparator implements Comparator {
/**
* Constructs a CorrectionGroupLineNumberComparator instance
*/
public CorrectionGroupLineNumberComparator() {
}
/**
* Compares two CorrectionChangeGroups based on thier line numbers within a GLCP document
*
* @param c1 a correction change group to compare
* @param c2 another correction change group to compare the first one to
* @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
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object c1, Object c2) {
CorrectionChangeGroup ccg1 = (CorrectionChangeGroup) c1;
CorrectionChangeGroup ccg2 = (CorrectionChangeGroup) c2;
return ccg1.getCorrectionChangeGroupLineNumber().compareTo(ccg2.getCorrectionChangeGroupLineNumber());
}
}
}