package org.sigmah.server.servlet.exporter.data;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import org.sigmah.client.ui.presenter.project.logframe.CodePolicy;
import org.sigmah.server.domain.Project;
import org.sigmah.server.domain.logframe.ExpectedResult;
import org.sigmah.server.domain.logframe.LogFrame;
import org.sigmah.server.domain.logframe.LogFrameActivity;
import org.sigmah.server.domain.logframe.LogFrameGroup;
import org.sigmah.server.domain.logframe.LogFrameModel;
import org.sigmah.server.domain.logframe.Prerequisite;
import org.sigmah.server.domain.logframe.SpecificObjective;
import org.sigmah.server.servlet.exporter.base.Exporter;
import org.sigmah.shared.dto.IndicatorDTO;
/**
* Log frame specific data store to be passed to templates
*
* @author sherzod (v1.3)
*/
public class LogFrameExportData extends ExportData {
public static final NumberFormat AGGR_SUM_FORMATTER = new DecimalFormat("#,###");
public static final NumberFormat AGGR_AVG_FORMATTER = new DecimalFormat("0.00");
private final Project project;
private final LogFrame logFrame;
private final LogFrameModel logFrameModel;
private final Map<LogFrameGroup, ArrayList<SpecificObjective>> soMap;
private final Map<LogFrameGroup, ArrayList<ExpectedResult>> erMap;
private final Map<LogFrameGroup, ArrayList<LogFrameActivity>> acMap;
private final Map<LogFrameGroup, ArrayList<Prerequisite>> prMap;
private final Map<Integer, IndicatorDTO> indMap;
private final ArrayList<SpecificObjective> soMainList;
private final ArrayList<ExpectedResult> erMainList;
private final ArrayList<LogFrameActivity> acMainList;
private final ArrayList<Prerequisite> prMainList;
private boolean isIndicatorsSheetExist = false;
private class LogFrameGroupComparator implements Comparator<LogFrameGroup> {
@Override
public int compare(LogFrameGroup o1, LogFrameGroup o2) {
return o1.getLabel().compareTo(o2.getLabel());
}
}
public LogFrameExportData(final Project project, final Exporter exporter) {
super(exporter, 7);
this.project = project;
this.logFrame = project.getLogFrame();
this.logFrameModel = logFrame.getLogFrameModel();
soMap = new TreeMap<LogFrameGroup, ArrayList<SpecificObjective>>(new LogFrameGroupComparator());
erMap = new TreeMap<LogFrameGroup, ArrayList<ExpectedResult>>(new LogFrameGroupComparator());
acMap = new TreeMap<LogFrameGroup, ArrayList<LogFrameActivity>>(new LogFrameGroupComparator());
prMap = new TreeMap<LogFrameGroup, ArrayList<Prerequisite>>(new LogFrameGroupComparator());
indMap = new TreeMap<Integer, IndicatorDTO>();
soMainList = new ArrayList<SpecificObjective>();
erMainList = new ArrayList<ExpectedResult>();
acMainList = new ArrayList<LogFrameActivity>();
prMainList = new ArrayList<Prerequisite>();
fillCollection();
sortAll();
}
private void fillCollection() {
// SO
for (final SpecificObjective so : logFrame.getSpecificObjectives()) {
final LogFrameGroup soGroup = so.getGroup();
ArrayList<SpecificObjective> soList = soMap.get(soGroup);
if (soList == null) {
soList = new ArrayList<SpecificObjective>();
soMap.put(soGroup, soList);
}
soList.add(so);
soMainList.add(so);
// ER
for (final ExpectedResult er : so.getExpectedResults()) {
final LogFrameGroup erGroup = er.getGroup();
ArrayList<ExpectedResult> erList = erMap.get(erGroup);
if (erList == null) {
erList = new ArrayList<ExpectedResult>();
erMap.put(erGroup, erList);
}
erList.add(er);
erMainList.add(er);
// Activity
for (final LogFrameActivity ac : er.getActivities()) {
final LogFrameGroup acGroup = ac.getGroup();
ArrayList<LogFrameActivity> acList = acMap.get(acGroup);
if (acList == null) {
acList = new ArrayList<LogFrameActivity>();
acMap.put(acGroup, acList);
}
acList.add(ac);
acMainList.add(ac);
}
}
}
// Prerequisite
for (final Prerequisite pr : logFrame.getPrerequisites()) {
final LogFrameGroup prGroup = pr.getGroup();
ArrayList<Prerequisite> prList = prMap.get(prGroup);
if (prList == null) {
prList = new ArrayList<Prerequisite>();
prMap.put(prGroup, prList);
}
prList.add(pr);
prMainList.add(pr);
}
}
/*
* Sorts items by their positions
*/
private void sortAll() {
// so
if (getEnableSpecificObjectivesGroups()) {
for (final LogFrameGroup soGroup : soMap.keySet()) {
Collections.sort(soMap.get(soGroup), new Comparator<SpecificObjective>() {
@Override
public int compare(SpecificObjective o1, SpecificObjective o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
} else {
Collections.sort(soMainList, new Comparator<SpecificObjective>() {
@Override
public int compare(SpecificObjective o1, SpecificObjective o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
// er
if (getEnableExpectedResultsGroups()) {
for (final LogFrameGroup erGroup : erMap.keySet()) {
Collections.sort(erMap.get(erGroup), new Comparator<ExpectedResult>() {
@Override
public int compare(ExpectedResult o1, ExpectedResult o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
} else {
Collections.sort(erMainList, new Comparator<ExpectedResult>() {
@Override
public int compare(ExpectedResult o1, ExpectedResult o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
// ac
if (getEnableActivitiesGroups()) {
for (final LogFrameGroup group : acMap.keySet()) {
Collections.sort(acMap.get(group), new Comparator<LogFrameActivity>() {
@Override
public int compare(LogFrameActivity o1, LogFrameActivity o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
} else {
Collections.sort(acMainList, new Comparator<LogFrameActivity>() {
@Override
public int compare(LogFrameActivity o1, LogFrameActivity o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
// pr
if (getEnablePrerequisitesGroups()) {
for (final LogFrameGroup group : prMap.keySet()) {
Collections.sort(prMap.get(group), new Comparator<Prerequisite>() {
@Override
public int compare(Prerequisite o1, Prerequisite o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
} else {
Collections.sort(prMainList, new Comparator<Prerequisite>() {
@Override
public int compare(Prerequisite o1, Prerequisite o2) {
return o1.getPosition().compareTo(o2.getPosition());
}
});
}
}
public String getFormattedCode(int code) {
final StringBuilder sb = new StringBuilder();
sb.append(CodePolicy.getLetter(code, true, 1));
sb.append(".");
return sb.toString();
}
public String getDetailedIndicatorName(Integer indicatorId) {
IndicatorDTO dto = indMap.get(indicatorId);
StringBuilder builder = new StringBuilder(dto.getName());
builder.append(" (");
if (dto.getLabelCounts() != null) {
builder.append(dto.formatMode());
} else {
if (dto.getCurrentValue() == null)
dto.setCurrentValue(0.0);
if (dto.getAggregation() == IndicatorDTO.AGGREGATE_AVG) {
builder.append(AGGR_AVG_FORMATTER.format(dto.getCurrentValue()));
} else {
builder.append(AGGR_SUM_FORMATTER.format(dto.getCurrentValue()));
}
builder.append("/");
builder.append(dto.getObjective() != null ? dto.getObjective() : "0.0");
}
builder.append(")");
return builder.toString();
}
public String getTitleOfAction() {
return project.getFullName();
}
public String getMainObjective() {
return logFrame.getMainObjective();
}
public Map<LogFrameGroup, ArrayList<SpecificObjective>> getSoMap() {
return soMap;
}
public Map<LogFrameGroup, ArrayList<ExpectedResult>> getErMap() {
return erMap;
}
public Map<LogFrameGroup, ArrayList<LogFrameActivity>> getAcMap() {
return acMap;
}
public Map<LogFrameGroup, ArrayList<Prerequisite>> getPrMap() {
return prMap;
}
public Map<Integer, IndicatorDTO> getIndMap() {
return indMap;
}
public ArrayList<SpecificObjective> getSoMainList() {
return soMainList;
}
public ArrayList<ExpectedResult> getErMainList() {
return erMainList;
}
public ArrayList<LogFrameActivity> getAcMainList() {
return acMainList;
}
public ArrayList<Prerequisite> getPrMainList() {
return prMainList;
}
public boolean getEnableSpecificObjectivesGroups() {
return logFrameModel.getEnableSpecificObjectivesGroups();
}
public boolean getEnableExpectedResultsGroups() {
return logFrameModel.getEnableExpectedResultsGroups();
}
public boolean getEnableActivitiesGroups() {
return logFrameModel.getEnableActivitiesGroups();
}
public boolean getEnablePrerequisitesGroups() {
return logFrameModel.getEnablePrerequisitesGroups();
}
public boolean isIndicatorsSheetExist() {
return isIndicatorsSheetExist;
}
public void setIndicatorsSheetExist(boolean isIndicatorsSheetExist) {
this.isIndicatorsSheetExist = isIndicatorsSheetExist;
}
}