From 8f41cd58366c85ed01aa05c4c83d63a2799548c2 Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Thu, 4 Mar 2010 17:05:57 +0100 Subject: [PATCH] ItEr49S18AdaptacionServiciosREST: Fixes the LabelServiceREST. --- .../business/labels/entities/Label.java | 7 ++ .../business/labels/entities/LabelType.java | 22 ++++++ .../ws/labels/impl/LabelConverter.java | 32 ++++++++ .../ws/labels/impl/LabelServiceREST.java | 78 ++++++------------- .../test/ws/labels/api/LabelServiceTest.java | 34 +++++--- scripts/rest-clients/README | 12 +++ scripts/rest-clients/export-label-types.sh | 21 +++++ scripts/rest-clients/import-label-types.sh | 33 ++++++++ scripts/rest-clients/label-sample.xml | 18 +++++ 9 files changed, 194 insertions(+), 63 deletions(-) create mode 100755 scripts/rest-clients/export-label-types.sh create mode 100755 scripts/rest-clients/import-label-types.sh create mode 100644 scripts/rest-clients/label-sample.xml 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 72b039dfb..9311b2cd8 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 @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.NotNull; @@ -115,4 +116,10 @@ public class Label extends IntegrationEntity { return Registry.getLabelDAO(); } + public void updateUnvalidated(String name) { + if (!StringUtils.isBlank(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 184de61b5..6eaab7fe0 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 @@ -141,4 +141,26 @@ public class LabelType extends IntegrationEntity implements Comparable { return !StringUtils.isBlank(name); } + public void updateUnvalidated(String name) { + if (!StringUtils.isBlank(name)) { + this.name = name; + } + } + + public Label getLabelByCode(String code) throws InstanceNotFoundException { + + if (StringUtils.isBlank(code)) { + throw new InstanceNotFoundException(code, Label.class.getName()); + } + + for (Label l : labels) { + if (l.getCode().equalsIgnoreCase(StringUtils.trim(code))) { + return l; + } + } + + throw new InstanceNotFoundException(code, Label.class.getName()); + + } + } 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 index c876a983a..00733bb5b 100644 --- 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 @@ -20,10 +20,15 @@ package org.navalplanner.ws.labels.impl; +import static org.navalplanner.web.I18nHelper._; + import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.apache.commons.lang.StringUtils; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.labels.entities.Label; import org.navalplanner.business.labels.entities.LabelType; import org.navalplanner.ws.labels.api.LabelDTO; @@ -83,4 +88,31 @@ public final class LabelConverter { return label; } + public final static void updateLabelType(LabelType labelType, + LabelTypeDTO labelTypeDTO) throws ValidationException { + + /* + * 1: Update basic properties in existing label or add new label. + */ + List labelDTOs = labelTypeDTO.labels; + for (LabelDTO labelDTO : labelDTOs) { + + /* Step 1.1: requires each label DTO to have a code. */ + if (StringUtils.isBlank(labelDTO.code)) { + throw new ValidationException(_("missing code in a label")); + } + + try { + Label label = labelType.getLabelByCode(labelDTO.code); + label.updateUnvalidated(StringUtils.trim(labelDTO.name)); + } catch (InstanceNotFoundException e) { + labelType.addLabel(toEntity(labelDTO)); + } + } + + /* 2: Update label type basic properties. */ + labelType.updateUnvalidated(StringUtils.trim(labelTypeDTO.name)); + + } + } 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 49254e013..1a3829a97 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,26 +20,19 @@ 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.daos.IIntegrationEntityDAO; 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.common.impl.GenericRESTService; +import org.navalplanner.ws.common.impl.RecoverableErrorException; import org.navalplanner.ws.labels.api.ILabelService; import org.navalplanner.ws.labels.api.LabelTypeDTO; import org.navalplanner.ws.labels.api.LabelTypeListDTO; @@ -55,7 +48,8 @@ import org.springframework.transaction.annotation.Transactional; @Path("/labels/") @Produces("application/xml") @Service("labelServiceREST") -public class LabelServiceREST implements ILabelService { +public class LabelServiceREST extends + GenericRESTService implements ILabelService { @Autowired private ILabelTypeDAO labelTypeDAO; @@ -64,7 +58,7 @@ public class LabelServiceREST implements ILabelService { @GET @Transactional(readOnly = true) public LabelTypeListDTO getLabelTypes() { - return LabelConverter.toDTO(labelTypeDAO.getAll()); + return new LabelTypeListDTO(findAll()); } @Override @@ -73,51 +67,29 @@ public class LabelServiceREST implements ILabelService { @Transactional public InstanceConstraintViolationsListDTO addLabelTypes( LabelTypeListDTO labelTypes) { - List instanceConstraintViolationsList = new ArrayList(); - Long numItem = new Long(1); - Set labelTypeNames = new HashSet(); + return save(labelTypes.labelTypes); + } - for (LabelTypeDTO labelTypeDTO : labelTypes.labelTypes) { - InstanceConstraintViolationsDTO instanceConstraintViolationsDTO = null; + @Override + protected IIntegrationEntityDAO getIntegrationEntityDAO() { + return labelTypeDAO; + } - LabelType labelType = LabelConverter.toEntity(labelTypeDTO); + @Override + protected LabelTypeDTO toDTO(LabelType entity) { + return LabelConverter.toDTO(entity); + } - if (labelType.getName() != null - && labelTypeNames.contains(labelType.getName() - .toLowerCase())) { + @Override + protected LabelType toEntity(LabelTypeDTO entityDTO) + throws ValidationException, RecoverableErrorException { + return LabelConverter.toEntity(entityDTO); + } - 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); + @Override + protected void updateEntity(LabelType entity, LabelTypeDTO entityDTO) + throws ValidationException, RecoverableErrorException { + LabelConverter.updateLabelType(entity, entityDTO); } } diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/LabelServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/LabelServiceTest.java index 7f51c8b6c..c1723d100 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/LabelServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/LabelServiceTest.java @@ -32,6 +32,7 @@ import static org.navalplanner.web.test.ws.common.Util.mustEnd; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.UUID; import org.hibernate.SessionFactory; import org.junit.Test; @@ -57,6 +58,7 @@ import org.springframework.transaction.annotation.Transactional; * * @author Manuel Rego Casasnovas */ + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE }) @@ -78,7 +80,8 @@ public class LabelServiceTest { private LabelType givenLabelTypeStored() { Label label1 = Label.create("label-name-1"); Label label2 = Label.create("label-name-2"); - final LabelType labelType = LabelType.create("label-type-name"); + final LabelType labelType = LabelType.create("label-type-name" + + UUID.randomUUID()); labelType.addLabel(label1); labelType.addLabel(label2); @@ -135,7 +138,7 @@ public class LabelServiceTest { public void importValidLabelType() { int previous = labelTypeDAO.getAll().size(); - LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name", + LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name1", new ArrayList()); List instanceConstraintViolationsList = labelService @@ -153,21 +156,24 @@ public class LabelServiceTest { public void importTwoValidLabelType() { int previous = labelTypeDAO.getAll().size(); - LabelTypeDTO labelTypeDTO1 = new LabelTypeDTO("label-type-name1", + LabelTypeDTO labelTypeDTO1 = new LabelTypeDTO("label-type-A", new ArrayList()); - LabelTypeDTO labelTypeDTO2 = new LabelTypeDTO("label-type-name2", + LabelTypeDTO labelTypeDTO2 = new LabelTypeDTO("label-type-B", new ArrayList()); + LabelTypeListDTO labelTypeDTOs = createLabelTypeListDTO(labelTypeDTO1, + labelTypeDTO2); + List instanceConstraintViolationsList = labelService - .addLabelTypes(new LabelTypeListDTO(Arrays.asList( - labelTypeDTO1, labelTypeDTO2))).instanceConstraintViolationsList; + .addLabelTypes(labelTypeDTOs).instanceConstraintViolationsList; + assertThat(instanceConstraintViolationsList.size(), equalTo(0)); List labelTypes = labelTypeDAO.getAll(); assertThat(labelTypes.size(), equalTo(previous + 2)); for (LabelType labelType : labelTypes) { assertThat(labelType.getName(), anyOf(equalTo(labelTypeDTO1.name), - equalTo(labelTypeDTO2.name))); + equalTo(labelTypeDTO2.name), equalTo("label-type-name1"))); assertThat(labelType.getLabels().size(), equalTo(0)); } } @@ -176,7 +182,7 @@ public class LabelServiceTest { public void importTwoLabelTypeWithRepeatedName() { int previous = labelTypeDAO.getAll().size(); - String labelTypeName = "label-type-name"; + String labelTypeName = "label-type-nameX"; LabelTypeDTO labelTypeDTO1 = new LabelTypeDTO(labelTypeName, new ArrayList()); LabelTypeDTO labelTypeDTO2 = new LabelTypeDTO(labelTypeName, @@ -201,7 +207,7 @@ public class LabelServiceTest { LabelDTO labelDTO2 = new LabelDTO("label-name-2"); List labelDTOs = Arrays.asList(labelDTO1, labelDTO2); - LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name", + LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-nameY", labelDTOs); List instanceConstraintViolationsList = labelService @@ -210,7 +216,7 @@ public class LabelServiceTest { assertThat(labelTypeDAO.getAll().size(), equalTo(previous + 1)); - LabelType labelType = labelTypeDAO.getAll().get(0); + LabelType labelType = labelTypeDAO.getAll().get(previous); assertThat(labelType.getName(), equalTo(labelTypeDTO.name)); assertThat(labelType.getLabels().size(), equalTo(2)); for (Label label : labelType.getLabels()) { @@ -263,4 +269,12 @@ public class LabelServiceTest { assertThat(labelTypeDAO.getAll().size(), equalTo(previous)); } + private LabelTypeListDTO createLabelTypeListDTO(LabelTypeDTO... labelTypes) { + List labelTypeList = new ArrayList(); + for (LabelTypeDTO c : labelTypes) { + labelTypeList.add(c); + } + return new LabelTypeListDTO(labelTypeList); + } + } diff --git a/scripts/rest-clients/README b/scripts/rest-clients/README index 8eb0f4d0e..3ec8f75c7 100644 --- a/scripts/rest-clients/README +++ b/scripts/rest-clients/README @@ -30,6 +30,18 @@ - export-criterion-types.sh (authenticate with wsreader/wsreader) + * Import label types: + + - import-label-types.sh label-sample.xml + (authenticate with wswriter/wswriter) + + - Check the returned errors are consistent with the comments in + label-sample.xml. + + * Export label types: + + - export-label-types.sh (authenticate with wsreader/wsreader) + * Import resources: - import-resources.sh resources-sample-mini.xml (or resources-sample.xml) diff --git a/scripts/rest-clients/export-label-types.sh b/scripts/rest-clients/export-label-types.sh new file mode 100755 index 000000000..db13ac6b8 --- /dev/null +++ b/scripts/rest-clients/export-label-types.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +. ./rest-common-env.sh + +printf "Login name: " +read loginName +printf "Password: " +read password + +if [ "$1" = "--prod" ]; then + baseServiceURL=$PRODUCTION_BASE_SERVICE_URL + certificate=$PRODUCTION_CERTIFICATE +else + baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL + certificate=$DEVELOPMENT_CERTIFICATE +fi + +authorization=`./base64.sh $loginName:$password` + +curl -sv -X GET $certificate --header "Authorization: Basic $authorization" \ + $baseServiceURL/labels | tidy -xml -i -q -utf8 diff --git a/scripts/rest-clients/import-label-types.sh b/scripts/rest-clients/import-label-types.sh new file mode 100755 index 000000000..8f9db5666 --- /dev/null +++ b/scripts/rest-clients/import-label-types.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +. ./rest-common-env.sh + +printf "Login name: " +read loginName +printf "Password: " +read password + +baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL +certificate=$DEVELOPMENT_CERTIFICATE + +for i in "$@" +do + if [ "$i" = "--prod" ]; then + baseServiceURL=$PRODUCTION_BASE_SERVICE_URL + certificate=$PRODUCTION_CERTIFICATE + else + file=$i + fi +done + +if [ "$file" = "" ]; then + printf "Missing file\n" 1>&2 + exit 1 +fi + +authorization=`./base64.sh $loginName:$password` + +curl -sv -X POST $certificate -d @$file \ + --header "Content-type: application/xml" \ + --header "Authorization: Basic $authorization" \ + $baseServiceURL/labels | tidy -xml -i -q -utf8 diff --git a/scripts/rest-clients/label-sample.xml b/scripts/rest-clients/label-sample.xml new file mode 100644 index 000000000..a90350c0f --- /dev/null +++ b/scripts/rest-clients/label-sample.xml @@ -0,0 +1,18 @@ + + + + + + + + + + +