1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.blossom.web;
35
36 import info.magnolia.module.blossom.view.UuidRedirectViewResolver;
37 import info.magnolia.repository.RepositoryConstants;
38
39 import java.lang.reflect.InvocationTargetException;
40 import java.util.ArrayList;
41 import java.util.List;
42
43 import org.springframework.beans.factory.BeanInitializationException;
44 import org.springframework.core.MethodParameter;
45 import org.springframework.util.PatternMatchUtils;
46 import org.springframework.web.context.request.NativeWebRequest;
47 import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
48 import org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite;
49 import org.springframework.web.method.support.ModelAndViewContainer;
50 import org.springframework.web.servlet.ModelAndView;
51 import org.springframework.web.servlet.mvc.method.annotation.ModelAndViewMethodReturnValueHandler;
52 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
53 import org.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandler;
54
55
56
57
58
59
60
61
62
63
64
65 public class BlossomRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {
66
67 public String[] redirectPatterns = new String[]{RepositoryConstants.WEBSITE + ":*", "dms:*"};
68
69 public String[] getRedirectPatterns() {
70 return redirectPatterns;
71 }
72
73
74
75
76
77
78 public void setRedirectPatterns(String... redirectPatterns) {
79 this.redirectPatterns = redirectPatterns;
80 }
81
82 @Override
83 public void afterPropertiesSet() {
84 super.afterPropertiesSet();
85
86 List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>(getExistingReturnValueHandlers());
87
88 for (int i = 0; i < handlers.size(); i++) {
89 HandlerMethodReturnValueHandler handler = handlers.get(i);
90 if (handler instanceof ViewNameMethodReturnValueHandler) {
91 handlers.set(i, new ViewNameMethodReturnValueHandler() {
92
93 @Override
94 protected boolean isRedirectViewName(String viewName) {
95 return super.isRedirectViewName(viewName) || BlossomRequestMappingHandlerAdapter.this.isRedirectViewName(viewName);
96 }
97 });
98 }
99 if (handler instanceof ModelAndViewMethodReturnValueHandler) {
100 handlers.set(i, new ModelAndViewMethodReturnValueHandler() {
101
102 @Override
103 public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
104 if (returnValue != null) {
105 ModelAndView mav = (ModelAndView) returnValue;
106 if (mav.isReference()) {
107 String viewName = mav.getViewName();
108 if (viewName != null && BlossomRequestMappingHandlerAdapter.this.isRedirectViewName(viewName)) {
109 mavContainer.setRedirectModelScenario(true);
110 }
111 }
112 }
113 super.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
114 }
115 });
116 }
117 }
118
119 super.setReturnValueHandlers(handlers);
120 }
121
122
123
124
125
126
127
128
129 private List<HandlerMethodReturnValueHandler> getExistingReturnValueHandlers() {
130
131 Object returnValueHandlers;
132 try {
133 returnValueHandlers = getClass().getMethod("getReturnValueHandlers").invoke(this);
134 } catch (IllegalAccessException e) {
135 throw new BeanInitializationException("Could not get existing return value handlers", e);
136 } catch (InvocationTargetException e) {
137 throw new BeanInitializationException("Could not get existing return value handlers", e.getTargetException());
138 } catch (NoSuchMethodException e) {
139 throw new BeanInitializationException("Could not get existing return value handlers", e);
140 }
141
142 if (returnValueHandlers instanceof List) {
143 return (List<HandlerMethodReturnValueHandler>) returnValueHandlers;
144 }
145
146 if (returnValueHandlers instanceof HandlerMethodReturnValueHandlerComposite) {
147 return ((HandlerMethodReturnValueHandlerComposite) returnValueHandlers).getHandlers();
148 }
149
150 throw new BeanInitializationException("Could not get existing return value handlers");
151 }
152
153 protected boolean isRedirectViewName(String viewName) {
154 return viewName.equals(UuidRedirectViewResolver.REDIRECT_MAIN_CONTENT_PLACEHOLDER) ||
155 viewName.equals(UuidRedirectViewResolver.REDIRECT_CURRENT_CONTENT_PLACEHOLDER) ||
156 (redirectPatterns != null && PatternMatchUtils.simpleMatch(redirectPatterns, viewName));
157 }
158 }