/*
* 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.module.bc.report;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.kuali.kfs.module.bc.BCConstants.Report.BuildMode;
import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPullup;
/**
* Holds information on the current build configuration of the report control list table, and a requested configuration.
*/
public class ReportControlListBuildHelper implements Serializable {
private BuildState currentState;
private BuildState requestedState;
private boolean forceRebuild;
/**
* Constructs a ReportControlListBuildHelper.java.
*/
public ReportControlListBuildHelper() {
super();
forceRebuild = false;
}
/**
* Determines whether a build is needed based on the current and requested states
*
* @return true if build is needed, false otherwise
*/
public boolean isBuildNeeded() {
boolean buildNeeded = false;
if (this.isForceRebuild()) {
buildNeeded = true;
}
else if (this.getCurrentState() == null && this.getRequestedState() != null) {
buildNeeded = true;
}
else if (this.getRequestedState() != null && !this.getCurrentState().equals(this.getRequestedState())) {
buildNeeded = true;
}
return buildNeeded;
}
/**
* Helper method to add a requestState
*
* @param pointOfView - request point of view
* @param selectedOrganizations - organizations selected for the report
* @param buildMode - mode in which the control list should be build
* @see org.kuali.kfs.module.bc.BCConstants.Report.BuildMode
*/
public void addBuildRequest(String pointOfView, Collection<BudgetConstructionPullup> selectedOrganizations, BuildMode buildMode) {
this.setRequestedState(new BuildState(pointOfView, selectedOrganizations, buildMode));
}
/**
* Called when the control list has been built that satisfies the requested state. Will set current state to the requested
* state then empty the requested state.
*/
public void requestBuildComplete() {
if (this.getRequestedState() != null) {
if (this.getCurrentState() == null) {
this.setCurrentState(new BuildState());
}
this.getCurrentState().setPointOfView(this.getRequestedState().getPointOfView());
this.getCurrentState().setSelectedOrganizations(this.getRequestedState().getSelectedOrganizations());
this.getCurrentState().setBuildMode(this.getRequestedState().getBuildMode());
this.setRequestedState(null);
this.setForceRebuild(false);
}
else {
throw new RuntimeException("Requested state does not exist. Control list build state has been lost.");
}
}
/**
* Represents a build configuration for the control list.
*/
public class BuildState implements Serializable {
private String pointOfView;
private Collection<BudgetConstructionPullup> selectedOrganizations;
private BuildMode buildMode;
/**
* Constructs a ReportControlListBuildHelper.java.
*/
public BuildState() {
}
/**
* Constructs a ReportControlListBuildHelper.java.
*
* @param pointOfView - chart/org point of view string
* @param selectedOrganizations - organizations selected for reporting
* @param buildMode - mode for restricting report data
*/
public BuildState(String pointOfView, Collection<BudgetConstructionPullup> selectedOrganizations, BuildMode buildMode) {
this.pointOfView = pointOfView;
this.selectedOrganizations = selectedOrganizations;
this.buildMode = buildMode;
}
/**
* Gets the buildMode attribute.
*
* @return Returns the buildMode.
*/
public BuildMode getBuildMode() {
return buildMode;
}
/**
* Sets the buildMode attribute value.
*
* @param buildMode The buildMode to set.
*/
public void setBuildMode(BuildMode buildMode) {
this.buildMode = buildMode;
}
/**
* Gets the pointOfView attribute.
*
* @return Returns the pointOfView.
*/
public String getPointOfView() {
return pointOfView;
}
/**
* Sets the pointOfView attribute value.
*
* @param pointOfView The pointOfView to set.
*/
public void setPointOfView(String pointOfView) {
this.pointOfView = pointOfView;
}
/**
* Gets the selectedOrganizations attribute.
*
* @return Returns the selectedOrganizations.
*/
public Collection<BudgetConstructionPullup> getSelectedOrganizations() {
return selectedOrganizations;
}
/**
* Sets the selectedOrganizations attribute value.
*
* @param selectedOrganizations The selectedOrganizations to set.
*/
public void setSelectedOrganizations(Collection<BudgetConstructionPullup> selectedOrganizations) {
this.selectedOrganizations = selectedOrganizations;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof BuildState) {
boolean isEqual = true;
if (obj == null) {
isEqual = false;
}
else {
BuildState compareState = (BuildState) obj;
if (!this.getPointOfView().equals(compareState.getPointOfView())) {
isEqual = false;
}
if (!this.compareOrganizations(this.getSelectedOrganizations(), compareState.getSelectedOrganizations())) {
isEqual = false;
}
if (!this.getBuildMode().equals(compareState.getBuildMode())) {
isEqual = false;
}
}
return isEqual;
}
else {
return super.equals(obj);
}
}
/**
* Compares two collections of BudgetConstructionPullup objects for equality. BudgetConstructionPullup objects are compared
* by primary key.
*
* @param currentOrgs - current org build
* @param requestedOrgs - requested org build
* @return boolean indicating true if the collections are equal, false otherwise
*/
private boolean compareOrganizations(Collection<BudgetConstructionPullup> currentOrgs, Collection<BudgetConstructionPullup> requestedOrgs) {
Set<String> currentOrgSet = new HashSet<String>();
for (BudgetConstructionPullup pullup : currentOrgs) {
currentOrgSet.add(pullup.getChartOfAccountsCode() + pullup.getOrganizationCode());
}
for (BudgetConstructionPullup pullup : requestedOrgs) {
if (!currentOrgSet.contains(pullup.getChartOfAccountsCode() + pullup.getOrganizationCode())) {
return false;
}
currentOrgSet.remove(pullup.getChartOfAccountsCode() + pullup.getOrganizationCode());
}
if (!currentOrgSet.isEmpty()) {
return false;
}
return true;
}
}
/**
* Gets the currentState attribute.
*
* @return Returns the currentState.
*/
public BuildState getCurrentState() {
return currentState;
}
/**
* Sets the currentState attribute value.
*
* @param currentState The currentState to set.
*/
public void setCurrentState(BuildState currentState) {
this.currentState = currentState;
}
/**
* Gets the requestedState attribute.
*
* @return Returns the requestedState.
*/
public BuildState getRequestedState() {
return requestedState;
}
/**
* Sets the requestedState attribute value.
*
* @param requestedState The requestedState to set.
*/
public void setRequestedState(BuildState requestedState) {
this.requestedState = requestedState;
}
/**
* Gets the forceRebuild attribute.
*
* @return Returns the forceRebuild.
*/
public boolean isForceRebuild() {
return forceRebuild;
}
/**
* Sets the forceRebuild attribute value.
*
* @param forceRebuild The forceRebuild to set.
*/
public void setForceRebuild(boolean forceRebuild) {
this.forceRebuild = forceRebuild;
}
}