From 71412758e17f020094abef5dc2569c3e6386309e Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 8 Dec 2008 16:09:54 +0000 Subject: [PATCH] Introduce service servlet ASSIGNED - bug 71: Extend capabilities of web services https://www.argeo.org/bugzilla/show_bug.cgi?id=71 git-svn-id: https://svn.argeo.org/slc/trunk@1959 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../src/main/config/jetty/jetty-test.xml | 2 +- .../webapp/WEB-INF/slc-service-servlet.xml | 9 +++ .../src/main/webapp/WEB-INF/web.xml | 11 ++++ .../web/mvc/AbstractServiceController.java | 59 +++++++++++++++++++ .../org/argeo/slc/web/mvc/MarshallerView.java | 52 ++++++++++++++++ .../slc/web/mvc/MarshallerViewResolver.java | 32 ++++++++++ .../web/mvc/XsltMarshallerViewResolver.java | 6 ++ .../web/mvc/result/GetResultController.java | 32 ++++++++++ .../slc/server/spring/slc-service-servlet.xml | 55 +++++++++++++++++ .../org/argeo/slc/msg/ExecutionAnswer.java | 8 +++ 10 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 org.argeo.slc.webapp/src/main/webapp/WEB-INF/slc-service-servlet.xml create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/AbstractServiceController.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerView.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerViewResolver.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/result/GetResultController.java create mode 100644 runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/spring/slc-service-servlet.xml diff --git a/org.argeo.slc.webapp/src/main/config/jetty/jetty-test.xml b/org.argeo.slc.webapp/src/main/config/jetty/jetty-test.xml index fda6c1692..a214a0140 100644 --- a/org.argeo.slc.webapp/src/main/config/jetty/jetty-test.xml +++ b/org.argeo.slc.webapp/src/main/config/jetty/jetty-test.xml @@ -24,7 +24,7 @@ + default="jdbc:hsqldb:file:/home/mbaudier/dev/work/slcDbs/slcMainDs" /> sa diff --git a/org.argeo.slc.webapp/src/main/webapp/WEB-INF/slc-service-servlet.xml b/org.argeo.slc.webapp/src/main/webapp/WEB-INF/slc-service-servlet.xml new file mode 100644 index 000000000..11ae5380d --- /dev/null +++ b/org.argeo.slc.webapp/src/main/webapp/WEB-INF/slc-service-servlet.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/org.argeo.slc.webapp/src/main/webapp/WEB-INF/web.xml b/org.argeo.slc.webapp/src/main/webapp/WEB-INF/web.xml index 987fcf098..55a573449 100644 --- a/org.argeo.slc.webapp/src/main/webapp/WEB-INF/web.xml +++ b/org.argeo.slc.webapp/src/main/webapp/WEB-INF/web.xml @@ -5,6 +5,17 @@ SLC Web Application + + + slc-service + org.springframework.web.servlet.DispatcherServlet + + + + slc-service + *.service + + slc-ws diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/AbstractServiceController.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/AbstractServiceController.java new file mode 100644 index 000000000..3b10f0b22 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/AbstractServiceController.java @@ -0,0 +1,59 @@ +package org.argeo.slc.web.mvc; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.slc.msg.ExecutionAnswer; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.AbstractController; + +public abstract class AbstractServiceController extends AbstractController { + public final static String KEY_ANSWER = "__answer"; + + private String viewName = null; + + @Override + protected final ModelAndView handleRequestInternal( + HttpServletRequest request, HttpServletResponse response) + throws Exception { + ModelAndView mv = new ModelAndView(); + mv.setViewName(getViewName()); + try { + handleServiceRequest(request, response, mv); + } catch (Exception e) { + StringWriter writer = new StringWriter(); + e.printStackTrace(new PrintWriter(writer)); + ExecutionAnswer answer = ExecutionAnswer.error(writer.toString()); + ModelAndView errorMv = new ModelAndView(); + errorMv.addObject(KEY_ANSWER, answer); + errorMv.setViewName(KEY_ANSWER); + return errorMv; + } + + if (mv.getModel().size() == 0) { + mv.addObject(KEY_ANSWER, ExecutionAnswer + .ok("Execution completed properly")); + } + + if (mv.getViewName() == null && mv.getModel().size() == 1) + mv.setViewName(mv.getModel().keySet().iterator().next().toString()); + + return mv; + } + + protected abstract void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception; + + public void setViewName(String viewName) { + this.viewName = viewName; + } + + public String getViewName() { + return viewName; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerView.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerView.java new file mode 100644 index 000000000..61bafce94 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerView.java @@ -0,0 +1,52 @@ +package org.argeo.slc.web.mvc; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.transform.stream.StreamResult; + +import org.argeo.slc.SlcException; +import org.springframework.oxm.Marshaller; +import org.springframework.web.servlet.view.AbstractView; + +/** Marshal one of the object of the map to the output. */ +public class MarshallerView extends AbstractView { + private String modelKey = null; + private final Marshaller marshaller; + + public MarshallerView(Marshaller marshaller) { + this.marshaller = marshaller; + } + + public MarshallerView(Marshaller marshaller, String modelKey) { + this(marshaller); + this.modelKey = modelKey; + } + + @Override + protected void renderMergedOutputModel(Map model, + HttpServletRequest request, HttpServletResponse response) + throws Exception { + final Object answer; + if (modelKey != null) { + if (!model.containsKey(modelKey)) + throw new SlcException("Key " + modelKey + + " not found in model."); + answer = model.get(modelKey); + } else { + if (model.size() != 1) + throw new SlcException( + "Model has a size different from 1. Specify a modelKey."); + answer = model.values().iterator().next(); + } + + StreamResult streamResult = new StreamResult(response.getOutputStream()); + marshaller.marshal(answer, streamResult); + } + + public void setModelKey(String modelKey) { + this.modelKey = modelKey; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerViewResolver.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerViewResolver.java new file mode 100644 index 000000000..52ff190b7 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/MarshallerViewResolver.java @@ -0,0 +1,32 @@ +package org.argeo.slc.web.mvc; + +import java.util.Locale; + +import org.springframework.oxm.Marshaller; +import org.springframework.web.servlet.View; +import org.springframework.web.servlet.view.AbstractCachingViewResolver; + +/** + * Returns a MarshallerView based on the underlying marshaller. View name is the + * model key of the marshaller view. + */ +public class MarshallerViewResolver extends AbstractCachingViewResolver { + private final Marshaller marshaller; + + public MarshallerViewResolver(Marshaller marshaller) { + super(); + this.marshaller = marshaller; + } + + /** + * Caches a marshaller view. + * + * @param viewName + * van be null, default marshaller view behavior is then used + */ + @Override + protected View loadView(String viewName, Locale locale) throws Exception { + return new MarshallerView(marshaller, viewName); + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java index f8b89aa03..b28a39ca6 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java @@ -17,6 +17,12 @@ import org.springframework.oxm.Marshaller; import org.springframework.web.servlet.view.AbstractUrlBasedView; import org.springframework.web.servlet.view.xslt.XsltViewResolver; +/** + * Xslt View resolver implementing URI resolver as well. + * + * @see URIResolver + * @see XsltViewResolver + */ public class XsltMarshallerViewResolver extends XsltViewResolver implements URIResolver { private final static Log log = LogFactory diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/result/GetResultController.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/result/GetResultController.java new file mode 100644 index 000000000..4fef228a3 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/result/GetResultController.java @@ -0,0 +1,32 @@ +package org.argeo.slc.web.mvc.result; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.slc.core.test.tree.TreeTestResult; +import org.argeo.slc.dao.test.tree.TreeTestResultDao; +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.web.servlet.ModelAndView; + +/** Returns one single result. */ +public class GetResultController extends AbstractServiceController { + public final static String MODELKEY_RESULT = "result"; + + private final TreeTestResultDao testResultDao; + + public GetResultController(TreeTestResultDao testResultDao) { + this.testResultDao = testResultDao; + } + + @Override + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + + String uuid = request.getParameter("uuid"); + TreeTestResult result = testResultDao.getTestResult(uuid); + + modelAndView.addObject(MODELKEY_RESULT, result); + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/spring/slc-service-servlet.xml b/runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/spring/slc-service-servlet.xml new file mode 100644 index 000000000..0e30401c8 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/spring/slc-service-servlet.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java index 4a036ccfe..e113f98bb 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java @@ -40,4 +40,12 @@ public class ExecutionAnswer { this.message = message; } + public static ExecutionAnswer error(String message) { + return new ExecutionAnswer(ERROR, message); + } + + public static ExecutionAnswer ok(String message) { + return new ExecutionAnswer(OK, message); + } + } -- 2.39.2