diff --git a/INSTALL b/INSTALL index 1157c1bdb..6d310ef8d 100644 --- a/INSTALL +++ b/INSTALL @@ -40,14 +40,6 @@ Database creation Compilation ----------- -* Download Spring Framework 2.5.6 (http://www.springsource.org/download). - -* Execute the following commands:: - - mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta \ - -Dversion=1.0.1B -Dpackaging=jar \ - -Dfile=<>/lib/j2ee/jta.jar - cd xestion-producion mvn install 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/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/img/group_left.png b/ganttzk/src/main/resources/web/ganttz/img/group_left.png new file mode 100644 index 000000000..6a8297cc0 Binary files /dev/null and b/ganttzk/src/main/resources/web/ganttz/img/group_left.png differ diff --git a/ganttzk/src/main/resources/web/ganttz/img/group_right.png b/ganttzk/src/main/resources/web/ganttz/img/group_right.png new file mode 100644 index 000000000..646c9ff9b Binary files /dev/null and b/ganttzk/src/main/resources/web/ganttz/img/group_right.png differ 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 000000000..5627f0b79 Binary files /dev/null and b/ganttzk/src/main/resources/web/ganttz/img/milestone.png differ diff --git a/ganttzk/src/main/resources/web/ganttz/img/watermark_deadline.png b/ganttzk/src/main/resources/web/ganttz/img/watermark_deadline.png new file mode 100644 index 000000000..240d2083d Binary files /dev/null and b/ganttzk/src/main/resources/web/ganttz/img/watermark_deadline.png differ diff --git a/ganttzk/src/main/resources/web/ganttz/img/watermark_today.png b/ganttzk/src/main/resources/web/ganttz/img/watermark_today.png new file mode 100644 index 000000000..6f5c27dd1 Binary files /dev/null and b/ganttzk/src/main/resources/web/ganttz/img/watermark_today.png differ 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; diff --git a/navalplanner-business/pom.xml b/navalplanner-business/pom.xml index 8a0c4d961..d377c91e2 100644 --- a/navalplanner-business/pom.xml +++ b/navalplanner-business/pom.xml @@ -37,6 +37,10 @@ org.springframework spring + + org.apache.geronimo.specs + geronimo-jta_1.0.1B_spec + org.springframework spring-test 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(); } 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/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/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/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/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/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 81724d589..c8387a31f 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; @@ -33,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; @@ -157,6 +160,12 @@ public class Registry { @Autowired private IHourCostDAO hourCostDAO; + @Autowired + private ICalendarExceptionDAO calendarExceptionDAO; + + @Autowired + private ICalendarDataDAO calendarDataDAO; + @Autowired private ICalendarExceptionTypeDAO calendarExceptionTypeDAO; @@ -166,6 +175,9 @@ public class Registry { @Autowired private IScenarioManager scenarioManager; + @Autowired + private IUnitTypeDAO unitTypeDAO; + private Registry() { } @@ -173,6 +185,10 @@ public class Registry { return singleton; } + public static IUnitTypeDAO getUnitTypeDAO() { + return getInstance().unitTypeDAO; + } + public static IAdvanceTypeDAO getAdvanceTypeDao() { return getInstance().advanceTypeDao; } @@ -299,4 +315,12 @@ public class Registry { return getInstance().scenarioManager; } -} \ No newline at end of file + public static ICalendarExceptionDAO getCalendarExceptionDAO() { + return getInstance().calendarExceptionDAO; + } + + public static ICalendarDataDAO getCalendarDataDAO() { + return getInstance().calendarDataDAO; + } + +} 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..cca633b92 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java @@ -0,0 +1,56 @@ +/* + * 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 + .existsUnitTypeByNameInAnotherTransaction(predefinedUnitType + .getMeasure())) { + unitTypeDAO.save(predefinedUnitType.createUnitType()); + } + } + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java index 303a1a91a..cc4dfe1b8 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java @@ -22,7 +22,7 @@ package org.navalplanner.business.materials.daos; 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.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; @@ -33,7 +33,8 @@ import org.navalplanner.business.materials.entities.MaterialCategory; * @author Jacobo Aragunde Perez * @author Diego Pino Garcia */ -public interface IMaterialCategoryDAO extends IGenericDAO { +public interface IMaterialCategoryDAO extends + IIntegrationEntityDAO { /** * Returns true if {@link MaterialCategory} exists diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java index b62d7bd85..3808c559d 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java @@ -23,7 +23,7 @@ package org.navalplanner.business.materials.daos; import java.util.List; import java.util.Set; -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.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; @@ -37,7 +37,7 @@ import org.navalplanner.business.orders.entities.Order; * @author Jacobo Aragunde Perez * @author Diego Pino Garcia */ -public interface IMaterialDAO extends IGenericDAO { +public interface IMaterialDAO extends IIntegrationEntityDAO { /** * Returns true if {@link Material} exits 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..f1474c0af --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java @@ -0,0 +1,42 @@ +/* + * 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; + + UnitType findUniqueByNameInAnotherTransaction(String measure) + throws InstanceNotFoundException; + + boolean existsUnitTypeByNameInAnotherTransaction(String measure); +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java index a46d45bca..6a46a72cd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java @@ -23,8 +23,9 @@ package org.navalplanner.business.materials.daos; import java.util.List; import org.hibernate.Criteria; +import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; -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.materials.entities.MaterialCategory; import org.springframework.beans.factory.config.BeanDefinition; @@ -40,7 +41,8 @@ import org.springframework.transaction.annotation.Transactional; */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) -public class MaterialCategoryDAO extends GenericDAOHibernate implements +public class MaterialCategoryDAO extends IntegrationEntityDAO + implements IMaterialCategoryDAO { @Override @@ -87,4 +89,10 @@ public class MaterialCategoryDAO extends GenericDAOHibernate findAll() { + return getSession().createCriteria(MaterialCategory.class).add( + Restrictions.isNull("parent")).addOrder(Order.asc("code")) + .list(); + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java index ffacbcc89..c6ea30705 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java @@ -28,7 +28,7 @@ import java.util.Set; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Restrictions; -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.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; @@ -50,7 +50,7 @@ import org.springframework.transaction.annotation.Transactional; */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) -public class MaterialDAO extends GenericDAOHibernate implements +public class MaterialDAO extends IntegrationEntityDAO implements IMaterialDAO { @Override 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..8ba4b5d82 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.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.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; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 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 + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public UnitType findUniqueByNameInAnotherTransaction(String measure) + throws InstanceNotFoundException { + return findByName(measure); + } + + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public boolean existsUnitTypeByNameInAnotherTransaction(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..f7c4eb526 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 @@ -22,32 +22,26 @@ package org.navalplanner.business.materials.entities; import java.math.BigDecimal; -import org.hibernate.validator.AssertTrue; -import org.hibernate.validator.NotEmpty; +import org.apache.commons.lang.StringUtils; import org.hibernate.validator.NotNull; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; -import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.materials.daos.IMaterialDAO; /** * Material entity - * * @author Jacobo Aragunde Perez * */ -public class Material extends BaseEntity implements Comparable { - - @NotEmpty(message = "code not specified") - private String code; +public class Material extends IntegrationEntity implements Comparable { private String description; private BigDecimal defaultUnitPrice = new BigDecimal(0); - private UnitTypeEnum unitType; + private UnitType unitType; - private boolean disabled; + private Boolean disabled; @NotNull private MaterialCategory category = null; @@ -58,11 +52,38 @@ public class Material extends BaseEntity implements Comparable { } public static Material create(String code) { - return (Material) create(new Material(code)); + return (Material) create(new Material(), code); + } + + public static Material createUnvalidated(String code, String description, + BigDecimal defaultPrice, Boolean disabled) { + Material material = create(new Material(), code); + material.description = description; + material.defaultUnitPrice = defaultPrice; + material.disabled = disabled; + return material; + } + + public void updateUnvalidated(String description, + BigDecimal defaultUnitPrice, + Boolean disabled) { + + if (!StringUtils.isBlank(description)) { + this.description = description; + } + + if (defaultUnitPrice != null) { + this.defaultUnitPrice = defaultUnitPrice; + } + + if (disabled != null) { + this.disabled = disabled; + } + } protected Material(String code) { - this.code = code; + this.setCode(code); } public MaterialCategory getCategory() { @@ -73,14 +94,6 @@ public class Material extends BaseEntity implements Comparable { this.category = category; } - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - public String getDescription() { return description; } @@ -89,11 +102,11 @@ public class Material extends BaseEntity implements Comparable { this.description = description; } - public boolean getDisabled() { - return disabled; + public Boolean getDisabled() { + return disabled == null ? false : disabled; } - public void setDisabled(boolean disabled) { + public void setDisabled(Boolean disabled) { this.disabled = disabled; } @@ -105,45 +118,23 @@ 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; } @Override public int compareTo(Object arg0) { final Material material = (Material) arg0; - return code.compareTo(material.getCode()); + return getCode().compareTo(material.getCode()); } - @AssertTrue(message="materialcode has to be unique. It is already used") - public boolean checkConstraintUniqueCode() { - boolean result; - if (isNewObject()) { - result = !existsMaterialWithTheCode(); - } else { - result = isIfExistsTheExistentMaterialThisOne(); - } - return result; - } - - private boolean existsMaterialWithTheCode() { - IMaterialDAO materialDAO = Registry.getMaterialDAO(); - return materialDAO.existsMaterialWithCodeInAnotherTransaction(code); - } - - private boolean isIfExistsTheExistentMaterialThisOne() { - IMaterialDAO materialDAO = Registry.getMaterialDAO(); - try { - Material material = - materialDAO.findUniqueByCodeInAnotherTransaction(code); - return material.getId().equals(getId()); - } catch (InstanceNotFoundException e) { - return true; - } + @Override + protected IMaterialDAO getIntegrationEntityDAO() { + return Registry.getMaterialDAO(); } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java index 67a936a02..e58554adb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java @@ -26,10 +26,12 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; + +import org.apache.commons.lang.StringUtils; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.Valid; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; @@ -40,7 +42,7 @@ import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; * @author Jacobo Aragunde Perez * */ -public class MaterialCategory extends BaseEntity { +public class MaterialCategory extends IntegrationEntity { public static List getAllMaterialsFrom( Collection categories) { @@ -71,6 +73,20 @@ public class MaterialCategory extends BaseEntity { return (MaterialCategory) create(new MaterialCategory(name)); } + public static MaterialCategory createUnvalidated(String code, String name) { + MaterialCategory materialCategory = create(new MaterialCategory(), code); + materialCategory.name = name; + return materialCategory; + } + + public void updateUnvalidated(String name) { + + if (!StringUtils.isBlank(name)) { + this.name = name; + } + + } + protected MaterialCategory(String name) { this.name = name; } @@ -144,4 +160,91 @@ public class MaterialCategory extends BaseEntity { } } + public Material getMaterialByCode(String code) + throws InstanceNotFoundException { + + if (StringUtils.isBlank(code)) { + throw new InstanceNotFoundException(code, Material.class.getName()); + } + + for (Material m : this.materials) { + if (m.getCode().equalsIgnoreCase(StringUtils.trim(code))) { + return m; + } + } + + throw new InstanceNotFoundException(code, Material.class.getName()); + + } + + public MaterialCategory getSubcategoryByCode(String code) + throws InstanceNotFoundException { + + if (StringUtils.isBlank(code)) { + throw new InstanceNotFoundException(code, MaterialCategory.class + .getName()); + } + + for (MaterialCategory s : this.subcategories) { + if (s.getCode().equalsIgnoreCase(StringUtils.trim(code))) { + return s; + } + } + + throw new InstanceNotFoundException(code, MaterialCategory.class + .getName()); + + } + + @Override + protected IMaterialCategoryDAO getIntegrationEntityDAO() { + return Registry.getMaterialCategoryDAO(); + } + + @SuppressWarnings("unused") + @AssertTrue(message = "The subcategories names must be unique.") + public boolean checkConstraintUniqueSubcategoryName() { + Set subcategoriesNames = new HashSet(); + for (MaterialCategory mc : this.getAllSubcategories()) { + if (!StringUtils.isBlank(mc.getName())) { + String name = StringUtils.deleteWhitespace(mc.getName() + .toLowerCase()); + if (subcategoriesNames.contains(name)) { + return false; + } else { + subcategoriesNames.add(name); + } + } + } + return true; + } + + @AssertTrue + public boolean checkConstraintNonRepeatedMaterialCategoryCodes() { + Set allSubcategories = getAllSubcategories(); + allSubcategories.add(this); + return getFirstRepeatedCode(allSubcategories) == null; + } + + private Set getAllSubcategories() { + Set result = new HashSet(subcategories); + for (MaterialCategory subcategory : subcategories) { + result.addAll(subcategory.getAllSubcategories()); + } + return result; + } + + @AssertTrue + public boolean checkConstraintNonRepeatedMaterialCodes() { + Set allMaterials = getAllMaterials(); + return getFirstRepeatedCode(allMaterials) == null; + } + + private Set getAllMaterials() { + Set result = new HashSet(materials); + for (MaterialCategory subcategory : subcategories) { + result.addAll(subcategory.getAllMaterials()); + } + return result; + } } 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..daf011d8d --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java @@ -0,0 +1,104 @@ +/* + * 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.apache.commons.lang.StringUtils; +import org.hibernate.validator.AssertTrue; +import org.hibernate.validator.NotEmpty; +import org.navalplanner.business.common.IntegrationEntity; +import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; + +/** + * UnitType entity + * + * @author Susana Montes Pedreira + * + */ +public class UnitType extends IntegrationEntity{ + + public static UnitType create(String code, String measure) { + return (UnitType) create(new UnitType(measure), code); + } + + public static UnitType create(String measure) { + return (UnitType) create(new UnitType(measure)); + } + + public void updateUnvalidated(String measure) { + if (!StringUtils.isBlank(measure)) { + this.measure = 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; + } + + @AssertTrue(message = "the measure unit type has to be unique. It is already used") + public boolean checkConstraintUniqueName() { + boolean result; + if (isNewObject()) { + result = !existsUnitTypeWithTheName(); + } else { + result = isIfExistsTheExistentUnitTypeThisOne(); + } + return result; + } + + private boolean existsUnitTypeWithTheName() { + IUnitTypeDAO unitTypeDAO = Registry.getUnitTypeDAO(); + return unitTypeDAO.existsUnitTypeByNameInAnotherTransaction(measure); + } + + private boolean isIfExistsTheExistentUnitTypeThisOne() { + IUnitTypeDAO unitTypeDAO = Registry.getUnitTypeDAO(); + try { + UnitType unitType = unitTypeDAO + .findUniqueByNameInAnotherTransaction(measure); + return unitType.getId().equals(getId()); + } catch (InstanceNotFoundException e) { + return true; + } + } + + @Override + protected IUnitTypeDAO getIntegrationEntityDAO() { + return Registry.getUnitTypeDAO(); + } +} 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 3a647b1f6..e50ebc1b7 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 @@ -27,12 +27,13 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +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; @@ -59,7 +60,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 @@ -209,10 +210,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 af60ccd8c..ef45f1a17 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 @@ -59,6 +59,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! */ @@ -72,7 +79,6 @@ public class Order extends OrderLineGroup { private Boolean dependenciesConstraintsHavePriority; - @NotNull(message = "order calendar not specified") private BaseCalendar calendar; private Boolean codeAutogenerated = false; @@ -285,6 +291,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-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-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java index a0441c72a..7500efaab 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java @@ -19,6 +19,9 @@ */ package org.navalplanner.business.resources.entities; + +import static org.navalplanner.business.i18n.I18nHelper._; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -91,6 +94,8 @@ public abstract class Resource extends IntegrationEntity { private Set resourcesCostCategoryAssignments = new HashSet(); + private Boolean limitingResource = Boolean.FALSE; + private void clearCachedData() { assignmentsByDayCached = null; } @@ -1041,4 +1046,16 @@ public abstract class Resource extends IntegrationEntity { return Registry.getResourceDAO(); } + public Boolean isLimitingResource() { + return limitingResource; + } + + public void setLimitingResource(Boolean limitingResource) { + this.limitingResource = limitingResource; + } + + public String getLimitingResourceAsString() { + return (Boolean.TRUE.equals(isLimitingResource())) ? _("yes") : _("no"); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java index 406e1686c..7b53a5a9d 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java @@ -93,4 +93,9 @@ public class VirtualWorker extends Worker { } } + @Override + public Boolean isLimitingResource() { + return false; + } + } 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..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 @@ -12,6 +12,8 @@ + + @@ -49,6 +51,8 @@ + + @@ -83,6 +87,8 @@ + + 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..0d4582908 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 + + + + + + + + + @@ -38,6 +49,8 @@ + + diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml index e560a00ec..676ff1810 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml @@ -12,7 +12,11 @@ Hibernate infers type="integer". --> + + + + @@ -167,4 +171,4 @@ - \ No newline at end of file + diff --git a/navalplanner-webapp/pom.xml b/navalplanner-webapp/pom.xml index f6ed5df23..918eadd09 100644 --- a/navalplanner-webapp/pom.xml +++ b/navalplanner-webapp/pom.xml @@ -166,6 +166,10 @@ org.springframework spring + + org.apache.geronimo.specs + geronimo-jta_1.0.1B_spec + org.springframework spring-test 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; 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..6323a6e21 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 @@ -29,14 +29,17 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.hibernate.validator.InvalidValue; 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 +59,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 +95,9 @@ public class MaterialsModel implements IMaterialsModel { private void initializeMaterials(Set materials) { for (Material each: materials) { each.getDescription(); + if (each.getUnitType() != null) { + each.getUnitType().getMeasure(); + } } } @@ -113,7 +124,7 @@ public class MaterialsModel implements IMaterialsModel { public void addMaterialCategory(MaterialCategory parent, MaterialCategory child) throws ValidationException { Validate.notNull(child); - final MaterialCategory materialCategory = findMaterialCategory(parent, child); + final MaterialCategory materialCategory = findMaterialCategory(child); if (materialCategory != null) { final InvalidValue invalidValue = new InvalidValue(_("{0} already exists", materialCategory.getName()), MaterialCategory.class, "name", materialCategory.getName(), materialCategory); @@ -128,18 +139,22 @@ public class MaterialsModel implements IMaterialsModel { } } - private MaterialCategory findMaterialCategory(final MaterialCategory parent, final MaterialCategory category) { - for (int i = 0; i < materialCategories.getChildCount(parent); i++) { - final MaterialCategory each = materialCategories.getChild(parent, i); - if (equalsMaterialCategory(each, category)) { - return each; + private MaterialCategory findMaterialCategory( + final MaterialCategory category) { + for (MaterialCategory mc : materialCategories.asList()) { + if (equalsMaterialCategory(mc, category)) { + return mc; } } return null; } private boolean equalsMaterialCategory(MaterialCategory obj1, MaterialCategory obj2) { - return obj1.getName().equals(obj2.getName()); + String name1 = StringUtils.deleteWhitespace(obj1.getName() + .toLowerCase()); + String name2 = StringUtils.deleteWhitespace(obj2.getName() + .toLowerCase()); + return name1.equals(name2); } @Override @@ -231,4 +246,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/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); 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/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( 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/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/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(); 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); 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 diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java index ca7b37bed..d6c3296ab 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java @@ -24,6 +24,7 @@ import static org.navalplanner.web.I18nHelper._; import java.util.Date; import java.util.List; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -48,6 +49,7 @@ import org.navalplanner.web.costcategories.ResourcesCostCategoryAssignmentContro import org.navalplanner.web.resources.search.ResourcePredicate; import org.navalplanner.web.resources.worker.CriterionsController; import org.navalplanner.web.resources.worker.CriterionsMachineController; +import org.navalplanner.web.resources.worker.WorkerCRUDController.LimitingResourceEnum; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.util.GenericForwardComposer; @@ -57,6 +59,8 @@ import org.zkoss.zul.ComboitemRenderer; import org.zkoss.zul.Constraint; import org.zkoss.zul.Datebox; import org.zkoss.zul.Grid; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listitem; import org.zkoss.zul.SimpleListModel; import org.zkoss.zul.Tab; import org.zkoss.zul.Textbox; @@ -97,6 +101,8 @@ public class MachineCRUDController extends GenericForwardComposer { private Datebox filterFinishDate; + private Listbox filterLimitingResource; + private Textbox txtfilter; private BandboxMultipleSearch bdFilters; @@ -139,6 +145,8 @@ public class MachineCRUDController extends GenericForwardComposer { .getFellowIfAny("filterFinishDate"); this.filterStartDate = (Datebox) listWindow .getFellowIfAny("filterStartDate"); + this.filterLimitingResource = (Listbox) listWindow + .getFellowIfAny("filterLimitingResource"); this.bdFilters = (BandboxMultipleSearch) listWindow .getFellowIfAny("bdFilters"); this.txtfilter = (Textbox) listWindow.getFellowIfAny("txtfilter"); @@ -512,13 +520,18 @@ public class MachineCRUDController extends GenericForwardComposer { .getValue()); } + final Listitem item = filterLimitingResource.getSelectedItem(); + Boolean isLimitingResource = (item != null) ? LimitingResourceEnum + .valueOf((LimitingResourceEnum) item.getValue()) : null; + if (listFilters.isEmpty() && (personalFilter == null || personalFilter.isEmpty()) - && startDate == null && finishDate == null) { + && startDate == null && finishDate == null + && isLimitingResource == null) { return null; } return new ResourcePredicate(listFilters, personalFilter, startDate, - finishDate); + finishDate, isLimitingResource); } private void filterByPredicate(ResourcePredicate predicate) { @@ -538,4 +551,31 @@ public class MachineCRUDController extends GenericForwardComposer { .toArray())); listing.invalidate(); } -} \ No newline at end of file + + public Set getLimitingResourceFilterOptionList() { + return LimitingResourceEnum.getLimitingResourceFilterOptionList(); + } + + public Set getLimitingResourceOptionList() { + return LimitingResourceEnum.getLimitingResourceOptionList(); + } + + public Object getLimitingResource() { + final Machine machine = getMachine(); + return (machine != null) ? LimitingResourceEnum.valueOf(machine + .isLimitingResource()) + : LimitingResourceEnum.NON_LIMITING_RESOURCE; // Default option + } + + public void setLimitingResource(LimitingResourceEnum option) { + Machine machine = getMachine(); + if (machine != null) { + machine.setLimitingResource(LimitingResourceEnum.LIMITING_RESOURCE.equals(option)); + } + } + + public boolean isEditing() { + return (getMachine() != null && !getMachine().isNewObject()); + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourcePredicate.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourcePredicate.java index b900f6e6d..420c17926 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourcePredicate.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourcePredicate.java @@ -52,14 +52,18 @@ public class ResourcePredicate implements IPredicate { private String[] personalFilters; + private Boolean isLimitingResource; + private List assignedResourcesInIntervalDates; public ResourcePredicate(List filters, String personalFilters, LocalDate startDate, - LocalDate finishDate) { + LocalDate finishDate, + Boolean isLimitingResource) { this.filters = filters; this.startDate = startDate; this.finishDate = finishDate; + this.isLimitingResource = isLimitingResource; this.personalFilters = personalFilters.split(" "); } @@ -74,12 +78,16 @@ public class ResourcePredicate implements IPredicate { return false; } if (acceptFilters(resource) && acceptPersonalFilters(resource) - && acceptFiltersDates(resource)) { + && acceptFiltersDates(resource) && acceptFilterIsLimitingResource(resource)) { return true; } return false; } + private boolean acceptFilterIsLimitingResource(Resource resource) { + return (isLimitingResource != null) ? isLimitingResource.equals(resource.isLimitingResource()) : true; + } + private boolean acceptFilters(Resource resource) { if ((filters == null) || (filters.isEmpty())) { return true; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java index c5264dc9c..fa4353714 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java @@ -23,7 +23,9 @@ package org.navalplanner.web.resources.worker; import static org.navalplanner.web.I18nHelper._; import java.util.Date; +import java.util.EnumSet; import java.util.List; +import java.util.Set; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.BaseCalendar; @@ -54,6 +56,8 @@ import org.zkoss.zul.ComboitemRenderer; import org.zkoss.zul.Constraint; import org.zkoss.zul.Datebox; import org.zkoss.zul.Grid; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listitem; import org.zkoss.zul.SimpleListModel; import org.zkoss.zul.Tab; import org.zkoss.zul.Textbox; @@ -107,6 +111,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements private Datebox filterFinishDate; + private Listbox filterLimitingResource; + private BandboxMultipleSearch bdFilters; private Textbox txtfilter; @@ -291,6 +297,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements .getFellowIfAny("filterFinishDate"); this.filterStartDate = (Datebox) listWindow .getFellowIfAny("filterStartDate"); + this.filterLimitingResource = (Listbox) listWindow + .getFellowIfAny("filterLimitingResource"); this.bdFilters = (BandboxMultipleSearch) listWindow .getFellowIfAny("bdFilters"); this.txtfilter = (Textbox) listWindow.getFellowIfAny("txtfilter"); @@ -599,13 +607,18 @@ public class WorkerCRUDController extends GenericForwardComposer implements finishDate = LocalDate.fromDateFields(filterFinishDate.getValue()); } + final Listitem item = filterLimitingResource.getSelectedItem(); + Boolean isLimitingResource = (item != null) ? LimitingResourceEnum + .valueOf((LimitingResourceEnum) item.getValue()) : null; + if (listFilters.isEmpty() && (personalFilter == null || personalFilter.isEmpty()) - && startDate == null && finishDate == null) { + && startDate == null && finishDate == null + && isLimitingResource == null) { return null; } return new ResourcePredicate(listFilters, personalFilter, startDate, - finishDate); + finishDate, isLimitingResource); } private void filterByPredicate(ResourcePredicate predicate) { @@ -625,4 +638,74 @@ public class WorkerCRUDController extends GenericForwardComposer implements .toArray())); listing.invalidate(); } + + public enum LimitingResourceEnum { + ALL(_("ALL")), + LIMITING_RESOURCE(_("LIMITING RESOURCE")), + NON_LIMITING_RESOURCE(_("NON LIMITING RESOURCE")); + + private String option; + + private LimitingResourceEnum(String option) { + this.option = option; + } + + public String toString() { + return option; + } + + public static LimitingResourceEnum valueOf(Boolean isLimitingResource) { + return (Boolean.TRUE.equals(isLimitingResource)) ? LIMITING_RESOURCE : NON_LIMITING_RESOURCE; + } + + public static Boolean valueOf(LimitingResourceEnum option) { + if (LIMITING_RESOURCE.equals(option)) { + return true; + } else if (NON_LIMITING_RESOURCE.equals(option)) { + return false; + } else { + return null; + } + } + + public static Set getLimitingResourceOptionList() { + return EnumSet.of( + LimitingResourceEnum.LIMITING_RESOURCE, + LimitingResourceEnum.NON_LIMITING_RESOURCE); + } + + public static Set getLimitingResourceFilterOptionList() { + return EnumSet.of(LimitingResourceEnum.ALL, + LimitingResourceEnum.LIMITING_RESOURCE, + LimitingResourceEnum.NON_LIMITING_RESOURCE); + } + + } + + public Set getLimitingResourceFilterOptionList() { + return LimitingResourceEnum.getLimitingResourceFilterOptionList(); + } + + public Set getLimitingResourceOptionList() { + return LimitingResourceEnum.getLimitingResourceOptionList(); + } + + public Object getLimitingResource() { + final Worker worker = getWorker(); + return (worker != null) ? LimitingResourceEnum.valueOf(worker + .isLimitingResource()) + : LimitingResourceEnum.NON_LIMITING_RESOURCE; // Default option + } + + public void setLimitingResource(LimitingResourceEnum option) { + Worker worker = getWorker(); + if (worker != null) { + worker.setLimitingResource(LimitingResourceEnum.LIMITING_RESOURCE.equals(option)); + } + } + + public boolean isEditing() { + return (getWorker() != null && !getWorker().isNewObject()); + } + } 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/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; } 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..6099c737b --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/BaseCalendarDTO.java @@ -0,0 +1,76 @@ +/* + * 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.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; + +/** + * 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; + + @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, + List calendarExceptions, + List calendarDatas) { + super(code); + this.name = name; + this.calendarExceptions = calendarExceptions; + this.calendarDatas = calendarDatas; + } + + public BaseCalendarDTO(String name, + List calendarExceptions, + List calendarDatas) { + this(generateCode(), name, calendarExceptions, calendarDatas); + } + + @Override + public String getEntityType() { + 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 new file mode 100644 index 000000000..656e0af90 --- /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; + } + +} \ 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 new file mode 100644 index 000000000..94f9ca754 --- /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(); + +} \ No newline at end of file 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..06e0ae25f --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarConverter.java @@ -0,0 +1,89 @@ +/* + * 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 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. + * + * @author Manuel Rego Casasnovas + */ +public final class CalendarConverter { + + private 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(), 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 new file mode 100644 index 000000000..7a9b02029 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/impl/CalendarServiceREST.java @@ -0,0 +1,91 @@ +/* + * 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 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.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 IBaseCalendarDAO 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() { + // Avoid ResourceCalendar entities + List justBaseCalendars = getIntegrationEntityDAO() + .getBaseCalendars(); + return new BaseCalendarListDTO(toDTO(justBaseCalendars)); + } + +} \ No newline at end of file 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/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/common/impl/OrderElementConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java index 626085114..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 @@ -38,11 +38,12 @@ 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.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; @@ -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/materials/api/IMaterialService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/IMaterialService.java new file mode 100644 index 000000000..6b1b8b82b --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/IMaterialService.java @@ -0,0 +1,36 @@ +/* + * 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.materials.api; + +import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; + +/** + * Service for managing material-related entities. + * @author Susana Montes Pedreira + */ +public interface IMaterialService { + + public MaterialCategoryListDTO getMaterials(); + + public InstanceConstraintViolationsListDTO addMaterials( + MaterialCategoryListDTO materialCategoryListDTO); + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialCategoryDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialCategoryDTO.java new file mode 100644 index 000000000..955ac6a69 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialCategoryDTO.java @@ -0,0 +1,84 @@ +/* + * 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.materials.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.ws.common.api.IntegrationEntityDTO; + +/** + * DTO for MaterialCategory entity. + * @author Susana Montes Pedreira + */ +public class MaterialCategoryDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "material-category"; + + @XmlAttribute + public String name; + + @XmlAttribute + public String parent; + + @XmlElement + public MaterialCategoryListDTO subcategories; + + @XmlElementWrapper(name = "material-list") + @XmlElement(name = "material") + public List materials = new ArrayList(); + + public MaterialCategoryDTO() { + } + + public MaterialCategoryDTO(String code, String name, String parent, + MaterialCategoryListDTO subcategories, List materials) { + + super(code); + this.name = name; + this.parent = parent; + this.subcategories = subcategories; + this.materials = materials; + + } + + /** + * This constructor automatically generates a unique code. It is intended to + * facilitate the implementation of test cases that add new instances (such + * instances will have a unique code). + */ + public MaterialCategoryDTO(String name, String parent, + MaterialCategoryListDTO subcategories, List materials) { + + this(generateCode(), name, parent, subcategories, materials); + + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialCategoryListDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialCategoryListDTO.java new file mode 100644 index 000000000..fd97ab77e --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialCategoryListDTO.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.materials.api; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * DTO for a list of MaterialCategory entities. + * @author Susana Montes Pedreira + */ +@XmlRootElement(name = "material-category-list") +public class MaterialCategoryListDTO { + + @XmlElement(name = "material-category") + public List materialCategoryDTOs = new ArrayList(); + + public MaterialCategoryListDTO() { + } + + public MaterialCategoryListDTO( + List materialCategoryDTOs) { + if (materialCategoryDTOs != null) { + this.materialCategoryDTOs = materialCategoryDTOs; + } + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialDTO.java new file mode 100644 index 000000000..e994fcb3b --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/MaterialDTO.java @@ -0,0 +1,80 @@ +/* + * 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.materials.api; + +import java.math.BigDecimal; + +import javax.xml.bind.annotation.XmlAttribute; + +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + +/** + * DTO for Material entity. + * @author Susana Montes Pedreira + */ +public class MaterialDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "material"; + + @XmlAttribute + public String description; + + @XmlAttribute + public BigDecimal defaultPrice; + + @XmlAttribute + public String unitType; + + @XmlAttribute + public Boolean disabled; + + public MaterialDTO() { + } + + public MaterialDTO(String code, String description, + BigDecimal defaultPrice, String unitType, Boolean disabled) { + + super(code); + this.description = description; + this.defaultPrice = defaultPrice; + this.unitType = unitType; + this.disabled = disabled; + + } + + /** + * This constructor automatically generates a unique code. It is intended to + * facilitate the implementation of test cases that add new instances (such + * instances will have a unique code). + */ + public MaterialDTO(String description, BigDecimal defaultPrice, + String unitType, Boolean disabled) { + + this(generateCode(), description, defaultPrice, unitType, disabled); + + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/package-info.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/package-info.java new file mode 100644 index 000000000..54a090bc4 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/api/package-info.java @@ -0,0 +1,30 @@ +/* + * 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 Susana Montes Pedreira + */ +@javax.xml.bind.annotation.XmlSchema( + elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED, + namespace=WSCommonGlobalNames.REST_NAMESPACE +) +package org.navalplanner.ws.materials.api; +import org.navalplanner.ws.common.api.WSCommonGlobalNames; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/impl/MaterialConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/impl/MaterialConverter.java new file mode 100644 index 000000000..80f89754d --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/impl/MaterialConverter.java @@ -0,0 +1,274 @@ +/* + * 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.materials.impl; + +import static org.navalplanner.web.I18nHelper._; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +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.ws.materials.api.MaterialCategoryDTO; +import org.navalplanner.ws.materials.api.MaterialCategoryListDTO; +import org.navalplanner.ws.materials.api.MaterialDTO; + +/** + * Converter from/to material-related entities to/from DTOs. + * @author Susana Montes Pedreira + */ +public final class MaterialConverter { + + private MaterialConverter() { + } + + public final static MaterialCategoryDTO toDTO( + MaterialCategory materialCategory) { + + // converter the materials + List materialDTOs = new ArrayList(); + + for (Material m : materialCategory.getMaterials()) { + materialDTOs.add(toDTO(m)); + } + + if (materialDTOs.isEmpty()) { + materialDTOs = null; + } + + // converter the subcategories + MaterialCategoryListDTO subcategories = createSubcategoriesList(materialCategory + .getSubcategories()); + + // get the parent code + String parentCode = null; + if (materialCategory.getParent() != null) { + parentCode = materialCategory.getParent().getCode(); + } + + return new MaterialCategoryDTO(materialCategory.getCode(), + materialCategory.getName(), parentCode, subcategories, + materialDTOs); + + } + + private static MaterialCategoryListDTO createSubcategoriesList( + Set subcategories) { + + List DTOs = new ArrayList(); + + for (MaterialCategory m : subcategories) { + DTOs.add(toDTO(m)); + } + + if (DTOs.isEmpty()) { + return null; + } + + return new MaterialCategoryListDTO(DTOs); + } + + public final static MaterialDTO toDTO(Material material) { + + String unitTypeCode = null; + if (material.getUnitType() != null) { + unitTypeCode = material.getUnitType().getCode(); + } + + return new MaterialDTO(material.getCode(), material.getDescription(), + material.getDefaultUnitPrice(), unitTypeCode, material + .getDisabled()); + + } + + public final static MaterialCategory toEntity( + MaterialCategoryDTO materialCategoryDTO) { + MaterialCategory materialCategory = toEntityCategory(materialCategoryDTO); + + // find the parent + if (materialCategoryDTO.parent != null) { + try { + MaterialCategory parentCategory = Registry + .getMaterialCategoryDAO().findByCode( + materialCategoryDTO.parent); + materialCategory.setParent(parentCategory); + } catch (InstanceNotFoundException e) { + throw new ValidationException( + _("There is no material category with this code")); + } + } + + return materialCategory; + } + + public final static MaterialCategory toEntityCategory( + MaterialCategoryDTO materialCategoryDTO) { + + MaterialCategory materialCategory = MaterialCategory.createUnvalidated( + StringUtils.trim(materialCategoryDTO.code), StringUtils + .trim(materialCategoryDTO.name)); + + // Create and add the materials + if (materialCategoryDTO.materials != null) { + for (MaterialDTO materialDTO : materialCategoryDTO.materials) { + materialCategory.addMaterial(toEntity(materialDTO)); + } + } + + // Create and add the subcategories + if (materialCategoryDTO.subcategories != null) { + for (MaterialCategoryDTO subCategoryDTO : materialCategoryDTO.subcategories.materialCategoryDTOs) { + materialCategory.addSubcategory(toEntitySubCategories( + subCategoryDTO, materialCategory)); + } + } + + return materialCategory; + + } + + public final static MaterialCategory toEntitySubCategories( + MaterialCategoryDTO materialCategoryDTO, MaterialCategory parent) { + + MaterialCategory materialCategory = toEntityCategory(materialCategoryDTO); + + // find the parent + if (materialCategoryDTO.parent != null) { + if (!materialCategoryDTO.parent.equalsIgnoreCase(parent.getCode())) { + throw new ValidationException(_("inconsistent parent code.")); + } + } + + return materialCategory; + + } + + private static Material toEntity(MaterialDTO materialDTO) { + + Material material = Material.createUnvalidated(StringUtils + .trim(materialDTO.code), StringUtils + .trim(materialDTO.description), materialDTO.defaultPrice, + materialDTO.disabled); + + if (materialDTO.unitType != null) { + try { + UnitType unitType = Registry.getUnitTypeDAO() + .findByCodeAnotherTransaction( + materialDTO.unitType); + material.setUnitType(unitType); + } catch (InstanceNotFoundException e) { + material.setUnitType(null); + } + } + + return material; + + } + + public final static void updateMaterialCategory( + MaterialCategory materialCategory, + MaterialCategoryDTO materialCategoryDTO) throws ValidationException { + + /* check the parent code */ + if (((materialCategoryDTO.parent != null) + && (materialCategory.getParent() != null) + && (!materialCategory.getParent().getCode().equalsIgnoreCase( + materialCategoryDTO.parent))) + || ((!(materialCategoryDTO.parent == null) && (materialCategory + .getParent() == null)))) { + throw new ValidationException(_("inconsistent parent code.")); + } + + /* + * 1: Update basic properties in existing material category and add new + * materials. + */ + if (materialCategoryDTO.materials != null) { + for (MaterialDTO materialDTO : materialCategoryDTO.materials) { + + /* Step 1.1 requires each material DTO to have a code. */ + if (StringUtils.isBlank(materialDTO.code)) { + throw new ValidationException( + _("missing code in a material")); + } + + try { + Material material = materialCategory + .getMaterialByCode(materialDTO.code); + updateMaterial(material, materialDTO); + } catch (InstanceNotFoundException e) { + materialCategory.addMaterial(toEntity(materialDTO)); + } + } + } + + /* + * 2: Update basic properties in existing subcategories and add new + * subcategories. + */ + if (materialCategoryDTO.subcategories != null) { + for (MaterialCategoryDTO subcategoryDTO : materialCategoryDTO.subcategories.materialCategoryDTOs) { + + /* Step 2.1 requires each subcategory DTO to have a code. */ + if (StringUtils.isBlank(subcategoryDTO.code)) { + throw new ValidationException( + _("missing code in a subcategory")); + } + + try { + MaterialCategory subcategory = materialCategory + .getSubcategoryByCode(subcategoryDTO.code); + updateMaterialCategory(subcategory, subcategoryDTO); + } catch (InstanceNotFoundException e) { + materialCategory + .addSubcategory(toEntity(subcategoryDTO)); + } + } + } + + /* 3: Update material category basic properties. */ + materialCategory.updateUnvalidated(StringUtils + .trim(materialCategoryDTO.name)); + + } + + public final static void updateMaterial(Material material, + MaterialDTO materialDTO) throws ValidationException { + if (materialDTO.unitType != null) { + try { + UnitType type = Registry.getUnitTypeDAO() + .findByCodeAnotherTransaction( + materialDTO.unitType); + material.setUnitType(type); + } catch (InstanceNotFoundException e) { + throw new ValidationException(_("unit type code not found")); + } + } + material.updateUnvalidated(StringUtils.trim(materialDTO.description), + materialDTO.defaultPrice, materialDTO.disabled); + } +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/impl/MaterialServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/impl/MaterialServiceREST.java new file mode 100644 index 000000000..72ee56bdd --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/materials/impl/MaterialServiceREST.java @@ -0,0 +1,95 @@ +/* + * 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.materials.impl; + +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.materials.daos.IMaterialCategoryDAO; +import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; +import org.navalplanner.ws.common.impl.GenericRESTService; +import org.navalplanner.ws.materials.api.IMaterialService; +import org.navalplanner.ws.materials.api.MaterialCategoryDTO; +import org.navalplanner.ws.materials.api.MaterialCategoryListDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * REST-based implementation of IMaterialService. + * @author Susana Montes Pedreira + */ +@Path("/materialcategories/") +@Produces("application/xml") +@Service("materialServiceREST") +public class MaterialServiceREST extends + GenericRESTService implements + IMaterialService { + + @Autowired + private IMaterialCategoryDAO materialCategoryDAO; + + @Override + @GET + @Transactional(readOnly = true) + public MaterialCategoryListDTO getMaterials() { + return new MaterialCategoryListDTO(findAll()); + } + + @Override + @POST + @Consumes("application/xml") + public InstanceConstraintViolationsListDTO addMaterials( + MaterialCategoryListDTO materialCategoryListDTO) { + return save(materialCategoryListDTO.materialCategoryDTOs); + } + + @Override + protected MaterialCategory toEntity(MaterialCategoryDTO entityDTO) { + return MaterialConverter.toEntity(entityDTO); + } + + @Override + protected MaterialCategoryDTO toDTO(MaterialCategory entity) { + return MaterialConverter.toDTO(entity); + } + + @Override + protected IIntegrationEntityDAO getIntegrationEntityDAO() { + return materialCategoryDAO; + } + + @Override + protected void updateEntity(MaterialCategory entity, + MaterialCategoryDTO entityDTO) + throws ValidationException { + + MaterialConverter.updateMaterialCategory(entity, entityDTO); + + } + +} 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/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/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/main/java/org/navalplanner/ws/unittypes/api/IUnitTypeService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/IUnitTypeService.java new file mode 100644 index 000000000..09aa04c98 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/IUnitTypeService.java @@ -0,0 +1,32 @@ +/* + * 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.unittypes.api; + +import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; + +public interface IUnitTypeService { + + public UnitTypeListDTO getUnitTypes(); + + public InstanceConstraintViolationsListDTO addUnitTypes( + UnitTypeListDTO unitTypeListDTO); + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/UnitTypeDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/UnitTypeDTO.java new file mode 100644 index 000000000..16ba34fb8 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/UnitTypeDTO.java @@ -0,0 +1,60 @@ +/* + * 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.unittypes.api; + +import javax.xml.bind.annotation.XmlAttribute; + +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + +/** + * DTO for UnitType entity. + * @author Susana Montes Pedreira + */ +public class UnitTypeDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "unit type"; + + @XmlAttribute + public String measure; + + public UnitTypeDTO() { + } + + public UnitTypeDTO(String code, String measure) { + super(code); + this.measure = measure; + } + + /** + * This constructor automatically generates a unique code. It is intended to + * facilitate the implementation of test cases that add new instances (such + * instances will have a unique code). + */ + public UnitTypeDTO(String measure) { + this(generateCode(), measure); + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/UnitTypeListDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/UnitTypeListDTO.java new file mode 100644 index 000000000..8623f7cc0 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/UnitTypeListDTO.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.unittypes.api; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * DTO for a list of UnitType entities. + * @author Susana Montes Pedreira + */ +@XmlRootElement(name = "unit-type-list") +public class UnitTypeListDTO { + + @XmlElement(name = "unit-type") + public List unitTypeDTOs = new ArrayList(); + + public UnitTypeListDTO() { + } + + public UnitTypeListDTO(List unitTypeDTOs) { + if (unitTypeDTOs != null) { + this.unitTypeDTOs = unitTypeDTOs; + } + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/package-info.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/package-info.java new file mode 100644 index 000000000..6190da8ee --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/api/package-info.java @@ -0,0 +1,28 @@ +/* + * 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 Susana Montes Pedreira + */ +@javax.xml.bind.annotation.XmlSchema(elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, namespace = WSCommonGlobalNames.REST_NAMESPACE) +package org.navalplanner.ws.unittypes.api; + +import org.navalplanner.ws.common.api.WSCommonGlobalNames; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/impl/UnitTypeConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/impl/UnitTypeConverter.java new file mode 100644 index 000000000..a7485b5f4 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/impl/UnitTypeConverter.java @@ -0,0 +1,51 @@ +/* + * 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.unittypes.impl; + +import org.apache.commons.lang.StringUtils; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.materials.entities.UnitType; +import org.navalplanner.ws.unittypes.api.UnitTypeDTO; + +/** + * Service for managing unit-types-related entities. + * @author Susana Montes Pedreira + */ +public class UnitTypeConverter { + + private UnitTypeConverter() { + } + + public final static UnitTypeDTO toDTO(UnitType unitType) { + return new UnitTypeDTO(unitType.getCode(), unitType.getMeasure()); + } + + public final static UnitType toEntity(UnitTypeDTO unitTypeDTO) { + return UnitType.create(unitTypeDTO.code, unitTypeDTO.measure); + } + + public final static void updateUnitType(UnitType unitType, + UnitTypeDTO unitTypeDTO) throws ValidationException { + /* 1: Update unit type basic properties. */ + unitType.updateUnvalidated(StringUtils.trim(unitTypeDTO.measure)); + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/impl/UnitTypeServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/impl/UnitTypeServiceREST.java new file mode 100644 index 000000000..a3c69bcc7 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/unittypes/impl/UnitTypeServiceREST.java @@ -0,0 +1,93 @@ +/* + * 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.unittypes.impl; + +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.materials.daos.IUnitTypeDAO; +import org.navalplanner.business.materials.entities.UnitType; +import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; +import org.navalplanner.ws.common.impl.GenericRESTService; +import org.navalplanner.ws.unittypes.api.IUnitTypeService; +import org.navalplanner.ws.unittypes.api.UnitTypeDTO; +import org.navalplanner.ws.unittypes.api.UnitTypeListDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * REST-based implementation of IUnitTypeService. + * @author Susana Montes Pedreira + */ +@Path("/unittypes/") +@Produces("application/xml") +@Service("unitTypeServiceREST") +public class UnitTypeServiceREST extends + GenericRESTService implements IUnitTypeService { + + @Autowired + private IUnitTypeDAO unitTypeDAO; + + @Override + @GET + @Transactional(readOnly = true) + public UnitTypeListDTO getUnitTypes() { + return new UnitTypeListDTO(findAll()); + } + + @Override + @POST + @Consumes("application/xml") + public InstanceConstraintViolationsListDTO addUnitTypes( + UnitTypeListDTO unitTypeListDTO) { + return save(unitTypeListDTO.unitTypeDTOs); + } + + @Override + protected UnitType toEntity(UnitTypeDTO entityDTO) { + return UnitTypeConverter.toEntity(entityDTO); + } + + @Override + protected UnitTypeDTO toDTO(UnitType entity) { + return UnitTypeConverter.toDTO(entity); + } + + @Override + protected IIntegrationEntityDAO getIntegrationEntityDAO() { + return unitTypeDAO; + } + + @Override + protected void updateEntity(UnitType entity, UnitTypeDTO entityDTO) + throws ValidationException { + + UnitTypeConverter.updateUnitType(entity, entityDTO); + + } + +} \ No newline at end of file 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/resources/navalplanner-webapp-spring-config.xml b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml index d65659acf..857711250 100644 --- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml +++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml @@ -76,6 +76,9 @@ + + + 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/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..2aaf034d7 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 . --> - + @@ -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 + 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/_materialAssignmentsBox.zul b/navalplanner-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul index 4c3264e0c..1f3cfffcd 100644 --- a/navalplanner-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul +++ b/navalplanner-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul @@ -19,8 +19,10 @@ readonly="true" /> - + 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 @@ --> - + 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 { 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())); + } + +} 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/materials/MaterialServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/materials/MaterialServiceTest.java new file mode 100644 index 000000000..0fa283492 --- /dev/null +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/materials/MaterialServiceTest.java @@ -0,0 +1,308 @@ +/* + * 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.materials; + +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; +import static org.navalplanner.web.test.ws.common.Util.getUniqueName; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.hibernate.SessionFactory; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.IDataBootstrap; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +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.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; +import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; +import org.navalplanner.ws.materials.api.IMaterialService; +import org.navalplanner.ws.materials.api.MaterialCategoryDTO; +import org.navalplanner.ws.materials.api.MaterialCategoryListDTO; +import org.navalplanner.ws.materials.api.MaterialDTO; +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 IMaterialService. + * @author Susana Montes Pedreira + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class MaterialServiceTest { + + @Autowired + private SessionFactory sessionFactory; + + @Autowired + private IMaterialService materialService; + + @Autowired + private IMaterialCategoryDAO materialCategoryDAO; + + @Autowired + private IMaterialDAO materialDAO; + + @Autowired + private IUnitTypeDAO unitTypeDAO; + + @Resource + private IDataBootstrap materialCategoryBootstrap; + + @Resource + private IDataBootstrap unitTypeBootstrap; + + private String unitTypeCodeA = "unitTypeA"; + + @Before + public void loadRequiredaData() { + materialCategoryBootstrap.loadRequiredData(); + unitTypeBootstrap.loadRequiredData(); + } + + @Test + public void testAddAndGetMaterialCategories() { + /* Build materialCategory (0 constraint violations). */ + // Missing material name and the unit type. + MaterialDTO m1 = new MaterialDTO(null, new BigDecimal(13), + unitTypeCodeA, true); + // Missing default unit price + MaterialDTO m2 = new MaterialDTO("material 2", null, unitTypeCodeA, + true); + // Missing unit type + MaterialDTO m3 = new MaterialDTO("material 3", new BigDecimal(13), + null, true); + // Missing unit type, same name + MaterialDTO m4 = new MaterialDTO("material 3", new BigDecimal(13), + unitTypeCodeA, null); + + List materialDTOs = new ArrayList(); + materialDTOs.add(m1); + materialDTOs.add(m2); + materialDTOs.add(m3); + materialDTOs.add(m4); + + MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO( + "categoryA", null, null, materialDTOs); + + MaterialCategoryListDTO materialCategoryListDTO = createMaterialCategoryListDTO(materialCategoryDTO); + + List instanceConstraintViolationsList = materialService + .addMaterials(materialCategoryListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); + } + + @Test + public void testAddMaterialRepeatedCodes() { + /* Build material with same code (1 constraint violations). */ + MaterialDTO m1 = new MaterialDTO("CodeA", "material1", new BigDecimal( + 13), unitTypeCodeA, true); + MaterialDTO m2 = new MaterialDTO("CodeA", "material2", new BigDecimal( + 13), unitTypeCodeA, true); + + List materialDTOs = new ArrayList(); + materialDTOs.add(m1); + materialDTOs.add(m2); + + MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO( + "category1", null, null, materialDTOs); + + MaterialCategoryListDTO materialCategoryListDTO = createMaterialCategoryListDTO(materialCategoryDTO); + + List instanceConstraintViolationsList = materialService + .addMaterials(materialCategoryListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); + } + + @Test + public void testAddValidMaterialCategory() { + /* Build material (0 constraint violations). */ + MaterialDTO m1 = new MaterialDTO("CodeM1", "material1", new BigDecimal( + 13), unitTypeCodeA, true); + MaterialDTO m2 = new MaterialDTO("CodeM2", "material2", new BigDecimal( + 13), unitTypeCodeA, true); + + List materialDTOs1 = new ArrayList(); + List materialDTOs2 = new ArrayList(); + materialDTOs1.add(m1); + materialDTOs2.add(m2); + + /* Build material (0 constraint violations). */ + MaterialCategoryDTO mc1 = new MaterialCategoryDTO("CodeMC1", + "subCategory1", "mainMaterialCode", null, materialDTOs1); + MaterialCategoryDTO mc2 = new MaterialCategoryDTO("CodeMC2", + "subCategory2", null, null, materialDTOs2); + MaterialCategoryListDTO subCategoryListDTO = createMaterialCategoryListDTO( + mc1, mc2); + + /* Build main material category */ + MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO( + "mainMaterialCode", "mainCategory1", null, subCategoryListDTO, + null); + + MaterialCategoryListDTO materialCategoryListDTO = createMaterialCategoryListDTO(materialCategoryDTO); + + List instanceConstraintViolationsList = materialService + .addMaterials(materialCategoryListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); + } + + @Test + public void testAddMaterialCategoryWithSameName() { + /* Build material (0 constraint violations). */ + MaterialCategoryDTO mc1 = new MaterialCategoryDTO("subMC1", + "subCategory", "subMC2", null, null); + MaterialCategoryListDTO subCategoryListDTOC = createMaterialCategoryListDTO(mc1); + + MaterialCategoryDTO mc2 = new MaterialCategoryDTO("subMC2", + "subCategory", null, subCategoryListDTOC, null); + MaterialCategoryListDTO subCategoryListDTOB = createMaterialCategoryListDTO(mc2); + + /* Build main material category */ + MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO( + "mainMaterialCode", "mainCategory1", null, subCategoryListDTOB, + null); + + MaterialCategoryListDTO materialCategoryListDTOA = createMaterialCategoryListDTO(materialCategoryDTO); + + List instanceConstraintViolationsList = materialService + .addMaterials(materialCategoryListDTOA).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); + } + + @Test + public void testAddMaterialCategoryWithInconsistentParent() { + /* Build material (0 constraint violations). */ + MaterialCategoryDTO mc1 = new MaterialCategoryDTO("subMCX1", + "subCategoryC", "mainMaterialCode", null, null); + MaterialCategoryListDTO subCategoryListDTOC = createMaterialCategoryListDTO(mc1); + + MaterialCategoryDTO mc2 = new MaterialCategoryDTO("subMCX2", + "subCategoryB", null, subCategoryListDTOC, null); + MaterialCategoryListDTO subCategoryListDTOB = createMaterialCategoryListDTO(mc2); + + /* Build main material category */ + MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO( + "mainMaterialCodeX", "mainCategory1", null, + subCategoryListDTOB, + null); + + MaterialCategoryListDTO materialCategoryListDTOA = createMaterialCategoryListDTO(materialCategoryDTO); + + List instanceConstraintViolationsList = materialService + .addMaterials(materialCategoryListDTOA).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); + } + + @Test + public void testAddAndUpdateMaterialCategory() { + + String unitTypeCodeA = getUniqueName(); + String unitTypeCodeB = getUniqueName(); + UnitType entityA = UnitType.create(unitTypeCodeA, "UnitTypeA"); + UnitType entityB = UnitType.create(unitTypeCodeB, "UnitTypeB"); + unitTypeDAO.save(entityA); + unitTypeDAO.save(entityB); + unitTypeDAO.flush(); + sessionFactory.getCurrentSession().evict(entityA); + sessionFactory.getCurrentSession().evict(entityB); + + /* Build material (0 constraint violations). */ + MaterialDTO m1 = new MaterialDTO("M-1", "tornillos", + new BigDecimal(13), unitTypeCodeA, true); + + List materialDTOs1 = new ArrayList(); + materialDTOs1.add(m1); + + MaterialCategoryDTO mc1 = new MaterialCategoryDTO("MC-C", "MC-C", + "MC-B", + null, null); + MaterialCategoryListDTO subCategoryListDTOC = createMaterialCategoryListDTO(mc1); + + MaterialCategoryDTO mc2 = new MaterialCategoryDTO("MC-B", "MC-B", + "C-A", + subCategoryListDTOC, materialDTOs1); + MaterialCategoryListDTO subCategoryListDTOB = createMaterialCategoryListDTO(mc2); + + /* Build main material category */ + MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO( + "C-A", "C-A", null, subCategoryListDTOB, null); + + MaterialCategoryListDTO materialCategoryListDTOA = createMaterialCategoryListDTO(materialCategoryDTO); + + List instanceConstraintViolationsList = materialService + .addMaterials(materialCategoryListDTOA).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); + + try { + MaterialCategory mc = materialCategoryDAO.findByCode("MC-B"); + assertTrue(mc.getMaterials().size() == 1); + assertTrue(mc.getSubcategories().size() == 1); + assertTrue(mc.getName().equalsIgnoreCase("MC-B")); + materialCategoryDAO.flush(); + sessionFactory.getCurrentSession().evict(mc); + } catch (InstanceNotFoundException e) { + fail(); + } + + } + + private MaterialCategoryListDTO createMaterialCategoryListDTO( + MaterialCategoryDTO... materialCategoryDTOs) { + + List materialCategoryList = new ArrayList(); + + for (MaterialCategoryDTO c : materialCategoryDTOs) { + materialCategoryList.add(c); + } + + return new MaterialCategoryListDTO(materialCategoryList); + + } + +} 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 c8e0ef236..249daeb40 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; @@ -36,6 +35,7 @@ import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_SECURITY 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; @@ -47,7 +47,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; @@ -61,7 +60,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; @@ -84,7 +82,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; @@ -111,15 +111,20 @@ public class OrderElementServiceTest { @Resource private IDataBootstrap materialCategoryBootstrap; + @Resource + private IDataBootstrap unitTypeBootstrap; + @Resource private IDataBootstrap criterionsBootstrap; - @Before + @Test + @Rollback(false) public void loadRequiredaData() { defaultAdvanceTypesBootstrapListener.loadRequiredData(); configurationBootstrap.loadRequiredData(); materialCategoryBootstrap.loadRequiredData(); criterionsBootstrap.loadRequiredData(); + unitTypeBootstrap.loadRequiredData(); } @Autowired @@ -137,8 +142,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()); @@ -151,8 +160,6 @@ public class OrderElementServiceTest { labelType.dontPoseAsTransientObjectAnymore(); label.dontPoseAsTransientObjectAnymore(); - - return label; } @Test @@ -161,15 +168,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)); } @@ -181,9 +193,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; @@ -201,15 +216,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)); } @@ -221,14 +237,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"))); @@ -240,19 +257,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 @@ -267,14 +284,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)); } @@ -296,8 +315,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 @@ -315,7 +335,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"; @@ -331,12 +350,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 @@ -351,15 +375,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)); } @@ -378,8 +404,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 @@ -393,22 +420,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); @@ -416,12 +443,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 @@ -436,8 +469,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 @@ -462,8 +496,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 @@ -481,7 +516,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"; @@ -494,12 +528,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 @@ -514,8 +553,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 @@ -528,7 +568,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"; @@ -536,15 +575,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 @@ -557,7 +601,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(); @@ -570,25 +614,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"); @@ -601,37 +639,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"); @@ -648,25 +690,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()) { @@ -675,14 +724,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"); @@ -697,48 +748,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)); } @@ -748,7 +806,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"); @@ -764,8 +822,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 @@ -789,7 +848,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"); @@ -806,8 +865,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); @@ -823,7 +883,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"); @@ -841,8 +901,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); @@ -853,12 +914,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); @@ -872,15 +939,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"); @@ -896,8 +964,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); @@ -908,7 +977,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"); @@ -928,20 +998,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"); @@ -963,8 +1034,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); @@ -973,15 +1045,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 @@ -991,7 +1064,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"); @@ -1011,8 +1084,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); @@ -1021,12 +1095,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); @@ -1039,15 +1118,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"); @@ -1069,40 +1147,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 @@ -1112,7 +1196,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"); @@ -1134,8 +1218,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); @@ -1146,19 +1230,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/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/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/criterion/api/CriterionServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/criterion/api/CriterionServiceTest.java index 34056c363..445d40af0 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/criterion/api/CriterionServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/criterion/api/CriterionServiceTest.java @@ -68,6 +68,32 @@ public class CriterionServiceTest { @Autowired private ICriterionTypeDAO criterionTypeDAO; + @Test + public void testAddCriterionWithSameCodeDistinctTypes() { + + /* Build criterion type "ct1" (5 constraint violations). */ + CriterionDTO c1 = new CriterionDTO("new_c1_code", "new_c1", true, + new ArrayList()); + + List ct1Criterions = new ArrayList(); + ct1Criterions.add(c1); + + CriterionTypeDTO ct1 = new CriterionTypeDTO("new_type_A", "desc", + false, true, true, ResourceEnumDTO.RESOURCE, ct1Criterions); + + CriterionTypeDTO ct2 = new CriterionTypeDTO("new_type_B", "desc", true, + true, false, ResourceEnumDTO.RESOURCE, null); + + /* Criterion type list. */ + CriterionTypeListDTO criterionTypes = createCriterionTypeListDTO(ct1, + ct2); + + List instanceConstraintViolationsList = criterionService + .addCriterionTypes(criterionTypes).instanceConstraintViolationsList; + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); + } + @Test public void testAddAndGetCriterionTypes() { diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/unittypes/UnitTypeServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/unittypes/UnitTypeServiceTest.java new file mode 100644 index 000000000..2161d4989 --- /dev/null +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/unittypes/UnitTypeServiceTest.java @@ -0,0 +1,168 @@ +/* + * 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.unittypes; + +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; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.hibernate.SessionFactory; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.IDataBootstrap; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; +import org.navalplanner.business.materials.entities.UnitType; +import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; +import org.navalplanner.ws.unittypes.api.IUnitTypeService; +import org.navalplanner.ws.unittypes.api.UnitTypeDTO; +import org.navalplanner.ws.unittypes.api.UnitTypeListDTO; +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; + +/** + * Tests for IUnitTypeService. + * @author Susana Montes Pedreira + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class UnitTypeServiceTest { + + @Autowired + private SessionFactory sessionFactory; + + @Autowired + private IUnitTypeService unitTypeService; + + @Autowired + private IUnitTypeDAO unitTypeDAO; + + @Resource + private IDataBootstrap unitTypeBootstrap; + + @Test + @Rollback(false) + public void loadRequiredaData() { + unitTypeBootstrap.loadRequiredData(); + } + + @Test + public void testAddUnitTypeRepeatedMeasure() { + /* Build material with same code (1 constraint violations). */ + UnitTypeDTO m1 = new UnitTypeDTO("CodeA", "measure1"); + UnitTypeDTO m2 = new UnitTypeDTO("CodeB", "measure1"); + UnitTypeDTO m3 = new UnitTypeDTO("measure1"); + + List unitTypeDTOs = new ArrayList(); + unitTypeDTOs.add(m1); + unitTypeDTOs.add(m2); + unitTypeDTOs.add(m3); + + UnitTypeListDTO unitTypeListDTO = createUnitTypeListDTO(m1, m2); + + List instanceConstraintViolationsList = unitTypeService + .addUnitTypes(unitTypeListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 1); + } + + @Test + public void testAddAndUpdateMaterialCategory() { + /* Build unittype (0 constraint violations). */ + UnitTypeDTO m1 = new UnitTypeDTO("XXX", "measureX"); + UnitTypeDTO m2 = new UnitTypeDTO("YYY", "measureY"); + + List unitTypeDTOs = new ArrayList(); + unitTypeDTOs.add(m1); + unitTypeDTOs.add(m2); + + UnitTypeListDTO unitTypeListDTO = createUnitTypeListDTO(m1, m2); + + List instanceConstraintViolationsList = unitTypeService + .addUnitTypes(unitTypeListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); + + try { + UnitType typeX = unitTypeDAO.findByCode("XXX"); + assertTrue(typeX.getMeasure().equalsIgnoreCase("measureX")); + UnitType typeY = unitTypeDAO.findByCode("YYY"); + assertTrue(typeY.getMeasure().equalsIgnoreCase("measureY")); + unitTypeDAO.flush(); + sessionFactory.getCurrentSession().evict(typeX); + sessionFactory.getCurrentSession().evict(typeY); + } catch (InstanceNotFoundException e) { + fail(); + } + + /* Update the measure unit type */ + m1 = new UnitTypeDTO("XXX", "update-measureX"); + m2 = new UnitTypeDTO("YYY", "update-measureY"); + + unitTypeDTOs = new ArrayList(); + unitTypeDTOs.add(m1); + unitTypeDTOs.add(m2); + + unitTypeListDTO = createUnitTypeListDTO(m1, m2); + + instanceConstraintViolationsList = unitTypeService + .addUnitTypes(unitTypeListDTO).instanceConstraintViolationsList; + + assertTrue(instanceConstraintViolationsList.toString(), + instanceConstraintViolationsList.size() == 0); + + try { + UnitType typeX = unitTypeDAO.findByCode("XXX"); + assertTrue(typeX.getMeasure().equalsIgnoreCase("update-measureX")); + UnitType typeY = unitTypeDAO.findByCode("YYY"); + assertTrue(typeY.getMeasure().equalsIgnoreCase("update-measureY")); + } catch (InstanceNotFoundException e) { + fail(); + } + } + + private UnitTypeListDTO createUnitTypeListDTO(UnitTypeDTO... unitTypeDTOs) { + + List unitTypeList = new ArrayList(); + + for (UnitTypeDTO c : unitTypeDTOs) { + unitTypeList.add(c); + } + + return new UnitTypeListDTO(unitTypeList); + + } + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index c06f74759..2f5ee4f42 100644 --- a/pom.xml +++ b/pom.xml @@ -218,6 +218,17 @@ org.hibernate hibernate 3.2.7.ga + + + javax.transaction + jta + + +
+ + org.apache.geronimo.specs + geronimo-jta_1.0.1B_spec + 1.1.1 org.hibernate diff --git a/scripts/rest-clients/README b/scripts/rest-clients/README index 0a8d22d1c..a689b64bf 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: @@ -88,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 diff --git a/scripts/rest-clients/export-material-categories.sh b/scripts/rest-clients/export-material-categories.sh new file mode 100755 index 000000000..fdd242d5a --- /dev/null +++ b/scripts/rest-clients/export-material-categories.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/materialcategories | tidy -xml -i -q -utf8 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/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 diff --git a/scripts/rest-clients/export-unit-types.sh b/scripts/rest-clients/export-unit-types.sh new file mode 100755 index 000000000..b721d9b57 --- /dev/null +++ b/scripts/rest-clients/export-unit-types.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +. ./rest-common-env.sh + +printf "Login name: " +read loginName +printf "Password: " +read password + +if [ "$1" = "--prod" ]; then + baseServiceURL=$PRODUCTION_BASE_SERVICE_URL + certificate=$PRODUCTION_CERTIFICATE +else + baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL + certificate=$DEVELOPMENT_CERTIFICATE +fi + +authorization=`./base64.sh $loginName:$password` + +curl -sv -X GET $certificate --header "Authorization: Basic $authorization" \ + $baseServiceURL/unittypes | tidy -xml -i -q -utf8 diff --git a/scripts/rest-clients/import-material-categories.sh b/scripts/rest-clients/import-material-categories.sh new file mode 100755 index 000000000..91419197c --- /dev/null +++ b/scripts/rest-clients/import-material-categories.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/materialcategories | 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/import-unit-types.sh b/scripts/rest-clients/import-unit-types.sh new file mode 100755 index 000000000..5badb3710 --- /dev/null +++ b/scripts/rest-clients/import-unit-types.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +. ./rest-common-env.sh + +printf "Login name: " +read loginName +printf "Password: " +read password + +baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL +certificate=$DEVELOPMENT_CERTIFICATE + +for i in "$@" +do + if [ "$i" = "--prod" ]; then + baseServiceURL=$PRODUCTION_BASE_SERVICE_URL + certificate=$PRODUCTION_CERTIFICATE + else + file=$i + fi +done + +if [ "$file" = "" ]; then + printf "Missing file\n" 1>&2 + exit 1 +fi + +authorization=`./base64.sh $loginName:$password` + +curl -sv -X POST $certificate -d @$file \ + --header "Content-type: application/xml" \ + --header "Authorization: Basic $authorization" \ + $baseServiceURL/unittypes | tidy -xml -i -q -utf8 diff --git a/scripts/rest-clients/material-categories-sample.xml b/scripts/rest-clients/material-categories-sample.xml new file mode 100644 index 000000000..d19af03f9 --- /dev/null +++ b/scripts/rest-clients/material-categories-sample.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/rest-clients/rest-common-env.sh b/scripts/rest-clients/rest-common-env.sh index d839556d8..17646de4c 100755 --- a/scripts/rest-clients/rest-common-env.sh +++ b/scripts/rest-clients/rest-common-env.sh @@ -1,8 +1,9 @@ DEVELOPMENT_BASE_SERVICE_URL=http://localhost:8080/navalplanner-webapp/ws/rest -PRODUCTION_BASE_SERVICE_URL=https://naval.igalia.com/navalplanner-webapp/ws/rest +PRODUCTION_BASE_SERVICE_URL=http://www.navalplan.org/navalplanner-webapp/ws/rest DEVELOPMENT_CERTIFICATE="" +PRODUCTION_CERTIFICATE="" # FIXME: Until we have a valid production certificate, accept any # server-provided certificate. -PRODUCTION_CERTIFICATE=-k +#PRODUCTION_CERTIFICATE=-k #PRODUCTION_CERTIFICATE=--cacert igalia-certificate.pem diff --git a/scripts/rest-clients/unit-types-sample.xml b/scripts/rest-clients/unit-types-sample.xml new file mode 100644 index 000000000..8d35bfc4b --- /dev/null +++ b/scripts/rest-clients/unit-types-sample.xml @@ -0,0 +1,11 @@ + + + + + + + + + + +