2 * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org
.argeo
.server
.mvc
;
19 import java
.util
.Locale
;
22 import javax
.servlet
.http
.HttpServletRequest
;
23 import javax
.servlet
.http
.HttpServletResponse
;
25 import org
.argeo
.ArgeoException
;
26 import org
.argeo
.server
.ServerAnswer
;
27 import org
.argeo
.server
.ServerSerializer
;
28 import org
.springframework
.validation
.BindingResult
;
29 import org
.springframework
.web
.servlet
.View
;
30 import org
.springframework
.web
.servlet
.view
.AbstractView
;
33 * Can be used as a standalone {@link View} or using
34 * {@link SerializingViewResolver}
36 public class SerializingView
extends AbstractView
implements MvcConstants
{
37 private final String viewName
;
38 private final Locale locale
;
40 private ServerSerializer serializer
;
42 public SerializingView() {
44 this.locale
= Locale
.getDefault();
47 public SerializingView(String viewName
, Locale locale
,
48 ServerSerializer serializer
) {
49 this.viewName
= viewName
;
51 this.serializer
= serializer
;
54 @SuppressWarnings( { "unchecked", "restriction" })
56 protected void renderMergedOutputModel(Map model
,
57 HttpServletRequest request
, HttpServletResponse response
)
59 Boolean serverAnswersAsHtml
= model
60 .containsKey(ANSWER_MODEL_KEY_AS_HTML
);
62 final Object answer
= findAnswerInModel(model
);
64 if ((answer
instanceof ServerAnswer
) && serverAnswersAsHtml
) {
65 response
.setContentType("text/html");
66 ServerAnswer serverAnswer
= (ServerAnswer
) answer
;
67 response
.getWriter().append("<pre>");
68 response
.getWriter().append(serverAnswer
.getMessage());
69 response
.getWriter().append("</pre>");
71 serializer
.serialize(answer
, request
, response
);
75 @SuppressWarnings("unchecked")
76 protected Object
findAnswerInModel(Map model
) {
77 if (model
.size() == 1) {
78 return model
.values().iterator().next();
79 } else if (model
.size() == 2) {
80 boolean otherIsBindingResult
= false;
81 Object answerValue
= null;
82 for (Object value
: model
.values()) {
83 if (value
instanceof BindingResult
)
84 otherIsBindingResult
= true;
89 if (otherIsBindingResult
)
93 if (model
.containsKey(ANSWER_MODEL_KEY
)) {
94 return model
.get(ANSWER_MODEL_KEY
);
95 } else if (model
.containsKey(ANSWER_MODEL_KEY_AS_HTML
)) {
96 return model
.get(ANSWER_MODEL_KEY_AS_HTML
);
97 } else if (viewName
!= null && model
.containsKey(viewName
)) {
98 return model
.get(viewName
);
100 if (model
.size() == 0)
101 throw new ArgeoException("Model is empty.");
103 throw new ArgeoException(
104 "Model has a size different from 1. Specify a modelKey.");
108 public String
getViewName() {
112 public Locale
getLocale() {
116 public void setSerializer(ServerSerializer serializer
) {
117 this.serializer
= serializer
;