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 javax.jcr.Node;
56
57 import org.springframework.beans.factory.InitializingBean;
58 import org.springframework.core.MethodParameter;
59 import org.springframework.web.bind.support.WebArgumentResolver;
60 import org.springframework.web.context.request.NativeWebRequest;
61
62
63
64
65
66
67
68
69
70
71 public class BlossomWebArgumentResolver implements WebArgumentResolver, InitializingBean {
72
73 private SiteManager siteManager;
74 private SiteFunctions siteFunctions;
75
76 public void setSiteManager(SiteManager siteManager) {
77 this.siteManager = siteManager;
78 }
79
80 public void setSiteFunctions(SiteFunctions siteFunctions) {
81 this.siteFunctions = siteFunctions;
82 }
83
84 @Override
85 public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
86
87 if (methodParameter.getParameterType().isAssignableFrom(Node.class)) {
88 RenderingContext renderingContext = Components.getComponent(RenderingContext.class);
89 if (hasSubsequentParametersOfType(methodParameter, Node.class)) {
90 return renderingContext.getMainContent();
91 }
92 Node currentContent = renderingContext.getCurrentContent();
93 return currentContent != null ? currentContent : renderingContext.getMainContent();
94 }
95 if (methodParameter.getParameterType().isAssignableFrom(Content.class)) {
96 AggregationState aggregationState = MgnlContext.getAggregationState();
97 if (hasSubsequentParametersOfType(methodParameter, Content.class)) {
98 return aggregationState.getMainContent();
99 }
100 Content currentContent = aggregationState.getCurrentContent();
101 return currentContent != null ? currentContent : aggregationState.getMainContent();
102 }
103 if (methodParameter.getParameterType().isAssignableFrom(TemplateDefinition.class)) {
104 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
105 }
106 if (methodParameter.getParameterType().isAssignableFrom(BlossomTemplateDefinition.class)) {
107 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
108 }
109 if (methodParameter.getParameterType().isAssignableFrom(AreaDefinition.class)) {
110 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
111 }
112 if (methodParameter.getParameterType().isAssignableFrom(BlossomAreaDefinition.class)) {
113 return Components.getComponent(RenderingContext.class).getRenderableDefinition();
114 }
115 if (methodParameter.getParameterType().isAssignableFrom(AggregationState.class)) {
116 return MgnlContext.getAggregationState();
117 }
118 if (methodParameter.getParameterType().isAssignableFrom(WebContext.class)) {
119 return MgnlContext.getWebContext();
120 }
121 if (methodParameter.getParameterType().isAssignableFrom(Context.class)) {
122 return MgnlContext.getInstance();
123 }
124 if (methodParameter.getParameterType().isAssignableFrom(User.class)) {
125 return MgnlContext.getUser();
126 }
127 if (methodParameter.getParameterType().isAssignableFrom(MgnlUser.class)) {
128 return MgnlContext.getUser();
129 }
130 if (methodParameter.getParameterType().isAssignableFrom(Channel.class)) {
131 return MgnlContext.getAggregationState().getChannel();
132 }
133 if (methodParameter.getParameterType().isAssignableFrom(Theme.class)) {
134 Site site = siteManager.getCurrentSite();
135 if (site == null) {
136 return null;
137 }
138 return siteFunctions.theme(site);
139 }
140 if (methodParameter.getParameterType().isAssignableFrom(Site.class)) {
141 return siteManager.getCurrentSite();
142 }
143
144 return UNRESOLVED;
145 }
146
147 private boolean hasSubsequentParametersOfType(MethodParameter methodParameter, Class<?> clazz) {
148 Class<?>[] parameterTypes = methodParameter.getMethod().getParameterTypes();
149 for (int i = methodParameter.getParameterIndex() + 1; i < parameterTypes.length; i++) {
150 Class<?> parameterType = parameterTypes[i];
151 if (parameterType.equals(clazz)) {
152 return true;
153 }
154 }
155 return false;
156 }
157
158 @Override
159 public void afterPropertiesSet() throws Exception {
160 if (siteFunctions == null) {
161 this.siteFunctions = Components.getComponent(SiteFunctions.class);
162 }
163 if (siteManager == null) {
164 this.siteManager = Components.getComponent(SiteManager.class);
165 }
166 }
167 }