+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.seedstack.seed.security.spi;
+
+import org.seedstack.seed.security.CrudAction;
+
+import java.lang.reflect.Method;
+import java.util.Optional;
+
+/**
+ * A class implementing {@link CrudActionResolver} provides logic to resolve the {@link CrudAction} that is associated
+ * to a particular method. For instance, a JAX-RS resolver could use JAX-RS annotations to determine the ongoing CRUD
+ * action. Another example would be a Servlet resolver which can use the method signature of an HttpServlet to determine
+ * the corresponding action.
+ *
+ *
+ * Classes implementing this interface can be annotated with {@link javax.annotation.Priority} to define an absolute
+ * order among them.
+ *
+ */
+public interface CrudActionResolver {
+ /**
+ * Resolves a {@link CrudAction} from the specified method object.
+ *
+ * @param method the method object.
+ * @return an optionally resolved {@link CrudAction}.
+ */
+ Optional resolve(Method method);
+}
\ No newline at end of file
diff --git a/specs/pom.xml b/specs/pom.xml
index d7f0fd3d7..967fa4060 100644
--- a/specs/pom.xml
+++ b/specs/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.seed
seed
- 3.3.1-SNAPSHOT
+ 3.3.2-SNAPSHOT
seed-specs
diff --git a/testing/pom.xml b/testing/pom.xml
index 05cc3dabe..d59c2f3ef 100644
--- a/testing/pom.xml
+++ b/testing/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.seed
seed
- 3.3.1-SNAPSHOT
+ 3.3.2-SNAPSHOT
seed-testing
diff --git a/web/core/pom.xml b/web/core/pom.xml
index 9c0da8c0b..c4e790001 100644
--- a/web/core/pom.xml
+++ b/web/core/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.seed
seed-web
- 3.3.1-SNAPSHOT
+ 3.3.2-SNAPSHOT
seed-web-core
diff --git a/web/core/src/main/java/org/seedstack/seed/web/internal/ServletCrudActionResolver.java b/web/core/src/main/java/org/seedstack/seed/web/internal/ServletCrudActionResolver.java
new file mode 100644
index 000000000..ebc67be73
--- /dev/null
+++ b/web/core/src/main/java/org/seedstack/seed/web/internal/ServletCrudActionResolver.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2013-2016, The SeedStack authors
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.seedstack.seed.web.internal;
+
+import org.seedstack.seed.security.CrudAction;
+import org.seedstack.seed.security.spi.CrudActionResolver;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Optional;
+
+class ServletCrudActionResolver implements CrudActionResolver {
+ private static final Class>[] PARAMETER_TYPES = {HttpServletRequest.class, HttpServletResponse.class};
+
+ @Override
+ public Optional resolve(Method method) {
+ if (HttpServlet.class.isAssignableFrom(method.getDeclaringClass()) && Arrays.equals(method.getParameterTypes(), PARAMETER_TYPES)) {
+ switch (method.getName()) {
+ case "doDelete":
+ return Optional.of(CrudAction.DELETE);
+ case "doGet":
+ return Optional.of(CrudAction.READ);
+ case "doHead":
+ return Optional.of(CrudAction.READ);
+ case "doOptions":
+ return Optional.of(CrudAction.READ);
+ case "doPost":
+ return Optional.of(CrudAction.CREATE);
+ case "doPut":
+ return Optional.of(CrudAction.UPDATE);
+ case "doTrace":
+ return Optional.of(CrudAction.READ);
+ }
+ }
+ return Optional.empty();
+ }
+}
diff --git a/web/core/src/test/java/org/seedstack/seed/web/internal/ServletCrudActionResolverTest.java b/web/core/src/test/java/org/seedstack/seed/web/internal/ServletCrudActionResolverTest.java
new file mode 100644
index 000000000..1334adcb2
--- /dev/null
+++ b/web/core/src/test/java/org/seedstack/seed/web/internal/ServletCrudActionResolverTest.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2013-2016, The SeedStack authors
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.seedstack.seed.web.internal;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.seedstack.seed.security.CrudAction;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ServletCrudActionResolverTest {
+ private ServletCrudActionResolver resolverUnderTest;
+
+ @Before
+ public void setup() throws Exception {
+ resolverUnderTest = new ServletCrudActionResolver();
+ }
+
+ @Test
+ public void resolveRightVerb() throws Exception {
+ assertThat(resolverUnderTest.resolve(Fixture.class.getDeclaredMethod("doGet", HttpServletRequest.class, HttpServletResponse.class))).isEqualTo(Optional.of(CrudAction.READ));
+ assertThat(resolverUnderTest.resolve(Fixture.class.getDeclaredMethod("doHead", HttpServletRequest.class, HttpServletResponse.class))).isEqualTo(Optional.of(CrudAction.READ));
+ assertThat(resolverUnderTest.resolve(Fixture.class.getDeclaredMethod("doPost", HttpServletRequest.class, HttpServletResponse.class))).isEqualTo(Optional.of(CrudAction.CREATE));
+ assertThat(resolverUnderTest.resolve(Fixture.class.getDeclaredMethod("doPut", HttpServletRequest.class, HttpServletResponse.class))).isEqualTo(Optional.of(CrudAction.UPDATE));
+ assertThat(resolverUnderTest.resolve(Fixture.class.getDeclaredMethod("doDelete", HttpServletRequest.class, HttpServletResponse.class))).isEqualTo(Optional.of(CrudAction.DELETE));
+ assertThat(resolverUnderTest.resolve(Fixture.class.getDeclaredMethod("doOptions", HttpServletRequest.class, HttpServletResponse.class))).isEqualTo(Optional.of(CrudAction.READ));
+ assertThat(resolverUnderTest.resolve(Fixture.class.getDeclaredMethod("doTrace", HttpServletRequest.class, HttpServletResponse.class))).isEqualTo(Optional.of(CrudAction.READ));
+ assertThat(resolverUnderTest.resolve(Fixture.class.getMethod("doGet"))).isNotPresent();
+ }
+
+ // Test Fixture
+ public static class Fixture extends HttpServlet {
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doGet(req, resp);
+ }
+
+ @Override
+ protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doHead(req, resp);
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doPost(req, resp);
+ }
+
+ @Override
+ protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doPut(req, resp);
+ }
+
+ @Override
+ protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doDelete(req, resp);
+ }
+
+ @Override
+ protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doOptions(req, resp);
+ }
+
+ @Override
+ protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doTrace(req, resp);
+ }
+
+ public void doGet() {
+
+ }
+ }
+}
diff --git a/web/pom.xml b/web/pom.xml
index dc8929ce9..85b1b2b53 100644
--- a/web/pom.xml
+++ b/web/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.seed
seed
- 3.3.1-SNAPSHOT
+ 3.3.2-SNAPSHOT
seed-web
diff --git a/web/security/pom.xml b/web/security/pom.xml
index 4ae41fbbb..ef7f8436a 100644
--- a/web/security/pom.xml
+++ b/web/security/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.seed
seed-web
- 3.3.1-SNAPSHOT
+ 3.3.2-SNAPSHOT
seed-web-security
diff --git a/web/specs/pom.xml b/web/specs/pom.xml
index 1233f17d8..cfc0b2643 100644
--- a/web/specs/pom.xml
+++ b/web/specs/pom.xml
@@ -13,7 +13,7 @@
org.seedstack.seed
seed-web
- 3.3.1-SNAPSHOT
+ 3.3.2-SNAPSHOT
seed-web-specs
diff --git a/web/undertow/pom.xml b/web/undertow/pom.xml
index 45a367fab..8308d7b71 100644
--- a/web/undertow/pom.xml
+++ b/web/undertow/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.seed
seed-web
- 3.3.1-SNAPSHOT
+ 3.3.2-SNAPSHOT
seed-web-undertow