]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/mvc/SerializingView.java
Migrate to PDE projects for server runtime
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.core / src / main / java / org / argeo / server / mvc / SerializingView.java
1 package org.argeo.server.mvc;
2
3 import java.util.Locale;
4 import java.util.Map;
5
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8
9 import org.argeo.ArgeoException;
10 import org.argeo.server.ServerAnswer;
11 import org.argeo.server.ServerSerializer;
12 import org.springframework.validation.BindingResult;
13 import org.springframework.web.servlet.view.AbstractView;
14
15 public class SerializingView extends AbstractView implements MvcConstants {
16 private final String viewName;
17 private final Locale locale;
18
19 private final ServerSerializer serializer;
20
21 public SerializingView(String viewName, Locale locale,
22 ServerSerializer serializer) {
23 this.viewName = viewName;
24 this.locale = locale;
25 this.serializer = serializer;
26 }
27
28 @SuppressWarnings({ "unchecked", "restriction" })
29 @Override
30 protected void renderMergedOutputModel(Map model,
31 HttpServletRequest request, HttpServletResponse response)
32 throws Exception {
33 Boolean serverAnswersAsHtml = model
34 .containsKey(ANSWER_MODEL_KEY_AS_HTML);
35
36 final Object answer = findAnswerInModel(model);
37
38 if ((answer instanceof ServerAnswer) && serverAnswersAsHtml) {
39 response.setContentType("text/html");
40 ServerAnswer serverAnswer = (ServerAnswer) answer;
41 response.getWriter().append("<pre>");
42 response.getWriter().append(serverAnswer.getMessage());
43 response.getWriter().append("</pre>");
44 } else {
45 serializer.serialize(answer, request, response);
46 }
47 }
48
49 @SuppressWarnings("unchecked")
50 protected Object findAnswerInModel(Map model) {
51 if (model.size() == 1) {
52 return model.values().iterator().next();
53 } else if (model.size() == 2) {
54 boolean otherIsBindingResult = false;
55 Object answerValue = null;
56 for (Object value : model.values()) {
57 if (value instanceof BindingResult)
58 otherIsBindingResult = true;
59 else
60 answerValue = value;
61 }
62
63 if (otherIsBindingResult)
64 return answerValue;
65 }
66
67 if (model.containsKey(ANSWER_MODEL_KEY)) {
68 return model.get(ANSWER_MODEL_KEY);
69 } else if (model.containsKey(ANSWER_MODEL_KEY_AS_HTML)) {
70 return model.get(ANSWER_MODEL_KEY_AS_HTML);
71 } else if (model.containsKey(viewName)) {
72 return model.get(viewName);
73 } else {
74 if (model.size() == 0)
75 throw new ArgeoException("Model is empty.");
76 else
77 throw new ArgeoException(
78 "Model has a size different from 1. Specify a modelKey.");
79 }
80 }
81
82 public String getViewName() {
83 return viewName;
84 }
85
86 public Locale getLocale() {
87 return locale;
88 }
89
90 }