package org.activityinfo.legacy.shared.impl;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* 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 com.bedatadriven.rebar.sql.client.SqlResultCallback;
import com.bedatadriven.rebar.sql.client.SqlResultSet;
import com.bedatadriven.rebar.sql.client.SqlTransaction;
import com.bedatadriven.rebar.sql.client.query.SqlInsert;
import com.bedatadriven.rebar.sql.client.query.SqlQuery;
import com.bedatadriven.rebar.sql.client.query.SqlUpdate;
import com.bedatadriven.rebar.time.calendar.LocalDate;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.activityinfo.legacy.shared.command.UpdateSite;
import org.activityinfo.legacy.shared.command.result.VoidResult;
import org.activityinfo.legacy.shared.model.AdminLevelDTO;
import org.activityinfo.legacy.shared.model.AttributeDTO;
import org.activityinfo.legacy.shared.model.IndicatorDTO;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
public class UpdateSiteHandler implements CommandHandlerAsync<UpdateSite, VoidResult> {
@Override
public void execute(final UpdateSite command, ExecutionContext context, final AsyncCallback<VoidResult> callback) {
final Map<String, Object> changes = command.getChanges().getTransientMap();
SqlTransaction tx = context.getTransaction();
updateSiteProperties(tx, command, changes);
updateAttributeValues(tx, command.getSiteId(), changes);
// updateLocation(tx, command.getSiteId(), changes);
updateReportingPeriod(tx, command.getSiteId(), changes);
callback.onSuccess(new VoidResult());
}
private void updateSiteProperties(SqlTransaction tx, UpdateSite command, Map<String, Object> changes) {
Date now = new Date();
SqlUpdate.update("site")
.where("SiteId", command.getSiteId())
.value("date1", changes)
.value("date2", changes)
.value("comments", changes)
.value("projectId", changes)
.value("partnerId", changes)
.value("locationId", changes)
.value("dateEdited", now)
.value("timeEdited", now.getTime())
.execute(tx);
}
private void updateAttributeValues(SqlTransaction tx, int siteId, Map<String, Object> changes) {
for (Entry<String, Object> change : changes.entrySet()) {
if (change.getKey().startsWith(AttributeDTO.PROPERTY_PREFIX)) {
int attributeId = AttributeDTO.idForPropertyName(change.getKey());
Boolean value = (Boolean) change.getValue();
SqlUpdate.delete(Tables.ATTRIBUTE_VALUE)
.where("attributeId", attributeId)
.where("siteId", siteId)
.execute(tx);
if (value != null) {
SqlInsert.insertInto(Tables.ATTRIBUTE_VALUE)
.value("attributeId", attributeId)
.value("siteId", siteId)
.value("value", value)
.execute(tx);
}
}
}
}
private void updateReportingPeriod(SqlTransaction tx, final int siteId, final Map<String, Object> changes) {
SqlQuery.select("reportingPeriodId")
.from(Tables.REPORTING_PERIOD)
.where("siteId")
.equalTo(siteId)
.execute(tx, new SqlResultCallback() {
@Override
public void onSuccess(SqlTransaction tx, SqlResultSet results) {
if (results.getRows().size() == 1) {
updateReportingPeriod(tx, siteId, results.getRow(0).getInt("reportingPeriodId"), changes);
}
}
});
}
private void updateReportingPeriod(SqlTransaction tx,
int siteId,
int reportingPeriodId,
Map<String, Object> changes) {
SqlUpdate.update(Tables.REPORTING_PERIOD)
.where("reportingPeriodId", reportingPeriodId)
.value("date1", changes)
.value("date2", changes)
.execute(tx);
for (Map.Entry<String, Object> change : changes.entrySet()) {
if (change.getKey().startsWith(IndicatorDTO.PROPERTY_PREFIX)) {
int indicatorId = IndicatorDTO.indicatorIdForPropertyName(change.getKey());
Object value = change.getValue();
SqlUpdate.delete(Tables.INDICATOR_VALUE)
.where("reportingPeriodId", reportingPeriodId)
.where("indicatorId", indicatorId)
.execute(tx);
if (value != null) {
SqlInsert sqlInsert = SqlInsert.insertInto(Tables.INDICATOR_VALUE)
.value("reportingPeriodId", reportingPeriodId)
.value("indicatorId", indicatorId);
if (value instanceof Double) {
sqlInsert.value("value", value).execute(tx);
} else if (value instanceof String) {
sqlInsert.value("TextValue", value).execute(tx);
} else if (value instanceof LocalDate) {
sqlInsert.value("DateValue", value).execute(tx);
}
}
}
}
}
private void updateLocationAdminLinks(SqlTransaction tx, int locationId, Map<String, Object> properties) {
// admin entity membership is not updated invidually,
// it must be updated in totality for a given site to maintain
// consistency
if (hasAdminUpdates(properties)) {
SqlUpdate.delete(Tables.LOCATION_ADMIN_LINK).where("locationId", locationId).execute(tx);
for (Entry<String, Object> property : properties.entrySet()) {
if (property.getKey().startsWith(AdminLevelDTO.PROPERTY_PREFIX)) {
Integer entityId = (Integer) property.getValue();
if (entityId != null) {
SqlInsert.insertInto("LocationAdminLink")
.value("AdminEntityId", entityId)
.value("Locationid", locationId)
.execute(tx);
}
}
}
}
}
private boolean hasAdminUpdates(Map<String, Object> changes) {
for (String propertyName : changes.keySet()) {
if (propertyName.startsWith(AdminLevelDTO.PROPERTY_PREFIX)) {
return true;
}
}
return false;
}
}