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);
+ }
+
}