From 90afb1c90316abea8f463ea59d21f9afcea6ba5a Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Fri, 9 Oct 2009 10:44:03 +0200 Subject: [PATCH] ItEr29S12CUVisualizacionModelosPlanificacionItEr28S15: Fixed validation exceptions raised by save milestone operation --- .../FunctionalityExposedForExtensions.java | 2 +- .../ContextRelativeToOtherComponent.java | 6 +++++ .../extensions/ContextWithPlannerTask.java | 6 +++++ .../org/zkoss/ganttz/extensions/IContext.java | 3 +++ .../main/resources/web/js/ganttz/milestone.js | 24 +++++++++++++++++ .../planner/entities/TaskElement.java | 2 -- .../planner/entities/TaskMilestone.java | 5 ---- .../business/planner/entities/Tasks.hbm.xml | 2 +- .../test/planner/daos/TaskElementDAOTest.java | 27 ++++++++++++------- .../web/planner/AddMilestoneCommand.java | 3 ++- .../web/planner/OrderPlanningModel.java | 5 +++- .../src/main/webapp/planner/css/ganttzk.css | 4 +-- 12 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 ganttzk/src/main/resources/web/js/ganttz/milestone.js diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java index dad65fb2c..e334a2d4c 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java @@ -238,7 +238,7 @@ public class FunctionalityExposedForExtensions implements IContext { add(position, list); } - IDomainAndBeansMapper getMapper() { + public IDomainAndBeansMapper getMapper() { return mapper; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java index 2a25bdb56..a05a9b02e 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java @@ -20,6 +20,7 @@ package org.zkoss.ganttz.extensions; +import org.zkoss.ganttz.adapters.IDomainAndBeansMapper; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.timetracker.TimeTracker; @@ -77,6 +78,11 @@ public class ContextRelativeToOtherComponent implements IContext { @Override public TimeTracker getTimeTracker() { return context.getTimeTracker(); + } + + @Override + public IDomainAndBeansMapper getMapper() { + return context.getMapper(); }; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java index 9efcec0a0..8be9c7474 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java @@ -20,6 +20,7 @@ package org.zkoss.ganttz.extensions; +import org.zkoss.ganttz.adapters.IDomainAndBeansMapper; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Position; import org.zkoss.ganttz.data.Task; @@ -84,4 +85,9 @@ public class ContextWithPlannerTask implements IContextWithPlannerTask { return context.getTimeTracker(); } + @Override + public IDomainAndBeansMapper getMapper() { + return context.getMapper(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java index 598defc85..1466f7164 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java @@ -23,6 +23,7 @@ package org.zkoss.ganttz.extensions; import org.zkoss.ganttz.Planner; import org.zkoss.ganttz.TaskComponent; import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties; +import org.zkoss.ganttz.adapters.IDomainAndBeansMapper; import org.zkoss.ganttz.adapters.IStructureNavigator; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Position; @@ -96,4 +97,6 @@ public interface IContext { */ TimeTracker getTimeTracker(); + IDomainAndBeansMapper getMapper(); + } diff --git a/ganttzk/src/main/resources/web/js/ganttz/milestone.js b/ganttzk/src/main/resources/web/js/ganttz/milestone.js new file mode 100644 index 000000000..41a7a7741 --- /dev/null +++ b/ganttzk/src/main/resources/web/js/ganttz/milestone.js @@ -0,0 +1,24 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * 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 . + */ + +// making believe to zk that milestone.js exists, so it doesn't throw error. +// zkMilestone code is in tasklist.js + +//This way there can be a schedule showing only tasks or taskcontainers. diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java index 59f17465f..685ebbafb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.Set; import org.apache.commons.lang.Validate; -import org.hibernate.validator.NotNull; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.orders.entities.OrderElement; @@ -51,7 +50,6 @@ public abstract class TaskElement extends BaseEntity { protected Integer shareOfHours; - @NotNull private OrderElement orderElement; private Set dependenciesWithThisOrigin = new HashSet(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java index 9bd109102..7f07fd757 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java @@ -27,12 +27,10 @@ import java.util.List; import java.util.Set; import org.apache.commons.lang.Validate; -import org.hibernate.validator.NotNull; import org.joda.time.DateTime; import org.joda.time.Days; import org.navalplanner.business.common.IValidable; import org.navalplanner.business.common.exceptions.ValidationException; -import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.OrderElement; /** @@ -46,9 +44,6 @@ public class TaskMilestone extends TaskElement implements IValidable { return milestone; } - @NotNull - private HoursGroup hoursGroup; - private CalculatedValue calculatedValue = CalculatedValue.END_DATE; private Set> resourceAllocations = new HashSet>(); diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml index 13a2afd41..6a645c036 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml @@ -15,7 +15,7 @@ - + diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/TaskElementDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/TaskElementDAOTest.java index 30552f4b1..a0be21248 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/TaskElementDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/TaskElementDAOTest.java @@ -29,6 +29,7 @@ import static org.junit.Assert.assertTrue; import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; +import java.util.Arrays; import java.util.Date; import java.util.List; @@ -36,6 +37,8 @@ import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.junit.Before; +import org.hibernate.validator.ClassValidator; +import org.hibernate.validator.InvalidValue; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.IDataBootstrap; @@ -161,16 +164,22 @@ public class TaskElementDAOTest { @Test public void canSaveMilestone() { TaskMilestone milestone = createValidTaskMilestone(); + ClassValidator validator = new ClassValidator( + TaskMilestone.class); + InvalidValue[] invalidValues = validator.getInvalidValues(milestone); + if (invalidValues.length > 0) { + throw new RuntimeException(Arrays.toString(invalidValues)); + } taskElementDAO.save(milestone); - // flushAndEvict(milestone); - // TaskElement fromDB; - // try { - // fromDB = taskElementDAO.find(milestone.getId()); - // } catch (InstanceNotFoundException e) { - // throw new RuntimeException(e); - // } - // assertThat(fromDB.getId(), equalTo(milestone.getId())); - // assertThat(fromDB, is(TaskMilestone.class)); + flushAndEvict(milestone); + TaskElement fromDB; + try { + fromDB = taskElementDAO.find(milestone.getId()); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + assertThat(fromDB.getId(), equalTo(milestone.getId())); + assertThat(fromDB, is(TaskMilestone.class)); } @Test diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/AddMilestoneCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/AddMilestoneCommand.java index 32936aa7b..345839a93 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/AddMilestoneCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/AddMilestoneCommand.java @@ -49,7 +49,8 @@ public class AddMilestoneCommand implements IAddMilestoneCommand { TaskElement task) { TaskMilestone milestone = new TaskMilestone(); milestone.setName("new milestone"); - context.add(milestone); + context.add(context.getMapper().findPositionFor(task), milestone); + planningState.added(milestone); } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java index 3f2a031fe..0a26445be 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java @@ -90,7 +90,10 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { @Override public boolean isMilestone(TaskElement object) { - return object instanceof TaskMilestone; + if (object != null) { + return object instanceof TaskMilestone; + } + return false; } } diff --git a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css index 0ed836608..40c05f63e 100644 --- a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css +++ b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css @@ -212,8 +212,8 @@ min-width:200px; width: 15px; float: right; position:relative; - left: 8px; - top: -3px; + left: 7px; + top: -13px; } .row .closed {