diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ISaveCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ISaveCommand.java
new file mode 100644
index 000000000..ffef9bf5a
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ISaveCommand.java
@@ -0,0 +1,16 @@
+package org.navalplanner.web.planner;
+
+import java.util.List;
+
+import org.navalplanner.business.planner.entities.TaskElement;
+import org.zkoss.ganttz.extensions.ICommand;
+
+/**
+ * Contract for {@link SaveCommand}
+ * @author Óscar González Fernández
+ */
+public interface ISaveCommand extends ICommand {
+
+ public void setState(List taskElements);
+
+}
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 48649af3e..60da089e2 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
@@ -46,7 +46,11 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel {
if (!orderReloaded.isSomeTaskElementScheduled())
throw new IllegalArgumentException("the order " + order
+ " must be scheduled");
- onTransaction.use(createConfiguration(orderReloaded));
+ PlannerConfiguration configuration = createConfiguration(orderReloaded);
+ ISaveCommand saveCommand = getSaveCommand();
+ saveCommand.setState(state);
+ configuration.addGlobalCommand(saveCommand);
+ onTransaction.use(configuration);
}
private PlannerConfiguration createConfiguration(
@@ -76,6 +80,8 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel {
// spring method injection
protected abstract ITaskElementAdapter getTaskElementAdapter();
+ protected abstract ISaveCommand getSaveCommand();
+
private Order reload(Order order) {
try {
return orderService.find(order.getId());
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SaveCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SaveCommand.java
new file mode 100644
index 000000000..c242c68a9
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SaveCommand.java
@@ -0,0 +1,48 @@
+package org.navalplanner.web.planner;
+
+import java.util.List;
+
+import org.navalplanner.business.planner.entities.TaskElement;
+import org.navalplanner.business.planner.services.ITaskElementService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.zkoss.ganttz.extensions.IContext;
+
+@Component
+@Scope(BeanDefinition.SCOPE_PROTOTYPE)
+/**
+ * A command that saves the changes in the taskElements.
+ * It can be considered the final step in the conversation
+ * @author Óscar González Fernández
+ */
+public class SaveCommand implements ISaveCommand {
+
+ @Autowired
+ private ITaskElementService taskElementService;
+
+ private List taskElements;
+
+ @Override
+ public void setState(List taskElements) {
+ this.taskElements = taskElements;
+
+ }
+
+ @Override
+ @Transactional
+ public void doAction(IContext context) {
+ for (TaskElement taskElement : taskElements) {
+ taskElementService.save(taskElement);
+ }
+ // TODO redirect to another page or show message
+ }
+
+ @Override
+ public String getName() {
+ return "Gardar";
+ }
+
+}
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 bfba9720e..603df0341 100644
--- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml
+++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml
@@ -17,6 +17,7 @@
+