From 8bc5b9f7e9a5afcdbdc57d928cb54e3b3cd97433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 18 Mar 2010 16:11:30 +0100 Subject: [PATCH 01/39] ItEr51S04ValidacionEProbasFuncionaisItEr50S04: Avoiding repeated load of data for OrderPlanningModel. --- .../web/planner/order/OrderPlanningController.java | 12 ++++++------ .../web/planner/tabs/PlanningTabCreator.java | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java index fae6959a9..8d7a63735 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningController.java @@ -130,9 +130,6 @@ public class OrderPlanningController implements Composer { @Override public void doAfterCompose(org.zkoss.zk.ui.Component comp) throws Exception { - if (order == null) { - throw new IllegalStateException("an order should have been set"); - } this.planner = (Planner) comp; String zoomLevelParameter = null; if ((parameters != null) && (parameters.get("zoom") != null) @@ -166,9 +163,12 @@ public class OrderPlanningController implements Composer { } private void updateConfiguration() { - model.setConfigurationToPlanner(planner, order, viewSwitcher, - editTaskController, calendarAllocationController, additional); - planner.updateSelectedZoomLevel(); + if (order != null) { + model.setConfigurationToPlanner(planner, order, viewSwitcher, + editTaskController, calendarAllocationController, + additional); + planner.updateSelectedZoomLevel(); + } } public EditTaskController getEditTaskController() { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java index b1e75a1e3..cd09d2db1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java @@ -175,7 +175,6 @@ public class PlanningTabCreator { public org.zkoss.zk.ui.Component create( org.zkoss.zk.ui.Component parent) { Map arguments = new HashMap(); - orderPlanningController.setOrder(mode.getOrder()); arguments.put("orderPlanningController", orderPlanningController); orderPlanningController.setURLParameters(parameters); From c289f74be4c4b4a2384bd4889899d753cf7c51e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 18 Mar 2010 16:38:29 +0100 Subject: [PATCH 02/39] ItEr51S04ValidacionEProbasFuncionaisItEr50S04: Adding location to prevent intermittent test error. --- .../test/java/org/navalplanner/web/orders/OrderModelTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java index a5710a741..de4e65c0d 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java @@ -29,6 +29,7 @@ import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONF import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE; import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_FILE; import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE; +import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_TEST_FILE; import java.util.Calendar; import java.util.Date; @@ -80,7 +81,8 @@ import org.springframework.transaction.annotation.Transactional; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE, - WEBAPP_SPRING_SECURITY_CONFIG_FILE }) + WEBAPP_SPRING_SECURITY_CONFIG_FILE, + WEBAPP_SPRING_SECURITY_CONFIG_TEST_FILE }) @Transactional public class OrderModelTest { From 2ba47db48c7a58591eb4b3fd1895372c1b43b32d Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Thu, 18 Mar 2010 10:11:45 +0100 Subject: [PATCH 03/39] ItEr51S04ValidacionEProbasFuncionaisItEr50S04: Fixing problem editing properties of a milestone. --- .../allocation/ResourceAllocationModel.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java index 3337e7e82..4c1ac4b91 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java @@ -149,33 +149,39 @@ public class ResourceAllocationModel implements IResourceAllocationModel { @Override public void cancel() { - task.setStartDate(currentStartDate); + if (currentStartDate != null) { + task.setStartDate(currentStartDate); + } allocationRowsHandler = null; currentStartDate = null; } @Override public void accept() { - applyAllocationWithDateChangesNotification(new IOnTransaction() { - @Override - public Void execute() { - stepsBeforeDoingAllocation(); - allocationRowsHandler.doAllocation().applyTo(task); - return null; - } - }); + if (context != null) { + applyAllocationWithDateChangesNotification(new IOnTransaction() { + @Override + public Void execute() { + stepsBeforeDoingAllocation(); + allocationRowsHandler.doAllocation().applyTo(task); + return null; + } + }); + } } @Override public void accept(final AllocationResult modifiedAllocationResult) { - applyAllocationWithDateChangesNotification(new IOnTransaction() { - @Override - public Void execute() { - stepsBeforeDoingAllocation(); - modifiedAllocationResult.applyTo(task); - return null; - } - }); + if (context != null) { + applyAllocationWithDateChangesNotification(new IOnTransaction() { + @Override + public Void execute() { + stepsBeforeDoingAllocation(); + modifiedAllocationResult.applyTo(task); + return null; + } + }); + } } private void applyAllocationWithDateChangesNotification( From d039edf5edf87f891f410918ceb4b25bb5782e92 Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Thu, 18 Mar 2010 11:44:47 +0100 Subject: [PATCH 04/39] ItEr51S04ValidacionEProbasFuncionaisItEr50S04 : [Bug #392] Fixing Bug. Checks if the assigned order element to a work report line is not null. --- .../web/workreports/WorkReportCRUDController.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportCRUDController.java index 3813e3007..a88c70543 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportCRUDController.java @@ -343,11 +343,11 @@ public class WorkReportCRUDController extends GenericForwardComposer implements return false; } } else if (workReportLine.getOrderElement() == null) { - Textbox txtOrder = getTextboxOrder(row); - if (txtOrder != null) { + BandboxSearch bandboxOrder = getTextboxOrder(row); + if (bandboxOrder != null) { String message = _("The order element code cannot be null"); - txtOrder.setValue(""); - showInvalidMessage(txtOrder, message); + bandboxOrder.clear(); + showInvalidMessage(bandboxOrder, message); } return false; } @@ -520,7 +520,7 @@ public class WorkReportCRUDController extends GenericForwardComposer implements * @param row * @return */ - private Textbox getTextboxOrder(Row row) { + private BandboxSearch getTextboxOrder(Row row) { int position = 0; if (!getWorkReportType().getDateIsSharedByLines()) { position++; @@ -529,7 +529,7 @@ public class WorkReportCRUDController extends GenericForwardComposer implements position++; } try { - return (Textbox) row.getChildren().get(position); + return (BandboxSearch) row.getChildren().get(position); } catch (Exception e) { return null; } From daabf1ce4c3c81515f6766cfb702c8dd38477956 Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Tue, 16 Mar 2010 13:20:23 +0100 Subject: [PATCH 05/39] ItEr50S13AdaptacionServiciosRESTItEr49S18 : Adapting of OrderServiceRest to GenericServiceRest. --- .../business/orders/daos/IOrderDAO.java | 6 +- .../orders/daos/IOrderElementDAO.java | 6 +- .../business/orders/daos/OrderDAO.java | 35 +- .../business/orders/daos/OrderElementDAO.java | 37 +- .../business/orders/entities/Order.java | 9 +- .../orders/entities/OrderElement.java | 9 +- .../business/orders/entities/OrderLine.java | 11 + .../orders/entities/OrderLineGroup.java | 6 + .../navalplanner/ws/common/api/OrderDTO.java | 5 +- .../ws/common/api/OrderElementDTO.java | 15 +- .../ws/common/impl/OrderElementConverter.java | 65 +++- .../ws/orders/api/IOrderElementService.java | 12 +- .../ws/orders/api/OrderListDTO.java | 49 +++ .../orders/impl/OrderElementServiceREST.java | 114 ++---- .../impl/SubcontractServiceREST.java | 4 - .../test/ws/labels/api/LabelServiceTest.java | 48 ++- .../ws/orders/OrderElementServiceTest.java | 368 +++++++++++------- scripts/rest-clients/README | 10 +- scripts/rest-clients/export-order-element.sh | 24 +- scripts/rest-clients/import-order-elements.sh | 33 ++ .../rest-clients/order-elements-sample.xml | 67 ++++ 21 files changed, 613 insertions(+), 320 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/OrderListDTO.java create mode 100755 scripts/rest-clients/import-order-elements.sh create mode 100644 scripts/rest-clients/order-elements-sample.xml diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java index 5e3247778..4f34b16db 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java @@ -23,11 +23,11 @@ package org.navalplanner.business.orders.daos; import java.util.Date; import java.util.List; -import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.reports.dtos.OrderCostsPerResourceDTO; import org.navalplanner.business.users.entities.User; -import org.navalplanner.business.planner.entities.Task; /** * Contract for {@link OrderDAO} @@ -36,7 +36,7 @@ import org.navalplanner.business.planner.entities.Task; * @author Diego Pino Garcia * @author Jacobo Aragunde Pérez */ -public interface IOrderDAO extends IGenericDAO { +public interface IOrderDAO extends IIntegrationEntityDAO { /** * Gets all the orders. diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java index a51be6839..c3ed65e40 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java @@ -23,7 +23,7 @@ package org.navalplanner.business.orders.daos; import java.math.BigDecimal; import java.util.List; -import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; @@ -35,12 +35,10 @@ import org.navalplanner.business.templates.entities.OrderElementTemplate; * @author Diego Pino García * @author Susana Montes Pedreira */ -public interface IOrderElementDAO extends IGenericDAO { +public interface IOrderElementDAO extends IIntegrationEntityDAO { public List findWithoutParent(); - public List findByCode(String code); - public OrderElement findUniqueByCode(String code) throws InstanceNotFoundException; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java index 8ffd0388a..fcf1ee9d0 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java @@ -25,9 +25,11 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.hibernate.Query; +import org.hibernate.criterion.Restrictions; import org.joda.time.LocalDate; -import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.costcategories.daos.CostCategoryDAO; import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO; @@ -48,7 +50,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; - /** * Dao for {@link Order} * @@ -58,7 +59,7 @@ import org.springframework.transaction.annotation.Transactional; */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) -public class OrderDAO extends GenericDAOHibernate implements +public class OrderDAO extends IntegrationEntityDAO implements IOrderDAO { @Autowired @@ -230,4 +231,32 @@ public class OrderDAO extends GenericDAOHibernate implements } } + @Override + public List findAll() { + return getSession().createCriteria(getEntityClass()).addOrder( + org.hibernate.criterion.Order.asc("infoComponent.code")).list(); + } + + @SuppressWarnings("unchecked") + @Override + public Order findByCode(String code) throws InstanceNotFoundException { + + if (StringUtils.isBlank(code)) { + throw new InstanceNotFoundException(null, getEntityClass() + .getName()); + } + + Order entity = (Order) getSession().createCriteria(getEntityClass()) + .add( + Restrictions.eq("infoComponent.code", code.trim()) + .ignoreCase()).uniqueResult(); + + if (entity == null) { + throw new InstanceNotFoundException(code, getEntityClass() + .getName()); + } else { + return entity; + } + + } } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java index 47d6a74fe..3cff01bcd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java @@ -25,12 +25,13 @@ import java.math.RoundingMode; import java.util.Iterator; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.IAdHocTransactionService; import org.navalplanner.business.common.IOnTransaction; -import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; @@ -56,7 +57,7 @@ import org.springframework.transaction.annotation.Transactional; **/ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) -public class OrderElementDAO extends GenericDAOHibernate +public class OrderElementDAO extends IntegrationEntityDAO implements IOrderElementDAO { @Autowired @@ -191,10 +192,34 @@ public class OrderElementDAO extends GenericDAOHibernate } @Override - public List findByCode(String code) { - Criteria c = getSession().createCriteria(OrderElement.class); - c.add(Restrictions.eq("infoComponent.code", code).ignoreCase()); - return (List) c.list(); + public List findAll() { + return getSession().createCriteria(getEntityClass()).addOrder( + org.hibernate.criterion.Order.asc("infoComponent.code")).list(); + } + + @SuppressWarnings("unchecked") + @Override + public OrderElement findByCode(String code) + throws InstanceNotFoundException { + + if (StringUtils.isBlank(code)) { + throw new InstanceNotFoundException(null, getEntityClass() + .getName()); + } + + OrderElement entity = (OrderElement) getSession().createCriteria( + getEntityClass()) + .add( + Restrictions.eq("infoComponent.code", code.trim()) + .ignoreCase()).uniqueResult(); + + if (entity == null) { + throw new InstanceNotFoundException(code, getEntityClass() + .getName()); + } else { + return entity; + } + } public List findByTemplate(OrderElementTemplate template) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java index 6aacba626..6cf03c694 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java @@ -54,6 +54,13 @@ public class Order extends OrderLineGroup { return order; } + + public static Order createUnvalidated(String code) { + Order order = create(new Order(), code); + OrderLineGroup.setupOrderLineGroup(order); + return order; + } + /** * Constructor for hibernate. Do not use! */ @@ -67,7 +74,6 @@ public class Order extends OrderLineGroup { private Boolean dependenciesConstraintsHavePriority; - @NotNull(message = "order calendar not specified") private BaseCalendar calendar; private Boolean codeAutogenerated = false; @@ -274,6 +280,7 @@ public class Order extends OrderLineGroup { this.calendar = calendar; } + @NotNull(message = "order calendar not specified") public BaseCalendar getCalendar() { return calendar; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java index 84e171835..ed9c15fee 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java @@ -42,8 +42,9 @@ import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; import org.navalplanner.business.advance.entities.IndirectAdvanceAssignment; import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException; import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.labels.entities.Label; @@ -62,7 +63,7 @@ import org.navalplanner.business.requirements.entities.IndirectCriterionRequirem import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.business.trees.ITreeNode; -public abstract class OrderElement extends BaseEntity implements +public abstract class OrderElement extends IntegrationEntity implements ICriterionRequirable, ITreeNode { private InfoComponent infoComponent = new InfoComponent(); @@ -1023,4 +1024,8 @@ public abstract class OrderElement extends BaseEntity implements return (measuredProgress.compareTo(new BigDecimal(100)) == 0); } + @Override + protected IIntegrationEntityDAO getIntegrationEntityDAO() { + return Registry.getOrderElementDAO(); + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java index 272f8b05d..c3dbeef1e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java @@ -51,6 +51,17 @@ public class OrderLine extends OrderElement { return result; } + public static OrderLine createUnvalidated(String code) { + OrderLine orderLine = create(new OrderLine(), code); + return orderLine; + } + + public static OrderLine createUnvalidatedWithUnfixedPercentage(String code, + int hours) { + OrderLine orderLine = createOrderLineWithUnfixedPercentage(hours); + return create(orderLine, code); + } + public static OrderLine createOrderLineWithUnfixedPercentage(int hours) { OrderLine result = create(); HoursGroup hoursGroup = HoursGroup.create(result); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java index 727aec363..1517e3537 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java @@ -109,6 +109,12 @@ public class OrderLineGroup extends OrderElement implements return result; } + public static OrderLineGroup createUnvalidated(String code) { + OrderLineGroup orderLineGroup = create(new OrderLineGroup(), code); + setupOrderLineGroup(orderLineGroup); + return orderLineGroup; + } + protected static void setupOrderLineGroup(OrderLineGroup result) { IndirectAdvanceAssignment indirectAdvanceAssignment = IndirectAdvanceAssignment .create(true); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderDTO.java index d81aa6083..2a0a6e1ef 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderDTO.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Set; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; import org.navalplanner.business.orders.entities.Order; @@ -34,9 +33,11 @@ import org.navalplanner.business.orders.entities.Order; * * @author Manuel Rego Casasnovas */ -@XmlRootElement(name = "order") + public class OrderDTO extends OrderLineGroupDTO { + public final static String ENTITY_TYPE = "order"; + @XmlAttribute(name = "dependencies-constraints-have-priority") public Boolean dependenciesConstraintsHavePriority; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderElementDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderElementDTO.java index 4f399febf..aeaff7aa9 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderElementDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/api/OrderElementDTO.java @@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlElements; -import javax.xml.bind.annotation.XmlRootElement; import org.navalplanner.business.orders.entities.OrderElement; @@ -37,15 +36,14 @@ import org.navalplanner.business.orders.entities.OrderElement; * * @author Manuel Rego Casasnovas */ -@XmlRootElement(name = "order-element") -public class OrderElementDTO { + +public class OrderElementDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "order-element"; @XmlAttribute public String name; - @XmlAttribute - public String code; - @XmlAttribute(name = "init-date") public Date initDate; @@ -92,4 +90,9 @@ public class OrderElementDTO { this.criterionRequirements = criterionRequirements; } + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java index 626085114..16b6d3804 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java @@ -38,6 +38,7 @@ import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlob import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.Registry; 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.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; @@ -58,7 +59,6 @@ import org.navalplanner.ws.common.api.AdvanceMeasurementDTO; import org.navalplanner.ws.common.api.CriterionRequirementDTO; import org.navalplanner.ws.common.api.DirectCriterionRequirementDTO; import org.navalplanner.ws.common.api.HoursGroupDTO; -import org.navalplanner.ws.common.api.IncompatibleTypeException; import org.navalplanner.ws.common.api.IndirectCriterionRequirementDTO; import org.navalplanner.ws.common.api.LabelReferenceDTO; import org.navalplanner.ws.common.api.MaterialAssignmentDTO; @@ -225,7 +225,7 @@ public final class OrderElementConverter { public final static OrderElement toEntity(OrderElementDTO orderElementDTO, ConfigurationOrderElementConverter configuration) - throws InstanceNotFoundException { + throws ValidationException { OrderElement orderElement = toEntityExceptCriterionRequirements( orderElementDTO, configuration); if (configuration.isCriterionRequirements()) { @@ -316,13 +316,14 @@ public final class OrderElementConverter { private final static OrderElement toEntityExceptCriterionRequirements( OrderElementDTO orderElementDTO, ConfigurationOrderElementConverter configuration) - throws InstanceNotFoundException { + throws ValidationException { OrderElement orderElement; if (orderElementDTO instanceof OrderLineDTO) { if ((configuration.isHoursGroups()) && (!((OrderLineDTO) orderElementDTO).hoursGroups.isEmpty())) { - orderElement = OrderLine.create(); + orderElement = OrderLine + .createUnvalidated(orderElementDTO.code); for (HoursGroupDTO hoursGroupDTO : ((OrderLineDTO) orderElementDTO).hoursGroups) { HoursGroup hoursGroup = toEntity(hoursGroupDTO, @@ -331,7 +332,8 @@ public final class OrderElementConverter { } } else { orderElement = OrderLine - .createOrderLineWithUnfixedPercentage(0); + .createUnvalidatedWithUnfixedPercentage( + orderElementDTO.code, 0); } } else { // orderElementDTO instanceof OrderLineGroupDTO List children = new ArrayList(); @@ -340,11 +342,9 @@ public final class OrderElementConverter { } if (orderElementDTO instanceof OrderDTO) { - orderElement = Order.create(); - + orderElement = Order.createUnvalidated(orderElementDTO.code); ((Order) orderElement) .setDependenciesConstraintsHavePriority(((OrderDTO) orderElementDTO).dependenciesConstraintsHavePriority); - List calendars = Registry.getBaseCalendarDAO() .findByName(((OrderDTO) orderElementDTO).calendarName); BaseCalendar calendar; @@ -356,7 +356,8 @@ public final class OrderElementConverter { } ((Order) orderElement).setCalendar(calendar); } else { // orderElementDTO instanceof OrderLineGroupDTO - orderElement = OrderLineGroup.create(); + orderElement = OrderLineGroup + .createUnvalidated(orderElementDTO.code); } for (OrderElement child : children) { @@ -372,7 +373,12 @@ public final class OrderElementConverter { if (configuration.isLabels()) { for (LabelReferenceDTO labelDTO : orderElementDTO.labels) { + try { orderElement.addLabel(LabelReferenceConverter.toEntity(labelDTO)); + } catch (InstanceNotFoundException e) { + throw new ValidationException("Label " + labelDTO.code + + " not found."); + } } } @@ -456,7 +462,7 @@ public final class OrderElementConverter { public final static void update(OrderElement orderElement, OrderElementDTO orderElementDTO, ConfigurationOrderElementConverter configuration) - throws IncompatibleTypeException, InstanceNotFoundException { + throws ValidationException { updateExceptCriterionRequirements(orderElement, orderElementDTO, configuration); if (configuration.isCriterionRequirements()) { @@ -467,12 +473,14 @@ public final class OrderElementConverter { private final static void updateExceptCriterionRequirements( OrderElement orderElement, OrderElementDTO orderElementDTO, ConfigurationOrderElementConverter configuration) - throws IncompatibleTypeException, InstanceNotFoundException { + throws ValidationException { if (orderElementDTO instanceof OrderLineDTO) { if (!(orderElement instanceof OrderLine)) { - throw new IncompatibleTypeException(orderElement.getCode(), - OrderLine.class, orderElement.getClass()); + throw new ValidationException(_( + "Order element {0} : OrderLineGroup is incompatible type with {1}" + + orderElement.getCode(), orderElement + .getClass().getName())); } if (configuration.isHoursGroups()) { @@ -492,8 +500,11 @@ public final class OrderElementConverter { } else { // orderElementDTO instanceof OrderLineGroupDTO if (orderElementDTO instanceof OrderDTO) { if (!(orderElement instanceof Order)) { - throw new IncompatibleTypeException(orderElement.getCode(), - Order.class, orderElement.getClass()); + throw new ValidationException(_( + "Order element {0} : Order is incompatible type with {1}" + + orderElement.getCode(), orderElement + .getClass().getName())); + } Boolean dependenciesConstraintsHavePriority = ((OrderDTO) orderElementDTO).dependenciesConstraintsHavePriority; @@ -518,8 +529,10 @@ public final class OrderElementConverter { } } else { // orderElementDTO instanceof OrderLineGroupDTO if (!(orderElement instanceof OrderLineGroup)) { - throw new IncompatibleTypeException(orderElement.getCode(), - OrderLineGroup.class, orderElement.getClass()); + throw new ValidationException(_( + "Order element {0} : OrderLineGroup is incompatible type with {1}" + + orderElement.getCode(), orderElement + .getClass().getName())); } } @@ -538,7 +551,12 @@ public final class OrderElementConverter { if (configuration.isLabels()) { for (LabelReferenceDTO labelDTO : orderElementDTO.labels) { if (!orderElement.containsLabel(labelDTO.code)) { + try { orderElement.addLabel(LabelReferenceConverter.toEntity(labelDTO)); + } catch (InstanceNotFoundException e) { + throw new ValidationException("Label " + labelDTO.code + + " not found"); + } } } } @@ -584,7 +602,7 @@ public final class OrderElementConverter { HoursGroupDTO hoursGroupDTO, ConfigurationOrderElementConverter configuration) { if (!hoursGroup.getCode().equals(hoursGroupDTO.code)) { - throw new RuntimeException( + throw new ValidationException( _("Not the same hours group, impossible to update")); } @@ -602,7 +620,8 @@ public final class OrderElementConverter { MaterialAssignmentDTO materialAssignmentDTO) { if (!materialAssignment.getMaterial().getCode().equals( materialAssignmentDTO.materialCode)) { - throw new RuntimeException(_("Not the same material, impossible to update")); + throw new ValidationException( + _("Not the same material, impossible to update")); } if (materialAssignmentDTO.units != null) { @@ -652,9 +671,13 @@ public final class OrderElementConverter { directAdvanceAssignment = orderElement .addSubcontractorAdvanceAssignment(); } catch (DuplicateValueTrueReportGlobalAdvanceException e) { - throw new RuntimeException(e); + throw new ValidationException( + _("Duplicate value true report global Advance for order element " + + orderElement.getCode())); } catch (DuplicateAdvanceAssignmentForOrderElementException e) { - throw new RuntimeException(e); + throw new ValidationException( + _("Duplicate advance assignment for order element " + + orderElement.getCode())); } } return directAdvanceAssignment; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/IOrderElementService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/IOrderElementService.java index 52a18c7fe..23a15d729 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/IOrderElementService.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/IOrderElementService.java @@ -20,12 +20,8 @@ package org.navalplanner.ws.orders.api; -import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.OrderElement; -import org.navalplanner.ws.common.api.IncompatibleTypeException; import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; -import org.navalplanner.ws.common.api.OrderDTO; -import org.navalplanner.ws.common.api.OrderElementDTO; /** * Service for managing {@link OrderElement} entities. @@ -34,12 +30,8 @@ import org.navalplanner.ws.common.api.OrderElementDTO; */ public interface IOrderElementService { - OrderElementDTO getOrderElement(String code) - throws InstanceNotFoundException; + InstanceConstraintViolationsListDTO addOrders(OrderListDTO orderListDTO); - InstanceConstraintViolationsListDTO addOrder(OrderDTO order); - - InstanceConstraintViolationsListDTO updateOrder(OrderDTO orderDTO) - throws InstanceNotFoundException, IncompatibleTypeException; + OrderListDTO getOrders(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/OrderListDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/OrderListDTO.java new file mode 100644 index 000000000..5744513b9 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/api/OrderListDTO.java @@ -0,0 +1,49 @@ +/* + * 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.orders.api; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.navalplanner.ws.common.api.OrderDTO; + +/** + * DTO for a list of Order entities. + * @author Susana Montes Pedreira + */ + +@XmlRootElement(name = "order-list") +public class OrderListDTO { + + @XmlElement(name = "order") + public List orderDTOs = new ArrayList(); + + public OrderListDTO() { + } + + public OrderListDTO(List orderDTOs) { + this.orderDTOs = orderDTOs; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/impl/OrderElementServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/impl/OrderElementServiceREST.java index f1523e29f..7dd6d8153 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/impl/OrderElementServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/orders/impl/OrderElementServiceREST.java @@ -20,32 +20,24 @@ package org.navalplanner.ws.orders.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.PUT; import javax.ws.rs.Path; -import javax.ws.rs.PathParam; import javax.ws.rs.Produces; -import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.common.exceptions.ValidationException; -import org.navalplanner.business.orders.daos.IOrderElementDAO; +import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.entities.Order; -import org.navalplanner.business.orders.entities.OrderElement; -import org.navalplanner.ws.common.api.IncompatibleTypeException; -import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; import org.navalplanner.ws.common.api.OrderDTO; -import org.navalplanner.ws.common.api.OrderElementDTO; import org.navalplanner.ws.common.impl.ConfigurationOrderElementConverter; -import org.navalplanner.ws.common.impl.ConstraintViolationConverter; +import org.navalplanner.ws.common.impl.GenericRESTService; import org.navalplanner.ws.common.impl.OrderElementConverter; -import org.navalplanner.ws.common.impl.Util; +import org.navalplanner.ws.common.impl.RecoverableErrorException; import org.navalplanner.ws.orders.api.IOrderElementService; +import org.navalplanner.ws.orders.api.OrderListDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -58,91 +50,51 @@ import org.springframework.transaction.annotation.Transactional; @Path("/orderelements/") @Produces("application/xml") @Service("orderElementServiceREST") -public class OrderElementServiceREST implements IOrderElementService { +public class OrderElementServiceREST extends + GenericRESTService implements + IOrderElementService { @Autowired - private IOrderElementDAO orderElementDAO; + private IOrderDAO orderDAO; @Override @GET - @Path("/{code}") @Transactional(readOnly = true) - public OrderElementDTO getOrderElement(@PathParam("code") String code) - throws InstanceNotFoundException { - return OrderElementConverter.toDTO(orderElementDAO - .findUniqueByCode(code), ConfigurationOrderElementConverter - .noAdvanceMeasurements()); + public OrderListDTO getOrders() { + return new OrderListDTO(findAll()); } @Override @POST @Consumes("application/xml") - @Transactional - public InstanceConstraintViolationsListDTO addOrder(OrderDTO orderDTO) { - - List instanceConstraintViolationsList = new ArrayList(); - - InstanceConstraintViolationsDTO instanceConstraintViolationsDTO = null; - try { - OrderElement orderElement = OrderElementConverter.toEntity( - orderDTO, ConfigurationOrderElementConverter - .all()); - - orderElement.validate(); - orderElementDAO.save(orderElement); - } catch (ValidationException e) { - instanceConstraintViolationsDTO = ConstraintViolationConverter - .toDTO(Util.generateInstanceId(1, orderDTO.code), e - .getInvalidValues()); - } catch (InstanceNotFoundException e) { - instanceConstraintViolationsDTO = InstanceConstraintViolationsDTO - .create(Util.generateInstanceId(1, orderDTO.code), e - .getMessage()); - } - - if (instanceConstraintViolationsDTO != null) { - instanceConstraintViolationsList - .add(instanceConstraintViolationsDTO); - } - - return new InstanceConstraintViolationsListDTO( - instanceConstraintViolationsList); + public InstanceConstraintViolationsListDTO addOrders( + OrderListDTO orderListDTO) { + return save(orderListDTO.orderDTOs); } @Override - @PUT - @Consumes("application/xml") - @Transactional - public InstanceConstraintViolationsListDTO updateOrder(OrderDTO orderDTO) - throws InstanceNotFoundException, IncompatibleTypeException { - OrderElement orderElement = orderElementDAO - .findUniqueByCode(orderDTO.code); - if (!(orderElement instanceof Order)) { - throw new IncompatibleTypeException(orderElement.getCode(), - Order.class, orderElement.getClass()); - } + protected OrderDTO toDTO(Order entity) { + return (OrderDTO) OrderElementConverter.toDTO(entity, + ConfigurationOrderElementConverter.all()); + } - List instanceConstraintViolationsList = new ArrayList(); + @Override + protected IIntegrationEntityDAO getIntegrationEntityDAO() { + return orderDAO; + } - InstanceConstraintViolationsDTO instanceConstraintViolationsDTO = null; - try { - OrderElementConverter.update((Order) orderElement, orderDTO, + @Override + protected Order toEntity(OrderDTO entityDTO) throws ValidationException, + RecoverableErrorException { + return (Order) OrderElementConverter.toEntity(entityDTO, + ConfigurationOrderElementConverter.all()); + } + + @Override + protected void updateEntity(Order entity, OrderDTO entityDTO) + throws ValidationException, RecoverableErrorException { + OrderElementConverter.update(entity, entityDTO, ConfigurationOrderElementConverter.all()); - orderElement.validate(); - orderElementDAO.save(orderElement); - } catch (ValidationException e) { - instanceConstraintViolationsDTO = ConstraintViolationConverter - .toDTO(Util.generateInstanceId(1, orderDTO.code), e - .getInvalidValues()); - } - - if (instanceConstraintViolationsDTO != null) { - instanceConstraintViolationsList - .add(instanceConstraintViolationsDTO); - } - - return new InstanceConstraintViolationsListDTO( - instanceConstraintViolationsList); } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/SubcontractServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/SubcontractServiceREST.java index 9eb248358..94b8a8d02 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/SubcontractServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/SubcontractServiceREST.java @@ -154,10 +154,6 @@ public class SubcontractServiceREST implements ISubcontractService { instanceConstraintViolationsDTO = ConstraintViolationConverter .toDTO(Util.generateInstanceId(1, orderElementDTO.code), e .getInvalidValues()); - } catch (InstanceNotFoundException e) { - instanceConstraintViolationsDTO = InstanceConstraintViolationsDTO - .create(Util.generateInstanceId(1, orderElementDTO.code), e - .getMessage()); } if (instanceConstraintViolationsDTO != null) { 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 c1723d100..87d36ed69 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 @@ -24,6 +24,7 @@ import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE; import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE; @@ -96,20 +97,27 @@ public class LabelServiceTest { @Test public void exportLabelTypes() { + int previous = labelTypeDAO.getAll().size(); LabelTypeListDTO labelTypes = labelService.getLabelTypes(); - assertTrue(labelTypes.labelTypes.isEmpty()); + assertTrue(labelTypes.labelTypes.size() == previous); } @Test public void exportLabelTypes2() { + int previous = labelTypeDAO.getAll().size(); + LabelType labelType = givenLabelTypeStored(); LabelTypeListDTO labelTypes = labelService.getLabelTypes(); - assertThat(labelTypes.labelTypes.size(), equalTo(1)); + assertThat(labelTypes.labelTypes.size(), equalTo(previous + 1)); - LabelTypeDTO labelTypeDTO = labelTypes.labelTypes.get(0); - assertThat(labelTypeDTO.code, equalTo(labelType.getCode())); - assertThat(labelTypeDTO.labels.size(), equalTo(2)); + for (LabelTypeDTO typeDTO : labelTypes.labelTypes) { + if ((typeDTO.code.equalsIgnoreCase(labelType.getCode())) + && (typeDTO.labels.size() == 2)) { + return; + } + } + fail(); } @Test @@ -138,7 +146,8 @@ public class LabelServiceTest { public void importValidLabelType() { int previous = labelTypeDAO.getAll().size(); - LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name1", + LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name" + + UUID.randomUUID().toString(), new ArrayList()); List instanceConstraintViolationsList = labelService @@ -147,18 +156,18 @@ public class LabelServiceTest { assertThat(labelTypeDAO.getAll().size(), equalTo(previous + 1)); - LabelType labelType = labelTypeDAO.getAll().get(0); - assertThat(labelType.getName(), equalTo(labelTypeDTO.name)); - assertThat(labelType.getLabels().size(), equalTo(0)); } @Test public void importTwoValidLabelType() { int previous = labelTypeDAO.getAll().size(); - LabelTypeDTO labelTypeDTO1 = new LabelTypeDTO("label-type-A", + String nameType1 = "label-type-" + UUID.randomUUID().toString(); + String nameType2 = "label-type-" + UUID.randomUUID().toString(); + + LabelTypeDTO labelTypeDTO1 = new LabelTypeDTO(nameType1, new ArrayList()); - LabelTypeDTO labelTypeDTO2 = new LabelTypeDTO("label-type-B", + LabelTypeDTO labelTypeDTO2 = new LabelTypeDTO(nameType2, new ArrayList()); LabelTypeListDTO labelTypeDTOs = createLabelTypeListDTO(labelTypeDTO1, @@ -171,11 +180,22 @@ public class LabelServiceTest { List labelTypes = labelTypeDAO.getAll(); assertThat(labelTypes.size(), equalTo(previous + 2)); + + int cont = 0; for (LabelType labelType : labelTypes) { - assertThat(labelType.getName(), anyOf(equalTo(labelTypeDTO1.name), - equalTo(labelTypeDTO2.name), equalTo("label-type-name1"))); - assertThat(labelType.getLabels().size(), equalTo(0)); + if (labelType.getName().equals(nameType1)) { + cont++; + } } + assertThat(cont, equalTo(1)); + + cont = 0; + for (LabelType labelType : labelTypes) { + if (labelType.getName().equals(nameType2)) { + cont++; + } + } + assertThat(cont, equalTo(1)); } @Test diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java index 04f026248..a674aff9f 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java @@ -22,7 +22,6 @@ package org.navalplanner.web.test.ws.orders; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; @@ -35,6 +34,7 @@ import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_T import static org.navalplanner.web.test.ws.common.Util.mustEnd; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -46,7 +46,6 @@ import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.joda.time.LocalDate; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.IDataBootstrap; @@ -60,7 +59,6 @@ import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.orders.entities.HoursGroup; -import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.OrderLine; import org.navalplanner.business.requirements.entities.CriterionRequirement; @@ -83,7 +81,9 @@ import org.navalplanner.ws.common.api.OrderLineDTO; import org.navalplanner.ws.common.api.OrderLineGroupDTO; import org.navalplanner.ws.common.api.ResourceEnumDTO; import org.navalplanner.ws.orders.api.IOrderElementService; +import org.navalplanner.ws.orders.api.OrderListDTO; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @@ -112,7 +112,8 @@ public class OrderElementServiceTest { @Resource private IDataBootstrap criterionsBootstrap; - @Before + @Test + @Rollback(false) public void loadRequiredaData() { defaultAdvanceTypesBootstrapListener.loadRequiredData(); configurationBootstrap.loadRequiredData(); @@ -135,8 +136,12 @@ public class OrderElementServiceTest { @Autowired private SessionFactory sessionFactory; - private Label givenLabelStored() { - Label label = Label.create("label-name-" + UUID.randomUUID()); + private static String labelCode = "label-code-" + UUID.randomUUID(); + + @Test + @Rollback(false) + public void givenLabelStored() { + Label label = Label.create(labelCode, "labelName"); LabelType labelType = LabelType.create("label-type-" + UUID.randomUUID()); @@ -149,8 +154,6 @@ public class OrderElementServiceTest { labelType.dontPoseAsTransientObjectAnymore(); label.dontPoseAsTransientObjectAnymore(); - - return label; } @Test @@ -159,15 +162,20 @@ public class OrderElementServiceTest { OrderDTO orderDTO = new OrderDTO(); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList .get(0).constraintViolations; - // Mandatory fields: code, name. Check constraints: + // Mandatory fields: code, infoComponent.code, infoComponent.name. Check + // constraints: // checkConstraintOrderMustHaveStartDate - assertThat(constraintViolations.size(), equalTo(3)); + assertThat(constraintViolations.size(), equalTo(4)); assertThat(orderDAO.getOrders().size(), equalTo(previous)); } @@ -179,9 +187,12 @@ public class OrderElementServiceTest { OrderDTO orderDTO = new OrderDTO(); orderDTO.code = "order-code"; + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; - assertThat(instanceConstraintViolationsList.size(), equalTo(1)); + .addOrders(orderListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); List constraintViolations = instanceConstraintViolationsList .get(0).constraintViolations; @@ -199,15 +210,16 @@ public class OrderElementServiceTest { OrderDTO orderDTO = new OrderDTO(); orderDTO.name = "Order name"; + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList .get(0).constraintViolations; - // Mandatory fields: code. Check constraints: + // Mandatory fields: code, infoComponentCode. Check constraints: // checkConstraintOrderMustHaveStartDate - assertThat(constraintViolations.size(), equalTo(2)); + assertThat(constraintViolations.size(), equalTo(3)); assertThat(orderDAO.getOrders().size(), equalTo(previous)); } @@ -219,14 +231,15 @@ public class OrderElementServiceTest { OrderDTO orderDTO = new OrderDTO(); orderDTO.initDate = new Date(); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList .get(0).constraintViolations; - // Mandatory fields: code, name - assertThat(constraintViolations.size(), equalTo(2)); + // Mandatory fields: code,infoComponent.code, infoComponent.name + assertThat(constraintViolations.size(), equalTo(3)); for (ConstraintViolationDTO constraintViolationDTO : constraintViolations) { assertThat(constraintViolationDTO.fieldName, anyOf(mustEnd("code"), mustEnd("name"))); @@ -238,19 +251,19 @@ public class OrderElementServiceTest { @Test public void validOrder() { String code = "order-code"; - int previous = orderElementDAO.findByCode(code).size(); OrderDTO orderDTO = new OrderDTO(); orderDTO.name = "Order name"; orderDTO.code = code; orderDTO.initDate = new Date(); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; - assertThat(instanceConstraintViolationsList.size(), equalTo(0)); + .addOrders(orderListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); - assertThat(orderElementDAO.findByCode(code).size(), - equalTo(previous + 1)); } @Test @@ -265,14 +278,16 @@ public class OrderElementServiceTest { OrderLineDTO orderLineDTO = new OrderLineDTO(); orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList .get(0).constraintViolations; - // Mandatory fields: code, name, hours group code. - assertThat(constraintViolations.size(), equalTo(3)); + // Mandatory fields: code,infoComponent.code, infoComponent.name, hours + // group code. + assertThat(constraintViolations.size(), equalTo(4)); assertThat(orderDAO.getOrders().size(), equalTo(previous)); } @@ -294,8 +309,9 @@ public class OrderElementServiceTest { orderLineDTO.hoursGroups.add(hoursGroupDTO); orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList @@ -313,7 +329,6 @@ public class OrderElementServiceTest { @Test public void validOrderWithOrderLine() { String code = "order-code"; - int previous = orderElementDAO.findByCode(code).size(); OrderDTO orderDTO = new OrderDTO(); orderDTO.name = "Order name"; @@ -329,12 +344,17 @@ public class OrderElementServiceTest { orderLineDTO.hoursGroups.add(hoursGroupDTO); orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); - assertThat(orderElementDAO.findByCode(code).size(), - equalTo(previous + 1)); + try { + orderElementDAO.findByCode(code); + assertTrue(true); + } catch (InstanceNotFoundException e) { + fail(); + } } @Test @@ -349,15 +369,17 @@ public class OrderElementServiceTest { OrderLineGroupDTO orderLineGroupDTO = new OrderLineGroupDTO(); orderDTO.children.add(orderLineGroupDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList .get(0).constraintViolations; - // Mandatory fields: code, name. Check constraints: + // Mandatory fields: code,infoComponent.code, infoComponenet.name. Check + // constraints: // checkConstraintAtLeastOneHoursGroupForEachOrderElement - assertThat(constraintViolations.size(), equalTo(3)); + assertThat(constraintViolations.size(), equalTo(4)); assertThat(orderDAO.getOrders().size(), equalTo(previous)); } @@ -376,8 +398,9 @@ public class OrderElementServiceTest { orderLineGroupDTO.code = "order-line-group-code"; orderDTO.children.add(orderLineGroupDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList @@ -391,22 +414,22 @@ public class OrderElementServiceTest { @Test public void validOrderWithOrderLineGroup() { - String code = "order-code"; - int previous = orderElementDAO.findByCode(code).size(); + String code = UUID.randomUUID().toString(); OrderDTO orderDTO = new OrderDTO(); - orderDTO.name = "Order name"; + orderDTO.name = "Order name A"; orderDTO.code = code; orderDTO.initDate = new Date(); OrderLineGroupDTO orderLineGroupDTO = new OrderLineGroupDTO(); - orderLineGroupDTO.name = "Order line group"; - orderLineGroupDTO.code = "order-line-group-code"; + orderLineGroupDTO.name = "Order line group A"; + orderLineGroupDTO.code = "order-line-group-code-A"; OrderLineDTO orderLineDTO = new OrderLineDTO(); - orderLineDTO.name = "Order line"; - orderLineDTO.code = "order-line-code"; - HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group", + orderLineDTO.name = "Order line A"; + orderLineDTO.code = "order-line-code-A"; + HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group-" + + UUID.randomUUID().toString(), ResourceEnumDTO.WORKER, 1000, new HashSet()); orderLineDTO.hoursGroups.add(hoursGroupDTO); @@ -414,12 +437,18 @@ public class OrderElementServiceTest { orderDTO.children.add(orderLineGroupDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; - assertThat(instanceConstraintViolationsList.size(), equalTo(0)); + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); - assertThat(orderElementDAO.findByCode(code).size(), - equalTo(previous + 1)); + try { + orderElementDAO.findByCode(code); + assertTrue(true); + } catch (InstanceNotFoundException e) { + fail(); + } } @Test @@ -434,8 +463,9 @@ public class OrderElementServiceTest { MaterialAssignmentDTO materialAssignmentDTO = new MaterialAssignmentDTO(); orderDTO.materialAssignments.add(materialAssignmentDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList @@ -460,8 +490,9 @@ public class OrderElementServiceTest { materialAssignmentDTO.materialCode = "material-code"; orderDTO.materialAssignments.add(materialAssignmentDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList @@ -479,7 +510,6 @@ public class OrderElementServiceTest { @Test public void validOrderWithMaterialAssignment() { String code = "order-code"; - int previous = orderElementDAO.findByCode(code).size(); OrderDTO orderDTO = new OrderDTO(); orderDTO.name = "Order name"; @@ -492,12 +522,17 @@ public class OrderElementServiceTest { materialAssignmentDTO.units = 100.0; orderDTO.materialAssignments.add(materialAssignmentDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); - assertThat(orderElementDAO.findByCode(code).size(), - equalTo(previous + 1)); + try { + orderElementDAO.findByCode(code); + assertTrue(true); + } catch (InstanceNotFoundException e) { + fail(); + } } @Test @@ -512,8 +547,9 @@ public class OrderElementServiceTest { LabelReferenceDTO labelReferenceDTO = new LabelReferenceDTO(); orderDTO.labels.add(labelReferenceDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList @@ -526,7 +562,6 @@ public class OrderElementServiceTest { @Test public void validOrderWithLabel() { String code = "order-code"; - int previous = orderElementDAO.findByCode(code).size(); OrderDTO orderDTO = new OrderDTO(); orderDTO.name = "Order name"; @@ -534,15 +569,20 @@ public class OrderElementServiceTest { orderDTO.initDate = new Date(); LabelReferenceDTO labelReferenceDTO = new LabelReferenceDTO(); - labelReferenceDTO.code = givenLabelStored().getCode(); + labelReferenceDTO.code = labelCode; orderDTO.labels.add(labelReferenceDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); - assertThat(orderElementDAO.findByCode(code).size(), - equalTo(previous + 1)); + try { + orderElementDAO.findByCode(code); + assertTrue(true); + } catch (InstanceNotFoundException e) { + fail(); + } } @Test @@ -555,7 +595,7 @@ public class OrderElementServiceTest { orderDTO.initDate = new Date(); LabelReferenceDTO labelReferenceDTO = new LabelReferenceDTO(); - labelReferenceDTO.code = givenLabelStored().getCode(); + labelReferenceDTO.code = labelCode; orderDTO.labels.add(labelReferenceDTO); OrderLineDTO orderLineDTO = new OrderLineDTO(); @@ -568,25 +608,19 @@ public class OrderElementServiceTest { orderLineDTO.labels.add(labelReferenceDTO); orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; - assertThat(instanceConstraintViolationsList.size(), equalTo(0)); + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); - assertThat(orderDAO.getOrders().size(), equalTo(previous + 1)); - - Order order = orderDAO.getOrders().get(previous); - assertThat(order.getLabels().size(), equalTo(1)); - assertThat(order.getLabels().iterator().next().getCode(), - equalTo(labelReferenceDTO.code)); - - OrderElement orderElement = order.getChildren().get(0); - assertThat(orderElement.getLabels().size(), equalTo(0)); + assertThat(orderDAO.getOrders().size(), equalTo(previous)); } @Test public void updateLabels() throws InstanceNotFoundException, IncompatibleTypeException { - String code = "order-code"; + String code = "order-code-" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -599,37 +633,41 @@ public class OrderElementServiceTest { orderDTO.code = code; orderDTO.initDate = new Date(); - LabelReferenceDTO labelReferenceDTO = new LabelReferenceDTO(givenLabelStored() - .getCode()); + LabelReferenceDTO labelReferenceDTO = new LabelReferenceDTO( +labelCode); orderDTO.labels.add(labelReferenceDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); assertThat(orderElement.getLabels().size(), equalTo(1)); - LabelReferenceDTO labelReferenceDTO2 = new LabelReferenceDTO(givenLabelStored() - .getCode()); + orderElementDAO.flush(); + sessionFactory.getCurrentSession().evict(orderElement); + + LabelReferenceDTO labelReferenceDTO2 = new LabelReferenceDTO( +labelCode); orderDTO.labels.add(labelReferenceDTO2); + + orderListDTO = createOrderListDTO(orderDTO); instanceConstraintViolationsList = orderElementService - .updateOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertThat(instanceConstraintViolationsList.size(), equalTo(0)); orderElement = orderElementDAO.findUniqueByCode(code); - assertThat(orderElement.getLabels().size(), equalTo(2)); - for (Label label : orderElement.getLabels()) { - assertThat(label.getCode(), anyOf(equalTo(labelReferenceDTO.code), - equalTo(labelReferenceDTO2.code))); - } + // update the same label + assertThat(orderElement.getLabels().size(), equalTo(1)); } @Test public void updateMaterialAssignment() throws InstanceNotFoundException, IncompatibleTypeException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -646,25 +684,32 @@ public class OrderElementServiceTest { "material-code", 100.0, BigDecimal.TEN, null); orderDTO.materialAssignments.add(materialAssignmentDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); assertThat(orderElement.getMaterialAssignments().size(), equalTo(1)); + orderElementDAO.flush(); + sessionFactory.getCurrentSession().evict(orderElement); + orderDTO.materialAssignments.iterator().next().units = 150.0; MaterialAssignmentDTO materialAssignmentDTO2 = new MaterialAssignmentDTO( "material-code2", 200.0, BigDecimal.ONE, null); + orderDTO.materialAssignments.add(materialAssignmentDTO); orderDTO.materialAssignments.add(materialAssignmentDTO2); + orderListDTO = createOrderListDTO(orderDTO); instanceConstraintViolationsList = orderElementService - .updateOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); orderElement = orderElementDAO.findUniqueByCode(code); + assertThat(orderElement.getMaterialAssignments().size(), equalTo(2)); for (MaterialAssignment materialAssignment : orderElement .getMaterialAssignments()) { @@ -673,14 +718,16 @@ public class OrderElementServiceTest { assertThat(materialAssignment.getUnits(), anyOf(equalTo(150.0), equalTo(200.0))); assertThat(materialAssignment.getUnitPrice(), anyOf( - equalTo(BigDecimal.TEN), equalTo(BigDecimal.ONE))); + equalTo(BigDecimal.TEN.setScale(2)), + equalTo(BigDecimal.ONE + .setScale(2)))); } } @Test public void updateHoursGroup() throws InstanceNotFoundException, IncompatibleTypeException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -695,48 +742,55 @@ public class OrderElementServiceTest { OrderLineDTO orderLineDTO = new OrderLineDTO(); orderLineDTO.name = "Order line"; - orderLineDTO.code = "order-line-code"; - HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group", + orderLineDTO.code = "order-line-code" + UUID.randomUUID().toString(); + HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-groupYY", ResourceEnumDTO.WORKER, 1000, new HashSet()); orderLineDTO.hoursGroups.add(hoursGroupDTO); orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; - assertThat(instanceConstraintViolationsList.size(), equalTo(0)); + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); OrderLine orderLine = (OrderLine) orderElementDAO - .findUniqueByCode("order-line-code"); + .findUniqueByCode(orderLineDTO.code); assertNotNull(orderLine); assertThat(orderLine.getHoursGroups().size(), equalTo(1)); + orderElementDAO.flush(); + sessionFactory.getCurrentSession().evict(orderElement); + sessionFactory.getCurrentSession().evict(orderLine); + orderLineDTO.hoursGroups.iterator().next().workingHours = 1500; - HoursGroupDTO hoursGroupDTO2 = new HoursGroupDTO("hours-group2", + HoursGroupDTO hoursGroupDTO2 = new HoursGroupDTO("hours-groupXX", ResourceEnumDTO.WORKER, 2000, new HashSet()); orderLineDTO.hoursGroups.add(hoursGroupDTO2); + orderListDTO = createOrderListDTO(orderDTO); instanceConstraintViolationsList = orderElementService - .updateOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); orderLine = (OrderLine) orderElementDAO - .findUniqueByCode("order-line-code"); + .findUniqueByCode(orderLineDTO.code); assertNotNull(orderLine); assertThat(orderLine.getHoursGroups().size(), equalTo(2)); for (HoursGroup hoursGroup : orderLine.getHoursGroups()) { - assertThat(hoursGroup.getCode(), anyOf(equalTo("hours-group"), - equalTo("hours-group2"))); - assertThat(hoursGroup.getWorkingHours(), anyOf( - equalTo(1500), equalTo(2000))); + assertThat(hoursGroup.getCode(), anyOf(equalTo("hours-groupYY"), + equalTo("hours-groupXX"))); + assertThat(hoursGroup.getWorkingHours(), anyOf(equalTo(1500), + equalTo(2000))); assertThat(hoursGroup.getResourceType(), equalTo(ResourceEnum.WORKER)); } @@ -746,7 +800,7 @@ public class OrderElementServiceTest { // FIXME move to subcontractors service when it exists public void invalidOrderWithInvalidAdvanceMeasurements() throws InstanceNotFoundException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -762,8 +816,9 @@ public class OrderElementServiceTest { AdvanceMeasurementDTO advanceMeasurementDTO = new AdvanceMeasurementDTO(); orderDTO.advanceMeasurements.add(advanceMeasurementDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(1)); List constraintViolations = instanceConstraintViolationsList @@ -787,7 +842,7 @@ public class OrderElementServiceTest { // FIXME move to subcontractors service when it exists public void validOrderWithAdvanceMeasurements() throws InstanceNotFoundException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -804,8 +859,9 @@ public class OrderElementServiceTest { new Date(), BigDecimal.TEN); orderDTO.advanceMeasurements.add(advanceMeasurementDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); @@ -821,7 +877,7 @@ public class OrderElementServiceTest { // FIXME move to subcontractors service when it exists public void updateAdvanceMeasurements() throws InstanceNotFoundException, IncompatibleTypeException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -839,8 +895,9 @@ public class OrderElementServiceTest { date.toDateTimeAtStartOfDay().toDate(), new BigDecimal(15)); orderDTO.advanceMeasurements.add(advanceMeasurementDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); @@ -851,12 +908,18 @@ public class OrderElementServiceTest { assertThat(advanceAssignment.getAdvanceMeasurements().size(), equalTo(1)); + orderElementDAO.flush(); + sessionFactory.getCurrentSession().evict(orderElement); + AdvanceMeasurementDTO advanceMeasurementDTO2 = new AdvanceMeasurementDTO( date.plusWeeks(1).toDateTimeAtStartOfDay().toDate(), new BigDecimal(20)); orderDTO.advanceMeasurements.add(advanceMeasurementDTO2); + + orderListDTO = createOrderListDTO(orderDTO); instanceConstraintViolationsList = orderElementService - .updateOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertThat(instanceConstraintViolationsList.size(), equalTo(0)); orderElement = orderElementDAO.findUniqueByCode(code); @@ -870,15 +933,16 @@ public class OrderElementServiceTest { for (AdvanceMeasurement advanceMeasurement : advanceMeasurements) { assertThat(advanceMeasurement.getDate(), anyOf(equalTo(date), equalTo(date.plusWeeks(1)))); - assertThat(advanceMeasurement.getValue(), anyOf(equalTo(new BigDecimal(15)), - equalTo(new BigDecimal(20)))); + assertThat(advanceMeasurement.getValue(), anyOf( + equalTo(new BigDecimal(15).setScale(2)), + equalTo(new BigDecimal(20).setScale(2)))); } } @Test public void invalidOrderWithCriterionRequirements() throws InstanceNotFoundException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -894,8 +958,9 @@ public class OrderElementServiceTest { CriterionRequirementDTO criterionRequirementDTO = new DirectCriterionRequirementDTO(); orderDTO.criterionRequirements.add(criterionRequirementDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); @@ -906,7 +971,8 @@ public class OrderElementServiceTest { @Test public void validOrderWithCriterionRequirements() throws InstanceNotFoundException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); + ; try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -926,20 +992,21 @@ public class OrderElementServiceTest { name, type); orderDTO.criterionRequirements.add(criterionRequirementDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); - assertThat(orderElement.getCriterionRequirements().size(), - equalTo(1)); + assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); } @Test public void validOrderWithDirectCriterionRequirementsAndIndidirectCriterionRequirements() throws InstanceNotFoundException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); + ; try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -961,8 +1028,9 @@ public class OrderElementServiceTest { OrderLineDTO orderLineDTO = new OrderLineDTO(); orderLineDTO.name = "Order line"; - orderLineDTO.code = "order-line-code"; - HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group", + orderLineDTO.code = "order-line-code-AX"; + HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group" + + UUID.randomUUID().toString(), ResourceEnumDTO.WORKER, 1000, new HashSet()); orderLineDTO.hoursGroups.add(hoursGroupDTO); @@ -971,15 +1039,16 @@ public class OrderElementServiceTest { orderLineDTO.criterionRequirements.add(indirectCriterionRequirementDTO); orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); - orderElement = orderElementDAO.findUniqueByCode("order-line-code"); + orderElement = orderElementDAO.findUniqueByCode("order-line-code-AX"); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); assertFalse(((IndirectCriterionRequirement) orderElement @@ -989,7 +1058,7 @@ public class OrderElementServiceTest { @Test public void updateCriterionRequirements() throws InstanceNotFoundException, IncompatibleTypeException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -1009,8 +1078,9 @@ public class OrderElementServiceTest { name, type); orderDTO.criterionRequirements.add(criterionRequirementDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); @@ -1019,12 +1089,17 @@ public class OrderElementServiceTest { String name2 = PredefinedCriterionTypes.LEAVE.getPredefined().get(1); + orderElementDAO.flush(); + sessionFactory.getCurrentSession().evict(orderElement); + CriterionRequirementDTO criterionRequirementDTO2 = new DirectCriterionRequirementDTO( name2, type); orderDTO.criterionRequirements.add(criterionRequirementDTO2); + orderListDTO = createOrderListDTO(orderDTO); instanceConstraintViolationsList = orderElementService - .updateOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertThat(instanceConstraintViolationsList.size(), equalTo(0)); orderElement = orderElementDAO.findUniqueByCode(code); @@ -1037,15 +1112,14 @@ public class OrderElementServiceTest { equalTo(name), equalTo(name2))); assertThat(criterionRequirement.getCriterion().getType().getName(), equalTo(type)); - assertThat(criterionRequirement, - instanceOf(DirectCriterionRequirement.class)); + assertTrue(criterionRequirement instanceof DirectCriterionRequirement); } } @Test public void updateDirectCriterionRequirementsAndIndirectCriterionRequirements() throws InstanceNotFoundException, IncompatibleTypeException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -1067,40 +1141,46 @@ public class OrderElementServiceTest { OrderLineDTO orderLineDTO = new OrderLineDTO(); orderLineDTO.name = "Order line"; - orderLineDTO.code = "order-line-code"; - HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group", + orderLineDTO.code = "order-line-code-RR"; + HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group-RR", ResourceEnumDTO.WORKER, 1000, new HashSet()); orderLineDTO.hoursGroups.add(hoursGroupDTO); orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); - orderElement = orderElementDAO.findUniqueByCode("order-line-code"); + orderElement = orderElementDAO.findUniqueByCode("order-line-code-RR"); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); assertTrue(((IndirectCriterionRequirement) orderElement .getCriterionRequirements().iterator().next()).isValid()); + orderElementDAO.flush(); + sessionFactory.getCurrentSession().evict(orderElement); + IndirectCriterionRequirementDTO indirectCriterionRequirementDTO = new IndirectCriterionRequirementDTO( name, type, false); orderLineDTO.criterionRequirements.add(indirectCriterionRequirementDTO); + orderListDTO = createOrderListDTO(orderDTO); instanceConstraintViolationsList = orderElementService - .updateOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; + assertThat(instanceConstraintViolationsList.size(), equalTo(0)); orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); - orderElement = orderElementDAO.findUniqueByCode("order-line-code"); + orderElement = orderElementDAO.findUniqueByCode("order-line-code-RR"); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); assertFalse(((IndirectCriterionRequirement) orderElement @@ -1110,7 +1190,7 @@ public class OrderElementServiceTest { @Test public void importDirectCriterionRequirementsAndIndirectCriterionRequirements() throws InstanceNotFoundException, IncompatibleTypeException { - String code = "order-code"; + String code = "order-code" + UUID.randomUUID().toString(); try { orderElementDAO.findUniqueByCode(code); fail("Order with code " + code + " already exists"); @@ -1132,8 +1212,8 @@ public class OrderElementServiceTest { OrderLineDTO orderLineDTO = new OrderLineDTO(); orderLineDTO.name = "Order line"; - orderLineDTO.code = "order-line-code"; - HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group", + orderLineDTO.code = "order-line-code-WW"; + HoursGroupDTO hoursGroupDTO = new HoursGroupDTO("hours-group-WW", ResourceEnumDTO.WORKER, 1000, new HashSet()); orderLineDTO.hoursGroups.add(hoursGroupDTO); @@ -1144,19 +1224,31 @@ public class OrderElementServiceTest { orderDTO.children.add(orderLineDTO); + OrderListDTO orderListDTO = createOrderListDTO(orderDTO); List instanceConstraintViolationsList = orderElementService - .addOrder(orderDTO).instanceConstraintViolationsList; + .addOrders(orderListDTO).instanceConstraintViolationsList; assertThat(instanceConstraintViolationsList.size(), equalTo(0)); OrderElement orderElement = orderElementDAO.findUniqueByCode(code); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); - orderElement = orderElementDAO.findUniqueByCode("order-line-code"); + orderElement = orderElementDAO.findUniqueByCode("order-line-code-WW"); assertNotNull(orderElement); assertThat(orderElement.getCriterionRequirements().size(), equalTo(1)); assertFalse(((IndirectCriterionRequirement) orderElement .getCriterionRequirements().iterator().next()).isValid()); } + private OrderListDTO createOrderListDTO(OrderDTO... orderDTOs) { + + List orderList = new ArrayList(); + + for (OrderDTO c : orderDTOs) { + orderList.add(c); + } + + return new OrderListDTO(orderList); + + } } diff --git a/scripts/rest-clients/README b/scripts/rest-clients/README index 0a8d22d1c..3e2dbeed3 100644 --- a/scripts/rest-clients/README +++ b/scripts/rest-clients/README @@ -64,17 +64,11 @@ * Export order elements: - - export-order-element.sh ORDER-ELEMENT-CODE (authenticate with - wsreader/wsreader) + - export-order-element.sh (authenticate with wsreader/wsreader) * Import orders: - - import-order.sh order-sample.xml (authenticate with wswriter/wswriter) - - * Update orders: - - - update-order.sh order-update-sample.xml (authenticate with - wswriter/wswriter) + - import-order-elements.sh order-elements-sample.xml (authenticate with wswriter/wswriter) * Export resources hours: diff --git a/scripts/rest-clients/export-order-element.sh b/scripts/rest-clients/export-order-element.sh index 4e000ea6d..f98c97e4c 100755 --- a/scripts/rest-clients/export-order-element.sh +++ b/scripts/rest-clients/export-order-element.sh @@ -7,25 +7,15 @@ 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 - orderElementCode=$i - fi -done - -if [ "$orderElementCode" = "" ]; then - printf "Missing order element code\n" 1>&2 - exit 1 +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/orderelements/$orderElementCode/ | tidy -xml -i -q -utf8 + $baseServiceURL/orderelements/ | tidy -xml -i -q -utf8 diff --git a/scripts/rest-clients/import-order-elements.sh b/scripts/rest-clients/import-order-elements.sh new file mode 100755 index 000000000..7087dc56d --- /dev/null +++ b/scripts/rest-clients/import-order-elements.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/orderelements/ | tidy -xml -i -q -utf8 diff --git a/scripts/rest-clients/order-elements-sample.xml b/scripts/rest-clients/order-elements-sample.xml new file mode 100644 index 000000000..284bfed4d --- /dev/null +++ b/scripts/rest-clients/order-elements-sample.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bafae1638ab8ee7fcbce465b554c899683467296 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Thu, 18 Mar 2010 16:39:26 +0100 Subject: [PATCH 06/39] ItEr51S10AdaptacionServiciosRESTItEr50S13: Added export resources service. --- .../ws/common/impl/DateConverter.java | 75 --------------- .../api/CriterionSatisfactionDTO.java | 14 ++- .../ws/resources/api/IResourceService.java | 2 + .../ResourcesCostCategoryAssignmentDTO.java | 18 ++-- .../ws/resources/impl/ResourceConverter.java | 95 ++++++++++++++++--- .../resources/impl/ResourceServiceREST.java | 30 +++++- .../ws/resources/api/ResourceServiceTest.java | 73 ++++---------- scripts/rest-clients/export-resources.sh | 21 ++++ 8 files changed, 167 insertions(+), 161 deletions(-) delete mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/DateConverter.java create mode 100755 scripts/rest-clients/export-resources.sh 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 From 347206d013dfa56f2e1dce01d6c07b6db4544af4 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 22 Mar 2010 10:27:47 +0100 Subject: [PATCH 07/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: [Bug #400] Fixed using the date from WorkReportLines instead of WorkReport to calculate the earned value chart. --- .../planner/entities/HoursCostCalculator.java | 4 +- .../planner/company/CompanyPlanningModel.java | 3 +- .../web/planner/order/OrderPlanningModel.java | 38 ++++++------------- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursCostCalculator.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursCostCalculator.java index d9f998d53..d86fb4429 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursCostCalculator.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursCostCalculator.java @@ -21,6 +21,7 @@ package org.navalplanner.business.planner.entities; import java.math.BigDecimal; +import java.util.Date; import java.util.List; import java.util.SortedMap; import java.util.SortedSet; @@ -119,8 +120,7 @@ public class HoursCostCalculator implements ICostCalculator { } for (WorkReportLine workReportLine : workReportLines) { - LocalDate day = new LocalDate(workReportLine.getWorkReport() - .getDate()); + LocalDate day = new LocalDate(workReportLine.getDate()); BigDecimal cost = new BigDecimal(workReportLine.getNumHours()); if (!result.containsKey(day)) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java index a13493a4e..212eecf96 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java @@ -873,8 +873,7 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel { } for (WorkReportLine workReportLine : workReportLines) { - LocalDate day = new LocalDate(workReportLine.getWorkReport() - .getDate()); + LocalDate day = new LocalDate(workReportLine.getDate()); BigDecimal cost = new BigDecimal(workReportLine.getNumHours()); if (!result.containsKey(day)) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java index a7a973b5c..a2f51a8fb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java @@ -74,7 +74,6 @@ import org.navalplanner.business.users.entities.OrderAuthorizationType; import org.navalplanner.business.users.entities.User; import org.navalplanner.business.users.entities.UserRole; import org.navalplanner.business.workreports.daos.IWorkReportLineDAO; -import org.navalplanner.business.workreports.entities.WorkReportLine; import org.navalplanner.web.calendars.BaseCalendarModel; import org.navalplanner.web.common.ViewSwitcher; import org.navalplanner.web.planner.ITaskElementAdapter; @@ -1178,7 +1177,18 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { } protected void calculateActualCostWorkPerformed(Interval interval) { - SortedMap workReportCost = getWorkReportCost(); + List list = order + .getAllChildrenAssociatedTaskElements(); + list.add(order.getAssociatedTaskElement()); + + SortedMap workReportCost = new TreeMap(); + + for (TaskElement taskElement : list) { + if (taskElement instanceof Task) { + addCost(workReportCost, hoursCostCalculator + .getWorkReportCost((Task) taskElement)); + } + } workReportCost = accumulateResult(workReportCost); addZeroBeforeTheFirstValue(workReportCost); @@ -1186,30 +1196,6 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { workReportCost, interval.getStart(), interval.getFinish())); } - public SortedMap getWorkReportCost() { - SortedMap result = new TreeMap(); - - List workReportLines = workReportLineDAO - .findByOrderElementAndChildren(order); - - if (workReportLines.isEmpty()) { - return result; - } - - for (WorkReportLine workReportLine : workReportLines) { - LocalDate day = new LocalDate(workReportLine.getWorkReport() - .getDate()); - BigDecimal cost = new BigDecimal(workReportLine.getNumHours()); - - if (!result.containsKey(day)) { - result.put(day, BigDecimal.ZERO); - } - result.put(day, result.get(day).add(cost)); - } - - return result; - } - protected void calculateBudgetedCostWorkPerformed(Interval interval) { List list = order .getAllChildrenAssociatedTaskElements(); From 4b6166e0051ea22f503cb2bcf7309f7d7f93fc58 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 22 Mar 2010 11:04:05 +0100 Subject: [PATCH 08/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: [Bug #404] Fixed missing rounding. --- .../business/advance/entities/AdvanceMeasurement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceMeasurement.java b/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceMeasurement.java index 88054eb16..7a6889be3 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceMeasurement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceMeasurement.java @@ -77,7 +77,7 @@ public class AdvanceMeasurement extends BaseEntity { public void setValue(BigDecimal value) { this.value = value; if (value != null) { - this.value.setScale(2); + this.value.setScale(2, BigDecimal.ROUND_DOWN); } resetCommunicationDate(); } From 7fe11da2cf5ebbc4a5b487e6d6746a761b1c7f16 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 22 Mar 2010 11:17:36 +0100 Subject: [PATCH 09/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: [Bug #405] Fixed not allowing remove calculated advances. --- .../web/orders/ManageOrderElementAdvancesController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java index c259a6f71..d509dd2fb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java @@ -554,6 +554,12 @@ public class ManageOrderElementAdvancesController extends } }); + if (advance instanceof IndirectAdvanceAssignment) { + removeButton.setDisabled(true); + removeButton + .setTooltiptext(_("Calculated advances can not be removed")); + } + Listcell listCell = new Listcell(); listCell.appendChild(removeButton); listItem.appendChild(listCell); From 664a25ec8dbccf5564071319c9124d0da80ae822 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 22 Mar 2010 12:01:32 +0100 Subject: [PATCH 10/39] ItEr50S13AdaptacionServiciosRESTItEr49S18: Basic structure for the new calendars service. --- .../calendars/daos/BaseCalendarDAO.java | 4 +- .../calendars/daos/IBaseCalendarDAO.java | 5 +- .../calendars/entities/BaseCalendar.java | 14 ++- .../calendars/entities/Calendars.hbm.xml | 2 + .../ws/calendars/api/BaseCalendarDTO.java | 57 ++++++++++ .../ws/calendars/api/BaseCalendarListDTO.java | 48 +++++++++ .../ws/calendars/api/ICalendarService.java | 34 ++++++ .../ws/calendars/api/package-info.java | 29 +++++ .../ws/calendars/impl/CalendarConverter.java | 41 +++++++ .../calendars/impl/CalendarServiceREST.java | 87 +++++++++++++++ .../navalplanner-webapp-spring-config.xml | 1 + .../ws/labels/api/CalendarServiceTest.java | 101 ++++++++++++++++++ 12 files changed, 414 insertions(+), 9 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/package-info.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java create mode 100644 navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/CalendarServiceTest.java diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java index 7ab0f5ac1..31fc8cc73 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java @@ -29,7 +29,7 @@ import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.ResourceCalendar; -import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -44,7 +44,7 @@ import org.springframework.transaction.annotation.Transactional; */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) -public class BaseCalendarDAO extends GenericDAOHibernate +public class BaseCalendarDAO extends IntegrationEntityDAO implements IBaseCalendarDAO { @Override diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java index a920a5da0..2a6dbae04 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java @@ -23,14 +23,15 @@ package org.navalplanner.business.calendars.daos; import java.util.List; import org.navalplanner.business.calendars.entities.BaseCalendar; -import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; /** * Contract for {@link BaseCalendarDAO} * * @author Manuel Rego Casasnovas */ -public interface IBaseCalendarDAO extends IGenericDAO { +public interface IBaseCalendarDAO extends + IIntegrationEntityDAO { List getBaseCalendars(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java index d27bb96b4..4ed46d1f9 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java @@ -30,8 +30,9 @@ import java.util.Set; import org.hibernate.validator.NotEmpty; import org.joda.time.DateTimeConstants; import org.joda.time.LocalDate; +import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; import org.navalplanner.business.calendars.entities.CalendarData.Days; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.planner.entities.ResourcesPerDay; /** @@ -41,14 +42,12 @@ import org.navalplanner.business.planner.entities.ResourcesPerDay; * some exceptions of its parent calendar. * @author Manuel Rego Casasnovas */ -public class BaseCalendar extends BaseEntity implements IWorkHours { +public class BaseCalendar extends IntegrationEntity implements IWorkHours { private static final Integer DEFAULT_VALUE = 0; public static BaseCalendar create() { - BaseCalendar baseCalendar = new BaseCalendar(CalendarData.create()); - baseCalendar.setNewObject(true); - return baseCalendar; + return create(new BaseCalendar(CalendarData.create())); } @NotEmpty @@ -938,4 +937,9 @@ public class BaseCalendar extends BaseEntity implements IWorkHours { return each.getHours() != 0 || each.getType().isOverAssignable(); } + @Override + protected IBaseCalendarDAO getIntegrationEntityDAO() { + return org.navalplanner.business.common.Registry.getBaseCalendarDAO(); + } + } diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml index eb030ca70..25e6d97b2 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml @@ -12,6 +12,8 @@ + + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java new file mode 100644 index 000000000..dad6cd1ff --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java @@ -0,0 +1,57 @@ +/* + * 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.calendars.api; + +import javax.xml.bind.annotation.XmlAttribute; + +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + +/** + * DTO for {@link BaseCalendar} entity. + * + * @author Manuel Rego Casasnovas + */ +public class BaseCalendarDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "base-calendar"; + + @XmlAttribute + public String name; + + public BaseCalendarDTO() { + } + + public BaseCalendarDTO(String code, String name) { + super(code); + this.name = name; + } + + public BaseCalendarDTO(String name) { + this(generateCode(), name); + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java new file mode 100644 index 000000000..ec62aa268 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java @@ -0,0 +1,48 @@ +/* + * 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.calendars.api; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.navalplanner.business.calendars.entities.BaseCalendar; + +/** + * DTO for a list of {@link BaseCalendar} entities. + * + * @author Manuel Rego Casasnovas + */ +@XmlRootElement(name = "base-calendar-list") +public class BaseCalendarListDTO { + + @XmlElement(name = "base-calendar") + public List baseCalendars = new ArrayList(); + + public BaseCalendarListDTO() {} + + public BaseCalendarListDTO(List baseCalendars) { + this.baseCalendars = baseCalendars; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java new file mode 100644 index 000000000..98b190958 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java @@ -0,0 +1,34 @@ +/* + * 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.calendars.api; + +import org.navalplanner.business.calendars.entities.BaseCalendar; + +/** + * Service for managing {@link BaseCalendar} entities. + * + * @author Manuel Rego Casasnovas + */ +public interface ICalendarService { + + BaseCalendarListDTO getBaseCalendars(); + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/package-info.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/package-info.java new file mode 100644 index 000000000..915b85e43 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/package-info.java @@ -0,0 +1,29 @@ +/* + * 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 . + */ + +/** + * Specification of namespace for REST-based services. + * + * @author Manuel Rego Casasnovas + */ +@javax.xml.bind.annotation.XmlSchema(elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, namespace = WSCommonGlobalNames.REST_NAMESPACE) +package org.navalplanner.ws.calendars.api; + +import org.navalplanner.ws.common.api.WSCommonGlobalNames; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java new file mode 100644 index 000000000..87b5a307e --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java @@ -0,0 +1,41 @@ +/* + * 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.calendars.impl; + +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.ws.calendars.api.BaseCalendarDTO; + +/** + * Converter from/to {@link BaseCalendar} related entities to/from DTOs. + * + * @author Manuel Rego Casasnovas + */ +public final class CalendarConverter { + + private CalendarConverter() { + } + + public final static BaseCalendarDTO toDTO(BaseCalendar baseCalendar) { + return new BaseCalendarDTO(baseCalendar.getCode(), baseCalendar + .getName()); + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java new file mode 100644 index 000000000..5e43c813f --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java @@ -0,0 +1,87 @@ +/* + * 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.calendars.impl; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.ws.calendars.api.BaseCalendarDTO; +import org.navalplanner.ws.calendars.api.BaseCalendarListDTO; +import org.navalplanner.ws.calendars.api.ICalendarService; +import org.navalplanner.ws.common.impl.GenericRESTService; +import org.navalplanner.ws.common.impl.RecoverableErrorException; +import org.navalplanner.ws.labels.api.ILabelService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * REST-based implementation of {@link ILabelService}. + * + * @author Manuel Rego Casasnovas + */ +@Path("/calendars/") +@Produces("application/xml") +@Service("calendarServiceREST") +public class CalendarServiceREST extends + GenericRESTService implements + ICalendarService { + + @Autowired + private IBaseCalendarDAO baseCalendarDAO; + + @Override + protected IIntegrationEntityDAO getIntegrationEntityDAO() { + return baseCalendarDAO; + } + + @Override + protected BaseCalendarDTO toDTO(BaseCalendar entity) { + return CalendarConverter.toDTO(entity); + } + + @Override + protected BaseCalendar toEntity(BaseCalendarDTO entityDTO) + throws ValidationException, RecoverableErrorException { + // TODO Auto-generated method stub + return null; + } + + @Override + protected void updateEntity(BaseCalendar entity, BaseCalendarDTO entityDTO) + throws ValidationException, RecoverableErrorException { + // TODO Auto-generated method stub + + } + + @Override + @GET + @Transactional(readOnly = true) + public BaseCalendarListDTO getBaseCalendars() { + return new BaseCalendarListDTO(findAll()); + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml index ad9656f0d..5ade06edc 100644 --- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml +++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml @@ -72,6 +72,7 @@ + diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/CalendarServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/CalendarServiceTest.java new file mode 100644 index 000000000..54014e279 --- /dev/null +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/CalendarServiceTest.java @@ -0,0 +1,101 @@ +/* + * 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.web.test.ws.labels.api; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE; +import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE; + +import org.hibernate.SessionFactory; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.common.IAdHocTransactionService; +import org.navalplanner.ws.calendars.api.BaseCalendarDTO; +import org.navalplanner.ws.calendars.api.BaseCalendarListDTO; +import org.navalplanner.ws.calendars.api.ICalendarService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +/** + * Tests for {@link ICalendarService}. + * + * @author Manuel Rego Casasnovas + */ + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class CalendarServiceTest { + + @Autowired + private ICalendarService calendarService; + + @Autowired + private IBaseCalendarDAO baseCalendarDAO; + + @Autowired + private SessionFactory sessionFactory; + + @Autowired + private IAdHocTransactionService transactionService; + + private BaseCalendar givenBaseCalendarStored() { + BaseCalendar calendar = BaseCalendar.create(); + calendar.setName("calendar-name"); + + baseCalendarDAO.save(calendar); + baseCalendarDAO.flush(); + sessionFactory.getCurrentSession().evict(calendar); + calendar.dontPoseAsTransientObjectAnymore(); + + return calendar; + } + + @Test + public void exportBaseCalendars() { + int previous = baseCalendarDAO.getBaseCalendars().size(); + + BaseCalendarListDTO baseCalendars = calendarService.getBaseCalendars(); + assertThat(baseCalendars.baseCalendars.size(), equalTo(previous)); + } + + @Test + public void exportBaseCalendars2() { + int previous = baseCalendarDAO.getBaseCalendars().size(); + + BaseCalendar calendar = givenBaseCalendarStored(); + + BaseCalendarListDTO baseCalendars = calendarService.getBaseCalendars(); + assertThat(baseCalendars.baseCalendars.size(), equalTo(previous + 1)); + + BaseCalendarDTO calendarDTO = baseCalendars.baseCalendars.get(previous); + assertThat(calendarDTO.code, equalTo(calendar.getCode())); + assertThat(calendarDTO.name, equalTo(calendar.getName())); + } + +} From fb3bd8bacfff2b17107d8ec6e6071edf6a69ebfc Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 22 Mar 2010 12:01:33 +0100 Subject: [PATCH 11/39] ItEr50S13AdaptacionServiciosRESTItEr49S18: Implementing calendars export service. --- .../calendars/daos/CalendarDataDAO.java | 40 ++++++++++ .../calendars/daos/CalendarExceptionDAO.java | 40 ++++++++++ .../calendars/daos/ICalendarDataDAO.java | 34 +++++++++ .../calendars/daos/ICalendarExceptionDAO.java | 34 +++++++++ .../calendars/entities/CalendarData.java | 15 ++-- .../calendars/entities/CalendarException.java | 21 +++--- .../business/common/Registry.java | 16 ++++ .../calendars/entities/Calendars.hbm.xml | 4 + .../ws/calendars/api/BaseCalendarDTO.java | 27 ++++++- .../ws/calendars/api/BaseCalendarListDTO.java | 2 +- .../ws/calendars/api/CalendarDataDTO.java | 74 +++++++++++++++++++ .../calendars/api/CalendarExceptionDTO.java | 69 +++++++++++++++++ .../ws/calendars/api/HoursPerDayDTO.java | 48 ++++++++++++ .../ws/calendars/api/ICalendarService.java | 2 +- .../ws/calendars/impl/CalendarConverter.java | 52 ++++++++++++- .../calendars/impl/CalendarServiceREST.java | 10 ++- scripts/rest-clients/README | 4 + scripts/rest-clients/export-calendars.sh | 21 ++++++ 18 files changed, 487 insertions(+), 26 deletions(-) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarDataDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarExceptionDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarDataDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarExceptionDAO.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarExceptionDTO.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/HoursPerDayDTO.java create mode 100755 scripts/rest-clients/export-calendars.sh diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarDataDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarDataDAO.java new file mode 100644 index 000000000..fb2670393 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarDataDAO.java @@ -0,0 +1,40 @@ +/* + * 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.business.calendars.daos; + +import org.navalplanner.business.calendars.entities.CalendarData; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Repository; + +/** + * DAO for {@link CalendarData} + * + * @author Manuel Rego Casasnovas + */ +@Repository +@Scope(BeanDefinition.SCOPE_SINGLETON) +public class CalendarDataDAO extends + IntegrationEntityDAO + implements ICalendarDataDAO { + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarExceptionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarExceptionDAO.java new file mode 100644 index 000000000..1863c6b22 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/CalendarExceptionDAO.java @@ -0,0 +1,40 @@ +/* + * 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.business.calendars.daos; + +import org.navalplanner.business.calendars.entities.CalendarException; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Repository; + +/** + * DAO for {@link CalendarException} + * + * @author Manuel Rego Casasnovas + */ +@Repository +@Scope(BeanDefinition.SCOPE_SINGLETON) +public class CalendarExceptionDAO extends + IntegrationEntityDAO implements + ICalendarExceptionDAO { + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarDataDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarDataDAO.java new file mode 100644 index 000000000..e1dbf7fed --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarDataDAO.java @@ -0,0 +1,34 @@ +/* + * 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.business.calendars.daos; + +import org.navalplanner.business.calendars.entities.CalendarData; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; + +/** + * Contract for {@link CalendarDataDAO} + * + * @author Manuel Rego Casasnovas + */ +public interface ICalendarDataDAO extends + IIntegrationEntityDAO { + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarExceptionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarExceptionDAO.java new file mode 100644 index 000000000..3db41b8a6 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/ICalendarExceptionDAO.java @@ -0,0 +1,34 @@ +/* + * 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.business.calendars.daos; + +import org.navalplanner.business.calendars.entities.CalendarException; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; + +/** + * Contract for {@link CalendarExceptionDAO}. + * + * @author Manuel Rego Casasnovas + */ +public interface ICalendarExceptionDAO extends + IIntegrationEntityDAO { + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java index f9b474978..27a089c53 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java @@ -25,19 +25,19 @@ import java.util.HashMap; import java.util.Map; import org.joda.time.LocalDate; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.calendars.daos.ICalendarDataDAO; +import org.navalplanner.business.common.IntegrationEntity; +import org.navalplanner.business.common.Registry; /** * Represents the information about the calendar that can change through time. * * @author Manuel Rego Casasnovas */ -public class CalendarData extends BaseEntity { +public class CalendarData extends IntegrationEntity { public static CalendarData create() { - CalendarData calendarData = new CalendarData(); - calendarData.setNewObject(true); - return calendarData; + return create(new CalendarData()); } private Map hoursPerDay; @@ -159,4 +159,9 @@ public class CalendarData extends BaseEntity { return true; } + @Override + protected ICalendarDataDAO getIntegrationEntityDAO() { + return Registry.getCalendarDataDAO(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java index 1abff1058..37c09c721 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java @@ -24,7 +24,9 @@ import java.util.Date; import org.hibernate.validator.NotNull; import org.joda.time.LocalDate; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.calendars.daos.ICalendarExceptionDAO; +import org.navalplanner.business.common.IntegrationEntity; +import org.navalplanner.business.common.Registry; /** * Represents an exceptional day that has a different number of hours. For @@ -34,22 +36,16 @@ import org.navalplanner.business.common.BaseEntity; * * @author Manuel Rego Casasnovas */ -public class CalendarException extends BaseEntity { +public class CalendarException extends IntegrationEntity { public static CalendarException create(Date date, Integer hours, CalendarExceptionType type) { - CalendarException exceptionDay = new CalendarException(new LocalDate( - date), hours, type); - exceptionDay.setNewObject(true); - return exceptionDay; + return create(new CalendarException(new LocalDate(date), hours, type)); } public static CalendarException create(LocalDate date, Integer hours, CalendarExceptionType type) { - CalendarException exceptionDay = new CalendarException(date, hours, - type); - exceptionDay.setNewObject(true); - return exceptionDay; + return create(new CalendarException(date, hours, type)); } private LocalDate date; @@ -85,4 +81,9 @@ public class CalendarException extends BaseEntity { return type; } + @Override + protected ICalendarExceptionDAO getIntegrationEntityDAO() { + return Registry.getCalendarExceptionDAO(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java index 2ed0c7357..f8ca7feaa 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java @@ -22,6 +22,8 @@ package org.navalplanner.business.common; import org.navalplanner.business.advance.daos.IAdvanceTypeDAO; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; +import org.navalplanner.business.calendars.daos.ICalendarDataDAO; +import org.navalplanner.business.calendars.daos.ICalendarExceptionDAO; import org.navalplanner.business.calendars.daos.ICalendarExceptionTypeDAO; import org.navalplanner.business.common.daos.IConfigurationDAO; import org.navalplanner.business.costcategories.daos.ICostCategoryDAO; @@ -154,6 +156,12 @@ public class Registry { @Autowired private IHourCostDAO hourCostDAO; + @Autowired + private ICalendarExceptionDAO calendarExceptionDAO; + + @Autowired + private ICalendarDataDAO calendarDataDAO; + @Autowired private ICalendarExceptionTypeDAO calendarExceptionTypeDAO; @@ -282,4 +290,12 @@ public class Registry { return getInstance().calendarExceptionTypeDAO; } + public static ICalendarExceptionDAO getCalendarExceptionDAO() { + return getInstance().calendarExceptionDAO; + } + + public static ICalendarDataDAO getCalendarDataDAO() { + return getInstance().calendarDataDAO; + } + } \ No newline at end of file diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml index 25e6d97b2..1e9d2b822 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml @@ -51,6 +51,8 @@ + + @@ -85,6 +87,8 @@ + + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java index dad6cd1ff..6099c737b 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java @@ -20,7 +20,12 @@ package org.navalplanner.ws.calendars.api; +import java.util.ArrayList; +import java.util.List; + import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.ws.common.api.IntegrationEntityDTO; @@ -37,16 +42,30 @@ public class BaseCalendarDTO extends IntegrationEntityDTO { @XmlAttribute public String name; + @XmlElementWrapper(name = "calendar-exception-list") + @XmlElement(name = "calendar-exception") + public List calendarExceptions = new ArrayList(); + + @XmlElementWrapper(name = "calendar-data-list") + @XmlElement(name = "calendar-data") + public List calendarDatas = new ArrayList(); + public BaseCalendarDTO() { } - public BaseCalendarDTO(String code, String name) { + public BaseCalendarDTO(String code, String name, + List calendarExceptions, + List calendarDatas) { super(code); this.name = name; + this.calendarExceptions = calendarExceptions; + this.calendarDatas = calendarDatas; } - public BaseCalendarDTO(String name) { - this(generateCode(), name); + public BaseCalendarDTO(String name, + List calendarExceptions, + List calendarDatas) { + this(generateCode(), name, calendarExceptions, calendarDatas); } @Override @@ -54,4 +73,4 @@ public class BaseCalendarDTO extends IntegrationEntityDTO { return ENTITY_TYPE; } -} +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java index ec62aa268..656e0af90 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarListDTO.java @@ -45,4 +45,4 @@ public class BaseCalendarListDTO { this.baseCalendars = baseCalendars; } -} +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java new file mode 100644 index 000000000..b086f1290 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java @@ -0,0 +1,74 @@ +/* + * 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.calendars.api; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; + +import org.navalplanner.business.calendars.entities.CalendarData; +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + +/** + * DTO for {@link CalendarData} entity. + * + * @author Manuel Rego Casasnovas + */ +public class CalendarDataDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "calendar-data"; + + @XmlElementWrapper(name = "hors-per-day-list") + @XmlElement(name = "hors-per-day") + public List hoursPerDays = new ArrayList(); + + @XmlAttribute(name = "expiring-date") + public Date expiringDate; + + @XmlAttribute(name = "parent-calendar") + public String parentCalendar; + + public CalendarDataDTO() { + } + + public CalendarDataDTO(String code, List hoursPerDays, + Date expiringDate, String parentCalendar) { + super(code); + this.hoursPerDays = hoursPerDays; + this.expiringDate = expiringDate; + this.parentCalendar = parentCalendar; + } + + public CalendarDataDTO(List hoursPerDays, + Date expiringDate, String parentCalendar) { + this(generateCode(), hoursPerDays, expiringDate, parentCalendar); + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarExceptionDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarExceptionDTO.java new file mode 100644 index 000000000..085674689 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarExceptionDTO.java @@ -0,0 +1,69 @@ +/* + * 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.calendars.api; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlAttribute; + +import org.navalplanner.business.calendars.entities.CalendarException; +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + +/** + * DTO for {@link CalendarException} entity. + * + * @author Manuel Rego Casasnovas + */ +public class CalendarExceptionDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "calendar-exception"; + + @XmlAttribute + public Date date; + + @XmlAttribute + public Integer hours; + + @XmlAttribute(name = "calendar-exception-type-name") + public String calendarExceptionTypeName; + + public CalendarExceptionDTO() { + } + + public CalendarExceptionDTO(String code, Date date, Integer hours, + String calendarExceptionTypeName) { + super(code); + this.date = date; + this.hours = hours; + this.calendarExceptionTypeName = calendarExceptionTypeName; + } + + public CalendarExceptionDTO(Date date, Integer hours, + String calendarExceptionTypeName) { + this(generateCode(), date, hours, calendarExceptionTypeName); + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/HoursPerDayDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/HoursPerDayDTO.java new file mode 100644 index 000000000..4fe553aff --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/HoursPerDayDTO.java @@ -0,0 +1,48 @@ +/* + * 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.calendars.api; + +import javax.xml.bind.annotation.XmlAttribute; + +import org.navalplanner.business.calendars.entities.CalendarData; + +/** + * DTO for represent hours per day of {@link CalendarData} entity. + * + * @author Manuel Rego Casasnovas + */ +public class HoursPerDayDTO { + + @XmlAttribute + public String day; + + @XmlAttribute + public Integer hours; + + public HoursPerDayDTO() { + } + + public HoursPerDayDTO(String day, Integer hours) { + this.day = day; + this.hours = hours; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java index 98b190958..94f9ca754 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/ICalendarService.java @@ -31,4 +31,4 @@ public interface ICalendarService { BaseCalendarListDTO getBaseCalendars(); -} +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java index 87b5a307e..06e0ae25f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java @@ -20,8 +20,18 @@ package org.navalplanner.ws.calendars.impl; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.CalendarData; +import org.navalplanner.business.calendars.entities.CalendarException; +import org.navalplanner.business.calendars.entities.CalendarData.Days; import org.navalplanner.ws.calendars.api.BaseCalendarDTO; +import org.navalplanner.ws.calendars.api.CalendarDataDTO; +import org.navalplanner.ws.calendars.api.CalendarExceptionDTO; +import org.navalplanner.ws.calendars.api.HoursPerDayDTO; /** * Converter from/to {@link BaseCalendar} related entities to/from DTOs. @@ -34,8 +44,46 @@ public final class CalendarConverter { } public final static BaseCalendarDTO toDTO(BaseCalendar baseCalendar) { + List calendarExceptionDTOs = new ArrayList(); + for (CalendarException calendarException : baseCalendar.getExceptions()) { + calendarExceptionDTOs.add(toDTO(calendarException)); + } + + List calendarDataDTOs = new ArrayList(); + for (CalendarData calendarData : baseCalendar.getCalendarDataVersions()) { + calendarDataDTOs.add(toDTO(calendarData)); + } + return new BaseCalendarDTO(baseCalendar.getCode(), baseCalendar - .getName()); + .getName(), calendarExceptionDTOs, calendarDataDTOs); } -} + private final static CalendarExceptionDTO toDTO( + CalendarException calendarException) { + return new CalendarExceptionDTO(calendarException.getCode(), + calendarException.getDate().toDateTimeAtStartOfDay().toDate(), + calendarException.getHours(), calendarException.getType() + .getName()); + } + + private final static CalendarDataDTO toDTO(CalendarData calendarData) { + List hoursPerDayDTOs = new ArrayList(); + Days[] days = CalendarData.Days.values(); + for (Integer day : calendarData.getHoursPerDay().keySet()) { + String dayName = days[day].name(); + Integer hours = calendarData.getHoursPerDay().get(day); + hoursPerDayDTOs.add(new HoursPerDayDTO(dayName, hours)); + } + + Date expiringDate = (calendarData.getExpiringDate() != null) ? calendarData + .getExpiringDate().toDateTimeAtStartOfDay().toDate() + : null; + String parentCalendar = (calendarData.getParent() != null) ? calendarData + .getParent().getCode() + : null; + + return new CalendarDataDTO(hoursPerDayDTOs, expiringDate, + parentCalendar); + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java index 5e43c813f..7a9b02029 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java @@ -20,13 +20,14 @@ package org.navalplanner.ws.calendars.impl; +import java.util.List; + import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; import org.navalplanner.business.calendars.entities.BaseCalendar; -import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.ws.calendars.api.BaseCalendarDTO; import org.navalplanner.ws.calendars.api.BaseCalendarListDTO; @@ -54,7 +55,7 @@ public class CalendarServiceREST extends private IBaseCalendarDAO baseCalendarDAO; @Override - protected IIntegrationEntityDAO getIntegrationEntityDAO() { + protected IBaseCalendarDAO getIntegrationEntityDAO() { return baseCalendarDAO; } @@ -81,7 +82,10 @@ public class CalendarServiceREST extends @GET @Transactional(readOnly = true) public BaseCalendarListDTO getBaseCalendars() { - return new BaseCalendarListDTO(findAll()); + // Avoid ResourceCalendar entities + List justBaseCalendars = getIntegrationEntityDAO() + .getBaseCalendars(); + return new BaseCalendarListDTO(toDTO(justBaseCalendars)); } } \ No newline at end of file diff --git a/scripts/rest-clients/README b/scripts/rest-clients/README index 3e2dbeed3..a689b64bf 100644 --- a/scripts/rest-clients/README +++ b/scripts/rest-clients/README @@ -82,6 +82,10 @@ - export-calendar-exception-types.sh (authenticate with wsreader/wsreader) + * Export calendars: + + - export-calendars.sh (authenticate with wsreader/wsreader) + + When working with the online demo add "--prod" argument to every command. Example: diff --git a/scripts/rest-clients/export-calendars.sh b/scripts/rest-clients/export-calendars.sh new file mode 100755 index 000000000..ceeaa29f2 --- /dev/null +++ b/scripts/rest-clients/export-calendars.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/calendars | tidy -xml -i -q -utf8 From 15eab391311e45ef17da2fd9e9ce2aefa4bcd128 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Tue, 23 Mar 2010 02:03:49 +0100 Subject: [PATCH 12/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: Implemented timeout thread to terminate unfinished CutyCapt processes --- .../web/print/CutyCaptTimeout.java | 47 +++++++++++++++++++ .../org/navalplanner/web/print/CutyPrint.java | 30 +++++++----- 2 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyCaptTimeout.java diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyCaptTimeout.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyCaptTimeout.java new file mode 100644 index 000000000..e2ca4167c --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyCaptTimeout.java @@ -0,0 +1,47 @@ +/* + * 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.web.print; + +import static org.zkoss.ganttz.i18n.I18nHelper._; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + +public class CutyCaptTimeout extends Thread { + + long timeout; + + private static final Log LOG = LogFactory.getLog(CutyPrint.class); + + CutyCaptTimeout(int timeout) { + this.timeout = timeout; + } + + public void run() { + try { + sleep(timeout); + Runtime.getRuntime().exec("killall CutyCapt"); + } catch (Exception e) { + LOG.error(_("CutycaptTimeout thread exception"), e); + } + } +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyPrint.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyPrint.java index d3928c448..911635432 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyPrint.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/print/CutyPrint.java @@ -53,6 +53,8 @@ public class CutyPrint { private static final Log LOG = LogFactory.getLog(CutyPrint.class); private static final String CUTYCAPT_COMMAND = "/usr/bin/CutyCapt "; + // Estimated maximum execution time (ms) + private static final int CUTYCAPT_TIMEOUT = 20000; // Taskdetails left padding private static int TASKDETAILS_WIDTH = 310; @@ -183,34 +185,36 @@ public class CutyPrint { // Destination complete absolute path captureString += " --out=" + absolutePath + filename; - try { // CutyCapt command execution LOG.warn(captureString); - Process print; - Process server = null; - - // Ensure cleanup of unfinished CutyCapt processes and CSS - Runtime.getRuntime().exec("killall CutyCapt"); + Process printProcess; + Process serverProcess = null; // If there is a not real X server environment then use Xvfb if ((System.getenv("DISPLAY") == null) || (System.getenv("DISPLAY").equals(""))) { String[] serverEnvironment = { "PATH=$PATH" }; - server = Runtime.getRuntime().exec("env - Xvfb :99", + serverProcess = Runtime.getRuntime().exec("env - Xvfb :99", serverEnvironment); String[] environment = { "DISPLAY=:99.0" }; - print = Runtime.getRuntime().exec(captureString, environment); + printProcess = Runtime.getRuntime().exec(captureString, + environment); } else { - print = Runtime.getRuntime().exec(captureString); + printProcess = Runtime.getRuntime().exec(captureString); } try { - print.waitFor(); - print.destroy(); + // Ensure CutyCapt process finalization + CutyCaptTimeout timeoutThread = new CutyCaptTimeout( CUTYCAPT_TIMEOUT ); + new Thread(timeoutThread).start(); + + printProcess.waitFor(); + printProcess.destroy(); + if ((System.getenv("DISPLAY") == null) || (System.getenv("DISPLAY").equals(""))) { - server.destroy(); + serverProcess.destroy(); } Executions.getCurrent().sendRedirect(filename, "_blank"); } catch (Exception e) { @@ -278,4 +282,4 @@ public class CutyPrint { } else return srFile; } -} +} \ No newline at end of file From 439009509b4e566e4dbd2122226bca749e7ae697 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Tue, 23 Mar 2010 02:03:50 +0100 Subject: [PATCH 13/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: Fixed dissapeared taskgroup and milestone images when printing planner view --- .../main/resources/web/ganttz/img/group_left.png | Bin 0 -> 223 bytes .../main/resources/web/ganttz/img/group_right.png | Bin 0 -> 227 bytes .../main/resources/web/ganttz/img/milestone.png | Bin 0 -> 317 bytes .../web/ganttz/img/watermark_deadline.png | Bin 0 -> 191 bytes .../resources/web/ganttz/img/watermark_today.png | Bin 0 -> 186 bytes .../src/main/webapp/planner/css/ganttzk.css | 13 ++++++------- 6 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 ganttzk/src/main/resources/web/ganttz/img/group_left.png create mode 100644 ganttzk/src/main/resources/web/ganttz/img/group_right.png create mode 100644 ganttzk/src/main/resources/web/ganttz/img/milestone.png create mode 100644 ganttzk/src/main/resources/web/ganttz/img/watermark_deadline.png create mode 100644 ganttzk/src/main/resources/web/ganttz/img/watermark_today.png diff --git a/ganttzk/src/main/resources/web/ganttz/img/group_left.png b/ganttzk/src/main/resources/web/ganttz/img/group_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6a8297cc0017a2a69483b140af645f4d29976f47 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>VN3FMcVYMs zf(!O8p9~b?EbxddW?hT|;+&tG zo0?a`;9QiNSdyBeP@Y+mq2TW68xY>eCk|9(<>}%WB5}EQf*}`!g23TPhfn_hA1+=f zw7xN~@e-E~Qx}hLV8X4C>P@RA>M2iPsR^CE#%$;EI;EEnrTgqzRk-&VHUmvz@O1Ta JS?83{1OPDf4F%}28J29*~C-V}>VN3FMcVYMs zf(!O8p9~b?EbxddW?ah%orpJs^=JqAUerUQ{QSwpnwr@U%ShK(5dZ0-R Mp00i_>zopr0JOD3`v3p{ literal 0 HcmV?d00001 diff --git a/ganttzk/src/main/resources/web/ganttz/img/milestone.png b/ganttzk/src/main/resources/web/ganttz/img/milestone.png new file mode 100644 index 0000000000000000000000000000000000000000..5627f0b795dfe4037050555bce8da8570959bfe9 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^{2QL70(Y)*K0-AbW|YuPggaE=DdP;a?^?5kMiy64!_l=ltB< z)VvY~=c3falGGH1^30M91$R&1fbd2>aiF3Zo-U3d8t0cz_7-AR`3G)|($+oLvPjNa`L{`5yjrlNW=Cz}7^$S+5y%tZSL>m&u*T&SiZqEOAif z!rpxq%D-R0}pj2SNw(FdGUzQeFIlfGob38X7fwkg}P(i@QTel5$4@`Q# zNA~)cQ@@_KYc|+%YJA$td0|!BjR`EgOqH)6?Mw6*bB%tGFr$tG=tc%lS3j3^P6_E)L!3HEN&baUbDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#7847%HSdvD-CaN-$r9Iy66gHf z+|;}h2Ir#G#FEq$h4Rdj3x`7I;J!Gca%qgD@k*tT_@uLG}_)Usv{ Date: Wed, 24 Mar 2010 08:23:50 +0100 Subject: [PATCH 14/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: Updated legacy page titles and literals with real project name --- doc/src/user/en/docinfo | 4 ++-- doc/src/user/es/docinfo | 4 ++-- .../src/main/webapp/planner/main.zul | 2 +- .../src/main/resources/i18n/es.po | 20 +++++++++---------- .../src/main/resources/i18n/gl.po | 20 +++++++++---------- .../src/main/resources/i18n/keys.pot | 10 +++++----- .../src/main/webapp/advance/advanceTypes.zul | 2 +- .../src/main/webapp/calendars/calendars.zul | 2 +- .../src/main/webapp/common/configuration.zul | 2 +- .../src/main/webapp/planner/index.zul | 2 +- .../src/main/webapp/planner/main.zul | 2 +- .../src/main/webapp/planner/order.zul | 2 +- .../src/main/webapp/planner/resources_use.zul | 2 +- .../webapp/planner/stretches_function.zul | 2 +- .../main/webapp/qualityforms/qualityForms.zul | 2 +- .../main/webapp/resourceload/resourceload.zul | 2 +- 16 files changed, 40 insertions(+), 40 deletions(-) diff --git a/doc/src/user/en/docinfo b/doc/src/user/en/docinfo index 0b7552fe5..ebce3fa22 100644 --- a/doc/src/user/en/docinfo +++ b/doc/src/user/en/docinfo @@ -5,12 +5,12 @@ Documentación de usuario da aplicación .. image:: images/logo.png :align: left -No seguinte documento proporciónase a documentación de axuda necesaria para utilizar a aplicación de xestión da produción do auxiliar do naval Navalpro. +No seguinte documento proporciónase a documentación de axuda necesaria para utilizar a aplicación de xestión da produción do auxiliar do naval NavalPlan. Esta documentación estó organizada do seguinte modo: En primeiro lugar descrébense os obxectivos fundamentais da aplicación e o comportamento global da mesma a modo introductorio e como contextualización xeral do uso da mesma. -A continuación introdúcense as entidades básicas que será necesario administrar para poder empregar todas as funcionalidades de Navalpro e que se mencionarán nas seguintes seccións da documentación. +A continuación introdúcense as entidades básicas que será necesario administrar para poder empregar todas as funcionalidades de NavalPlan e que se mencionarán nas seguintes seccións da documentación. Posteriormente, detállanse os procesos completos de creación de pedidos e proxectos, planificación, asignación de recursos, imputación de avances e extración de resultados. diff --git a/doc/src/user/es/docinfo b/doc/src/user/es/docinfo index 0b7552fe5..ebce3fa22 100644 --- a/doc/src/user/es/docinfo +++ b/doc/src/user/es/docinfo @@ -5,12 +5,12 @@ Documentación de usuario da aplicación .. image:: images/logo.png :align: left -No seguinte documento proporciónase a documentación de axuda necesaria para utilizar a aplicación de xestión da produción do auxiliar do naval Navalpro. +No seguinte documento proporciónase a documentación de axuda necesaria para utilizar a aplicación de xestión da produción do auxiliar do naval NavalPlan. Esta documentación estó organizada do seguinte modo: En primeiro lugar descrébense os obxectivos fundamentais da aplicación e o comportamento global da mesma a modo introductorio e como contextualización xeral do uso da mesma. -A continuación introdúcense as entidades básicas que será necesario administrar para poder empregar todas as funcionalidades de Navalpro e que se mencionarán nas seguintes seccións da documentación. +A continuación introdúcense as entidades básicas que será necesario administrar para poder empregar todas as funcionalidades de NavalPlan e que se mencionarán nas seguintes seccións da documentación. Posteriormente, detállanse os procesos completos de creación de pedidos e proxectos, planificación, asignación de recursos, imputación de avances e extración de resultados. diff --git a/ganttzk-demo-webapp/src/main/webapp/planner/main.zul b/ganttzk-demo-webapp/src/main/webapp/planner/main.zul index a07f54814..755810001 100644 --- a/ganttzk-demo-webapp/src/main/webapp/planner/main.zul +++ b/ganttzk-demo-webapp/src/main/webapp/planner/main.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/resources/i18n/es.po b/navalplanner-webapp/src/main/resources/i18n/es.po index 686f16722..b460945c4 100644 --- a/navalplanner-webapp/src/main/resources/i18n/es.po +++ b/navalplanner-webapp/src/main/resources/i18n/es.po @@ -758,8 +758,8 @@ msgid "percentage cannot be duplicated" msgstr "el porcentaje no puede estar duplicado" #: navalplanner-webapp/src/main/webapp/common/configuration.zul:21 -msgid "Navalpro: Configuration" -msgstr "Navalpro: Configuración" +msgid "NavalPlan: Configuration" +msgstr "NavalPlan: Configuración" #: navalplanner-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:26 msgid "Heading" @@ -1680,8 +1680,8 @@ msgid "Hours invested" msgstr "Horas invertidas" #: navalplanner-webapp/src/main/webapp/calendars/calendars.zul:21 -msgid "Navalpro: Calendars" -msgstr "Navalpro: Calendarios" +msgid "NavalPlan: Calendars" +msgstr "NavalPlan: Calendarios" #: navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java:472 #: navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java:639 @@ -1751,8 +1751,8 @@ msgid "Confirm deleting this profile. Are you sure?" msgstr "Confirmar el borrado de este perfil. ¿Está seguro?" #: navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul:21 -msgid "Navalpro: AdvanceTypes" -msgstr "Navalpro: AdvanceTypes" +msgid "NavalPlan: AdvanceTypes" +msgstr "NavalPlan: AdvanceTypes" #: navalplanner-webapp/src/main/webapp/orders/_edition.zul:147 msgid "Total hours" @@ -2161,8 +2161,8 @@ msgid "Statistics list " msgstr "Lista de estadísticas " #: navalplanner-webapp/src/main/webapp/qualityforms/qualityForms.zul:21 -msgid "Navalpro: QualityForms" -msgstr "Navalpro: Formularios de calidad" +msgid "NavalPlan: QualityForms" +msgstr "NavalPlan: Formularios de calidad" #: navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul:39 msgid "Edit advance type data" @@ -2493,8 +2493,8 @@ msgstr "No se han hecho asignaciones" #: navalplanner-webapp/src/main/webapp/planner/resources_use.zul:21 #: navalplanner-webapp/src/main/webapp/planner/index.zul:21 #: navalplanner-webapp/src/main/webapp/planner/order.zul:21 -msgid "Navalpro: Scheduling" -msgstr "Navalpro: planificación" +msgid "NavalPlan: Scheduling" +msgstr "NavalPlan: planificación" #: navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarCRUDController.java:187 msgid "Removed calendar \"{0}\"" diff --git a/navalplanner-webapp/src/main/resources/i18n/gl.po b/navalplanner-webapp/src/main/resources/i18n/gl.po index 88c143a16..1d13db39b 100644 --- a/navalplanner-webapp/src/main/resources/i18n/gl.po +++ b/navalplanner-webapp/src/main/resources/i18n/gl.po @@ -757,8 +757,8 @@ msgid "percentage cannot be duplicated" msgstr "a porcentaxe non pode estar duplicada" #: navalplanner-webapp/src/main/webapp/common/configuration.zul:21 -msgid "Navalpro: Configuration" -msgstr "Navalpro: Configuración" +msgid "NavalPlan: Configuration" +msgstr "NavalPlan: Configuración" #: navalplanner-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:26 msgid "Heading" @@ -1677,8 +1677,8 @@ msgid "Hours invested" msgstr "Horas invertidas" #: navalplanner-webapp/src/main/webapp/calendars/calendars.zul:21 -msgid "Navalpro: Calendars" -msgstr "Navalpro: Calendarios" +msgid "NavalPlan: Calendars" +msgstr "NavalPlan: Calendarios" #: navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java:472 #: navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java:639 @@ -1747,8 +1747,8 @@ msgid "Confirm deleting this profile. Are you sure?" msgstr "Confirmar o borrado deste perfil. ¿Está seguro?" #: navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul:21 -msgid "Navalpro: AdvanceTypes" -msgstr "Navalpro: Tipos de avance" +msgid "NavalPlan: AdvanceTypes" +msgstr "NavalPlan: Tipos de avance" #: navalplanner-webapp/src/main/webapp/orders/_edition.zul:147 msgid "Total hours" @@ -2157,8 +2157,8 @@ msgid "Statistics list " msgstr "Lista de estatísticas" #: navalplanner-webapp/src/main/webapp/qualityforms/qualityForms.zul:21 -msgid "Navalpro: QualityForms" -msgstr "Navalpro: Formularios de calidade" +msgid "NavalPlan: QualityForms" +msgstr "NavalPlan: Formularios de calidade" #: navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul:39 msgid "Edit advance type data" @@ -2487,8 +2487,8 @@ msgstr "Non se fixeron asignacións" #: navalplanner-webapp/src/main/webapp/planner/resources_use.zul:21 #: navalplanner-webapp/src/main/webapp/planner/index.zul:21 #: navalplanner-webapp/src/main/webapp/planner/order.zul:21 -msgid "Navalpro: Scheduling" -msgstr "Navalpro: planificación" +msgid "NavalPlan: Scheduling" +msgstr "NavalPlan: planificación" #: navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarCRUDController.java:187 msgid "Removed calendar \"{0}\"" diff --git a/navalplanner-webapp/src/main/resources/i18n/keys.pot b/navalplanner-webapp/src/main/resources/i18n/keys.pot index 671a9245d..904cdcd28 100644 --- a/navalplanner-webapp/src/main/resources/i18n/keys.pot +++ b/navalplanner-webapp/src/main/resources/i18n/keys.pot @@ -739,7 +739,7 @@ msgid "percentage cannot be duplicated" msgstr "" #: navalplanner-webapp/src/main/webapp/common/configuration.zul:21 -msgid "Navalpro: Configuration" +msgid "NavalPlan: Configuration" msgstr "" #: navalplanner-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:26 @@ -1639,7 +1639,7 @@ msgid "Hours invested" msgstr "" #: navalplanner-webapp/src/main/webapp/calendars/calendars.zul:21 -msgid "Navalpro: Calendars" +msgid "NavalPlan: Calendars" msgstr "" #: navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java:472 @@ -1709,7 +1709,7 @@ msgid "Confirm deleting this profile. Are you sure?" msgstr "" #: navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul:21 -msgid "Navalpro: AdvanceTypes" +msgid "NavalPlan: AdvanceTypes" msgstr "" #: navalplanner-webapp/src/main/webapp/orders/_edition.zul:147 @@ -2115,7 +2115,7 @@ msgid "Statistics list " msgstr "" #: navalplanner-webapp/src/main/webapp/qualityforms/qualityForms.zul:21 -msgid "Navalpro: QualityForms" +msgid "NavalPlan: QualityForms" msgstr "" #: navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul:39 @@ -2442,7 +2442,7 @@ msgstr "" #: navalplanner-webapp/src/main/webapp/planner/resources_use.zul:21 #: navalplanner-webapp/src/main/webapp/planner/index.zul:21 #: navalplanner-webapp/src/main/webapp/planner/order.zul:21 -msgid "Navalpro: Scheduling" +msgid "NavalPlan: Scheduling" msgstr "" #: navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarCRUDController.java:187 diff --git a/navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul b/navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul index 7ed06fd0e..6d2c06e09 100644 --- a/navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul +++ b/navalplanner-webapp/src/main/webapp/advance/advanceTypes.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/calendars/calendars.zul b/navalplanner-webapp/src/main/webapp/calendars/calendars.zul index 21766dd4d..dc54dc9c7 100644 --- a/navalplanner-webapp/src/main/webapp/calendars/calendars.zul +++ b/navalplanner-webapp/src/main/webapp/calendars/calendars.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/common/configuration.zul b/navalplanner-webapp/src/main/webapp/common/configuration.zul index 10f87d999..23d4a4f3e 100644 --- a/navalplanner-webapp/src/main/webapp/common/configuration.zul +++ b/navalplanner-webapp/src/main/webapp/common/configuration.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/planner/index.zul b/navalplanner-webapp/src/main/webapp/planner/index.zul index e38f44cbc..1be9b65ac 100644 --- a/navalplanner-webapp/src/main/webapp/planner/index.zul +++ b/navalplanner-webapp/src/main/webapp/planner/index.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/planner/main.zul b/navalplanner-webapp/src/main/webapp/planner/main.zul index 509dee948..e49cc6bde 100644 --- a/navalplanner-webapp/src/main/webapp/planner/main.zul +++ b/navalplanner-webapp/src/main/webapp/planner/main.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/planner/order.zul b/navalplanner-webapp/src/main/webapp/planner/order.zul index 96277e8e4..bbb46c2e1 100644 --- a/navalplanner-webapp/src/main/webapp/planner/order.zul +++ b/navalplanner-webapp/src/main/webapp/planner/order.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + . --> - + diff --git a/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul b/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul index 01b222a00..de1ae98ab 100644 --- a/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul +++ b/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/qualityforms/qualityForms.zul b/navalplanner-webapp/src/main/webapp/qualityforms/qualityForms.zul index bb8df1868..937b4b9ba 100644 --- a/navalplanner-webapp/src/main/webapp/qualityforms/qualityForms.zul +++ b/navalplanner-webapp/src/main/webapp/qualityforms/qualityForms.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/resourceload/resourceload.zul b/navalplanner-webapp/src/main/webapp/resourceload/resourceload.zul index 7067252d5..94b73b1a0 100644 --- a/navalplanner-webapp/src/main/webapp/resourceload/resourceload.zul +++ b/navalplanner-webapp/src/main/webapp/resourceload/resourceload.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + From 818941b7dd58520eb1359f86ef87ee9030f42805 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Wed, 24 Mar 2010 08:23:51 +0100 Subject: [PATCH 15/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: Added NavalPlan page title to zul pages --- navalplanner-webapp/src/main/webapp/common/error.zul | 2 +- navalplanner-webapp/src/main/webapp/common/layout/login.zul | 1 + navalplanner-webapp/src/main/webapp/common/page_not_found.zul | 2 +- .../src/main/webapp/costcategories/costCategory.zul | 2 +- .../src/main/webapp/costcategories/typeOfWorkHours.zul | 2 +- .../src/main/webapp/externalcompanies/externalcompanies.zul | 2 +- navalplanner-webapp/src/main/webapp/labels/labelTypes.zul | 3 +-- navalplanner-webapp/src/main/webapp/materials/materials.zul | 2 +- .../src/main/webapp/reports/hoursWorkedPerWorkerReport.zul | 2 +- .../main/webapp/reports/schedulingProgressPerOrderReport.zul | 2 +- .../src/main/webapp/reports/timeLineMaterialReport.zul | 2 +- .../main/webapp/reports/workingArrangementsPerOrderReport.zul | 2 +- .../src/main/webapp/reports/workingProgressPerTaskReport.zul | 2 +- .../src/main/webapp/resources/criterions/criterions-V2.zul | 2 +- .../src/main/webapp/resources/machine/machines.zul | 2 +- .../src/main/webapp/resources/worker/virtualWorkers.zul | 2 +- .../src/main/webapp/resources/worker/worker.zul | 2 +- .../src/main/webapp/subcontract/reportAdvances.zul | 2 +- .../src/main/webapp/subcontract/subcontractedTasks.zul | 2 +- navalplanner-webapp/src/main/webapp/templates/templates.zul | 2 +- navalplanner-webapp/src/main/webapp/users/profiles.zul | 2 +- navalplanner-webapp/src/main/webapp/users/users.zul | 2 +- navalplanner-webapp/src/main/webapp/workreports/workReport.zul | 2 +- .../src/main/webapp/workreports/workReportQuery.zul | 2 +- .../src/main/webapp/workreports/workReportTypes.zul | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/navalplanner-webapp/src/main/webapp/common/error.zul b/navalplanner-webapp/src/main/webapp/common/error.zul index f5bac6293..827fafe50 100644 --- a/navalplanner-webapp/src/main/webapp/common/error.zul +++ b/navalplanner-webapp/src/main/webapp/common/error.zul @@ -17,7 +17,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/common/layout/login.zul b/navalplanner-webapp/src/main/webapp/common/layout/login.zul index 506ec1c05..8cbdc0348 100644 --- a/navalplanner-webapp/src/main/webapp/common/layout/login.zul +++ b/navalplanner-webapp/src/main/webapp/common/layout/login.zul @@ -17,6 +17,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> + diff --git a/navalplanner-webapp/src/main/webapp/common/page_not_found.zul b/navalplanner-webapp/src/main/webapp/common/page_not_found.zul index 8609a177a..0b05cc846 100644 --- a/navalplanner-webapp/src/main/webapp/common/page_not_found.zul +++ b/navalplanner-webapp/src/main/webapp/common/page_not_found.zul @@ -17,7 +17,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/costcategories/costCategory.zul b/navalplanner-webapp/src/main/webapp/costcategories/costCategory.zul index ebea31c27..2462797b5 100644 --- a/navalplanner-webapp/src/main/webapp/costcategories/costCategory.zul +++ b/navalplanner-webapp/src/main/webapp/costcategories/costCategory.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/costcategories/typeOfWorkHours.zul b/navalplanner-webapp/src/main/webapp/costcategories/typeOfWorkHours.zul index faf35611d..7c75b3f66 100644 --- a/navalplanner-webapp/src/main/webapp/costcategories/typeOfWorkHours.zul +++ b/navalplanner-webapp/src/main/webapp/costcategories/typeOfWorkHours.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/externalcompanies/externalcompanies.zul b/navalplanner-webapp/src/main/webapp/externalcompanies/externalcompanies.zul index fdd60c7f2..8531bd6e9 100644 --- a/navalplanner-webapp/src/main/webapp/externalcompanies/externalcompanies.zul +++ b/navalplanner-webapp/src/main/webapp/externalcompanies/externalcompanies.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/labels/labelTypes.zul b/navalplanner-webapp/src/main/webapp/labels/labelTypes.zul index d5876c3e1..28f13f1f0 100644 --- a/navalplanner-webapp/src/main/webapp/labels/labelTypes.zul +++ b/navalplanner-webapp/src/main/webapp/labels/labelTypes.zul @@ -17,8 +17,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - - + diff --git a/navalplanner-webapp/src/main/webapp/materials/materials.zul b/navalplanner-webapp/src/main/webapp/materials/materials.zul index 3dedf137f..1b44ebcbe 100644 --- a/navalplanner-webapp/src/main/webapp/materials/materials.zul +++ b/navalplanner-webapp/src/main/webapp/materials/materials.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul b/navalplanner-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul index baa03f0c9..76d40b05c 100644 --- a/navalplanner-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul +++ b/navalplanner-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul b/navalplanner-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul index e49556340..711fc3634 100644 --- a/navalplanner-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul +++ b/navalplanner-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/reports/timeLineMaterialReport.zul b/navalplanner-webapp/src/main/webapp/reports/timeLineMaterialReport.zul index a56e607a3..6b62d23a7 100644 --- a/navalplanner-webapp/src/main/webapp/reports/timeLineMaterialReport.zul +++ b/navalplanner-webapp/src/main/webapp/reports/timeLineMaterialReport.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul b/navalplanner-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul index 040eb0bff..ed98db175 100644 --- a/navalplanner-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul +++ b/navalplanner-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul b/navalplanner-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul index eb77c83ca..28756add1 100644 --- a/navalplanner-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul +++ b/navalplanner-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/resources/criterions/criterions-V2.zul b/navalplanner-webapp/src/main/webapp/resources/criterions/criterions-V2.zul index 7230c53e7..83aff8350 100644 --- a/navalplanner-webapp/src/main/webapp/resources/criterions/criterions-V2.zul +++ b/navalplanner-webapp/src/main/webapp/resources/criterions/criterions-V2.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/resources/machine/machines.zul b/navalplanner-webapp/src/main/webapp/resources/machine/machines.zul index 7d9b64643..751379e2c 100644 --- a/navalplanner-webapp/src/main/webapp/resources/machine/machines.zul +++ b/navalplanner-webapp/src/main/webapp/resources/machine/machines.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/virtualWorkers.zul b/navalplanner-webapp/src/main/webapp/resources/worker/virtualWorkers.zul index 726f1bace..9ad0b7235 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/virtualWorkers.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/virtualWorkers.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul index 5cab492e8..52e3186a2 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul b/navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul index a2e8e518c..4988db3ab 100644 --- a/navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul +++ b/navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/subcontract/subcontractedTasks.zul b/navalplanner-webapp/src/main/webapp/subcontract/subcontractedTasks.zul index 744984ee1..5ccb52abf 100644 --- a/navalplanner-webapp/src/main/webapp/subcontract/subcontractedTasks.zul +++ b/navalplanner-webapp/src/main/webapp/subcontract/subcontractedTasks.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/templates/templates.zul b/navalplanner-webapp/src/main/webapp/templates/templates.zul index 9d5cf71c1..e441aa865 100644 --- a/navalplanner-webapp/src/main/webapp/templates/templates.zul +++ b/navalplanner-webapp/src/main/webapp/templates/templates.zul @@ -18,7 +18,7 @@ along with this program. If not, see . --> - + diff --git a/navalplanner-webapp/src/main/webapp/users/profiles.zul b/navalplanner-webapp/src/main/webapp/users/profiles.zul index a5a32fc27..56a9be4e4 100644 --- a/navalplanner-webapp/src/main/webapp/users/profiles.zul +++ b/navalplanner-webapp/src/main/webapp/users/profiles.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/users/users.zul b/navalplanner-webapp/src/main/webapp/users/users.zul index 680df5c39..ca7b98703 100644 --- a/navalplanner-webapp/src/main/webapp/users/users.zul +++ b/navalplanner-webapp/src/main/webapp/users/users.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/workreports/workReport.zul b/navalplanner-webapp/src/main/webapp/workreports/workReport.zul index a8d4234f5..2524b1f16 100644 --- a/navalplanner-webapp/src/main/webapp/workreports/workReport.zul +++ b/navalplanner-webapp/src/main/webapp/workreports/workReport.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/workreports/workReportQuery.zul b/navalplanner-webapp/src/main/webapp/workreports/workReportQuery.zul index beccc1677..8c0755d17 100644 --- a/navalplanner-webapp/src/main/webapp/workreports/workReportQuery.zul +++ b/navalplanner-webapp/src/main/webapp/workreports/workReportQuery.zul @@ -19,7 +19,7 @@ --> - + diff --git a/navalplanner-webapp/src/main/webapp/workreports/workReportTypes.zul b/navalplanner-webapp/src/main/webapp/workreports/workReportTypes.zul index 66b1179e1..71303e316 100644 --- a/navalplanner-webapp/src/main/webapp/workreports/workReportTypes.zul +++ b/navalplanner-webapp/src/main/webapp/workreports/workReportTypes.zul @@ -19,7 +19,7 @@ --> - + From f038f698197722960a43670ab55101731dacfb3b Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Wed, 24 Mar 2010 09:22:45 +0100 Subject: [PATCH 16/39] ItEr52S04ValidacionEProbasFuncionaisItEr51S04: [Bug #402] Recalculated planning chart area when taskdetails table is resized --- .../src/main/java/org/zkoss/ganttz/Planner.java | 17 +++++++++++++++++ .../resources/web/ganttz/zul/plannerLayout.zul | 3 ++- .../main/resources/web/js/ganttz/tasklist.js | 9 +++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java index c5a714a4c..7b61f9fa9 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java @@ -54,6 +54,9 @@ import org.zkoss.ganttz.util.script.IScriptsRegister; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.HtmlMacroComponent; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.Button; import org.zkoss.zul.ListModel; @@ -247,6 +250,7 @@ public class Planner extends HtmlMacroComponent { if (configuration == null) { return; } + this.diagramGraph = new GanttDiagramGraph(configuration .getStartConstraints(), configuration.getEndConstraints(), configuration.isDependenciesConstraintsHavePriority()); @@ -296,6 +300,7 @@ public class Planner extends HtmlMacroComponent { flattenTree.setVisible(false); } listZoomLevels.setSelectedIndex(getZoomLevel().ordinal()); + } private void resettingPreviousComponentsToNull() { @@ -415,6 +420,18 @@ public class Planner extends HtmlMacroComponent { public void afterCompose() { super.afterCompose(); listZoomLevels = (Listbox) getFellow("listZoomLevels"); + + Component westContainer = getFellow("taskdetailsContainer"); + westContainer.addEventListener(Events.ON_SIZE, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + Clients.evalJavaScript("zkTaskContainer.legendResize();"); + + } + + }); + } public TimeTracker getTimeTracker() { diff --git a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul index b539ee866..8a673b9eb 100644 --- a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul +++ b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul @@ -52,7 +52,8 @@ planner = self;
- +
diff --git a/ganttzk/src/main/resources/web/js/ganttz/tasklist.js b/ganttzk/src/main/resources/web/js/ganttz/tasklist.js index eea5b8d32..09033d9c3 100644 --- a/ganttzk/src/main/resources/web/js/ganttz/tasklist.js +++ b/ganttzk/src/main/resources/web/js/ganttz/tasklist.js @@ -47,6 +47,8 @@ DRAGABLE_PADDING = 20; // Drag padding for dependency creation PERSPECTIVES_WIDTH = 90; +LEGEND_CONTAINER_OFFSET = 75; // Taskdetail width - legend container width + zkTasklist.tooltipTimeout = ""; zkTasklist.showTooltip = function(elem) { @@ -630,6 +632,7 @@ initConstraints : function() { } }); + /** * * taskContainer.js @@ -699,5 +702,11 @@ zkTaskContainer.setClass = function(cmp, newclass) { cmp.className = newclass; }; +zkTaskContainer.legendResize = function(cmp) { + var taskdetailsContainer = YAHOO.util.Selector.query('.taskdetailsContainer')[0]; + var legendContainer = YAHOO.util.Selector.query('.legend-container')[0]; + legendContainer.style["width"] = (taskdetailsContainer.clientWidth - LEGEND_CONTAINER_OFFSET )+"px"; +}; + zkTaskContainer.resizeCompletionAdvance = zkTask.resizeCompletionAdvance; zkTaskContainer.resizeCompletion2Advance = zkTask.resizeCompletion2Advance; From cacfec4bbcf783040f222640b16c9cbc6479243a Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Mon, 22 Mar 2010 17:21:11 +0100 Subject: [PATCH 17/39] ItEr51S04ValidacionEProbasFuncionaisItEr50S04 : [Bug #394] Fixing Bug. Makes the filter to lowercase and delete its white spaces for the searches. --- .../finders/IMultipleFiltersFinder.java | 10 +++++ .../finders/MultipleFiltersFinder.java | 12 +++--- .../OrderElementsMultipleFiltersFinder.java | 19 ++++++--- .../finders/OrdersMultipleFiltersFinder.java | 41 +++++++++++++------ .../ResourcesMultipleFiltersFinder.java | 15 +++++-- 5 files changed, 69 insertions(+), 28 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/IMultipleFiltersFinder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/IMultipleFiltersFinder.java index 8d3bf4961..ce460c1e2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/IMultipleFiltersFinder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/IMultipleFiltersFinder.java @@ -33,12 +33,22 @@ public interface IMultipleFiltersFinder { void init(); + /** + * Return the FilterPair list match with filter. + * @param filter + * @return List + */ List getMatching(String filter); List getFirstTenFilters(); String objectToString(Object obj); + /** + * Return the new filter that is lower case and without white spaces. + * @param inputText + * @return + */ String getNewFilterText(String inputText); boolean isValidNewFilter(Object obj); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/MultipleFiltersFinder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/MultipleFiltersFinder.java index 155ca3b38..be44f8612 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/MultipleFiltersFinder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/MultipleFiltersFinder.java @@ -25,6 +25,7 @@ import static org.navalplanner.web.I18nHelper._; import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.navalplanner.business.common.IAdHocTransactionService; import org.springframework.beans.factory.annotation.Autowired; import org.zkoss.zul.Listcell; @@ -72,11 +73,8 @@ public abstract class MultipleFiltersFinder implements IMultipleFiltersFinder { } public String getNewFilterText(String inputText) { - String newFilterText = new String(""); String[] filtersText = inputText.split(","); - newFilterText = getLastText(filtersText); - newFilterText = newFilterText.replace(" ", ""); - newFilterText = newFilterText.trim(); + String newFilterText = getLastText(filtersText); return newFilterText; } @@ -85,7 +83,7 @@ public abstract class MultipleFiltersFinder implements IMultipleFiltersFinder { if (texts.length > 0) { return texts[last]; } else { - return ""; + return new String(""); } } @@ -103,7 +101,7 @@ public abstract class MultipleFiltersFinder implements IMultipleFiltersFinder { } filterValues = updateDeletedFilters(filterValues, value); - value = value.replace(" ", ""); + value = StringUtils.deleteWhitespace(value); String[] values = value.split(","); if (values.length != filterValues.size()) { return false; @@ -142,7 +140,7 @@ public abstract class MultipleFiltersFinder implements IMultipleFiltersFinder { private boolean isFilterAdded(String[] values, String filter) { for (int i = 0; i < values.length; i++) { String value = values[i].replace(" ", ""); - filter = filter.replace(" ", ""); + filter = StringUtils.deleteWhitespace(filter); if (filter.equals(value)) { return true; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrderElementsMultipleFiltersFinder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrderElementsMultipleFiltersFinder.java index 5d110d12c..f8861bd81 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrderElementsMultipleFiltersFinder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrderElementsMultipleFiltersFinder.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.apache.commons.lang.StringUtils; import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.daos.ILabelTypeDAO; @@ -151,7 +152,7 @@ public class OrderElementsMultipleFiltersFinder extends MultipleFiltersFinder { public List getMatching(String filter) { getListMatching().clear(); if ((filter != null) && (!filter.isEmpty())) { - filter = filter.toLowerCase(); + filter = StringUtils.deleteWhitespace(filter.toLowerCase()); searchInCriterionTypes(filter); searchInLabelTypes(filter); } @@ -163,7 +164,9 @@ public class OrderElementsMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCriterionTypes(String filter) { boolean limited = (filter.length() < 3); for (CriterionType type : mapCriterions.keySet()) { - if (type.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(type.getName() + .toLowerCase()); + if (name.contains(filter)) { setFilterPairCriterionType(type, limited); } else { searchInCriterions(type, filter); @@ -173,7 +176,9 @@ public class OrderElementsMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCriterions(CriterionType type, String filter) { for (Criterion criterion : mapCriterions.get(type)) { - if (criterion.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(criterion.getName() + .toLowerCase()); + if (name.contains(filter)) { addCriterion(type, criterion); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; @@ -194,7 +199,9 @@ public class OrderElementsMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInLabelTypes(String filter) { boolean limited = (filter.length() < 3); for (LabelType type : mapLabels.keySet()) { - if (type.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(type.getName() + .toLowerCase()); + if (name.contains(filter)) { setFilterPairLabelType(type, limited); } else { searchInLabels(type, filter); @@ -204,7 +211,9 @@ public class OrderElementsMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInLabels(LabelType type, String filter) { for (Label label : mapLabels.get(type)) { - if (label.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(label.getName() + .toLowerCase()); + if (name.contains(filter)) { addLabel(type, label); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrdersMultipleFiltersFinder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrdersMultipleFiltersFinder.java index 22e52a869..fe3a2571e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrdersMultipleFiltersFinder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/OrdersMultipleFiltersFinder.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.apache.commons.lang.StringUtils; import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.externalcompanies.daos.IExternalCompanyDAO; import org.navalplanner.business.externalcompanies.entities.ExternalCompany; @@ -235,7 +236,9 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { public List getMatching(String filter) { getListMatching().clear(); if ((filter != null) && (!filter.isEmpty())) { - filter = filter.toLowerCase(); + + filter = StringUtils.deleteWhitespace(filter.toLowerCase()); + if (filter.indexOf("rc:") == 0) { searchInCustomerReferences(filter); } else if (filter.indexOf("cod:") == 0) { @@ -255,7 +258,9 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCriterionTypes(String filter) { boolean limited = (filter.length() < 3); for (CriterionType type : mapCriterions.keySet()) { - if (type.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(type.getName() + .toLowerCase()); + if (name.contains(filter)) { setFilterPairCriterionType(type, limited); } else { searchInCriterions(type, filter); @@ -265,7 +270,9 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCriterions(CriterionType type, String filter) { for (Criterion criterion : mapCriterions.get(type)) { - if (criterion.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(criterion.getName() + .toLowerCase()); + if (name.contains(filter)) { addCriterion(type, criterion); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; @@ -286,7 +293,9 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInLabelTypes(String filter) { boolean limited = (filter.length() < 3); for (LabelType type : mapLabels.keySet()) { - if (type.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(type.getName() + .toLowerCase()); + if (name.contains(filter)) { setFilterPairLabelType(type, limited); } else { searchInLabels(type, filter); @@ -296,7 +305,9 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInLabels(LabelType type, String filter) { for (Label label : mapLabels.get(type)) { - if (label.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(label.getName() + .toLowerCase()); + if (name.contains(filter)) { addLabel(type, label); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; @@ -316,8 +327,11 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInExternalCompanies(String filter){ for(ExternalCompany externalCompany : externalCompanies){ - if ((externalCompany.getName().toLowerCase().contains(filter)) - || (externalCompany.getNif().toLowerCase().contains(filter))) { + String name = StringUtils.deleteWhitespace(externalCompany + .getName().toLowerCase()); + String nif = StringUtils.deleteWhitespace(externalCompany.getNif() + .toLowerCase()); + if ((name.contains(filter)) || (nif.contains(filter))) { addExternalCompany(externalCompany); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; @@ -328,7 +342,9 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInOrderStatus(String filter) { for (OrderStatusEnum state : ordersStatusEnums) { - if (state.name().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(state.name() + .toLowerCase()); + if (name.contains(filter)) { addState(state); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; @@ -340,9 +356,9 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInOrderCodes(String filter) { if (filter.indexOf("cod:") == 0) { String codeFilter = filter.replaceFirst("cod:", ""); - codeFilter = codeFilter.replace(" ", ""); for (String code : ordersCodes) { - if (code.toLowerCase().equals(codeFilter)) { + code = StringUtils.deleteWhitespace(code.toLowerCase()); + if (code.equals(codeFilter)) { addCode(code); return; } @@ -353,9 +369,10 @@ public class OrdersMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCustomerReferences(String filter) { if (filter.indexOf("rc:") == 0) { String referenceFilter = filter.replaceFirst("rc:", ""); - referenceFilter = referenceFilter.replace(" ", ""); for (String reference : customerReferences) { - if (reference.toLowerCase().equals(referenceFilter)) { + reference = StringUtils.deleteWhitespace(reference + .toLowerCase()); + if (reference.equals(referenceFilter)) { addCustomerReference(reference); return; } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/ResourcesMultipleFiltersFinder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/ResourcesMultipleFiltersFinder.java index b3696066c..488f87020 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/ResourcesMultipleFiltersFinder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/components/finders/ResourcesMultipleFiltersFinder.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.apache.commons.lang.StringUtils; import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.costcategories.daos.ICostCategoryDAO; import org.navalplanner.business.costcategories.entities.CostCategory; @@ -131,7 +132,7 @@ public class ResourcesMultipleFiltersFinder extends MultipleFiltersFinder { public List getMatching(String filter) { getListMatching().clear(); if ((filter != null) && (!filter.isEmpty())) { - filter = filter.toLowerCase(); + filter = StringUtils.deleteWhitespace(filter.toLowerCase()); searchInCriterionTypes(filter); searchInCostCategories(filter); } @@ -142,7 +143,9 @@ public class ResourcesMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCriterionTypes(String filter) { boolean limited = (filter.length() < 3); for (CriterionType type : mapCriterions.keySet()) { - if (type.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(type.getName() + .toLowerCase()); + if (name.contains(filter)) { setFilterPairCriterionType(type, limited); } else { searchInCriterions(type, filter); @@ -152,7 +155,9 @@ public class ResourcesMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCriterions(CriterionType type, String filter) { for (Criterion criterion : mapCriterions.get(type)) { - if (criterion.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(criterion.getName() + .toLowerCase()); + if (name.contains(filter)) { addCriterion(type, criterion); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; @@ -172,7 +177,9 @@ public class ResourcesMultipleFiltersFinder extends MultipleFiltersFinder { private void searchInCostCategories(String filter) { for (CostCategory costCategory : costCategories) { - if (costCategory.getName().toLowerCase().contains(filter)) { + String name = StringUtils.deleteWhitespace(costCategory.getName() + .toLowerCase()); + if (name.contains(filter)) { addCostCategory(costCategory); if ((filter.length() < 3) && (getListMatching().size() > 9)) { return; From a0b22dc8c7a11dd216ef1a7a468eaa92ec0dfbca Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Wed, 24 Mar 2010 14:12:11 +0100 Subject: [PATCH 18/39] ItEr50S13AdaptacionServiciosRESTItEr49S18 : Refactoring the enumeration UnitTypeEnum to an Entity. After the following patch, it must be updated or dropped the column unit_type to the table material. Its unit_type can be null. Option A: ALTER TABLE material ALTER unit_type TYPE BIGINT; UPDATE material SET unit_type = null; ------- Option B: ALTER TABLE material DROP unit_type BIGINT; ALTER TABLE material ADD unit_type BIGINT; --- .../business/common/Registry.java | 8 ++ .../IMaterialCategoryBootstrap.java | 3 +- .../MaterialCategoryBootstrap.java | 2 +- .../PredefinedMaterialCategories.java | 3 +- .../PredefinedUnitTypes.java} | 24 +++++- .../bootstrap/UnitTypeBootstrap.java | 55 +++++++++++++ .../business/materials/daos/IUnitTypeDAO.java | 40 ++++++++++ .../business/materials/daos/UnitTypeDAO.java | 77 +++++++++++++++++++ .../business/materials/entities/Material.java | 6 +- .../business/materials/entities/UnitType.java | 64 +++++++++++++++ .../materials/entities/Materials.hbm.xml | 21 +++-- .../web/materials/IMaterialsModel.java | 4 + .../web/materials/MaterialsController.java | 49 ++++++++++++ .../web/materials/MaterialsModel.java | 24 ++++++ .../AssignedMaterialsController.java | 65 +++++++++++++++- .../materials/AssignedMaterialsModel.java | 17 ++++ .../AssignedMaterialsToOrderElementModel.java | 9 +++ .../materials/IAssignedMaterialsModel.java | 7 ++ ...IAssignedMaterialsToOrderElementModel.java | 3 + ...dMaterialsToOrderElementTemplateModel.java | 9 +++ ...dMaterialsToOrderElementTemplateModel.java | 3 + .../ws/common/impl/OrderElementConverter.java | 2 +- .../src/main/webapp/materials/materials.zul | 10 +-- .../main/webapp/orders/_assignmentsBox.zul | 6 +- .../components/_listOrderElementMaterials.zul | 10 +-- .../templates/_materialAssignmentsBox.zul | 6 +- 26 files changed, 493 insertions(+), 34 deletions(-) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities => bootstrap}/IMaterialCategoryBootstrap.java (89%) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities => bootstrap}/MaterialCategoryBootstrap.java (97%) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities => bootstrap}/PredefinedMaterialCategories.java (93%) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities/UnitTypeEnum.java => bootstrap/PredefinedUnitTypes.java} (70%) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java index f8ca7feaa..b21fb4afd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java @@ -35,6 +35,7 @@ import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.daos.ILabelTypeDAO; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; import org.navalplanner.business.orders.daos.IHoursGroupDAO; import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; @@ -165,6 +166,9 @@ public class Registry { @Autowired private ICalendarExceptionTypeDAO calendarExceptionTypeDAO; + @Autowired + private IUnitTypeDAO unitTypeDAO; + private Registry() { } @@ -172,6 +176,10 @@ public class Registry { return singleton; } + public static IUnitTypeDAO getUnitTypeDAO() { + return getInstance().unitTypeDAO; + } + public static IAdvanceTypeDAO getAdvanceTypeDao() { return getInstance().advanceTypeDao; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/IMaterialCategoryBootstrap.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/IMaterialCategoryBootstrap.java similarity index 89% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/IMaterialCategoryBootstrap.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/IMaterialCategoryBootstrap.java index 89876bced..ff0ae81d3 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/IMaterialCategoryBootstrap.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/IMaterialCategoryBootstrap.java @@ -18,9 +18,10 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; import org.navalplanner.business.IDataBootstrap; +import org.navalplanner.business.materials.entities.MaterialCategory; /** * Contratct for {@link MaterialCategory}. diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategoryBootstrap.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/MaterialCategoryBootstrap.java similarity index 97% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategoryBootstrap.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/MaterialCategoryBootstrap.java index 7f2f84df0..e1dcb24e1 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategoryBootstrap.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/MaterialCategoryBootstrap.java @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; import org.navalplanner.business.calendars.entities.CalendarExceptionType; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/PredefinedMaterialCategories.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedMaterialCategories.java similarity index 93% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/PredefinedMaterialCategories.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedMaterialCategories.java index 77a2bfa4f..4a3f58f73 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/PredefinedMaterialCategories.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedMaterialCategories.java @@ -18,10 +18,11 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.MaterialCategory; /** diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitTypeEnum.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedUnitTypes.java similarity index 70% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitTypeEnum.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedUnitTypes.java index 5de32bba2..27a5b6f66 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitTypeEnum.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedUnitTypes.java @@ -1,3 +1,5 @@ + + /* * This file is part of NavalPlan * @@ -18,9 +20,17 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; + +import org.navalplanner.business.materials.entities.UnitType; + +/** + * Defines the default {@link UnitType}. + * + * @author Susana Montes Pedreira + */ +public enum PredefinedUnitTypes { -public enum UnitTypeEnum { UNITS("units"), KILOGRAMS("kg"), KILOMETERS("km"), @@ -32,10 +42,18 @@ public enum UnitTypeEnum { private String measure; - private UnitTypeEnum(String measure) { + private PredefinedUnitTypes(String measure) { this.measure = measure; } + public UnitType createUnitType() { + return UnitType.create(measure); + } + + public String getMeasure() { + return measure; + } + public String toString() { return measure; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java new file mode 100644 index 000000000..7efd79b06 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java @@ -0,0 +1,55 @@ +/* + * 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.business.materials.bootstrap; + +import org.navalplanner.business.IDataBootstrap; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; +import org.navalplanner.business.materials.entities.UnitType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * Creates the bootstrap of the predefined {@link UnitType}. + * @author Susana Montes Pedreira + */ + +@Component +@Scope("singleton") +public class UnitTypeBootstrap implements IDataBootstrap { + + @Autowired + private IUnitTypeDAO unitTypeDAO; + + @Transactional + @Override + public void loadRequiredData() { + for (PredefinedUnitTypes predefinedUnitType : PredefinedUnitTypes + .values()) { + if (!unitTypeDAO.existsUnitTypeByName(predefinedUnitType + .getMeasure())) { + unitTypeDAO.save(predefinedUnitType.createUnitType()); + } + } + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java new file mode 100644 index 000000000..1bed2bdfd --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java @@ -0,0 +1,40 @@ +/* + * 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.business.materials.daos; + +import java.util.List; + +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.UnitType; + +/** + * @author Susana Montes Pedreira + */ +public interface IUnitTypeDAO extends IIntegrationEntityDAO { + + List getAll(); + + UnitType findByName(String measure) throws InstanceNotFoundException; + + boolean existsUnitTypeByName(String measure); + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java new file mode 100644 index 000000000..96219409b --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java @@ -0,0 +1,77 @@ +/* + * 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.business.materials.daos; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.hibernate.criterion.Restrictions; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.UnitType; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Repository; + +/** + * DAO for {@link UnitType} + * @author Susana Montes Pedreira + */ +@Repository +@Scope(BeanDefinition.SCOPE_SINGLETON) +public class UnitTypeDAO extends IntegrationEntityDAO implements + IUnitTypeDAO { + + @Override + public List getAll() { + return list(UnitType.class); + } + + @Override + public UnitType findByName(String measure) throws InstanceNotFoundException { + if (StringUtils.isBlank(measure)) { + throw new InstanceNotFoundException(null, getEntityClass() + .getName()); + } + + UnitType unitType = (UnitType) getSession().createCriteria( + UnitType.class).add( + Restrictions.eq("measure", measure)).uniqueResult(); + + if (unitType == null) { + throw new InstanceNotFoundException(measure, getEntityClass() + .getName()); + } else { + return unitType; + } + } + + @Override + public boolean existsUnitTypeByName(String measure) { + try { + findByName(measure); + } catch (InstanceNotFoundException e) { + return false; + } + return true; + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java index 6d13be4f2..ceef60bbb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java @@ -45,7 +45,7 @@ public class Material extends BaseEntity implements Comparable { private BigDecimal defaultUnitPrice = new BigDecimal(0); - private UnitTypeEnum unitType; + private UnitType unitType; private boolean disabled; @@ -105,11 +105,11 @@ public class Material extends BaseEntity implements Comparable { this.defaultUnitPrice = defaultUnitPrice; } - public UnitTypeEnum getUnitType() { + public UnitType getUnitType() { return unitType; } - public void setUnitType(UnitTypeEnum unitType) { + public void setUnitType(UnitType unitType) { this.unitType = unitType; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java new file mode 100644 index 000000000..b9c1853d2 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java @@ -0,0 +1,64 @@ +/* + * 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.business.materials.entities; + +import org.hibernate.validator.NotEmpty; +import org.navalplanner.business.common.IntegrationEntity; +import org.navalplanner.business.common.Registry; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; + +/** + * UnitType entity + * + * @author Susana Montes Pedreira + * + */ +public class UnitType extends IntegrationEntity{ + + public static UnitType create(String measure) { + return (UnitType) create(new UnitType(measure)); + } + + private String measure; + + // Default constructor, needed by Hibernate + protected UnitType() { + + } + + private UnitType(String measure) { + this.measure = measure; + } + + @NotEmpty(message = "measure not specified") + public String getMeasure() { + return measure; + } + + public void setMeasure(String measure) { + this.measure = measure; + } + + @Override + protected IUnitTypeDAO getIntegrationEntityDAO() { + return Registry.getUnitTypeDAO(); + } +} diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml index 39c23fc17..c2ec68ad4 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml @@ -17,11 +17,7 @@ - - - org.navalplanner.business.materials.entities.UnitTypeEnum - - + @@ -29,6 +25,21 @@ + + + + + + 100 + + + + + + + + + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java index 93445e8c8..c5bdce961 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java @@ -26,6 +26,7 @@ import java.util.List; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.zkoss.ganttz.util.MutableTreeModel; /** @@ -53,4 +54,7 @@ public interface IMaterialsModel { void removeMaterial(Material material); + List getUnitTypes(); + + void loadUnitTypes(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java index a8d3327c1..a8421e599 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java @@ -32,6 +32,7 @@ import org.hibernate.validator.InvalidValue; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.web.common.ConstraintChecker; import org.navalplanner.web.common.IMessagesForUser; import org.navalplanner.web.common.Level; @@ -47,6 +48,10 @@ import org.zkoss.zk.ui.event.InputEvent; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Grid; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Row; import org.zkoss.zul.Rows; @@ -86,6 +91,7 @@ public class MaterialsController extends private Component messagesContainer; + private UnitTypeListRenderer unitTypeListRenderer = new UnitTypeListRenderer(); @Override public void doAfterCompose(Component comp) throws Exception { @@ -93,6 +99,9 @@ public class MaterialsController extends comp.setVariable("materialsController", this, true); messagesForUser = new MessagesForUser(messagesContainer); + // load the unit types + loadUnitTypes(); + // Renders grid and enables delete button is material is new gridMaterials.addEventListener("onInitRender", new EventListener() { @@ -115,6 +124,21 @@ public class MaterialsController extends }); } + private void loadUnitTypes() { + materialsModel.loadUnitTypes(); + } + + public List getUnitTypes() { + return materialsModel.getUnitTypes(); + } + + public void selectUnitType(Component self) { + Listitem selectedItem = ((Listbox) self).getSelectedItem(); + UnitType unitType = (UnitType) selectedItem.getValue(); + Material material = (Material) ((Row) self.getParent()).getValue(); + material.setUnitType(unitType); + } + public TreeModel getMaterialCategories() { return materialsModel.getMaterialCategories(); } @@ -410,4 +434,29 @@ public class MaterialsController extends Util.reloadBindings(gridMaterials); } + public UnitTypeListRenderer getRenderer() { + return unitTypeListRenderer; + } + + /** + * RowRenderer for a @{UnitType} element + * @author Susana Montes Pedreira + */ + public class UnitTypeListRenderer implements ListitemRenderer { + @Override + public void render(Listitem listItem, Object data) throws Exception { + final UnitType unitType = (UnitType) data; + listItem.setValue(unitType); + + Listcell listCell = new Listcell(unitType.getMeasure()); + listItem.appendChild(listCell); + + Material material = (Material) ((Row) listItem.getListbox() + .getParent()).getValue(); + if ((material.getUnitType() != null) + && (unitType.getId().equals(material.getUnitType().getId()))) { + listItem.getListbox().setSelectedItem(listItem); + } + } + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java index 5f51c0865..ae1e9623a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java @@ -35,8 +35,10 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.web.common.concurrentdetection.OnConcurrentModification; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -56,9 +58,14 @@ public class MaterialsModel implements IMaterialsModel { @Autowired IMaterialDAO materialDAO; + @Autowired + IUnitTypeDAO unitTypeDAO; + MutableTreeModel materialCategories = MutableTreeModel .create(MaterialCategory.class); + private List unitTypes = new ArrayList(); + @Override @Transactional(readOnly=true) public MutableTreeModel getMaterialCategories() { @@ -87,6 +94,9 @@ public class MaterialsModel implements IMaterialsModel { private void initializeMaterials(Set materials) { for (Material each: materials) { each.getDescription(); + if (each.getUnitType() != null) { + each.getUnitType().getMeasure(); + } } } @@ -231,4 +241,18 @@ public class MaterialsModel implements IMaterialsModel { return result; } + @Override + @Transactional(readOnly = true) + public void loadUnitTypes() { + List result = new ArrayList(); + for (UnitType each : unitTypeDAO.findAll()) { + each.getMeasure(); + result.add(each); + } + this.unitTypes = result; + } + + public List getUnitTypes() { + return this.unitTypes; + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java index 9db201135..6a6d684bb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java @@ -33,6 +33,7 @@ import org.apache.commons.logging.LogFactory; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.web.common.Util; import org.zkoss.zk.ui.Component; @@ -45,7 +46,9 @@ import org.zkoss.zul.Doublebox; import org.zkoss.zul.Grid; import org.zkoss.zul.Label; import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listcell; import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Row; import org.zkoss.zul.SimpleListModel; @@ -88,6 +91,7 @@ public abstract class AssignedMaterialsController extends GenericForwardCo @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); + getModel().loadUnitTypes(); createAssignmentsBoxComponent(assignmentsBox); } @@ -508,6 +512,63 @@ public abstract class AssignedMaterialsController extends GenericForwardCo protected abstract double getUnits(A assignment); + private UnitTypeListRenderer unitTypeListRenderer = new UnitTypeListRenderer(); + + public List getUnitTypes() { + return getModel().getUnitTypes(); + } + + public void selectUnitType(Component self) { + Listitem selectedItem = ((Listbox) self).getSelectedItem(); + UnitType unitType = (UnitType) selectedItem.getValue(); + Material material = (Material) ((Row) self.getParent()).getValue(); + material.setUnitType(unitType); + } + + public UnitTypeListRenderer getRenderer() { + return unitTypeListRenderer; + } + + /** + * RowRenderer for a @{UnitType} element + * @author Susana Montes Pedreira + */ + public class UnitTypeListRenderer implements ListitemRenderer { + @Override + public void render(Listitem listItem, Object data) throws Exception { + final UnitType unitType = (UnitType) data; + listItem.setValue(unitType); + + Listcell listCell = new Listcell(unitType.getMeasure()); + listItem.appendChild(listCell); + + Listbox listbox = listItem.getListbox(); + Component parent = listbox.getParent(); + + if (parent instanceof Row) { + Object assigment = (Object) ((Row) parent).getValue(); + if (getModel().isCurrentUnitType(assigment, unitType)) { + listItem.getListbox().setSelectedItem(listItem); + } + return; + } + + if (parent instanceof Listcell) { + Material material = (Material) ((Listitem) (parent.getParent())) + .getValue(); + if (isCurrentUnitType(material, unitType)) { + listItem.getListbox().setSelectedItem(listItem); + } + } + + } + } + + private boolean isCurrentUnitType(Material material, UnitType unitType) { + return ((material != null) + && (material.getUnitType() != null) + && (unitType + .getId().equals(material.getUnitType().getId()))); + } + } - - diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsModel.java index 9a7a79768..4f2351557 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsModel.java @@ -26,8 +26,10 @@ import java.util.List; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.zkoss.ganttz.util.MutableTreeModel; @@ -46,6 +48,9 @@ public abstract class AssignedMaterialsModel implements @Autowired private IMaterialDAO materialDAO; + @Autowired + private IUnitTypeDAO unitTypeDAO; + private MutableTreeModel materialCategories = MutableTreeModel .create(MaterialCategory.class); @@ -54,6 +59,8 @@ public abstract class AssignedMaterialsModel implements private List matchingMaterials = new ArrayList(); + private List unitTypes = new ArrayList(); + @Transactional(readOnly = true) public void initEdit(T element) { assignAndReattach(element); @@ -246,4 +253,14 @@ public abstract class AssignedMaterialsModel implements protected abstract BigDecimal getTotalPrice(A each); + @Override + @Transactional(readOnly = true) + public void loadUnitTypes() { + unitTypes = unitTypeDAO.findAll(); + } + + @Override + public List getUnitTypes() { + return unitTypes; + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java index f39a13613..1c9ae5065 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java @@ -28,6 +28,7 @@ import java.util.Set; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.orders.entities.OrderElement; import org.springframework.beans.factory.annotation.Autowired; @@ -139,4 +140,12 @@ public class AssignedMaterialsToOrderElementModel extends return orderElement != null; } + @Override + public boolean isCurrentUnitType(Object assigment, UnitType unitType) { + MaterialAssignment material = (MaterialAssignment) assigment; + return ((material != null) + && (material.getMaterial().getUnitType() != null) && (unitType + .getId().equals(material.getMaterial().getUnitType().getId()))); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java index 1e4354a93..9651097f7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java @@ -24,6 +24,7 @@ import java.util.List; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.zkoss.zul.TreeModel; /** @@ -42,6 +43,8 @@ public interface IAssignedMaterialsModel { List getAssignedMaterials(MaterialCategory materialCategory); + abstract boolean isCurrentUnitType(Object assigment, UnitType unitType); + List getMatchingMaterials(); TreeModel getMaterialCategories(); @@ -54,4 +57,8 @@ public interface IAssignedMaterialsModel { void searchMaterials(String text, MaterialCategory materialCategory); + void loadUnitTypes(); + + List getUnitTypes(); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java index 4b7541c2e..f80d00e3e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java @@ -21,6 +21,7 @@ package org.navalplanner.web.orders.materials; import org.navalplanner.business.materials.entities.MaterialAssignment; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.orders.entities.OrderElement; @@ -30,6 +31,8 @@ import org.navalplanner.business.orders.entities.OrderElement; public interface IAssignedMaterialsToOrderElementModel extends IAssignedMaterialsModel { + boolean isCurrentUnitType(Object assigment, UnitType unitType); + OrderElement getOrderElement(); void initEdit(OrderElement orderElement); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java index e92938e05..cf97b003c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java @@ -27,6 +27,7 @@ import java.util.List; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignmentTemplate; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.templates.daos.IOrderElementTemplateDAO; import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.web.orders.materials.AssignedMaterialsModel; @@ -130,4 +131,12 @@ public class AssignedMaterialsToOrderElementTemplateModel extends template.removeMaterialAssignment(materialAssignment); } + @Override + public boolean isCurrentUnitType(Object assigment, UnitType unitType) { + MaterialAssignmentTemplate material = (MaterialAssignmentTemplate) assigment; + return ((material != null) + && (material.getMaterial().getUnitType() != null) && (unitType + .getId().equals(material.getMaterial().getUnitType().getId()))); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java index a1f4093b7..2f9565a5e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java @@ -20,6 +20,7 @@ package org.navalplanner.web.templates.materials; import org.navalplanner.business.materials.entities.MaterialAssignmentTemplate; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.web.orders.materials.IAssignedMaterialsModel; @@ -30,6 +31,8 @@ import org.navalplanner.web.orders.materials.IAssignedMaterialsModel; public interface IAssignedMaterialsToOrderElementTemplateModel extends IAssignedMaterialsModel { + public boolean isCurrentUnitType(Object assigment, UnitType unitType); + OrderElementTemplate getTemplate(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java index 16b6d3804..c30f43da7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java @@ -40,10 +40,10 @@ import org.navalplanner.business.common.Registry; 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.materials.bootstrap.PredefinedMaterialCategories; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.materials.entities.MaterialCategory; -import org.navalplanner.business.materials.entities.PredefinedMaterialCategories; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.ICriterionRequirable; import org.navalplanner.business.orders.entities.Order; diff --git a/navalplanner-webapp/src/main/webapp/materials/materials.zul b/navalplanner-webapp/src/main/webapp/materials/materials.zul index 1b44ebcbe..2aaf034d7 100644 --- a/navalplanner-webapp/src/main/webapp/materials/materials.zul +++ b/navalplanner-webapp/src/main/webapp/materials/materials.zul @@ -28,11 +28,6 @@ - - Object[] unitTypes = org.navalplanner.business.materials.entities.UnitTypeEnum - .values(); - - @@ -100,8 +95,9 @@ constraint="no empty:${i18n:_('cannot be null or empty')}" /> - + \ No newline at end of file + From d712de0b1539cb48c5dd300dc34fc369b05aa8cb Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Mon, 5 Apr 2010 02:18:14 +0200 Subject: [PATCH 31/39] ItEr52S13CUCreacionRecursosLimitantes: Added column isLimitedResource in machines list --- .../src/main/webapp/resources/machine/_listMachines.zul | 2 ++ 1 file changed, 2 insertions(+) diff --git a/navalplanner-webapp/src/main/webapp/resources/machine/_listMachines.zul b/navalplanner-webapp/src/main/webapp/resources/machine/_listMachines.zul index 173724b4a..7680eadbc 100644 --- a/navalplanner-webapp/src/main/webapp/resources/machine/_listMachines.zul +++ b/navalplanner-webapp/src/main/webapp/resources/machine/_listMachines.zul @@ -33,6 +33,7 @@ + @@ -40,6 +41,7 @@