package org.sigmah.server.service;
/*
* #%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 com.google.inject.Inject;
import java.util.Arrays;
import java.util.Date;
import org.sigmah.client.util.AdminUtil;
import org.sigmah.server.dao.ContactModelDAO;
import org.sigmah.server.dispatch.impl.UserDispatch;
import org.sigmah.server.domain.ContactCard;
import org.sigmah.server.domain.ContactDetails;
import org.sigmah.server.domain.ContactModel;
import org.sigmah.server.domain.User;
import org.sigmah.server.domain.element.DefaultContactFlexibleElement;
import org.sigmah.server.domain.layout.Layout;
import org.sigmah.server.domain.layout.LayoutConstraint;
import org.sigmah.server.domain.layout.LayoutGroup;
import org.sigmah.server.mapper.Mapper;
import org.sigmah.server.service.base.AbstractEntityService;
import org.sigmah.server.service.util.ModelUtil;
import org.sigmah.server.service.util.PropertyMap;
import org.sigmah.shared.dispatch.CommandException;
import org.sigmah.shared.dto.ContactModelDTO;
import org.sigmah.shared.dto.referential.ContactModelType;
import org.sigmah.shared.dto.referential.DefaultContactFlexibleElementType;
import org.sigmah.shared.dto.referential.ProjectModelStatus;
public class ContactModelService extends AbstractEntityService<ContactModel, Integer, ContactModelDTO> {
@Inject
private ContactModelDAO contactModelDAO;
@Inject
private Mapper mapper;
@Inject
private ModelUtil modelUtil;
@Override
public ContactModel create(PropertyMap properties, UserDispatch.UserExecutionContext context) throws CommandException {
final ContactModelDTO contactModelDTO = (ContactModelDTO) properties.get(AdminUtil.ADMIN_CONTACT_MODEL);
// Only draft models can be changed.
if (contactModelDTO == null) {
return null;
}
if (contactModelDTO.getId() != null) {
// Properties can only contain actual changes between old version and new one as verification has already been
// done.
return update(contactModelDTO.getId(), properties, context);
}
// Create new draft ContactModel
ContactModel contactModel = createContactModel(null, properties, context.getUser());
// Contact model details
ContactDetails contactDetails = new ContactDetails();
Layout detailsLayout = new Layout();
detailsLayout.setColumnsCount(1);
detailsLayout.setRowsCount(1);
contactDetails.setLayout(detailsLayout);
contactDetails.setContactModel(contactModel);
ContactCard contactCard = new ContactCard();
Layout cardLayout = new Layout();
cardLayout.setColumnsCount(2);
cardLayout.setRowsCount(1);
contactCard.setLayout(cardLayout);
contactCard.setContactModel(contactModel);
LayoutGroup detailsGroup = new LayoutGroup();
detailsGroup.setTitle("Default details group");
detailsGroup.setColumn(0);
detailsGroup.setRow(0);
detailsGroup.setParentLayout(detailsLayout);
LayoutGroup avatarGroup = new LayoutGroup();
avatarGroup.setTitle("Avatar group");
avatarGroup.setColumn(1);
avatarGroup.setRow(0);
avatarGroup.setParentLayout(cardLayout);
LayoutGroup cardGroup = new LayoutGroup();
cardGroup.setTitle("Default card group");
cardGroup.setColumn(0);
cardGroup.setRow(1);
cardGroup.setParentLayout(cardLayout);
// Default flexible elements all in default details group
int order = 0;
for (DefaultContactFlexibleElementType e : DefaultContactFlexibleElementType.values()) {
DefaultContactFlexibleElement defaultElement = new DefaultContactFlexibleElement();
defaultElement.setType(e);
defaultElement.setValidates(false);
defaultElement.setAmendable(true);
defaultElement.setExportable(true);
em().persist(defaultElement);
// Details
LayoutConstraint detailLayoutConstraint = new LayoutConstraint();
detailLayoutConstraint.setParentLayoutGroup(detailsGroup);
detailLayoutConstraint.setElement(defaultElement);
detailLayoutConstraint.setSortOrder(order);
detailsGroup.addConstraint(detailLayoutConstraint);
// Card
LayoutConstraint cardLayoutConstraint = new LayoutConstraint();
cardLayoutConstraint.setElement(defaultElement);
if (e == DefaultContactFlexibleElementType.PHOTO) {
cardLayoutConstraint.setSortOrder(0);
cardLayoutConstraint.setParentLayoutGroup(avatarGroup);
avatarGroup.addConstraint(cardLayoutConstraint);
} else if (e.getDefaultCardOrder() != null) {
cardLayoutConstraint.setSortOrder(e.getDefaultCardOrder());
cardLayoutConstraint.setParentLayoutGroup(cardGroup);
cardGroup.addConstraint(cardLayoutConstraint);
}
order++;
}
detailsLayout.setGroups(Arrays.asList(detailsGroup));
cardLayout.setGroups(Arrays.asList(avatarGroup, cardGroup));
contactModel.setDetails(contactDetails);
contactModel.setCard(contactCard);
return contactModelDAO.persist(contactModel, context.getUser());
}
@Override
public ContactModel update(Integer entityId, PropertyMap changes, UserDispatch.UserExecutionContext context) throws CommandException {
ContactModel contactModel = em().find(ContactModel.class, entityId);
if (contactModel == null) {
throw new IllegalArgumentException("No ContactModel found for id #" + entityId);
}
if (changes.get(AdminUtil.PROP_CM_NAME) != null) {
contactModel = createContactModel(contactModel, changes, context.getUser());
return em().merge(contactModel);
}
if (changes.get(AdminUtil.PROP_FX_FLEXIBLE_ELEMENT) != null) {
modelUtil.persistFlexibleElement(changes, contactModel);
return em().find(ContactModel.class, contactModel.getId());
}
em().flush();
return null;
}
private static ContactModel createContactModel(ContactModel oldContactModel, PropertyMap properties, User user) {
ContactModel updatedContactModel = oldContactModel;
if (updatedContactModel == null) {
updatedContactModel = new ContactModel();
updatedContactModel.setStatus(ProjectModelStatus.DRAFT);
updatedContactModel.setOrganization(user.getOrganization());
} else {
if (properties.get(AdminUtil.PROP_CM_STATUS) != null) {
updatedContactModel.setStatus((ProjectModelStatus) properties.get(AdminUtil.PROP_CM_STATUS));
}
if (properties.containsKey(AdminUtil.PROP_CM_MAINTENANCE_DATE)) {
Object maintenanceDate = properties.get(AdminUtil.PROP_CM_MAINTENANCE_DATE);
if (maintenanceDate instanceof Date) {
updatedContactModel.setDateMaintenance((Date) maintenanceDate);
} else {
updatedContactModel.setDateMaintenance(null);
}
}
}
if (properties.get(AdminUtil.PROP_CM_NAME) != null) {
updatedContactModel.setName((String) properties.get(AdminUtil.PROP_CM_NAME));
}
if (properties.get(AdminUtil.PROP_CM_TYPE) != null) {
updatedContactModel.setType((ContactModelType) properties.get(AdminUtil.PROP_CM_TYPE));
}
return updatedContactModel;
}
}