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.cms.core.AggregationState;
37 import info.magnolia.cms.core.Channel;
38 import info.magnolia.cms.core.Content;
39 import info.magnolia.cms.security.MgnlUser;
40 import info.magnolia.cms.security.User;
41 import info.magnolia.context.Context;
42 import info.magnolia.context.MgnlContext;
43 import info.magnolia.context.WebContext;
44 import info.magnolia.module.blossom.template.BlossomAreaDefinition;
45 import info.magnolia.module.blossom.template.BlossomTemplateDefinition;
46 import info.magnolia.module.site.Site;
47 import info.magnolia.module.site.SiteManager;
48 import info.magnolia.module.site.functions.SiteFunctions;
49 import info.magnolia.module.site.theme.Theme;
50 import info.magnolia.objectfactory.Components;
51 import info.magnolia.rendering.context.RenderingContext;
52 import info.magnolia.rendering.template.AreaDefinition;
53 import info.magnolia.rendering.template.TemplateDefinition;
54
55 import java.util.HashSet;
56 import java.util.Set;
57
58 import javax.jcr.Node;
59
60 import org.springframework.beans.factory.InitializingBean;
61 import org.springframework.core.MethodParameter;
62 import org.springframework.web.bind.support.WebDataBinderFactory;
63 import org.springframework.web.context.request.NativeWebRequest;
64 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
65 import org.springframework.web.method.support.ModelAndViewContainer;
66
67
68
69
70
71
72
73
74
75 public class BlossomHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver, InitializingBean {
76
77 private SiteManager siteManager;
78 private SiteFunctions siteFunctions;
79
80 public void setSiteManager(SiteManager siteManager) {
81 this.siteManager = siteManager;
82 }
83
84 public void setSiteFunctions(SiteFunctions siteFunctions) {
85 this.siteFunctions = siteFunctions;
86 }
87
88 private Set<Class<?>> supportedParameterTypes = new HashSet<Class<?>>();
89
90 public BlossomHandlerMethodArgumentResolver() {
91 supportedParameterTypes.add(Node.class);
92 supportedParameterTypes.add(Content.class);
93 supportedParameterTypes.add(TemplateDefinition.class);
94 supportedParameterTypes.add(BlossomTemplateDefinition.class);
95 supportedParameterTypes.add(AreaDefinition.class);
96 supportedParameterTypes.add(BlossomAreaDefinition.class);
97 supportedParameterTypes.add(AggregationState.class);
98 supportedParameterTypes.add(WebContext.class);
99 supportedParameterTypes.add(Context.class);
100 supportedParameterTypes.add(User.class);
101 supportedParameterTypes.add(MgnlUser.class);
102 supportedParameterTypes.add(Channel.class);
103 supportedParameterTypes.add(Site.class);
104 supportedParameterTypes.add(Theme.class);
105 }
106
107 @Override
108 public boolean supportsParameter(MethodParameter parameter) {
109 for (Class<?> supportedParameterType : supportedParameterTypes) {
110 if (parameter.getParameterType().isAssignableFrom(supportedParameterType)) {
111 return true;
112 }
113 }
114 return false;
115 }
116
117 @Override
118 public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
119
120 if (methodParameter.getParameterType().isAssignableFrom(Node.class)) {
121 RenderingContext renderingContext = Components.getComponent(RenderingContext.class);
122 if (hasSubsequentParametersOfType(methodParameter, Node.class)) {
123 return renderingContext.getMainContent();
124 }
125 Node currentContent = renderingContext.getCurrentContent();
126 return currentContent != null ? currentContent : renderingContext.getMainContent();
127 }
128 if (methodParameter.getParameterType().isAssignableFrom(Content.class)) {
129 AggregationState aggregationState = MgnlContext.getAggregationState();
130 if (hasSubsequentParametersOfType(methodParameter, Content.class)) {
131 return aggregationState.getMainContent();
132 }
133 Content currentContent = aggregationState.getCurrentContent();
134 return currentContent != null ? currentContent : aggregationState.getMainContent();
135 }
136 if (methodParameter.getParameterType().isAssignableFrom(TemplateDefinition.class)) {
137 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
138 }
139 if (methodParameter.getParameterType().isAssignableFrom(BlossomTemplateDefinition.class)) {
140 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
141 }
142 if (methodParameter.getParameterType().isAssignableFrom(AreaDefinition.class)) {
143 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
144 }
145 if (methodParameter.getParameterType().isAssignableFrom(BlossomAreaDefinition.class)) {
146 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
147 }
148 if (methodParameter.getParameterType().isAssignableFrom(AggregationState.class)) {
149 return MgnlContext.getAggregationState();
150 }
151 if (methodParameter.getParameterType().isAssignableFrom(Context.class)) {
152 return MgnlContext.getInstance();
153 }
154 if (methodParameter.getParameterType().isAssignableFrom(WebContext.class)) {
155 return MgnlContext.getWebContext();
156 }
157 if (methodParameter.getParameterType().isAssignableFrom(User.class)) {
158 return MgnlContext.getUser();
159 }
160 if (methodParameter.getParameterType().isAssignableFrom(MgnlUser.class)) {
161 return MgnlContext.getUser();
162 }
163 if (methodParameter.getParameterType().isAssignableFrom(Channel.class)) {
164 return MgnlContext.getAggregationState().getChannel();
165 }
166 if (methodParameter.getParameterType().isAssignableFrom(Theme.class)) {
167 Site site = siteManager.getCurrentSite();
168 if (site == null) {
169 return null;
170 }
171 return siteFunctions.theme(site);
172 }
173 if (methodParameter.getParameterType().isAssignableFrom(Site.class)) {
174 return siteManager.getCurrentSite();
175 }
176
177 return null;
178 }
179
180 private boolean hasSubsequentParametersOfType(MethodParameter methodParameter, Class<?> clazz) {
181 Class<?>[] parameterTypes = methodParameter.getMethod().getParameterTypes();
182 for (int i = methodParameter.getParameterIndex() + 1; i < parameterTypes.length; i++) {
183 Class<?> parameterType = parameterTypes[i];
184 if (parameterType.equals(clazz)) {
185 return true;
186 }
187 }
188 return false;
189 }
190
191 @Override
192 public void afterPropertiesSet() throws Exception {
193 if (siteFunctions == null) {
194 siteFunctions = Components.getComponent(SiteFunctions.class);
195 }
196 if (siteManager == null) {
197 siteManager = Components.getComponent(SiteManager.class);
198 }
199 }
200 }