mifosx-195 report maintenance (fixed)

This commit is contained in:
John Woodlock
2013-05-06 23:18:55 +01:00
parent 5a2acd7897
commit 3fbd32918f
5 changed files with 158 additions and 63 deletions
@@ -6,6 +6,7 @@
package org.mifosplatform.infrastructure.dataqueries.domain;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@@ -59,13 +60,12 @@ public class Report extends AbstractPersistable<Long> {
@Column(name = "report_sql")
private String reportSql;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "report", orphanRemoval = true)
private Set<ReportParameterUsage> reportParameterUsages = new HashSet<ReportParameterUsage>();
public static Report fromJson(
final JsonCommand command) {
public static Report fromJson(final JsonCommand command) {
String reportName = null;
String reportType = null;
@@ -173,14 +173,16 @@ public class Report extends AbstractPersistable<Long> {
this.reportSql = StringUtils.defaultIfEmpty(newValue, null);
}
final String reportParametersParamName = "reportParameters";
if (command.hasParameter(reportParametersParamName)) {
JsonArray jsonArray = command.arrayOfParameterNamed(reportParametersParamName);
if (jsonArray != null) {
actualChanges.put(reportParametersParamName, command.jsonFragment(reportParametersParamName));
}
}
final String reportParametersParamName = "reportParameters";
if (command.hasParameter(reportParametersParamName)) {
JsonArray jsonArray = command
.arrayOfParameterNamed(reportParametersParamName);
if (jsonArray != null) {
actualChanges.put(reportParametersParamName,
command.jsonFragment(reportParametersParamName));
}
}
validate();
if (!actualChanges.isEmpty()) {
@@ -294,18 +296,61 @@ public class Report extends AbstractPersistable<Long> {
return false;
boolean updated = false;
if (this.reportParameterUsages != null) {
if (!(this.reportParameterUsages.equals(newReportParameterUsages))) {
updated = true;
this.reportParameterUsages.clear();
this.reportParameterUsages.addAll(newReportParameterUsages);
}
} else {
if (changeInReportParameters(newReportParameterUsages)) {
updated = true;
this.reportParameterUsages = newReportParameterUsages;
this.reportParameterUsages.clear();
this.reportParameterUsages.addAll(newReportParameterUsages);
}
return updated;
}
private boolean changeInReportParameters(
Set<ReportParameterUsage> newReportParameterUsages) {
if (!(this.reportParameterUsages.equals(newReportParameterUsages))) return true;
Map<Long, ReportParameterUsage> currentRPUs = new HashMap<Long, ReportParameterUsage>();
for (ReportParameterUsage rpu : this.reportParameterUsages) {
currentRPUs.put(rpu.getId(), rpu);
}
Map<Long, ReportParameterUsage> newRPUs = new HashMap<Long, ReportParameterUsage>();
for (ReportParameterUsage rpu : newReportParameterUsages) {
newRPUs.put(rpu.getId(), rpu);
}
ReportParameterUsage currentRPU = null;
ReportParameterUsage newRPU = null;
for (Long key : currentRPUs.keySet()) {
currentRPU = currentRPUs.get(key);
newRPU = newRPUs.get(key);
if (existingEntryChanged(currentRPU, newRPU)) return true;
}
return false;
}
private boolean existingEntryChanged(
final ReportParameterUsage currentRPU, final ReportParameterUsage newRPU) {
if (!(currentRPU.getParameter().getId()
.equals(newRPU.getParameter().getId())))
return true;
if ((currentRPU.getReportParameterName() == null)
&& (newRPU.getReportParameterName() == null))
return false;
if (!(currentRPU.getReportParameterName()
.equals(newRPU.getReportParameterName())))
return true;
return false;
}
}
@@ -41,6 +41,14 @@ public class ReportParameterUsage extends AbstractPersistable<Long> {
this.parameter = parameter;
this.reportParameterName = reportParameterName;
}
public ReportParameterUsage(final ReportParameterUsage currentReportParameterUsage, final Report report,
final ReportParameter parameter, final String reportParameterName) {
this.setId(currentReportParameterUsage.getId());
this.report = report;
this.parameter = parameter;
this.reportParameterName = reportParameterName;
}
public void setReport(Report report) {
this.report = report;
@@ -50,6 +58,14 @@ public class ReportParameterUsage extends AbstractPersistable<Long> {
this.parameter = parameter;
}
public ReportParameter getParameter() {
return parameter;
}
public String getReportParameterName() {
return reportParameterName;
}
public void setReportParameterName(String reportParameterName) {
this.reportParameterName = reportParameterName;
}
@@ -223,33 +223,28 @@ public class ReportWritePlatformServiceImpl implements
"reportParameterName").getAsString();
}
ReportParameterUsage reportParameterUsage = null;
if (jsonObject.has("id")) {
final String idStr = jsonObject.get("id").getAsString();
if (!(idStr.equals("")))
id = Long.parseLong(idStr);
}
ReportParameterUsage reportParameterUsage = null;
if (id == null) {
reportParameterUsage = new ReportParameterUsage(report,
parameter, reportParameterName);
} else {
reportParameterUsage = rpuById(report, id);
ReportParameterUsage currentReportParameterUsage = rpuById(
report, id);
if (reportParameterUsage == null) {
throw new PlatformDataIntegrityException(
"error.msg.supplied.parameter.id.doesnt.exist",
"Supplied parameterId column doesn't Exist",
id);
}
if (parameter != null)
reportParameterUsage.setParameter(parameter);
if (reportParameterName != null) {
reportParameterUsage
.setReportParameterName(reportParameterName);
}
if (existingEntryChanged(currentReportParameterUsage,
parameter.getId(), reportParameterName)) {
reportParameterUsage = new ReportParameterUsage(
currentReportParameterUsage, report,
parameter, reportParameterName);
} else {
reportParameterUsage = currentReportParameterUsage;
}
}
reportParameterUsages.add(reportParameterUsage);
@@ -261,6 +256,25 @@ public class ReportWritePlatformServiceImpl implements
return null;
}
private boolean existingEntryChanged(
final ReportParameterUsage currentReportParameterUsage,
final Long parameterId, final String reportParameterName) {
if (!(currentReportParameterUsage.getParameter().getId()
.equals(parameterId)))
return true;
if ((reportParameterName == null)
&& (currentReportParameterUsage.getReportParameterName() == null))
return false;
if (!(currentReportParameterUsage.getReportParameterName()
.equals(reportParameterName)))
return true;
return false;
}
private ReportParameterUsage rpuById(final Report report, final Long id) {
for (ReportParameterUsage rpu : report.getReportParameterUsages()) {
@@ -268,7 +282,8 @@ public class ReportWritePlatformServiceImpl implements
return rpu;
}
return null;
throw new PlatformDataIntegrityException(
"error.msg.supplied.parameter.id.doesnt.exist",
"Supplied parameterId column doesn't Exist", id);
}
}