package org.activityinfo.server.command.handler; /* * #%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.time.calendar.LocalDate; import com.google.common.base.Strings; import com.google.inject.util.Providers; import org.activityinfo.model.type.FieldTypeClass; import org.activityinfo.legacy.shared.exception.IllegalAccessCommandException; import org.activityinfo.model.type.TypeRegistry; import org.activityinfo.server.database.hibernate.entity.*; import javax.persistence.EntityManager; import java.util.Date; import java.util.Map; /** * Provides functionality common to CreateEntityHandler and UpdateEntityHandler * * @author Alex Bertram (akbertram@gmail.com) */ public class BaseEntityHandler { private final EntityManager em; private final PermissionOracle permissionsOracle; public BaseEntityHandler(EntityManager em) { this.em = em; this.permissionsOracle = new PermissionOracle(Providers.of(em)); } protected void updateIndicatorProperties(Indicator indicator, Map<String, Object> changes) { if (changes.containsKey("name")) { indicator.setName(trim(changes.get("name"))); } if (changes.containsKey("type")) { String typeId = (String) changes.get("type"); FieldTypeClass type = TypeRegistry.get().getTypeClass(typeId); indicator.setType(type != null ? type.getId() : null); if (type != FieldTypeClass.QUANTITY && !changes.containsKey("units")) { indicator.setUnits(""); } } if (changes.containsKey("expression")) { indicator.setExpression(trim(changes.get("expression"))); } if (changes.containsKey("skipExpression")) { indicator.setSkipExpression(trim(changes.get("skipExpression"))); } if (changes.containsKey("nameInExpression")) { indicator.setNameInExpression(trim(changes.get("nameInExpression"))); } if (changes.containsKey("calculatedAutomatically")) { indicator.setCalculatedAutomatically((Boolean) changes.get("calculatedAutomatically")); } if (changes.containsKey("aggregation")) { indicator.setAggregation((Integer) changes.get("aggregation")); } if (changes.containsKey("category")) { indicator.setCategory(trim(changes.get("category"))); } if (changes.containsKey("listHeader")) { indicator.setListHeader(trim(changes.get("listHeader"))); } if (changes.containsKey("description")) { indicator.setDescription(trim(changes.get("description"))); } if (changes.containsKey("units")) { indicator.setUnits(trim(changes.get("units"))); } if (changes.containsKey("sortOrder")) { indicator.setSortOrder((Integer) changes.get("sortOrder")); } if (changes.containsKey("mandatory")) { indicator.setMandatory((Boolean) changes.get("mandatory")); } indicator.getActivity().getDatabase().setLastSchemaUpdate(new Date()); } protected void updateAttributeProperties(Map<String, Object> changes, Attribute attribute) { if (changes.containsKey("name")) { attribute.setName(trim(changes.get("name"))); } if (changes.containsKey("sortOrder")) { attribute.setSortOrder((Integer) changes.get("sortOrder")); } // TODO: update lastSchemaUpdate } protected void updateAttributeGroupProperties(AttributeGroup group, Map<String, Object> changes) { if (changes.containsKey("name")) { group.setName(trim(changes.get("name"))); } if (changes.containsKey("multipleAllowed")) { group.setMultipleAllowed((Boolean) changes.get("multipleAllowed")); } if (changes.containsKey("sortOrder")) { group.setSortOrder((Integer) changes.get("sortOrder")); } if (changes.containsKey("mandatory")) { group.setMandatory((Boolean) changes.get("mandatory")); } if (changes.containsKey("defaultValue")) { group.setDefaultValue((Integer) changes.get("defaultValue")); } if (changes.containsKey("workflow")) { group.setWorkflow((Boolean) changes.get("workflow")); } } protected void updateLockedPeriodProperties(LockedPeriod lockedPeriod, Map<String, Object> changes) { if (changes.containsKey("name")) { lockedPeriod.setName(trim(changes.get("name"))); } if (changes.containsKey("toDate")) { lockedPeriod.setToDate((LocalDate) changes.get("toDate")); } if (changes.containsKey("fromDate")) { lockedPeriod.setFromDate((LocalDate) changes.get("fromDate")); } if (changes.containsKey("enabled")) { lockedPeriod.setEnabled((Boolean) changes.get("enabled")); } lockedPeriod.getParentDatabase().setLastSchemaUpdate(new Date()); entityManager().merge(lockedPeriod); } private String trim(Object value) { if (value instanceof String) { String stringValue = (String)value; return Strings.emptyToNull(stringValue.trim()); } else { return null; } } protected void updateTargetProperties(Target target, Map<String, Object> changes) { if (changes.containsKey("name")) { target.setName(trim(changes.get("name"))); } if (changes.containsKey("date1")) { target.setDate1((Date) changes.get("date1")); } if (changes.containsKey("date2")) { target.setDate2((Date) changes.get("date2")); } if (changes.containsKey("projectId")) { target.setProject(entityManager().getReference(Project.class, changes.get("projectId"))); } if (changes.containsKey("partnerId")) { target.setPartner(entityManager().getReference(Partner.class, changes.get("partnerId"))); } if (changes.containsKey("AdminEntityId")) { target.setAdminEntity(entityManager().getReference(AdminEntity.class, changes.get("AdminEntityId"))); } } /** * Asserts that the user has permission to modify the structure of the given * database. * * @param user THe user for whom to check permissions * @param database The database the user is trying to modify * @throws IllegalAccessCommandException If the user does not have permission */ protected void assertDesignPrivileges(User user, UserDatabase database) throws IllegalAccessCommandException { if (!permissionsOracle.isDesignAllowed(database, user)) { throw new IllegalAccessCommandException(); } } public EntityManager entityManager() { return em; } }