From 237369faf91f50cfe634053f6249bedb5c21d7fa Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 2 Nov 2012 16:57:22 +0100 Subject: [PATCH 01/30] Fix parameters order in import example rest scripts Included dependency with cURL in the web services documentation. FEA: ItEr77S04BugFixing --- scripts/rest-clients/README | 5 ++++- scripts/rest-clients/import.sh | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/scripts/rest-clients/README b/scripts/rest-clients/README index d8823e972..1e0f34831 100644 --- a/scripts/rest-clients/README +++ b/scripts/rest-clients/README @@ -57,7 +57,10 @@ Requirements ------------ These scripts are written in bash so you need to be running a bash terminal to -use them. +use them. And they use cURL to do the HTTP requests, you can install it with the +following command in Debian based distributions:: + + # apt-get install curl Moreover, it is recommended to have Tidy available in your system. You can install it with the following command in Debian based distributions:: diff --git a/scripts/rest-clients/import.sh b/scripts/rest-clients/import.sh index 856b2b44a..629fc9b64 100755 --- a/scripts/rest-clients/import.sh +++ b/scripts/rest-clients/import.sh @@ -7,19 +7,21 @@ read loginName printf "Password: " read password -if [ "$3" = "--prod" ]; then +file=$2 + +if [ "$2" = "--prod" ]; then baseServiceURL=$PRODUCTION_BASE_SERVICE_URL certificate=$PRODUCTION_CERTIFICATE -elif [ "$3" = "--dev" ]; then - baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL - certificate=$DEVELOPMENT_CERTIFICATE + file=$3 +elif [ "$2" = "--dev" ]; then + baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL + certificate=$DEVELOPMENT_CERTIFICATE + file=$3 else - baseServiceURL=$DEMO_BASE_SERVICE_URL - certificate=$DEMO_CERTIFICATE + baseServiceURL=$DEMO_BASE_SERVICE_URL + certificate=$DEMO_CERTIFICATE fi -file=$2 - if [ "$file" = "" ]; then printf "Missing file\n" 1>&2 exit 1 From a8e57499afcfa1bf1a1e6c759bd84a64294e9cd4 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 2 Nov 2012 17:16:26 +0100 Subject: [PATCH 02/30] Use code instead of id for ResourceHoursService Using code from now on in order to make it coherent with the rest of services. FEA: ItEr77S04BugFixing --- .../business/resources/daos/IWorkerDAO.java | 2 +- .../business/resources/daos/WorkerDAO.java | 16 ++++++++-------- .../resources/impl/ResourceHoursServiceREST.java | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java index 67ac2b10e..b75034983 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java @@ -111,7 +111,7 @@ public interface IWorkerDAO extends IIntegrationEntityDAO { List findByFirstNameSecondNameAndNifAnotherTransaction( String firstname, String surname, String nif); - List getWorkingHoursGroupedPerWorker(List workerNifs, + List getWorkingHoursGroupedPerWorker(List workerCodes, Date startingDate, Date endingDate); Worker findByNifAnotherTransaction(String nif) diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java index 92079d838..9c52c4645 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java @@ -147,8 +147,8 @@ public class WorkerDAO extends IntegrationEntityDAO @Override @Transactional(readOnly = true) public List getWorkingHoursGroupedPerWorker( - List workerNifs, Date startingDate, Date endingDate) { - String strQuery = "SELECT worker.nif, SUM(wrl.effort) " + List workerCodes, Date startingDate, Date endingDate) { + String strQuery = "SELECT worker.code, SUM(wrl.effort) " + "FROM Worker worker, WorkReportLine wrl " + "LEFT OUTER JOIN wrl.resource resource " + "WHERE resource.id = worker.id "; @@ -165,15 +165,15 @@ public class WorkerDAO extends IntegrationEntityDAO } // Set workers - if (workerNifs != null && !workerNifs.isEmpty()) { - strQuery += "AND worker.nif IN (:workerNifs) "; + if (workerCodes != null && !workerCodes.isEmpty()) { + strQuery += "AND worker.code IN (:workerCodes) "; } // Group by - strQuery += "GROUP BY worker.nif "; + strQuery += "GROUP BY worker.code "; // Order by - strQuery += "ORDER BY worker.nif"; + strQuery += "ORDER BY worker.code"; // Set parameters Query query = getSession().createQuery(strQuery); @@ -183,8 +183,8 @@ public class WorkerDAO extends IntegrationEntityDAO if (endingDate != null) { query.setParameter("endingDate", endingDate); } - if (workerNifs != null && !workerNifs.isEmpty()) { - query.setParameterList("workerNifs", workerNifs); + if (workerCodes != null && !workerCodes.isEmpty()) { + query.setParameterList("workerCodes", workerCodes); } // Get result diff --git a/libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceHoursServiceREST.java b/libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceHoursServiceREST.java index 3f4a634cd..8d67aebdd 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceHoursServiceREST.java +++ b/libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceHoursServiceREST.java @@ -87,13 +87,13 @@ public class ResourceHoursServiceREST implements IResourceHoursService { throw new RuntimeException(e); } - List workerNifs = null; + List workerCodes = null; if (resourceCode != null) { - workerNifs = Arrays.asList(resourceCode); + workerCodes = Arrays.asList(resourceCode); } List hoursPerWorker = workerDAO - .getWorkingHoursGroupedPerWorker(workerNifs, startingDate, + .getWorkingHoursGroupedPerWorker(workerCodes, startingDate, endingDate); for (Object[] pair : hoursPerWorker) { From 4ea3d95c961512e119b6e2e0959439c3ea30a5f9 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 5 Nov 2012 14:11:05 +0100 Subject: [PATCH 03/30] Basic implementation of DELETE operation in order elements web service FEA: ItEr77S13AllowDeleteOrderElements --- .../ws/orders/api/IOrderElementService.java | 2 + .../orders/impl/OrderElementServiceREST.java | 53 +++++++++++++++++++ scripts/rest-clients/remove-order-element.sh | 34 ++++++++++++ 3 files changed, 89 insertions(+) create mode 100755 scripts/rest-clients/remove-order-element.sh diff --git a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/api/IOrderElementService.java b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/api/IOrderElementService.java index d5c1bef87..52d4875aa 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/api/IOrderElementService.java +++ b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/api/IOrderElementService.java @@ -39,4 +39,6 @@ public interface IOrderElementService { Response getOrderElement(String code); + Response removeOrderElement(String code); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java index 1369c922b..65aa42c3b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java +++ b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java @@ -22,17 +22,24 @@ package org.libreplan.ws.orders.impl; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.libreplan.business.common.daos.IIntegrationEntityDAO; +import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.orders.daos.IOrderDAO; +import org.libreplan.business.orders.daos.IOrderElementDAO; import org.libreplan.business.orders.entities.Order; +import org.libreplan.business.orders.entities.OrderElement; +import org.libreplan.business.orders.entities.OrderLineGroup; +import org.libreplan.business.scenarios.IScenarioManager; import org.libreplan.ws.common.api.InstanceConstraintViolationsListDTO; import org.libreplan.ws.common.api.OrderDTO; import org.libreplan.ws.common.impl.ConfigurationOrderElementConverter; @@ -60,6 +67,12 @@ public class OrderElementServiceREST extends @Autowired private IOrderDAO orderDAO; + @Autowired + private IOrderElementDAO orderElementDAO; + + @Autowired + private IScenarioManager scenarioManager; + @Override @GET @Transactional(readOnly = true) @@ -108,4 +121,44 @@ public class OrderElementServiceREST extends return getDTOByCode(code); } + @Override + @DELETE + @Path("/{code}/") + @Transactional + public Response removeOrderElement(@PathParam("code") String code) { + try { + OrderElement orderElement = orderElementDAO.findByCode(code); + if (orderElement.isOrder()) { + orderDAO.remove(orderElement.getId()); + } else { + Order order = orderDAO.loadOrderAvoidingProxyFor(orderElement); + order.useSchedulingDataFor(scenarioManager.getCurrent()); + + orderElement = findOrderElement(order, orderElement.getId()); + + OrderLineGroup parent = orderElement.getParent(); + parent.remove(orderElement); + + orderDAO.save(order); + } + + return Response.ok().build(); + } catch (InstanceNotFoundException e) { + return Response.status(Status.NOT_FOUND).build(); + } + } + + private OrderElement findOrderElement(OrderElement orderElement, Long id) { + if (orderElement.getId().equals(id)) { + return orderElement; + } + for (OrderElement child : orderElement.getChildren()) { + OrderElement found = findOrderElement(child, id); + if (found != null) { + return found; + } + } + return null; + } + } diff --git a/scripts/rest-clients/remove-order-element.sh b/scripts/rest-clients/remove-order-element.sh new file mode 100755 index 000000000..02e0bcd75 --- /dev/null +++ b/scripts/rest-clients/remove-order-element.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +. ./rest-common-env.sh + +printf "Username: " +read loginName +printf "Password: " +read password + +code=$1 + +if [ "$1" = "--prod" ]; then + baseServiceURL=$PRODUCTION_BASE_SERVICE_URL + certificate=$PRODUCTION_CERTIFICATE + code=$2 +elif [ "$1" = "--dev" ]; then + baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL + certificate=$DEVELOPMENT_CERTIFICATE + code=$2 +else + baseServiceURL=$DEMO_BASE_SERVICE_URL + certificate=$DEMO_CERTIFICATE +fi + +authorization=`echo -n "$loginName:$password" | base64` + +result=`curl -sv -X DELETE $certificate --header "Authorization: Basic $authorization" \ + $baseServiceURL/orderelements/$code` + +if hash tidy &> /dev/null; then + echo $result | tidy -xml -i -q -utf8 +else + echo $result +fi From 7c24830ef6d0e0fc3d6f4901622f3a89bf820ab6 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 5 Nov 2012 15:53:35 +0100 Subject: [PATCH 04/30] Convert parent in leaf if the element removed was the only child FEA: ItEr77S13AllowDeleteOrderElements --- .../orders/impl/OrderElementServiceREST.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java index 65aa42c3b..aaf1d487c 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java +++ b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java @@ -21,6 +21,8 @@ package org.libreplan.ws.orders.impl; +import java.util.UUID; + import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; @@ -31,7 +33,9 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import org.libreplan.business.common.daos.IEntitySequenceDAO; import org.libreplan.business.common.daos.IIntegrationEntityDAO; +import org.libreplan.business.common.entities.EntityNameEnum; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.orders.daos.IOrderDAO; @@ -73,6 +77,9 @@ public class OrderElementServiceREST extends @Autowired private IScenarioManager scenarioManager; + @Autowired + private IEntitySequenceDAO entitySequenceDAO; + @Override @GET @Transactional(readOnly = true) @@ -139,6 +146,18 @@ public class OrderElementServiceREST extends OrderLineGroup parent = orderElement.getParent(); parent.remove(orderElement); + if (!parent.isOrder() && parent.getChildren().isEmpty()) { + OrderElement newElement = parent.toLeaf(); + if (!order.isCodeAutogenerated()) { + newElement.setCode(UUID.randomUUID().toString()); + } + parent.getParent().replace(parent, newElement); + if (order.isCodeAutogenerated()) { + order.generateOrderElementCodes(entitySequenceDAO + .getNumberOfDigitsCode(EntityNameEnum.ORDER)); + } + } + orderDAO.save(order); } From fe0835ef66e82fd2ab7a7f0b0672cc39615d21ac Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 5 Nov 2012 18:08:17 +0100 Subject: [PATCH 05/30] Remove properly order element using OrderModel class In that way we are sure that everything is removed properly. We have to manually detach the removed element from its parent in order to avoid delete the parent too. FEA: ItEr77S13AllowDeleteOrderElements --- .../orders/entities/OrderElement.java | 4 ++++ .../business/orders/entities/Orders.hbm.xml | 3 ++- .../planner/order/PlanningStateCreator.java | 9 ++++++-- .../orders/impl/OrderElementServiceREST.java | 22 +++++++------------ 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java index 6c397a3ab..87b0b4c2e 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java @@ -1584,4 +1584,8 @@ public abstract class OrderElement extends IntegrationEntity implements return false; } + public void detachFromParent() { + parent = null; + } + } diff --git a/libreplan-business/src/main/resources/org/libreplan/business/orders/entities/Orders.hbm.xml b/libreplan-business/src/main/resources/org/libreplan/business/orders/entities/Orders.hbm.xml index c32dada6c..2a7096a5d 100644 --- a/libreplan-business/src/main/resources/org/libreplan/business/orders/entities/Orders.hbm.xml +++ b/libreplan-business/src/main/resources/org/libreplan/business/orders/entities/Orders.hbm.xml @@ -55,7 +55,8 @@ access="field" cascade="all" class="org.libreplan.business.orders.entities.OrderLineGroup" - index="idx_order_element_on_parent"/> + index="idx_order_element_on_parent" + lazy="false" /> Date: Tue, 6 Nov 2012 07:52:12 +0100 Subject: [PATCH 06/30] Include validations in the new service to remove order elements FEA: ItEr77S13AllowDeleteOrderElements --- .../orders/impl/OrderElementServiceREST.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java index e72c07df6..5c3c24c6a 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java +++ b/libreplan-webapp/src/main/java/org/libreplan/ws/orders/impl/OrderElementServiceREST.java @@ -42,6 +42,7 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; import org.libreplan.web.orders.IOrderModel; +import org.libreplan.ws.common.api.ErrorDTO; import org.libreplan.ws.common.api.InstanceConstraintViolationsListDTO; import org.libreplan.ws.common.api.OrderDTO; import org.libreplan.ws.common.impl.ConfigurationOrderElementConverter; @@ -130,6 +131,12 @@ public class OrderElementServiceREST extends public Response removeOrderElement(@PathParam("code") String code) { try { OrderElement orderElement = orderElementDAO.findByCode(code); + String errorMessage = checkRemovalValidation(orderElement); + if (errorMessage != null) { + return Response.status(Status.FORBIDDEN) + .entity(new ErrorDTO(errorMessage)).build(); + } + if (orderElement.isOrder()) { orderModel.remove((Order) orderElement); } else { @@ -161,6 +168,25 @@ public class OrderElementServiceREST extends } } + private String checkRemovalValidation(OrderElement orderElement) { + if (orderElementDAO.isAlreadyInUseThisOrAnyOfItsChildren(orderElement)) { + return "You cannot remove the order element '" + + orderElement.getName() + + "' because it or any of its children have tracked time in some work report"; + } + try { + if (orderElementDAO.hasImputedExpenseSheet(orderElement.getId())) { + return "You cannot remove the order element '" + + orderElement.getName() + + "' because it or any of its children have tracked expenses in some expense sheet"; + } + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + + return null; + } + private OrderElement findOrderElement(OrderElement orderElement, Long id) { if (orderElement.getId().equals(id)) { return orderElement; From cffe9a0299eee366de7dd6854c9275ac9e8dab5d Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 6 Nov 2012 07:58:27 +0100 Subject: [PATCH 07/30] Fix example removal scripts reusing generic code FEA: ItEr77S13AllowDeleteOrderElements --- scripts/rest-clients/remove-order-element.sh | 33 +----------------- .../rest-clients/remove-work-report-line.sh | 33 +----------------- scripts/rest-clients/remove-work-report.sh | 33 +----------------- scripts/rest-clients/remove.sh | 34 +++++++++++++++++++ 4 files changed, 37 insertions(+), 96 deletions(-) create mode 100755 scripts/rest-clients/remove.sh diff --git a/scripts/rest-clients/remove-order-element.sh b/scripts/rest-clients/remove-order-element.sh index 02e0bcd75..666c51fc1 100755 --- a/scripts/rest-clients/remove-order-element.sh +++ b/scripts/rest-clients/remove-order-element.sh @@ -1,34 +1,3 @@ #!/bin/sh -. ./rest-common-env.sh - -printf "Username: " -read loginName -printf "Password: " -read password - -code=$1 - -if [ "$1" = "--prod" ]; then - baseServiceURL=$PRODUCTION_BASE_SERVICE_URL - certificate=$PRODUCTION_CERTIFICATE - code=$2 -elif [ "$1" = "--dev" ]; then - baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL - certificate=$DEVELOPMENT_CERTIFICATE - code=$2 -else - baseServiceURL=$DEMO_BASE_SERVICE_URL - certificate=$DEMO_CERTIFICATE -fi - -authorization=`echo -n "$loginName:$password" | base64` - -result=`curl -sv -X DELETE $certificate --header "Authorization: Basic $authorization" \ - $baseServiceURL/orderelements/$code` - -if hash tidy &> /dev/null; then - echo $result | tidy -xml -i -q -utf8 -else - echo $result -fi +./remove.sh orderelements $* diff --git a/scripts/rest-clients/remove-work-report-line.sh b/scripts/rest-clients/remove-work-report-line.sh index 14e01c87d..d1b7ceb65 100755 --- a/scripts/rest-clients/remove-work-report-line.sh +++ b/scripts/rest-clients/remove-work-report-line.sh @@ -1,34 +1,3 @@ #!/bin/sh -. ./rest-common-env.sh - -printf "Username: " -read loginName -printf "Password: " -read password - -code=$1 - -if [ "$1" = "--prod" ]; then - baseServiceURL=$PRODUCTION_BASE_SERVICE_URL - certificate=$PRODUCTION_CERTIFICATE - code=$2 -elif [ "$1" = "--dev" ]; then - baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL - certificate=$DEVELOPMENT_CERTIFICATE - code=$2 -else - baseServiceURL=$DEMO_BASE_SERVICE_URL - certificate=$DEMO_CERTIFICATE -fi - -authorization=`echo -n "$loginName:$password" | base64` - -result=`curl -sv -X DELETE $certificate --header "Authorization: Basic $authorization" \ - $baseServiceURL/workreports/line/$code` - -if hash tidy &> /dev/null; then - echo $result | tidy -xml -i -q -utf8 -else - echo $result -fi +./remove.sh workreports/line $* diff --git a/scripts/rest-clients/remove-work-report.sh b/scripts/rest-clients/remove-work-report.sh index 43a687c91..04319d4bd 100755 --- a/scripts/rest-clients/remove-work-report.sh +++ b/scripts/rest-clients/remove-work-report.sh @@ -1,34 +1,3 @@ #!/bin/sh -. ./rest-common-env.sh - -printf "Username: " -read loginName -printf "Password: " -read password - -code=$1 - -if [ "$1" = "--prod" ]; then - baseServiceURL=$PRODUCTION_BASE_SERVICE_URL - certificate=$PRODUCTION_CERTIFICATE - code=$2 -elif [ "$1" = "--dev" ]; then - baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL - certificate=$DEVELOPMENT_CERTIFICATE - code=$2 -else - baseServiceURL=$DEMO_BASE_SERVICE_URL - certificate=$DEMO_CERTIFICATE -fi - -authorization=`echo -n "$loginName:$password" | base64` - -result=`curl -sv -X DELETE $certificate --header "Authorization: Basic $authorization" \ - $baseServiceURL/workreports/$code` - -if hash tidy &> /dev/null; then - echo $result | tidy -xml -i -q -utf8 -else - echo $result -fi +./remove.sh workreports $* diff --git a/scripts/rest-clients/remove.sh b/scripts/rest-clients/remove.sh new file mode 100755 index 000000000..e71b3661e --- /dev/null +++ b/scripts/rest-clients/remove.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +. ./rest-common-env.sh + +printf "Username: " +read loginName +printf "Password: " +read password + +code=$2 + +if [ "$2" = "--prod" ]; then + baseServiceURL=$PRODUCTION_BASE_SERVICE_URL + certificate=$PRODUCTION_CERTIFICATE + code=$3 +elif [ "$2" = "--dev" ]; then + baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL + certificate=$DEVELOPMENT_CERTIFICATE + code=$3 +else + baseServiceURL=$DEMO_BASE_SERVICE_URL + certificate=$DEMO_CERTIFICATE +fi + +authorization=`echo -n "$loginName:$password" | base64` + +result=`curl -sv -X DELETE $certificate --header "Authorization: Basic $authorization" \ + $baseServiceURL/$1/$code` + +if hash tidy &> /dev/null; then + echo $result | tidy -xml -i -q -utf8 +else + echo $result +fi From 0b0b7fbda0ae6af783e8d054c9e345e8bc42e03c Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 6 Nov 2012 11:47:14 +0100 Subject: [PATCH 08/30] Update web services documentation with the new delete service FEA: ItEr77S13AllowDeleteOrderElements --- scripts/rest-clients/README | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/rest-clients/README b/scripts/rest-clients/README index 1e0f34831..9193fc57e 100644 --- a/scripts/rest-clients/README +++ b/scripts/rest-clients/README @@ -47,10 +47,10 @@ methods with the following meaning: * If it already exists: Update entity with new data. * If it does not exist: Add the new entity. -These means that delete is not allowed from web services, in that way only new -info could be added or updated. This is because of entities are related with -others and remove operation could be dangerous. Then if necessary, the -recommendation would be add a field to disable such entity. +These means that delete is not allowed for all the entities in the web services, +in that way only new info could be added or updated. This is because of entities +are related with others and remove operation could be dangerous. Anyway for some +specific entities the delete operation has been implemented. Requirements @@ -208,11 +208,11 @@ For each entity there are the following methods: * No parameters * URL: ``/ws/rest//`` -* Remove entity (only available for work reports): +* Remove entity (only available for work reports and order elements): * HTTP method: ``DELETE`` * Parameter: ``entity-code`` - * URL: ``/ws/rest/workreports//`` + * URL: ``/ws/rest///`` * Special URL for work report lines: ``/ws/rest/workreports/line//`` From 774b97a26b6f5558cc741c5f87944f1a523d6580 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 6 Nov 2012 12:42:13 +0100 Subject: [PATCH 09/30] Add test for new delete order elements service FEA: ItEr77S13AllowDeleteOrderElements --- .../ws/orders/OrderElementServiceTest.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/orders/OrderElementServiceTest.java b/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/orders/OrderElementServiceTest.java index c50fc8bfe..bc4ad34c6 100644 --- a/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/orders/OrderElementServiceTest.java +++ b/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/orders/OrderElementServiceTest.java @@ -45,6 +45,8 @@ import java.util.SortedSet; import java.util.UUID; import javax.annotation.Resource; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.hibernate.SessionFactory; import org.joda.time.LocalDate; @@ -536,6 +538,18 @@ public class OrderElementServiceTest { public void validOrderWithOrderLineGroup() { String code = UUID.randomUUID().toString(); + OrderDTO orderDTO = createOrderDTOWithChildren(code); + + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); + List instanceConstraintViolationsList = orderElementService + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); + + checkIfExistsByCodeInAnotherTransaction(code); + } + + private OrderDTO createOrderDTOWithChildren(String code) { OrderDTO orderDTO = new OrderDTO(); orderDTO.name = "Order name " + UUID.randomUUID().toString(); orderDTO.code = code; @@ -557,6 +571,14 @@ public class OrderElementServiceTest { orderLineGroupDTO.children.add(orderLineDTO); orderDTO.children.add(orderLineGroupDTO); + return orderDTO; + } + + @Test + public void removeOrderElement() { + String code = UUID.randomUUID().toString(); + + OrderDTO orderDTO = createOrderDTOWithChildren(code); OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService @@ -565,6 +587,24 @@ public class OrderElementServiceTest { instanceConstraintViolationsList.size() == 0); checkIfExistsByCodeInAnotherTransaction(code); + + String codeToRemove = orderDTO.children.get(0).code; + Response response = orderElementService + .removeOrderElement(codeToRemove); + assertThat(response.getStatus(), equalTo(Status.OK.getStatusCode())); + + try { + orderElementDAO.findByCode(codeToRemove); + } catch (InstanceNotFoundException e) { + assertTrue(true); + } + + try { + OrderElement order = orderElementDAO.findByCode(code); + assertTrue(order.getChildren().isEmpty()); + } catch (InstanceNotFoundException e) { + fail(); + } } @Test From 944d59e2b9b8158ec4746997d9e048ec5c8d702d Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 6 Nov 2012 15:51:36 +0100 Subject: [PATCH 10/30] Bug #1555: Fix issue adding condition in both UI and web service FEA: ItEr77S04BugFixing --- .../orders/daos/IOrderElementDAO.java | 4 +++ .../business/orders/daos/OrderElementDAO.java | 12 +++++-- .../org/libreplan/web/orders/IOrderModel.java | 5 ++- .../web/orders/OrderCRUDController.java | 2 +- .../orders/OrderElementTreeController.java | 21 +++++++++--- .../org/libreplan/web/orders/OrderModel.java | 24 ++++++++++++-- .../orders/impl/OrderElementServiceREST.java | 33 ++++++++++++++----- 7 files changed, 82 insertions(+), 19 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java index 92c0201ca..87524d7f2 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java @@ -109,6 +109,8 @@ public interface IOrderElementDAO extends IIntegrationEntityDAO { EffortDuration calculateMinWorkedHours(final List list); + boolean isAlreadyInUse(OrderElement orderElement); + boolean isAlreadyInUseThisOrAnyOfItsChildren(OrderElement orderElement); /** @@ -130,6 +132,8 @@ public interface IOrderElementDAO extends IIntegrationEntityDAO { boolean hasImputedExpenseSheet(Long id) throws InstanceNotFoundException; + boolean hasImputedExpenseSheetThisOrAnyOfItsChildren(Long id) throws InstanceNotFoundException; + OrderElement findByExternalCode(String code) throws InstanceNotFoundException; public List findByLabelsAndCriteria(Set