]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/mvc/SerializingView.java
74a3ec3469368355b6901dbbd01cd4d2be83b5df
[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;
14 import org.springframework.web.servlet.view.AbstractView;
15
16 /**
17 * Can be used as a standalone {@link View} or using
18 * {@link SerializingViewResolver}
19 */
20 public class SerializingView extends AbstractView implements MvcConstants {
21 private final String viewName;
22 private final Locale locale;
23
24 private ServerSerializer serializer;
25
26 public SerializingView() {
27 this.viewName = null;
28 this.locale = Locale.getDefault();
29 }
30
31 public SerializingView(String viewName, Locale locale,
32 ServerSerializer serializer) {
33 this.viewName = viewName;
34 this.locale = locale;
35 this.serializer = serializer;
36 }
37
38 @SuppressWarnings( { "unchecked", "restriction" })
39 @Override
40 protected void renderMergedOutputModel(Map model,
41 HttpServletRequest request, HttpServletResponse response)
42 throws Exception {
43 Boolean serverAnswersAsHtml = model
44 .containsKey(ANSWER_MODEL_KEY_AS_HTML);
45
46 final Object answer = findAnswerInModel(model);
47
48 if ((answer instanceof ServerAnswer) && serverAnswersAsHtml) {
49 response.setContentType("text/html");
50 ServerAnswer serverAnswer = (ServerAnswer) answer;
51 response.getWriter().append("<pre>");
52 response.getWriter().append(serverAnswer.getMessage());
53 response.getWriter().append("</pre>");
54 } else {
55 serializer.serialize(answer, request, response);
56 }
57 }
58
59 @SuppressWarnings("unchecked")
60 protected Object findAnswerInModel(Map model) {
61 if (model.size() == 1) {
62 return model.values().iterator().next();
63 } else if (model.size() == 2) {
64 boolean otherIsBindingResult = false;
65 Object answerValue = null;
66 for (Object value : model.values()) {
67 if (value instanceof BindingResult)
68 otherIsBindingResult = true;
69 else
70 answerValue = value;
71 }
72
73 if (otherIsBindingResult)
74 return answerValue;
75 }
76
77 if (model.containsKey(ANSWER_MODEL_KEY)) {
78 return model.get(ANSWER_MODEL_KEY);
79 } else if (model.containsKey(ANSWER_MODEL_KEY_AS_HTML)) {
80 return model.get(ANSWER_MODEL_KEY_AS_HTML);
81 } else if (viewName != null && model.containsKey(viewName)) {
82 return model.get(viewName);
83 } else {
84 if (model.size() == 0)
85 throw new ArgeoException("Model is empty.");
86 else
87 throw new ArgeoException(
88 "Model has a size different from 1. Specify a modelKey.");
89 }
90 }
91
92 public String getViewName() {
93 return viewName;
94 }
95
96 public Locale getLocale() {
97 return locale;
98 }
99
100 public void setSerializer(ServerSerializer serializer) {
101 this.serializer = serializer;
102 }
103
104 }