<New class="org.hsqldb.jdbc.jdbcDataSource">
<Set name="database">
<Property name="jdbcUrl"
- default="jdbc:hsqldb:mem:mainDs" />
+ default="jdbc:hsqldb:file:/home/mbaudier/dev/work/slcDbs/slcMainDs" />
</Set>
<Set name="user">sa</Set>
<Set name="password"></Set>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
+
+ <import
+ resource="classpath:/org/argeo/slc/server/spring/slc-service-servlet.xml" />
+</beans>
\ No newline at end of file
<display-name>SLC Web Application</display-name>
+ <!-- SERVICE servlet -->
+ <servlet>
+ <servlet-name>slc-service</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>slc-service</servlet-name>
+ <url-pattern>*.service</url-pattern>
+ </servlet-mapping>
+
<!-- WS servlet -->
<servlet>
<servlet-name>slc-ws</servlet-name>
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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);
+ }
+
+}
import org.springframework.web.servlet.view.AbstractUrlBasedView;\r
import org.springframework.web.servlet.view.xslt.XsltViewResolver;\r
\r
+/**\r
+ * Xslt View resolver implementing URI resolver as well.\r
+ * \r
+ * @see URIResolver\r
+ * @see XsltViewResolver\r
+ */\r
public class XsltMarshallerViewResolver extends XsltViewResolver implements\r
URIResolver {\r
private final static Log log = LogFactory\r
--- /dev/null
+package org.argeo.slc.web.mvc.result;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import org.argeo.slc.core.test.tree.TreeTestResult;\r
+import org.argeo.slc.dao.test.tree.TreeTestResultDao;\r
+import org.argeo.slc.web.mvc.AbstractServiceController;\r
+import org.springframework.web.servlet.ModelAndView;\r
+\r
+/** Returns one single result. */\r
+public class GetResultController extends AbstractServiceController {\r
+ public final static String MODELKEY_RESULT = "result";\r
+\r
+ private final TreeTestResultDao testResultDao;\r
+\r
+ public GetResultController(TreeTestResultDao testResultDao) {\r
+ this.testResultDao = testResultDao;\r
+ }\r
+\r
+ @Override\r
+ protected void handleServiceRequest(HttpServletRequest request,\r
+ HttpServletResponse response, ModelAndView modelAndView)\r
+ throws Exception {\r
+\r
+ String uuid = request.getParameter("uuid");\r
+ TreeTestResult result = testResultDao.getTestResult(uuid);\r
+\r
+ modelAndView.addObject(MODELKEY_RESULT, result);\r
+ }\r
+\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
+
+ <import resource="classpath:/org/argeo/slc/castor/spring/applicationContext.xml" />
+
+ <bean name="/resultList.service" class="org.argeo.slc.web.mvc.result.ResultListController">
+ <constructor-arg ref="testResultDao" />
+ <property name="viewName" value="resultList" />
+ </bean>
+
+ <bean name="/getResult.service" class="org.argeo.slc.web.mvc.result.GetResultController">
+ <constructor-arg ref="testResultDao" />
+ </bean>
+
+ <bean name="/resultCollectionList.service"
+ class="org.argeo.slc.web.mvc.result.ResultCollectionListController">
+ <constructor-arg ref="testResultCollectionDao" />
+ <property name="viewName" value="resultCollectionList" />
+ </bean>
+
+ <bean name="/resultCollectionView.service"
+ class="org.argeo.slc.web.mvc.result.ResultCollectionViewController">
+ <constructor-arg ref="testResultCollectionDao" />
+ <property name="viewName" value="resultCollectionView" />
+ </bean>
+
+ <bean name="/addResultToCollection.service"
+ class="org.argeo.slc.web.mvc.result.AddResultToCollectionController">
+ <constructor-arg ref="testManagerService" />
+ <property name="viewName" value="addResultToCollectionS" />
+ </bean>
+
+ <bean name="/removeResultFromCollection.service"
+ class="org.argeo.slc.web.mvc.result.RemoveResultFromCollectionController">
+ <constructor-arg ref="testManagerService" />
+ <property name="viewName" value="removeResultFromCollectionS" />
+ </bean>
+
+ <bean id="handlerMapping"
+ class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
+ <property name="interceptors">
+ <list>
+ <ref bean="osivInterceptor" />
+ </list>
+ </property>
+ </bean>
+
+ <bean id="viewResolver" class="org.argeo.slc.web.mvc.MarshallerViewResolver">
+ <constructor-arg ref="slcDefault.castor.marshaller" />
+ </bean>
+
+
+</beans>
\ No newline at end of file
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);
+ }
+
}