diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/MatrixParameters.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/MatrixParameters.java
new file mode 100644
index 000000000..555dfa19d
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/MatrixParameters.java
@@ -0,0 +1,33 @@
+package org.navalplanner.web.common;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Extracts matrix
+ * parameters.
+ * @author Óscar González Fernández
+ */
+public class MatrixParameters {
+
+ private static Pattern matrixParamPattern = Pattern
+ .compile(";([^/=;]+)=?([^/;]+)?");
+
+ public static Map extract(HttpServletRequest request) {
+ return extract(request.getRequestURI());
+ }
+
+ public static Map extract(String string) {
+ Map result = new HashMap();
+ Matcher matcher = matrixParamPattern.matcher(string);
+ while (matcher.find()) {
+ result.put(matcher.group(1), matcher.group(2));
+ }
+ return result;
+ }
+
+}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java
index e479dbf01..c411a391f 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java
@@ -59,6 +59,12 @@ public class CriterionWorkersController extends GenericForwardComposer {
return criterionsModel.isChangeAssignmentsDisabled();
}
+ public void goToEditPage(Resource resource) {
+ System.out.println("going to edit page for: " + resource);
+ desktop.getExecution().sendRedirect(
+ "/resources/worker/worker.zul;edit=" + resource.getId());
+ }
+
@Override
public void doAfterCompose(final Component comp) throws Exception {
super.doAfterCompose(comp);
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java
index ca545481e..bd3e2d829 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java
@@ -29,4 +29,6 @@ public interface IWorkerModel {
Set getCriterionSatisfactions(Worker worker);
+ Worker findResource(long workerId);
+
}
\ No newline at end of file
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 35e860f04..66a8dd759 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
@@ -1,12 +1,16 @@
package org.navalplanner.web.resources.worker;
import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
import org.hibernate.validator.InvalidValue;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.web.common.IMessagesForUser;
import org.navalplanner.web.common.Level;
+import org.navalplanner.web.common.MatrixParameters;
import org.navalplanner.web.common.MessagesForUser;
import org.navalplanner.web.common.OnlyOneVisible;
import org.navalplanner.web.common.Util;
@@ -119,6 +123,15 @@ public class WorkerCRUDController extends GenericForwardComposer {
if (messagesContainer == null)
throw new RuntimeException("messagesContainer is needed");
messages = new MessagesForUser(messagesContainer);
+ Map matrixParameters = MatrixParameters
+ .extract((HttpServletRequest) execution.getNativeRequest());
+ if (matrixParameters.containsKey("create")) {
+ goToCreateForm();
+ } else if (matrixParameters.containsKey("edit")) {
+ goToEditForm(workerModel.findResource(Long
+ .parseLong(matrixParameters.get("edit"))));
+ }
+
}
private LocalizationsController createLocalizationsController(
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java
index 66c412e53..e37f1ab4f 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java
@@ -284,4 +284,13 @@ public class WorkerModel implements IWorkerModel {
return worker != null && worker.getId() == null;
}
+ @Override
+ public Worker findResource(long workerId) {
+ try {
+ return (Worker) resourceService.findResource(workerId);
+ } catch (InstanceNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
}
\ No newline at end of file
diff --git a/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul b/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul
index 4c40b3290..7cb7dc5e6 100644
--- a/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul
+++ b/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul
@@ -2,12 +2,14 @@
-
-
+
+
+
+
diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportSeveralParameters.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportSeveralParameters.java
new file mode 100644
index 000000000..a3e6dd211
--- /dev/null
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportSeveralParameters.java
@@ -0,0 +1,40 @@
+package org.navalplanner.web.common;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.Map;
+
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests that {@link MatrixParameters} supports extracting several
+ * matrix parameters
+ * @author Óscar González Fernández
+ */
+@RunWith(Theories.class)
+public class MatrixParametersSupportSeveralParameters {
+
+ @DataPoint
+ public static String TWO_PARAMETERS_IN_THE_END = "/prueba/prueba.php;color=red;size=2";
+
+ @DataPoint
+ public static String TWO_PARAMETERS_IN_THE_MIDDLE = "/prueba;color=red;size=2/prueba.php";
+
+ @DataPoint
+ public static String TWO_PARAMETERS_IN_DIFFERENT_LOCATIONS = "/prueba;color=red/prueba.php;size=2";
+
+ @Theory
+ public void oneParameterEqualToRed(String parameter) {
+ Map params = MatrixParameters
+ .extract(parameter);
+ assertThat(params.size(), equalTo(2));
+ assertThat(params.get("color"), equalTo("red"));
+ assertThat(params.get("size"), equalTo("2"));
+
+ }
+
+}
diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportsOneParameterTheory.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportsOneParameterTheory.java
new file mode 100644
index 000000000..38c7b1a38
--- /dev/null
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportsOneParameterTheory.java
@@ -0,0 +1,38 @@
+package org.navalplanner.web.common;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.Map;
+
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.runner.RunWith;
+
+/**
+ * Test that {@link MatrixParameters} support one parameter
+ * @author Óscar González Fernández
+ */
+@RunWith(Theories.class)
+public class MatrixParametersSupportsOneParameterTheory {
+
+ @DataPoint
+ public static String ONE_PARAMETER_IN_THE_END = "/prueba/prueba.php;color=red";
+
+ @DataPoint
+ public static String ONE_PARAMETER_IN_THE_MIDDLE = "/prueba;color=red/prueba.php";
+
+ @DataPoint
+ public static String ONE_PARAMETER_IN_THE_MIDDLE_WITH_SEMICOLON_AFTER = "/prueba;color=red;/prueba.php";
+
+ @Theory
+ public void oneParameterEqualToRed(String parameter) {
+ Map params = MatrixParameters
+ .extract(parameter);
+ assertThat(params.size(), equalTo(1));
+ assertThat(params.keySet().iterator().next(), equalTo("color"));
+ assertThat(params.get("color"), equalTo("red"));
+ }
+
+}
diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportsParametersWithoutValue.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportsParametersWithoutValue.java
new file mode 100644
index 000000000..d0ec9cf31
--- /dev/null
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/common/MatrixParametersSupportsParametersWithoutValue.java
@@ -0,0 +1,37 @@
+package org.navalplanner.web.common;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map;
+
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests that {@link MatrixParameters} supports matrix parameters
+ * without value
+ * @author Óscar González Fernández
+ */
+@RunWith(Theories.class)
+public class MatrixParametersSupportsParametersWithoutValue {
+
+ @DataPoint
+ public static String ONE_PARAMETER_WITHOUT_VALUE_AT_THE_END = "/blabalba/eo/prueba;create";
+
+ @DataPoint
+ public static String ONE_PARAMETER_WITHOUT_VALUE_IN_THE_MIDDLE = "/blabalba;create/eo/prueba";
+
+ @Theory
+ public void testTheory(String parameter) {
+ Map map = MatrixParameters.extract(parameter);
+ assertThat(map.size(), equalTo(1));
+ assertTrue(map.containsKey("create"));
+ assertNull(map.get("create"));
+ }
+
+}