MIFOSX-195: some formatting and clean up whilst testing this issue.

This commit is contained in:
Keith Woodlock
2013-05-07 10:18:54 +01:00
parent d8913ab758
commit e8b8cf4f8a
7 changed files with 434 additions and 562 deletions
@@ -5,8 +5,8 @@
*/
package org.mifosplatform.infrastructure.core.service;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.sql.DataSource;
@@ -28,7 +28,7 @@ import org.springframework.stereotype.Service;
@Service
public class TomcatJdbcDataSourcePerTenantService implements DataSourcePerTenantService {
private final Map<Long, DataSource> tenantToDataSourceMap = new ConcurrentHashMap<Long, DataSource>(1);
private final Map<Long, DataSource> tenantToDataSourceMap = new HashMap<Long, DataSource>(1);
private final DataSource tenantDataSource;
@Autowired
@@ -44,9 +44,9 @@ public class TomcatJdbcDataSourcePerTenantService implements DataSourcePerTenant
MifosPlatformTenant tenant = ThreadLocalContextUtil.getTenant();
if (tenant != null) {
synchronized(this.tenantToDataSourceMap)
{
// if tenant information available switch to appropriate datasource
synchronized (this.tenantToDataSourceMap) {
// if tenant information available switch to appropriate
// datasource
// for that tenant.
if (this.tenantToDataSourceMap.containsKey(tenant.getId())) {
tenantDataSource = this.tenantToDataSourceMap.get(tenant.getId());
@@ -6,7 +6,6 @@
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;
@@ -34,323 +33,222 @@ import com.google.gson.JsonArray;
@Entity
@Table(name = "stretchy_report", uniqueConstraints = { @UniqueConstraint(columnNames = { "report_name" }, name = "unq_report_name") })
public class Report extends AbstractPersistable<Long> {
public final class Report extends AbstractPersistable<Long> {
@Column(name = "report_name", nullable = false, unique = true)
private String reportName;
@Column(name = "report_name", nullable = false, unique = true)
private String reportName;
@Column(name = "report_type", nullable = false)
private String reportType;
@Column(name = "report_type", nullable = false)
private String reportType;
@Column(name = "report_subtype")
private String reportSubType;
@Column(name = "report_subtype")
private String reportSubType;
@Column(name = "report_category")
private String reportCategory;
@Column(name = "report_category")
private String reportCategory;
@Column(name = "description")
private String description;
@Column(name = "description")
private String description;
@Column(name = "core_report", nullable = false)
private boolean coreReport;
@Column(name = "core_report", nullable = false)
private boolean coreReport;
// only defines if report should appear in reference app UI List
@Column(name = "use_report", nullable = false)
private boolean useReport;
// only defines if report should appear in reference app UI List
@Column(name = "use_report", nullable = false)
private boolean useReport;
@Column(name = "report_sql")
private String reportSql;
@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>();
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "report", orphanRemoval = true)
private final 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;
String reportSubType = null;
String reportCategory = null;
String description = null;
boolean useReport = false;
String reportSql = null;
String reportName = null;
String reportType = null;
String reportSubType = null;
String reportCategory = null;
String description = null;
boolean useReport = false;
String reportSql = null;
if (command.parameterExists("reportName"))
reportName = command.stringValueOfParameterNamed("reportName");
if (command.parameterExists("reportType"))
reportType = command.stringValueOfParameterNamed("reportType");
if (command.parameterExists("reportSubType"))
reportSubType = command
.stringValueOfParameterNamed("reportSubType");
if (command.parameterExists("reportCategory"))
reportCategory = command
.stringValueOfParameterNamed("reportCategory");
if (command.parameterExists("description"))
description = command.stringValueOfParameterNamed("description");
if (command.parameterExists("useReport"))
useReport = command
.booleanPrimitiveValueOfParameterNamed("useReport");
if (command.parameterExists("reportSql"))
reportSql = command.stringValueOfParameterNamed("reportSql");
if (command.parameterExists("reportName")) reportName = command.stringValueOfParameterNamed("reportName");
if (command.parameterExists("reportType")) reportType = command.stringValueOfParameterNamed("reportType");
if (command.parameterExists("reportSubType")) reportSubType = command.stringValueOfParameterNamed("reportSubType");
if (command.parameterExists("reportCategory")) reportCategory = command.stringValueOfParameterNamed("reportCategory");
if (command.parameterExists("description")) description = command.stringValueOfParameterNamed("description");
if (command.parameterExists("useReport")) useReport = command.booleanPrimitiveValueOfParameterNamed("useReport");
if (command.parameterExists("reportSql")) reportSql = command.stringValueOfParameterNamed("reportSql");
return new Report(reportName, reportType, reportSubType,
reportCategory, description, useReport, reportSql);
}
return new Report(reportName, reportType, reportSubType, reportCategory, description, useReport, reportSql);
}
protected Report() {
//
}
protected Report() {
//
}
public Report(final String reportName, final String reportType,
final String reportSubType, final String reportCategory,
final String description, final boolean useReport,
final String reportSql) {
this.reportName = reportName;
this.reportType = reportType;
this.reportSubType = reportSubType;
this.reportCategory = reportCategory;
this.description = description;
this.coreReport = false;
this.useReport = useReport;
this.reportSql = reportSql;
validate();
}
public Report(final String reportName, final String reportType, final String reportSubType, final String reportCategory,
final String description, final boolean useReport, final String reportSql) {
this.reportName = reportName;
this.reportType = reportType;
this.reportSubType = reportSubType;
this.reportCategory = reportCategory;
this.description = description;
this.coreReport = false;
this.useReport = useReport;
this.reportSql = reportSql;
validate();
}
public Map<String, Object> update(final JsonCommand command) {
public Map<String, Object> update(final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(
8);
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(8);
String paramName = "reportName";
if (command.isChangeInStringParameterNamed(paramName, this.reportName)) {
final String newValue = command
.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportName = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "reportType";
if (command.isChangeInStringParameterNamed(paramName, this.reportType)) {
final String newValue = command
.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportType = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "reportSubType";
if (command.isChangeInStringParameterNamed(paramName,
this.reportSubType)) {
final String newValue = command
.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportSubType = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "reportCategory";
if (command.isChangeInStringParameterNamed(paramName,
this.reportCategory)) {
final String newValue = command
.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportCategory = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "description";
if (command.isChangeInStringParameterNamed(paramName, this.description)) {
final String newValue = command
.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.description = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "useReport";
if (command.isChangeInBooleanParameterNamed(paramName, this.useReport)) {
final boolean newValue = command
.booleanPrimitiveValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.useReport = newValue;
}
paramName = "reportSql";
if (command.isChangeInStringParameterNamed(paramName, this.reportSql)) {
final String newValue = command
.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
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));
}
}
validate();
if (!actualChanges.isEmpty()) {
if (isCoreReport()) {
for (final String key : actualChanges.keySet()) {
if (!(key.equals("useReport"))) {
throw new PlatformDataIntegrityException(
"error.msg.only.use.report.can.be.updated.for.core.report",
"Only the Use Report field can be updated for Core Reports",
key);
}
}
}
}
return actualChanges;
}
public boolean isCoreReport() {
return coreReport;
}
private void validate() {
final List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(
dataValidationErrors).resource("report");
baseDataValidator.reset().parameter("reportName")
.value(this.reportName).notBlank().notExceedingLengthOf(100);
baseDataValidator
.reset()
.parameter("reportType")
.value(this.reportType)
.notBlank()
.isOneOfTheseValues(
new Object[] { "Table", "Pentaho", "Chart" });
baseDataValidator.reset().parameter("reportSubType")
.value(this.reportSubType).notExceedingLengthOf(20);
if (StringUtils.isNotBlank(this.reportType)) {
if (this.reportType.equals("Chart")) {
baseDataValidator
.reset()
.parameter("reportSubType")
.value(this.reportSubType)
.cantBeBlankWhenParameterProvidedIs("reportType",
this.reportType)
.isOneOfTheseValues(new Object[] { "Bar", "Pie" });
} else {
baseDataValidator
.reset()
.parameter("reportSubType")
.value(this.reportSubType)
.mustBeBlankWhenParameterProvidedIs("reportType",
this.reportType);
}
}
baseDataValidator.reset().parameter("reportCategory")
.value(this.reportCategory).notExceedingLengthOf(45);
if (StringUtils.isNotBlank(this.reportType)) {
if ((this.reportType.equals("Table"))
|| (this.reportType.equals("Chart"))) {
baseDataValidator
.reset()
.parameter("reportSql")
.value(this.reportSql)
.cantBeBlankWhenParameterProvidedIs("reportType",
this.reportType);
} else {
baseDataValidator
.reset()
.parameter("reportSql")
.value(this.reportSql)
.mustBeBlankWhenParameterProvidedIs("reportType",
this.reportType);
}
}
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
private void throwExceptionIfValidationWarningsExist(
final List<ApiParameterError> dataValidationErrors) {
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
public String getReportName() {
return reportName;
}
public Set<ReportParameterUsage> getReportParameterUsages() {
return reportParameterUsages;
}
public void setReportParameterUsages(
Set<ReportParameterUsage> reportParameterUsages) {
this.reportParameterUsages = reportParameterUsages;
}
public boolean update(
final Set<ReportParameterUsage> newReportParameterUsages) {
if (newReportParameterUsages == null)
return false;
boolean updated = false;
if (changeInReportParameters(newReportParameterUsages)) {
updated = true;
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;
String paramName = "reportName";
if (command.isChangeInStringParameterNamed(paramName, this.reportName)) {
final String newValue = command.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportName = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "reportType";
if (command.isChangeInStringParameterNamed(paramName, this.reportType)) {
final String newValue = command.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportType = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "reportSubType";
if (command.isChangeInStringParameterNamed(paramName, this.reportSubType)) {
final String newValue = command.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportSubType = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "reportCategory";
if (command.isChangeInStringParameterNamed(paramName, this.reportCategory)) {
final String newValue = command.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportCategory = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "description";
if (command.isChangeInStringParameterNamed(paramName, this.description)) {
final String newValue = command.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.description = StringUtils.defaultIfEmpty(newValue, null);
}
paramName = "useReport";
if (command.isChangeInBooleanParameterNamed(paramName, this.useReport)) {
final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.useReport = newValue;
}
paramName = "reportSql";
if (command.isChangeInStringParameterNamed(paramName, this.reportSql)) {
final String newValue = command.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
this.reportSql = StringUtils.defaultIfEmpty(newValue, null);
}
return false;
}
private boolean existingEntryChanged(
final ReportParameterUsage currentRPU, final ReportParameterUsage newRPU) {
final String reportParametersParamName = "reportParameters";
if (command.hasParameter(reportParametersParamName)) {
JsonArray jsonArray = command.arrayOfParameterNamed(reportParametersParamName);
if (jsonArray != null) {
actualChanges.put(reportParametersParamName, command.jsonFragment(reportParametersParamName));
}
}
if (!(currentRPU.getParameter().getId()
.equals(newRPU.getParameter().getId())))
return true;
validate();
if ((currentRPU.getReportParameterName() == null)
&& (newRPU.getReportParameterName() == null))
return false;
if (!actualChanges.isEmpty()) {
if (isCoreReport()) {
for (final String key : actualChanges.keySet()) {
if (!(key.equals("useReport"))) { throw new PlatformDataIntegrityException(
"error.msg.only.use.report.can.be.updated.for.core.report",
"Only the Use Report field can be updated for Core Reports", key); }
}
}
}
if (!(currentRPU.getReportParameterName()
.equals(newRPU.getReportParameterName())))
return true;
return actualChanges;
}
return false;
}
}
public boolean isCoreReport() {
return coreReport;
}
public ReportParameterUsage findReportParameterById(final Long reportParameterId) {
ReportParameterUsage reportParameterUsage = null;
for (ReportParameterUsage rpu : this.reportParameterUsages) {
if (rpu.hasIdOf(reportParameterId)) {
reportParameterUsage = rpu;
break;
}
}
return reportParameterUsage;
}
private void validate() {
final List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("report");
baseDataValidator.reset().parameter("reportName").value(this.reportName).notBlank().notExceedingLengthOf(100);
baseDataValidator.reset().parameter("reportType").value(this.reportType).notBlank()
.isOneOfTheseValues(new Object[] { "Table", "Pentaho", "Chart" });
baseDataValidator.reset().parameter("reportSubType").value(this.reportSubType).notExceedingLengthOf(20);
if (StringUtils.isNotBlank(this.reportType)) {
if (this.reportType.equals("Chart")) {
baseDataValidator.reset().parameter("reportSubType").value(this.reportSubType)
.cantBeBlankWhenParameterProvidedIs("reportType", this.reportType)
.isOneOfTheseValues(new Object[] { "Bar", "Pie" });
} else {
baseDataValidator.reset().parameter("reportSubType").value(this.reportSubType)
.mustBeBlankWhenParameterProvidedIs("reportType", this.reportType);
}
}
baseDataValidator.reset().parameter("reportCategory").value(this.reportCategory).notExceedingLengthOf(45);
if (StringUtils.isNotBlank(this.reportType)) {
if ((this.reportType.equals("Table")) || (this.reportType.equals("Chart"))) {
baseDataValidator.reset().parameter("reportSql").value(this.reportSql)
.cantBeBlankWhenParameterProvidedIs("reportType", this.reportType);
} else {
baseDataValidator.reset().parameter("reportSql").value(this.reportSql)
.mustBeBlankWhenParameterProvidedIs("reportType", this.reportType);
}
}
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
private void throwExceptionIfValidationWarningsExist(final List<ApiParameterError> dataValidationErrors) {
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); }
}
public String getReportName() {
return reportName;
}
public boolean update(final Set<ReportParameterUsage> newReportParameterUsages) {
if (newReportParameterUsages == null) return false;
boolean updated = false;
if (changeInReportParameters(newReportParameterUsages)) {
updated = true;
this.reportParameterUsages.clear();
this.reportParameterUsages.addAll(newReportParameterUsages);
}
return updated;
}
private boolean changeInReportParameters(final Set<ReportParameterUsage> newReportParameterUsages) {
if (!(this.reportParameterUsages.equals(newReportParameterUsages))) return true;
return false;
}
}
@@ -14,8 +14,11 @@ import org.springframework.data.jpa.domain.AbstractPersistable;
@Table(name = "stretchy_parameter")
public class ReportParameter extends AbstractPersistable<Long> {
protected ReportParameter() {
//
}
protected ReportParameter() {
//
}
}
public boolean hasIdOf(final Long id) {
return getId().equals(id);
}
}
@@ -11,63 +11,68 @@ import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@Table(name = "stretchy_report_parameter")
public class ReportParameterUsage extends AbstractPersistable<Long> {
@SuppressWarnings("unused")
@ManyToOne(optional = false)
@JoinColumn(name = "report_id", nullable = false)
private Report report;
public final class ReportParameterUsage extends AbstractPersistable<Long> {
@SuppressWarnings("unused")
@ManyToOne(optional = false)
@JoinColumn(name = "parameter_id", nullable = false)
private ReportParameter parameter;
@ManyToOne(optional = false)
@JoinColumn(name = "report_id", nullable = false)
private Report report;
@SuppressWarnings("unused")
@Column(name = "report_parameter_name")
private String reportParameterName;
@ManyToOne(optional = false)
@JoinColumn(name = "parameter_id", nullable = false)
private ReportParameter parameter;
protected ReportParameterUsage() {
//
}
@Column(name = "report_parameter_name")
private String reportParameterName;
public ReportParameterUsage(final Report report,
final ReportParameter parameter, final String reportParameterName) {
this.report = report;
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;
}
protected ReportParameterUsage() {
//
}
public void setReport(Report report) {
this.report = report;
}
public ReportParameterUsage(final Report report, final ReportParameter parameter, final String reportParameterName) {
this.report = report;
this.parameter = parameter;
this.reportParameterName = reportParameterName;
}
public void setParameter(ReportParameter parameter) {
this.parameter = parameter;
}
@Override
public boolean equals(final Object obj) {
if (obj == null) { return false; }
if (obj == this) { return true; }
if (obj.getClass() != getClass()) { return false; }
ReportParameterUsage rhs = (ReportParameterUsage) obj;
return new EqualsBuilder().appendSuper(super.equals(obj)) //
.append(this.getId(), rhs.getId()) //
.append(this.report.getId(), rhs.report.getId()) //
.append(this.parameter.getId(), rhs.parameter.getId()) //
.append(this.reportParameterName, rhs.reportParameterName) //
.isEquals();
}
public ReportParameter getParameter() {
return parameter;
}
@Override
public int hashCode() {
return new HashCodeBuilder(3, 5) //
.append(this.getId()) //
.append(this.report.getId()) //
.append(this.parameter.getId()) //
.append(this.reportParameterName) //
.toHashCode();
}
public String getReportParameterName() {
return reportParameterName;
}
public boolean hasIdOf(final Long id) {
return getId().equals(id);
}
public void setReportParameterName(String reportParameterName) {
this.reportParameterName = reportParameterName;
}
}
public boolean hasParameterIdOf(final Long parameterId) {
return this.parameter != null && this.parameter.hasIdOf(parameterId);
}
public void updateParameterName(final String parameterName) {
this.reportParameterName = parameterName;
}
}
@@ -0,0 +1,14 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.dataqueries.domain;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface ReportParameterUsageRepository extends JpaRepository<ReportParameterUsage, Long>,
JpaSpecificationExecutor<ReportParameterUsage> {
// no added behaviour
}
@@ -13,6 +13,6 @@ public interface ReportWritePlatformService {
CommandProcessingResult createReport(JsonCommand command);
CommandProcessingResult updateReport(Long reportId, JsonCommand command);
CommandProcessingResult deleteReport(Long reportId);
}
@@ -9,6 +9,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder;
@@ -17,6 +18,7 @@ import org.mifosplatform.infrastructure.dataqueries.domain.Report;
import org.mifosplatform.infrastructure.dataqueries.domain.ReportParameter;
import org.mifosplatform.infrastructure.dataqueries.domain.ReportParameterRepository;
import org.mifosplatform.infrastructure.dataqueries.domain.ReportParameterUsage;
import org.mifosplatform.infrastructure.dataqueries.domain.ReportParameterUsageRepository;
import org.mifosplatform.infrastructure.dataqueries.domain.ReportRepository;
import org.mifosplatform.infrastructure.dataqueries.exception.ReportNotFoundException;
import org.mifosplatform.infrastructure.dataqueries.exception.ReportParameterNotFoundException;
@@ -36,254 +38,204 @@ import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
@Service
public class ReportWritePlatformServiceImpl implements
ReportWritePlatformService {
public class ReportWritePlatformServiceImpl implements ReportWritePlatformService {
private final static Logger logger = LoggerFactory
.getLogger(ReportWritePlatformServiceImpl.class);
private final static Logger logger = LoggerFactory.getLogger(ReportWritePlatformServiceImpl.class);
private final PlatformSecurityContext context;
private final ReportCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final PermissionRepository permissionRepository;
private final ReportRepository reportRepository;
private final ReportParameterRepository reportParameterRepository;
private final PlatformSecurityContext context;
private final ReportCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final ReportRepository reportRepository;
private final ReportParameterUsageRepository reportParameterUsageRepository;
private final ReportParameterRepository reportParameterRepository;
private final PermissionRepository permissionRepository;
@Autowired
public ReportWritePlatformServiceImpl(
final PlatformSecurityContext context,
final ReportCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final ReportRepository reportRepository,
final ReportParameterRepository reportParameterRepository,
final PermissionRepository permissionRepository) {
this.context = context;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.reportRepository = reportRepository;
this.reportParameterRepository = reportParameterRepository;
this.permissionRepository = permissionRepository;
}
@Autowired
public ReportWritePlatformServiceImpl(final PlatformSecurityContext context,
final ReportCommandFromApiJsonDeserializer fromApiJsonDeserializer, final ReportRepository reportRepository,
final ReportParameterRepository reportParameterRepository, final ReportParameterUsageRepository reportParameterUsageRepository,
final PermissionRepository permissionRepository) {
this.context = context;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.reportRepository = reportRepository;
this.reportParameterRepository = reportParameterRepository;
this.reportParameterUsageRepository = reportParameterUsageRepository;
this.permissionRepository = permissionRepository;
}
@Transactional
@Override
public CommandProcessingResult createReport(final JsonCommand command) {
@Transactional
@Override
public CommandProcessingResult createReport(final JsonCommand command) {
try {
context.authenticatedUser();
try {
context.authenticatedUser();
this.fromApiJsonDeserializer.validate(command.json());
this.fromApiJsonDeserializer.validate(command.json());
final Report report = Report.fromJson(command);
final Set<ReportParameterUsage> reportParameterUsages = assembleSetOfReportParameterUsages(
report, command);
if (reportParameterUsages != null) {
report.setReportParameterUsages(reportParameterUsages);
}
this.reportRepository.save(report);
final Report report = Report.fromJson(command);
final Set<ReportParameterUsage> reportParameterUsages = assembleSetOfReportParameterUsages(report, command);
report.update(reportParameterUsages);
final Permission permission = new Permission("report",
report.getReportName(), "READ");
this.permissionRepository.save(permission);
this.reportRepository.save(report);
return new CommandProcessingResultBuilder()
.withCommandId(command.commandId())
.withEntityId(report.getId()).build();
} catch (DataIntegrityViolationException dve) {
handleReportDataIntegrityIssues(command, dve);
return CommandProcessingResult.empty();
}
}
final Permission permission = new Permission("report", report.getReportName(), "READ");
this.permissionRepository.save(permission);
@Transactional
@Override
public CommandProcessingResult updateReport(final Long reportId,
final JsonCommand command) {
return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) //
.withEntityId(report.getId()) //
.build();
} catch (DataIntegrityViolationException dve) {
handleReportDataIntegrityIssues(command, dve);
return CommandProcessingResult.empty();
}
}
try {
context.authenticatedUser();
@Transactional
@Override
public CommandProcessingResult updateReport(final Long reportId, final JsonCommand command) {
this.fromApiJsonDeserializer.validate(command.json());
try {
context.authenticatedUser();
final Report report = this.reportRepository.findOne(reportId);
if (report == null) {
throw new ReportNotFoundException(reportId);
}
this.fromApiJsonDeserializer.validate(command.json());
final Map<String, Object> changes = report.update(command);
final Report report = this.reportRepository.findOne(reportId);
if (report == null) { throw new ReportNotFoundException(reportId); }
if (changes.containsKey("reportParameters")) {
final Set<ReportParameterUsage> reportParameterUsages = assembleSetOfReportParameterUsages(
report, command);
boolean updated = report.update(reportParameterUsages);
if (!updated) {
changes.remove("reportParameters");
}
}
final Map<String, Object> changes = report.update(command);
if (!changes.isEmpty()) {
this.reportRepository.saveAndFlush(report);
}
if (changes.containsKey("reportParameters")) {
final Set<ReportParameterUsage> reportParameterUsages = assembleSetOfReportParameterUsages(report, command);
boolean updated = report.update(reportParameterUsages);
if (!updated) {
changes.remove("reportParameters");
}
}
return new CommandProcessingResultBuilder()
.withCommandId(command.commandId())
.withEntityId(report.getId()).with(changes).build();
} catch (DataIntegrityViolationException dve) {
handleReportDataIntegrityIssues(command, dve);
return CommandProcessingResult.empty();
}
}
if (!changes.isEmpty()) {
this.reportRepository.saveAndFlush(report);
}
@Transactional
@Override
public CommandProcessingResult deleteReport(final Long reportId) {
return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) //
.withEntityId(report.getId()) //
.with(changes) //
.build();
} catch (DataIntegrityViolationException dve) {
handleReportDataIntegrityIssues(command, dve);
return CommandProcessingResult.empty();
}
}
final Report report = this.reportRepository.findOne(reportId);
if (report == null) {
throw new ReportNotFoundException(reportId);
}
@Transactional
@Override
public CommandProcessingResult deleteReport(final Long reportId) {
if (report.isCoreReport()) {
throw new PlatformDataIntegrityException(
"error.msg.cant.delete.core.report",
"Core Reports Can't be Deleted", "");
}
final Report report = this.reportRepository.findOne(reportId);
if (report == null) { throw new ReportNotFoundException(reportId); }
final Permission permission = this.permissionRepository
.findOneByCode("READ" + "_" + report.getReportName());
if (permission == null) {
throw new PermissionNotFoundException("READ" + "_"
+ report.getReportName());
}
if (report.isCoreReport()) {
//
throw new PlatformDataIntegrityException("error.msg.cant.delete.core.report", "Core Reports Can't be Deleted", "");
}
this.reportRepository.delete(report);
this.permissionRepository.delete(permission);
final Permission permission = this.permissionRepository.findOneByCode("READ" + "_" + report.getReportName());
if (permission == null) { throw new PermissionNotFoundException("READ" + "_" + report.getReportName()); }
return new CommandProcessingResultBuilder().withEntityId(reportId)
.build();
}
this.reportRepository.delete(report);
this.permissionRepository.delete(permission);
/*
* Guaranteed to throw an exception no matter what the data integrity issue
* is.
*/
private void handleReportDataIntegrityIssues(final JsonCommand command,
DataIntegrityViolationException dve) {
return new CommandProcessingResultBuilder() //
.withEntityId(reportId) //
.build();
}
Throwable realCause = dve.getMostSpecificCause();
if (realCause.getMessage().contains("unq_report_name")) {
final String name = command
.stringValueOfParameterNamed("reportName");
throw new PlatformDataIntegrityException(
"error.msg.report.duplicate.name", "A report with name '"
+ name + "' already exists", "name", name);
}
/*
* Guaranteed to throw an exception no matter what the data integrity issue
* is.
*/
private void handleReportDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) {
logger.error(dve.getMessage(), dve);
throw new PlatformDataIntegrityException(
"error.msg.report.unknown.data.integrity.issue",
"Unknown data integrity issue with resource: "
+ realCause.getMessage());
}
Throwable realCause = dve.getMostSpecificCause();
if (realCause.getMessage().contains("unq_report_name")) {
final String name = command.stringValueOfParameterNamed("reportName");
throw new PlatformDataIntegrityException("error.msg.report.duplicate.name", "A report with name '" + name + "' already exists",
"name", name);
}
private Set<ReportParameterUsage> assembleSetOfReportParameterUsages(
final Report report, final JsonCommand command) {
if (report == null) {
throw new PlatformDataIntegrityException("system.error",
"report parameter is null; ");
}
logger.error(dve.getMessage(), dve);
throw new PlatformDataIntegrityException("error.msg.report.unknown.data.integrity.issue",
"Unknown data integrity issue with resource: " + realCause.getMessage());
}
if (command.parameterExists("reportParameters")) {
Set<ReportParameterUsage> reportParameterUsages = new HashSet<ReportParameterUsage>();
JsonArray reportParametersArray = command
.arrayOfParameterNamed("reportParameters");
if (reportParametersArray != null) {
for (int i = 0; i < reportParametersArray.size(); i++) {
private Set<ReportParameterUsage> assembleSetOfReportParameterUsages(final Report report, final JsonCommand command) {
final JsonObject jsonObject = reportParametersArray.get(i)
.getAsJsonObject();
Long id = null;
ReportParameter parameter = null;
String reportParameterName = null;
Set<ReportParameterUsage> reportParameterUsages = null;
if (jsonObject.has("parameterId")) {
final Long parameterId = jsonObject.get("parameterId")
.getAsLong();
parameter = this.reportParameterRepository
.findOne(parameterId);
if (parameter == null) {
throw new ReportParameterNotFoundException(
parameterId);
}
} else {
throw new PlatformDataIntegrityException(
"error.msg.parameter.id.mandatory.in.report.parameter",
"parameterId column is mandatory in Report Parameter Entry");
}
if (command.parameterExists("reportParameters")) {
JsonArray reportParametersArray = command.arrayOfParameterNamed("reportParameters");
if (reportParametersArray != null) {
if (jsonObject.has("reportParameterName")) {
reportParameterName = jsonObject.get(
"reportParameterName").getAsString();
}
reportParameterUsages = new HashSet<ReportParameterUsage>();
if (jsonObject.has("id")) {
final String idStr = jsonObject.get("id").getAsString();
if (!(idStr.equals("")))
id = Long.parseLong(idStr);
}
for (int i = 0; i < reportParametersArray.size(); i++) {
ReportParameterUsage reportParameterUsage = null;
if (id == null) {
reportParameterUsage = new ReportParameterUsage(report,
parameter, reportParameterName);
} else {
ReportParameterUsage currentReportParameterUsage = rpuById(
report, id);
final JsonObject jsonObject = reportParametersArray.get(i).getAsJsonObject();
if (existingEntryChanged(currentReportParameterUsage,
parameter.getId(), reportParameterName)) {
reportParameterUsage = new ReportParameterUsage(
currentReportParameterUsage, report,
parameter, reportParameterName);
} else {
reportParameterUsage = currentReportParameterUsage;
}
}
Long id = null;
ReportParameterUsage reportParameterUsageItem = null;
ReportParameter reportParameter = null;
String reportParameterName = null;
reportParameterUsages.add(reportParameterUsage);
}
return reportParameterUsages;
} else
return null;
} else
return null;
}
if (jsonObject.has("id")) {
final String idStr = jsonObject.get("id").getAsString();
if (StringUtils.isNotBlank(idStr)) {
id = Long.parseLong(idStr);
}
}
private boolean existingEntryChanged(
final ReportParameterUsage currentReportParameterUsage,
final Long parameterId, final String reportParameterName) {
if (id != null) {
// existing report parameter usage
reportParameterUsageItem = this.reportParameterUsageRepository.findOne(id);
if (reportParameterUsageItem == null) { throw new ReportParameterNotFoundException(id); }
if (!(currentReportParameterUsage.getParameter().getId()
.equals(parameterId)))
return true;
// check parameter
if (jsonObject.has("parameterId")) {
final Long parameterId = jsonObject.get("parameterId").getAsLong();
reportParameter = this.reportParameterRepository.findOne(parameterId);
if (reportParameter == null || !reportParameterUsageItem.hasParameterIdOf(parameterId)) {
//
throw new ReportParameterNotFoundException(parameterId);
}
}
if ((reportParameterName == null)
&& (currentReportParameterUsage.getReportParameterName() == null))
return false;
if (jsonObject.has("reportParameterName")) {
reportParameterName = jsonObject.get("reportParameterName").getAsString();
reportParameterUsageItem.updateParameterName(reportParameterName);
}
} else {
// new report parameter usage
if (jsonObject.has("parameterId")) {
final Long parameterId = jsonObject.get("parameterId").getAsLong();
reportParameter = this.reportParameterRepository.findOne(parameterId);
if (reportParameter == null) { throw new ReportParameterNotFoundException(parameterId); }
} else {
throw new PlatformDataIntegrityException("error.msg.parameter.id.mandatory.in.report.parameter",
"parameterId column is mandatory in Report Parameter Entry");
}
if (!(currentReportParameterUsage.getReportParameterName()
.equals(reportParameterName)))
return true;
if (jsonObject.has("reportParameterName")) {
reportParameterName = jsonObject.get("reportParameterName").getAsString();
}
return false;
}
reportParameterUsageItem = new ReportParameterUsage(report, reportParameter, reportParameterName);
}
private ReportParameterUsage rpuById(final Report report, final Long id) {
reportParameterUsages.add(reportParameterUsageItem);
}
}
}
for (ReportParameterUsage rpu : report.getReportParameterUsages()) {
if (rpu.getId().equals(id))
return rpu;
}
throw new PlatformDataIntegrityException(
"error.msg.supplied.parameter.id.doesnt.exist",
"Supplied parameterId column doesn't Exist", id);
}
return reportParameterUsages;
}
}