package org.sigmah.shared.dto;
/*
* #%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 java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.sigmah.shared.dto.base.AbstractModelDataEntityDTO;
import org.sigmah.shared.dto.base.mapping.CustomMappingField;
import org.sigmah.shared.dto.base.mapping.IsMappingMode;
import org.sigmah.shared.dto.base.mapping.MappingField;
import org.sigmah.shared.dto.element.DefaultContactFlexibleElementDTO;
import org.sigmah.shared.dto.element.FlexibleElementDTO;
import org.sigmah.shared.dto.layout.LayoutConstraintDTO;
import org.sigmah.shared.dto.layout.LayoutGroupDTO;
import org.sigmah.shared.dto.referential.ContactModelType;
import org.sigmah.shared.dto.referential.ElementTypeEnum;
import org.sigmah.shared.dto.referential.ProjectModelStatus;
public class ContactModelDTO extends AbstractModelDataEntityDTO<Integer> implements IsModel {
private static final long serialVersionUID = -250800101882782573L;
public static final String ENTITY_NAME = "ContactModel";
public static final String ID = "id";
public static final String NAME = "name";
public static final String STATUS = "status";
public static final String TYPE = "contactModelType";
public static final String MAINTENANCE_DATE = "dateMaintenance";
public static final String UNDER_MAINTENANCE = "underMaintenance";
public static final String CARD = "card";
public static final String DETAILS = "details";
public enum Mode implements IsMappingMode {
WITHOUT_LAYOUTS(new MappingField("card"), new MappingField("details"));
private final CustomMappingField[] customFields;
private final MappingField[] excludedFields;
Mode(final MappingField... excludedFields) {
this(null, excludedFields);
}
Mode(final CustomMappingField... customFields) {
this(customFields, (MappingField[]) null);
}
Mode(final CustomMappingField[] customFields, final MappingField... excludedFields) {
this.customFields = customFields;
this.excludedFields = excludedFields;
}
/**
* {@inheritDoc}
*/
@Override
public String getMapId() {
return name();
}
/**
* {@inheritDoc}
*/
@Override
public CustomMappingField[] getCustomFields() {
return customFields;
}
/**
* {@inheritDoc}
*/
@Override
public MappingField[] getExcludedFields() {
return excludedFields;
}
}
public static class LocalizedElement {
private final FlexibleElementDTO element;
public LocalizedElement(FlexibleElementDTO element) {
this.element = element;
}
/**
* Gets the flexible element.
*
* @return The flexible element.
*/
public FlexibleElementDTO getElement() {
return element;
}
}
/**
* Localized flexible elements.
*/
private transient HashMap<Class<? extends FlexibleElementDTO>, List<ContactModelDTO.LocalizedElement>> localizedElements;
/**
* {@inheritDoc}
*/
@Override
public String getEntityName() {
return ENTITY_NAME;
}
/**
* {@inheritDoc}
*/
@Override
public ModelType getModelType() {
return ModelType.ContactModel;
}
/**
* {@inheritDoc}
*/
@Override
public List<AbstractModelDataEntityDTO<?>> getHasLayoutElements() {
final List<AbstractModelDataEntityDTO<?>> hasLayoutElements = new ArrayList<AbstractModelDataEntityDTO<?>>();
hasLayoutElements.add(getDetails());
return hasLayoutElements;
}
public Integer getId() {
return get(ID);
}
public void setId(String id) {
set(ID, id);
}
@Override
public String getName() {
return get(NAME);
}
public void setName(String name) {
set(NAME, name);
}
public ContactModelType getType() {
return get(TYPE);
}
public void setType(ContactModelType contactModelType) {
set(TYPE, contactModelType);
}
// Card
public ContactCardDTO getCard() {
return get(CARD);
}
public void setCard(ContactCardDTO card) {
set(CARD, card);
}
// Details
public ContactDetailsDTO getDetails() {
return get(DETAILS);
}
public void setDetails(ContactDetailsDTO details) {
set(DETAILS, details);
}
@Override
public ProjectModelStatus getStatus() {
return (ProjectModelStatus) get(STATUS);
}
public void setStatus(ProjectModelStatus status) {
set(STATUS, status);
}
// Maintenance.
@Override
public boolean isUnderMaintenance() {
final Boolean underMaintenance = get(UNDER_MAINTENANCE);
return underMaintenance != null && underMaintenance;
}
public void setUnderMaintenance(boolean underMaintenance) {
set(UNDER_MAINTENANCE, underMaintenance);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isEditable() {
return getStatus().isEditable() || isUnderMaintenance();
}
// Maintenance start date.
@Override
public Date getDateMaintenance() {
return get(MAINTENANCE_DATE);
}
public void setDateMaintenance(Date date) {
set(MAINTENANCE_DATE, date);
}
/**
* {@inheritDoc}
*/
@Override
public List<FlexibleElementDTO> getAllElements() {
List<FlexibleElementDTO> allElements = new ArrayList<FlexibleElementDTO>();
List<FlexibleElementDTO> cardElements = new ArrayList<FlexibleElementDTO>();
// Card
if (this.getCard().getLayout() != null) {
for (LayoutGroupDTO layoutGroupDTO : getCard().getLayout().getGroups()) {
for (LayoutConstraintDTO layoutConstraintDTO : layoutGroupDTO.getConstraints()) {
FlexibleElementDTO flexibleElementDTO = layoutConstraintDTO.getFlexibleElementDTO();
// If the current element is a default contact flexible element not compatible with the current contact model type, do not add it
if (isElementIncompatibleWithCurrentType(flexibleElementDTO)) {
continue;
}
flexibleElementDTO.setBannerConstraint(layoutConstraintDTO);
cardElements.add(flexibleElementDTO);
}
}
}
// Details
ContactDetailsDTO contactDetailsDTO = getDetails();
contactDetailsDTO.setName();
setDetails(contactDetailsDTO);
if (getDetails().getLayout() != null) {
for (LayoutGroupDTO layoutGroupDTO : getDetails().getLayout().getGroups()) {
for (LayoutConstraintDTO layoutConstraintDTO : layoutGroupDTO.getConstraints()) {
FlexibleElementDTO flexibleElementDTO = layoutConstraintDTO.getFlexibleElementDTO();
if (isElementIncompatibleWithCurrentType(flexibleElementDTO)) {
continue;
}
flexibleElementDTO.setGroup(layoutGroupDTO);
flexibleElementDTO.setConstraint(layoutConstraintDTO);
flexibleElementDTO.setContainerModel(getDetails());
for (FlexibleElementDTO cardElement : cardElements) {
if (flexibleElementDTO.getId().equals(cardElement.getId())) {
flexibleElementDTO.setBannerConstraint(cardElement.getBannerConstraint());
}
}
allElements.add(flexibleElementDTO);
}
}
}
return allElements;
}
/**
* Gets all the flexible elements instances of the given class in this model (details page). The card is ignored
* cause the elements in it are read-only.
*
* @param clazz
* The class of the searched flexible elements.
* @return The elements localized for the given class, or <code>null</code> if there is no element of this class.
*/
public List<ContactModelDTO.LocalizedElement> getLocalizedElements(Class<? extends FlexibleElementDTO> clazz) {
if (localizedElements == null) {
localizedElements = new HashMap<Class<? extends FlexibleElementDTO>, List<ContactModelDTO.LocalizedElement>>();
// Details
for (final LayoutGroupDTO group : getDetails().getLayout().getGroups()) {
// For each constraint
for (final LayoutConstraintDTO constraint : group.getConstraints()) {
// Gets the element and its class
final FlexibleElementDTO flexibleElementDTO = constraint.getFlexibleElementDTO();
if (isElementIncompatibleWithCurrentType(flexibleElementDTO)) {
continue;
}
List<ContactModelDTO.LocalizedElement> elements = localizedElements.get(flexibleElementDTO.getClass());
// First element for this class
if (elements == null) {
elements = new ArrayList<ContactModelDTO.LocalizedElement>();
localizedElements.put(flexibleElementDTO.getClass(), elements);
}
// Maps the element.
elements.add(new ContactModelDTO.LocalizedElement(flexibleElementDTO));
}
}
}
return localizedElements.get(clazz);
}
private boolean isElementIncompatibleWithCurrentType(FlexibleElementDTO flexibleElementDTO) {
return flexibleElementDTO instanceof DefaultContactFlexibleElementDTO &&
!((DefaultContactFlexibleElementDTO) flexibleElementDTO).getType().isVisibleForType(getType());
}
/**
* Returns the current contact model corresponding global export elements.<br>
* Only the following types of elements are returned:
* <ul>
* <li>{@link ElementTypeEnum#DEFAULT_CONTACT}</li>
* <li>{@link ElementTypeEnum#CHECKBOX}</li>
* <li>{@link ElementTypeEnum#TEXT_AREA}</li>
* <li>{@link ElementTypeEnum#TRIPLETS}</li>
* <li>{@link ElementTypeEnum#QUESTION}</li>
* </ul>
*
* @return The current contact model corresponding global export elements.
*/
public List<FlexibleElementDTO> getGlobalExportElements() {
final List<FlexibleElementDTO> allElements = new ArrayList<FlexibleElementDTO>();
// add details groups
final ContactDetailsDTO p = getDetails();
p.setName();
setDetails(p);
if (getDetails().getLayout() != null) {
for (final LayoutGroupDTO lg : getDetails().getLayout().getGroups()) {
for (final LayoutConstraintDTO lc : lg.getConstraints()) {
final FlexibleElementDTO element = lc.getFlexibleElementDTO();
element.setGroup(lg);
element.setConstraint(lc);
element.setContainerModel(getDetails());
final ElementTypeEnum type = element.getElementType();
if (element instanceof DefaultContactFlexibleElementDTO) {
DefaultContactFlexibleElementDTO defaultElement = (DefaultContactFlexibleElementDTO) element;
if (getType() == ContactModelType.INDIVIDUAL) {
switch (defaultElement.getType()) {
case ORGANIZATION_NAME:
continue;
}
} else {
switch (defaultElement.getType()) {
case FAMILY_NAME:
case FIRST_NAME:
continue;
}
}
}
if (ElementTypeEnum.DEFAULT_CONTACT == type
|| ElementTypeEnum.CHECKBOX == type
|| ElementTypeEnum.TEXT_AREA == type
|| ElementTypeEnum.TRIPLETS == type
|| ElementTypeEnum.QUESTION == type
|| ElementTypeEnum.CONTACT_LIST == type) {
allElements.add(element);
}
}
}
}
return allElements;
}
}