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.client.util.ClientUtils; 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.FlexibleElementDTO; import org.sigmah.shared.dto.layout.LayoutConstraintDTO; import org.sigmah.shared.dto.layout.LayoutGroupDTO; import org.sigmah.shared.dto.referential.ProjectModelStatus; /** * OrgUnitModelDTO. * * @author Denis Colliot (dcolliot@ideia.fr) */ public class OrgUnitModelDTO extends AbstractModelDataEntityDTO<Integer> implements IsModel { /** * Serial version UID. */ private static final long serialVersionUID = -6438355456637422931L; /** * DTO corresponding entity name. */ public static final String ENTITY_NAME = "OrgUnitModel"; // DTO attributes keys. public static final String NAME = "name"; public static final String TITLE = "title"; public static final String HAS_BUDGET = "hasBudget"; public static final String CAN_CONTAIN_PROJECTS = "canContainProjects"; public static final String STATUS = "status"; public static final String TOP_MODEL = "topModel"; public static final String MAINTENANCE_DATE = "dateMaintenance"; public static final String UNDER_MAINTENANCE = "underMaintenance"; public static final String BANNER = "banner"; public static final String DETAILS = "details"; /** * Mapping configurations. * * @author Denis Colliot (dcolliot@ideia.fr) */ public static enum Mode implements IsMappingMode { /** * Base mapping that does not map following data: * <ul> * <li> {@link OrgUnitModelDTO#BANNER}</li> * <li> {@link OrgUnitModelDTO#DETAILS}</li> * </ul> */ BASE(new MappingField(BANNER), new MappingField(DETAILS)), /** * Mapping all data */ ALL(); private final CustomMappingField[] customFields; private final MappingField[] excludedFields; private Mode(final MappingField... excludedFields) { this(null, excludedFields); } private Mode(final CustomMappingField... customFields) { this(customFields, (MappingField[]) null); } private 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; } } /** * Localizes an flexible element in the organizational unit model. * * @author kma (1.3) */ 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<LocalizedElement>> localizedElements; /** * {@inheritDoc} */ @Override public String getEntityName() { return ENTITY_NAME; } /** * {@inheritDoc} */ @Override public ModelType getModelType() { return ModelType.OrgUnitModel; } /** * {@inheritDoc} */ @Override public List<AbstractModelDataEntityDTO<?>> getHasLayoutElements() { final List<AbstractModelDataEntityDTO<?>> hasLayoutElements = new ArrayList<AbstractModelDataEntityDTO<?>>(); hasLayoutElements.add(getDetails()); return hasLayoutElements; } // Name @Override public String getName() { return get(NAME); } public void setName(String name) { set(NAME, name); } // Title public String getTitle() { return get(TITLE); } public void setTitle(String title) { set(TITLE, title); } // Banner public OrgUnitBannerDTO getBanner() { return get(BANNER); } public void setBanner(OrgUnitBannerDTO banner) { set(BANNER, banner); } // Details public OrgUnitDetailsDTO getDetails() { return get(DETAILS); } public void setDetails(OrgUnitDetailsDTO details) { set(DETAILS, details); } // Budget public Boolean getHasBudget() { return (Boolean) get(HAS_BUDGET); } public void setHasBudget(Boolean hasBudget) { set(HAS_BUDGET, hasBudget); } // Can contain projects public Boolean getCanContainProjects() { return (Boolean) get(CAN_CONTAIN_PROJECTS); } public void setCanContainProjects(Boolean canContainProjects) { set(CAN_CONTAIN_PROJECTS, canContainProjects); } @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); } public void setTopOrgUnitModel(boolean is) { set(TOP_MODEL, is); } public boolean isTopOrgUnitModel() { return ClientUtils.isTrue(get(TOP_MODEL)); } /** * {@inheritDoc} */ @Override public List<FlexibleElementDTO> getAllElements() { List<FlexibleElementDTO> allElements = new ArrayList<FlexibleElementDTO>(); List<FlexibleElementDTO> bannerElements = new ArrayList<FlexibleElementDTO>(); // banner if (this.getBanner().getLayout() != null) { for (LayoutGroupDTO lg : getBanner().getLayout().getGroups()) { for (LayoutConstraintDTO lc : lg.getConstraints()) { FlexibleElementDTO f = lc.getFlexibleElementDTO(); f.setBannerConstraint(lc); bannerElements.add(f); } } } // Details OrgUnitDetailsDTO d = getDetails(); d.setName(); setDetails(d); if (getDetails().getLayout() != null) { for (LayoutGroupDTO lg : getDetails().getLayout().getGroups()) { for (LayoutConstraintDTO lc : lg.getConstraints()) { FlexibleElementDTO f = lc.getFlexibleElementDTO(); f.setGroup(lg); f.setConstraint(lc); f.setContainerModel(getDetails()); for (FlexibleElementDTO bf : bannerElements) { if (f.getId().equals(bf.getId())) { f.setBannerConstraint(bf.getBannerConstraint()); } } allElements.add(f); } } } return allElements; } /** * Gets all the flexible elements instances of the given class in this model (details page). The banner 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<LocalizedElement> getLocalizedElements(Class<? extends FlexibleElementDTO> clazz) { if (localizedElements == null) { localizedElements = new HashMap<Class<? extends FlexibleElementDTO>, List<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 element = constraint.getFlexibleElementDTO(); List<LocalizedElement> elements = localizedElements.get(element.getClass()); // First element for this class if (elements == null) { elements = new ArrayList<LocalizedElement>(); localizedElements.put(element.getClass(), elements); } // Maps the element. elements.add(new LocalizedElement(element)); } } } return localizedElements.get(clazz); } }