diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/DateConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/DateConverter.java deleted file mode 100644 index 30372d2f7..000000000 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/DateConverter.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of NavalPlan - * - * 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.common.impl; - -import java.util.Date; - -import javax.xml.datatype.XMLGregorianCalendar; - -import org.joda.time.LocalDate; - -/** - * A converter from java.util.Date to/from - * javax.xml.datatype.XMLGregorianCalendar. - * - * @author Fernando Bellas Permuy - */ -public class DateConverter { - - private DateConverter() {} - - /** - * It converts a XMLGregorianCalendar representing a - * xsd:date XML type to a Date.

- * - * If the date passed as a parameter is null, it also returns - * null. - */ - public final static Date toDate(XMLGregorianCalendar date) { - - if (date == null) { - return null; - } else { - return date.toGregorianCalendar().getTime(); - } - - } - - /** - * It converts a XMLGregorianCalendar representing a - * xsd:date XML type to a Joda's LocalDate. - *

- * - * If the date passed as a parameter is null, it also returns - * null. - */ - public final static LocalDate toLocalDate(XMLGregorianCalendar date) { - - if (date == null) { - return null; - } else { - return new LocalDate(date.getYear(), date.getMonth(), - date.getDay()); - } - - } - -} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java index 1924bfde1..8a6275741 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java @@ -20,9 +20,9 @@ package org.navalplanner.ws.resources.api; +import java.util.Date; + import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.datatype.XMLGregorianCalendar; import org.navalplanner.ws.common.api.IntegrationEntityDTO; @@ -42,18 +42,16 @@ public class CriterionSatisfactionDTO extends IntegrationEntityDTO { public String criterionName; @XmlAttribute(name="start-date") - @XmlSchemaType(name="date") - public XMLGregorianCalendar startDate; + public Date startDate; @XmlAttribute(name="end-date") - @XmlSchemaType(name="date") - public XMLGregorianCalendar endDate; + public Date endDate; public CriterionSatisfactionDTO() {} public CriterionSatisfactionDTO(String code, String criterionTypeName, String criterionName, - XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) { + Date startDate, Date endDate) { super(code); this.criterionTypeName = criterionTypeName; @@ -70,7 +68,7 @@ public class CriterionSatisfactionDTO extends IntegrationEntityDTO { */ public CriterionSatisfactionDTO( String criterionTypeName, String criterionName, - XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) { + Date startDate, Date endDate) { this(generateCode(), criterionTypeName, criterionName, startDate, endDate); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/IResourceService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/IResourceService.java index 5324fe3e6..21ada44da 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/IResourceService.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/IResourceService.java @@ -35,6 +35,8 @@ import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; */ public interface IResourceService { + public ResourceListDTO getResources(); + public InstanceConstraintViolationsListDTO addResources( ResourceListDTO resources); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java index a40eb2141..d3a173b79 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java @@ -19,9 +19,9 @@ */ package org.navalplanner.ws.resources.api; +import java.util.Date; + import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.datatype.XMLGregorianCalendar; import org.navalplanner.ws.common.api.IntegrationEntityDTO; @@ -39,18 +39,15 @@ public class ResourcesCostCategoryAssignmentDTO extends IntegrationEntityDTO { public String costCategoryName; @XmlAttribute(name="start-date") - @XmlSchemaType(name="date") - public XMLGregorianCalendar startDate; + public Date startDate; @XmlAttribute(name="end-date") - @XmlSchemaType(name="date") - public XMLGregorianCalendar endDate; + public Date endDate; public ResourcesCostCategoryAssignmentDTO() {} public ResourcesCostCategoryAssignmentDTO(String code, - String costCategoryName, XMLGregorianCalendar startDate, - XMLGregorianCalendar endDate) { + String costCategoryName, Date startDate, Date endDate) { super(code); this.costCategoryName = costCategoryName; @@ -64,9 +61,8 @@ public class ResourcesCostCategoryAssignmentDTO extends IntegrationEntityDTO { * to facilitate the implementation of test cases that add new instances * (such instances will have a unique code). */ - public ResourcesCostCategoryAssignmentDTO( - String costCategoryName, XMLGregorianCalendar startDate, - XMLGregorianCalendar endDate) { + public ResourcesCostCategoryAssignmentDTO(String costCategoryName, + Date startDate, Date endDate) { this(generateCode(), costCategoryName, startDate, endDate); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java index a3c8a9ed9..685a8bce5 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java @@ -22,9 +22,12 @@ package org.navalplanner.ws.resources.impl; import static org.navalplanner.web.I18nHelper._; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; +import org.joda.time.LocalDate; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.MultipleInstancesException; import org.navalplanner.business.common.exceptions.ValidationException; @@ -34,7 +37,6 @@ import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.Machine; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; -import org.navalplanner.ws.common.impl.DateConverter; import org.navalplanner.ws.common.impl.InstanceNotFoundRecoverableErrorException; import org.navalplanner.ws.common.impl.RecoverableErrorException; import org.navalplanner.ws.resources.api.CriterionSatisfactionDTO; @@ -158,9 +160,8 @@ public class ResourceConverter { StringUtils.trim(criterionSatisfactionDTO.code), StringUtils.trim(criterionSatisfactionDTO.criterionTypeName), StringUtils.trim(criterionSatisfactionDTO.criterionName), - resource, - DateConverter.toDate(criterionSatisfactionDTO.startDate), - DateConverter.toDate(criterionSatisfactionDTO.endDate)); + resource, criterionSatisfactionDTO.startDate, + criterionSatisfactionDTO.endDate); } catch (InstanceNotFoundException e) { @@ -216,11 +217,14 @@ public class ResourceConverter { } try { + LocalDate startDate = (assignmentDTO.startDate == null) ? null + : LocalDate.fromDateFields(assignmentDTO.startDate); + LocalDate endDate = (assignmentDTO.endDate == null) ? null + : LocalDate.fromDateFields(assignmentDTO.endDate); return ResourcesCostCategoryAssignment.createUnvalidated( - assignmentDTO.code, - StringUtils.trim(assignmentDTO.costCategoryName), resource, - DateConverter.toLocalDate(assignmentDTO.startDate), - DateConverter.toLocalDate(assignmentDTO.endDate)); + assignmentDTO.code, StringUtils + .trim(assignmentDTO.costCategoryName), resource, + startDate, endDate); } catch (InstanceNotFoundException e) { throw new InstanceNotFoundRecoverableErrorException( COST_CATEGORY_ENTITY_TYPE, e.getKey().toString()); @@ -302,8 +306,8 @@ public class ResourceConverter { criterionSatisfaction.updateUnvalidated( StringUtils.trim(criterionSatisfactionDTO.criterionTypeName), StringUtils.trim(criterionSatisfactionDTO.criterionName), - DateConverter.toDate(criterionSatisfactionDTO.startDate), - DateConverter.toDate(criterionSatisfactionDTO.endDate)); + criterionSatisfactionDTO.startDate, + criterionSatisfactionDTO.endDate); } catch (InstanceNotFoundException e) { @@ -351,10 +355,13 @@ public class ResourceConverter { ResourcesCostCategoryAssignmentDTO i) { try { + LocalDate startDate = (i.startDate == null) ? null : LocalDate + .fromDateFields(i.startDate); + LocalDate endDate = (i.endDate == null) ? null : LocalDate + .fromDateFields(i.endDate); assignment.updateUnvalidated( StringUtils.trim(i.costCategoryName), - DateConverter.toLocalDate(i.startDate), - DateConverter.toLocalDate(i.endDate)); + startDate, endDate); } catch (InstanceNotFoundException e) { throw new InstanceNotFoundRecoverableErrorException( COST_CATEGORY_ENTITY_TYPE, e.getKey().toString()); @@ -375,4 +382,66 @@ public class ResourceConverter { } -} + public static ResourceDTO toDTO(Resource resource) { + ResourceDTO resourceDTO; + if (resource instanceof Worker) { + resourceDTO = toDTO((Worker) resource); + } else if (resource instanceof Machine) { + resourceDTO = toDTO((Machine) resource); + } else { + return null; + } + + List criterionSatisfactionDTOs = new ArrayList(); + for (CriterionSatisfaction criterionSatisfaction : resource + .getCriterionSatisfactions()) { + criterionSatisfactionDTOs.add(toDTO(criterionSatisfaction)); + } + resourceDTO.criterionSatisfactions = criterionSatisfactionDTOs; + + List resourcesCostCategoryAssignmentDTOs = new ArrayList(); + for (ResourcesCostCategoryAssignment resourcesCostCategoryAssignment : resource + .getResourcesCostCategoryAssignments()) { + resourcesCostCategoryAssignmentDTOs + .add(toDTO(resourcesCostCategoryAssignment)); + } + resourceDTO.resourcesCostCategoryAssignments = resourcesCostCategoryAssignmentDTOs; + + return resourceDTO; + } + + private static WorkerDTO toDTO(Worker worker) { + return new WorkerDTO(worker.getCode(), worker.getFirstName(), worker + .getSurname(), worker.getNif()); + } + + private static MachineDTO toDTO(Machine machine) { + return new MachineDTO(machine.getCode(), machine.getName(), machine + .getDescription()); + } + + private static CriterionSatisfactionDTO toDTO( + CriterionSatisfaction criterionSatisfaction) { + return new CriterionSatisfactionDTO(criterionSatisfaction.getCode(), + criterionSatisfaction.getCriterion().getType().getName(), + criterionSatisfaction.getCriterion().getName(), + criterionSatisfaction.getStartDate(), criterionSatisfaction + .getEndDate()); + } + + private static ResourcesCostCategoryAssignmentDTO toDTO( + ResourcesCostCategoryAssignment resourcesCostCategoryAssignment) { + Date initDate = (resourcesCostCategoryAssignment.getInitDate() == null) ? null + : resourcesCostCategoryAssignment.getInitDate() + .toDateTimeAtStartOfDay().toDate(); + Date endDate = (resourcesCostCategoryAssignment.getEndDate() == null) ? null + : resourcesCostCategoryAssignment.getEndDate() + .toDateTimeAtStartOfDay().toDate(); + + return new ResourcesCostCategoryAssignmentDTO( + resourcesCostCategoryAssignment.getCode(), + resourcesCostCategoryAssignment.getCostCategory().getName(), + initDate, endDate); + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java index c5caccdbc..82fefa4b2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java @@ -20,14 +20,20 @@ package org.navalplanner.ws.resources.impl; +import java.util.ArrayList; +import java.util.List; + 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.resources.daos.IMachineDAO; import org.navalplanner.business.resources.daos.IResourceDAO; +import org.navalplanner.business.resources.daos.IWorkerDAO; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; import org.navalplanner.ws.common.impl.GenericRESTService; @@ -37,6 +43,7 @@ import org.navalplanner.ws.resources.api.ResourceDTO; import org.navalplanner.ws.resources.api.ResourceListDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * REST-based implementation of IResourceService. @@ -53,6 +60,27 @@ public class ResourceServiceREST @Autowired private IResourceDAO resourceDAO; + @Autowired + private IWorkerDAO workerDAO; + + @Autowired + private IMachineDAO machineDAO; + + @Override + @GET + @Transactional(readOnly = true) + public ResourceListDTO getResources() { + return new ResourceListDTO(findAll()); + } + + @Override + protected List findAll() { + List result = new ArrayList(); + result.addAll(workerDAO.getWorkers()); + result.addAll(machineDAO.getAll()); + return toDTO(result); + } + @Override @POST @Consumes("application/xml") @@ -73,7 +101,7 @@ public class ResourceServiceREST @Override protected ResourceDTO toDTO(Resource entity) { - return null; // This service does not provide finder methods. + return ResourceConverter.toDTO(entity); } @Override diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java index cc8c2cd8f..49c625660 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java @@ -39,11 +39,6 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.List; -import javax.xml.datatype.DatatypeConfigurationException; -import javax.xml.datatype.DatatypeConstants; -import javax.xml.datatype.DatatypeFactory; -import javax.xml.datatype.XMLGregorianCalendar; - import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; @@ -798,12 +793,10 @@ public class ResourceServiceTest { assertEquals(m1Updated.name, m1Entity.getName()); // Modified. assertEquals(m1.description, m1Entity.getDescription()); //Not modified. - assertTrue(datesEquals( // Modified. - m1s1Updated.startDate, - m1Entity.getCriterionSatisfactionByCode(m1s1.code).getStartDate())); - assertTrue(datesEquals( // Not modified. - m1s1.endDate, - m1Entity.getCriterionSatisfactionByCode(m1s1.code).getEndDate())); + assertTrue(m1s1Updated.startDate.equals(m1Entity + .getCriterionSatisfactionByCode(m1s1.code).getStartDate())); + assertTrue(m1s1.endDate.equals(m1Entity.getCriterionSatisfactionByCode( + m1s1.code).getEndDate())); // Not modified. m1Entity.getResourcesCostCategoryAssignmentByCode(m1a2.code); // New. /* Test worker update. */ @@ -812,14 +805,14 @@ public class ResourceServiceTest { assertEquals(w1Updated.surname, w1Entity.getSurname()); // Modified. assertEquals(w1.firstName, w1Entity.getFirstName()); // Not modified. w1Entity.getCriterionSatisfactionByCode(w1s2.code); // New. - assertTrue(datesEquals( // Modified. - w1a1Updated.startDate, - w1Entity.getResourcesCostCategoryAssignmentByCode(w1a1.code). - getInitDate())); - assertTrue(datesEquals( // Not modified. - w1a1.endDate, - w1Entity.getResourcesCostCategoryAssignmentByCode(w1a1.code). - getEndDate())); + + Date startDate = w1Entity.getResourcesCostCategoryAssignmentByCode( + w1a1.code).getInitDate().toDateTimeAtStartOfDay().toDate(); + Date endDate = w1Entity.getResourcesCostCategoryAssignmentByCode( + w1a1.code).getEndDate().toDateTimeAtStartOfDay().toDate(); + + assertTrue(w1a1Updated.startDate.equals(startDate)); // Modified. + assertTrue(w1a1.endDate.equals(endDate)); // Not modified. } @@ -941,10 +934,10 @@ public class ResourceServiceTest { private MachineDTO createMachineDTOWithTwoCriterionSatisfactions( String machineName, String criterionTypeName, - String criterionName1, XMLGregorianCalendar startDate1, - XMLGregorianCalendar endDate1, - String criterionName2, XMLGregorianCalendar startDate2, - XMLGregorianCalendar endDate2) { + String criterionName1, Date startDate1, + Date endDate1, + String criterionName2, Date startDate2, + Date endDate2) { MachineDTO machineDTO = new MachineDTO(machineName, "desc"); @@ -961,8 +954,7 @@ public class ResourceServiceTest { private MachineDTO createMachineDTOWithTwoCostsAssignments( String machineName, String costCategoryName, - XMLGregorianCalendar startDate1, XMLGregorianCalendar endDate1, - XMLGregorianCalendar startDate2, XMLGregorianCalendar endDate2) { + Date startDate1, Date endDate1, Date startDate2, Date endDate2) { MachineDTO machineDTO = new MachineDTO(machineName, "desc"); @@ -977,34 +969,9 @@ public class ResourceServiceTest { } - private XMLGregorianCalendar getDate(int year, int month, int day) { - - try { - return DatatypeFactory.newInstance().newXMLGregorianCalendarDate( - year, month, day, DatatypeConstants.FIELD_UNDEFINED); - } catch (DatatypeConfigurationException e) { - throw new RuntimeException(e); - } - - } - - private boolean datesEquals(XMLGregorianCalendar date1, Date date2) { - - GregorianCalendar date2AsGC = new GregorianCalendar(); - date2AsGC.setTime(date2); - - return datesEquals(date1.toGregorianCalendar(), date2AsGC); - - } - - private boolean datesEquals(XMLGregorianCalendar date1, LocalDate date2) { - - GregorianCalendar date2AsGC = new GregorianCalendar( - date2.getYear(), date2.getMonthOfYear()-1, date2.getDayOfMonth()); - - return datesEquals(date1.toGregorianCalendar(), date2AsGC); - - + private Date getDate(int year, int month, int day) { + return new LocalDate(year, month, day).toDateTimeAtStartOfDay() + .toDate(); } public boolean datesEquals(GregorianCalendar date1, diff --git a/scripts/rest-clients/export-resources.sh b/scripts/rest-clients/export-resources.sh new file mode 100755 index 000000000..62a830d96 --- /dev/null +++ b/scripts/rest-clients/export-resources.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/resources | tidy -xml -i -q -utf8