diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/Label.java b/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/Label.java index 2b32a4bd0..2f9c6def6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/Label.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/Label.java @@ -57,6 +57,10 @@ public class Label extends IntegrationEntity { return create(new Label(name)); } + public static Label create(String code, String name) { + return create(new Label(name), code); + } + protected Label(String name) { this.name = name; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/LabelType.java b/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/LabelType.java index ba8eda478..2f28e9c16 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/LabelType.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/labels/entities/LabelType.java @@ -53,6 +53,10 @@ public class LabelType extends IntegrationEntity implements Comparable { return create(new LabelType(name)); } + public static LabelType create(String code, String name) { + return create(new LabelType(name), code); + } + protected LabelType(String name) { this.name = name; } @@ -72,6 +76,7 @@ public class LabelType extends IntegrationEntity implements Comparable { public void addLabel(Label label) { Validate.notNull(label); labels.add(label); + label.setType(this); } public void removeLabel(Label label) { @@ -90,4 +95,5 @@ public class LabelType extends IntegrationEntity implements Comparable { protected ILabelTypeDAO getIntegrationEntityDAO() { return Registry.getLabelTypeDAO(); } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/api/ILabelService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/api/ILabelService.java index 57cf55af7..b47ecf80d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/api/ILabelService.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/api/ILabelService.java @@ -21,6 +21,7 @@ package org.navalplanner.ws.labels.api; import org.navalplanner.business.labels.entities.Label; +import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; /** * Service for managing {@link Label} entities. @@ -29,4 +30,9 @@ import org.navalplanner.business.labels.entities.Label; */ public interface ILabelService { + LabelTypeListDTO getLabelTypes(); + + InstanceConstraintViolationsListDTO addLabelTypes( + LabelTypeListDTO labelTypes); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/impl/LabelConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/impl/LabelConverter.java new file mode 100644 index 000000000..eb352aef2 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/impl/LabelConverter.java @@ -0,0 +1,86 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.ws.labels.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.navalplanner.business.labels.entities.Label; +import org.navalplanner.business.labels.entities.LabelType; +import org.navalplanner.ws.labels.api.LabelDTO; +import org.navalplanner.ws.labels.api.LabelTypeDTO; +import org.navalplanner.ws.labels.api.LabelTypeListDTO; + +/** + * Converter from/to {@link Label} related entities to/from DTOs. + * + * @author Manuel Rego Casasnovas + */ +public final class LabelConverter { + + private LabelConverter() { + } + + public final static LabelTypeListDTO toDTO(Collection labelTypes) { + List labelTypeDTOs = new ArrayList(); + + for (LabelType label : labelTypes) { + labelTypeDTOs.add(toDTO(label)); + } + + return new LabelTypeListDTO(labelTypeDTOs); + } + + public final static LabelTypeDTO toDTO(LabelType labelType) { + List labelDTOs = new ArrayList(); + + for (Label label : labelType.getLabels()) { + labelDTOs.add(toDTO(label)); + } + + return new LabelTypeDTO(labelType.getCode(), labelType.getName(), + labelDTOs); + } + + public final static LabelDTO toDTO(Label label) { + return new LabelDTO(label.getCode(), label.getName()); + } + + public final static LabelType toEntity(LabelTypeDTO labelTypeDTO) { + LabelType labelType = LabelType.create(labelTypeDTO.code, + labelTypeDTO.name); + + for (LabelDTO labelDTO : labelTypeDTO.labels) { + labelType.addLabel(toEntity(labelDTO)); + } + + return labelType; + + } + + private static Label toEntity(LabelDTO labelDTO) { + Label label = Label.create(labelDTO.code, labelDTO.name); + + return label; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/impl/LabelServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/impl/LabelServiceREST.java index aeab0c52d..ba82d168a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/impl/LabelServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/labels/impl/LabelServiceREST.java @@ -20,11 +20,32 @@ package org.navalplanner.ws.labels.impl; +import static org.navalplanner.web.I18nHelper._; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.labels.daos.ILabelTypeDAO; +import org.navalplanner.business.labels.entities.LabelType; +import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; +import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; +import org.navalplanner.ws.common.impl.ConstraintViolationConverter; +import org.navalplanner.ws.common.impl.Util; import org.navalplanner.ws.labels.api.ILabelService; +import org.navalplanner.ws.labels.api.LabelTypeDTO; +import org.navalplanner.ws.labels.api.LabelTypeListDTO; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * REST-based implementation of {@link ILabelService}. @@ -36,4 +57,67 @@ import org.springframework.stereotype.Service; @Service("labelServiceREST") public class LabelServiceREST implements ILabelService { + @Autowired + private ILabelTypeDAO labelTypeDAO; + + @Override + @GET + @Transactional(readOnly = true) + public LabelTypeListDTO getLabelTypes() { + return LabelConverter.toDTO(labelTypeDAO.getAll()); + } + + @Override + @POST + @Consumes("application/xml") + @Transactional + public InstanceConstraintViolationsListDTO addLabelTypes( + LabelTypeListDTO labelTypes) { + List instanceConstraintViolationsList = new ArrayList(); + Long numItem = new Long(1); + Set labelTypeNames = new HashSet(); + + for (LabelTypeDTO labelTypeDTO : labelTypes.labelTypes) { + InstanceConstraintViolationsDTO instanceConstraintViolationsDTO = null; + + LabelType labelType = LabelConverter.toEntity(labelTypeDTO); + + if (labelType.getName() != null + && labelTypeNames.contains(labelType.getName() + .toLowerCase())) { + + instanceConstraintViolationsDTO = InstanceConstraintViolationsDTO + .create(Util.generateInstanceConstraintViolationsDTOId( + numItem, labelTypeDTO), + _("label type name is used by another label " + + "type being imported")); + } else { + try { + labelType.validate(); + labelTypeDAO.save(labelType); + + if (labelType.getName() != null) { + labelTypeNames.add(labelType.getName().toLowerCase()); + } + } catch (ValidationException e) { + instanceConstraintViolationsDTO = ConstraintViolationConverter + .toDTO(Util + .generateInstanceConstraintViolationsDTOId( + numItem, labelTypeDTO), e + .getInvalidValues()); + } + } + + if (instanceConstraintViolationsDTO != null) { + instanceConstraintViolationsList + .add(instanceConstraintViolationsDTO); + } + + numItem++; + } + + return new InstanceConstraintViolationsListDTO( + instanceConstraintViolationsList); + } + }