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.dialog;
35
36 import info.magnolia.cms.security.MgnlUser;
37 import info.magnolia.cms.security.User;
38 import info.magnolia.context.Context;
39 import info.magnolia.context.MgnlContext;
40 import info.magnolia.context.WebContext;
41 import info.magnolia.module.blossom.annotation.TabFactory;
42 import info.magnolia.module.blossom.support.MethodInvocationUtils;
43 import info.magnolia.module.blossom.support.ParameterResolver;
44 import info.magnolia.ui.dialog.config.DialogBuilder;
45 import info.magnolia.ui.dialog.definition.ConfiguredFormDialogDefinition;
46 import info.magnolia.ui.dialog.definition.FormDialogDefinition;
47 import info.magnolia.ui.form.config.TabBuilder;
48 import info.magnolia.ui.form.definition.ConfiguredFormDefinition;
49 import info.magnolia.ui.form.definition.TabDefinition;
50 import info.magnolia.ui.framework.config.UiConfig;
51
52 import java.lang.reflect.Method;
53 import java.util.Collections;
54 import java.util.Comparator;
55
56 import javax.jcr.Node;
57
58 import org.apache.commons.lang.ArrayUtils;
59 import org.apache.commons.lang.StringUtils;
60 import org.springframework.beans.BeanUtils;
61 import org.springframework.util.ClassUtils;
62
63 import com.vaadin.data.Item;
64
65
66
67
68
69
70 public class DefaultDialogCreator implements DialogCreator {
71
72 private static final String[] DAM_CONFIG_CLASS_NAMES = new String[]{
73 "info.magnolia.dam.app.ui.config.DamConfig",
74 "info.magnolia.dam.asset.config.DamConfig"
75 };
76
77 private Class damConfigClass;
78
79 public DefaultDialogCreator() {
80 ClassLoader classLoader = this.getClass().getClassLoader();
81 for (String damConfigClassName : DAM_CONFIG_CLASS_NAMES) {
82 if (ClassUtils.isPresent(damConfigClassName, classLoader)) {
83 damConfigClass = ClassUtils.resolveClassName(damConfigClassName, classLoader);
84 break;
85 }
86 }
87 }
88
89 @Override
90 public void createDialog(DialogFactoryMetaData metaData, final DialogCreationContext context) throws Exception {
91
92 DialogBuilder dialogBuilder = new DialogBuilder(context.getId());
93 context.setDialog(dialogBuilder.definition());
94 context.getDialog().setForm(new ConfiguredFormDefinition());
95 context.getDialog().setPresenterClass(BlossomFormDialogPresenter.class);
96
97 if (StringUtils.isNotEmpty(metaData.getLabel())) {
98 ConfiguredFormDefinition form = (ConfiguredFormDefinition) dialogBuilder.definition().getForm();
99 form.setLabel(metaData.getLabel());
100 dialogBuilder.label(metaData.getLabel());
101 }
102
103 if (metaData.getFactoryMethod() != null) {
104 invokeMethodDialogFactory(metaData, context, dialogBuilder);
105 } else {
106 invokeClassDialogFactory(metaData, context, dialogBuilder);
107 }
108 }
109
110 protected void invokeMethodDialogFactory(DialogFactoryMetaData metaData, DialogCreationContext context, DialogBuilder dialogBuilder) {
111
112 if (StringUtils.isNotEmpty(metaData.getI18nBasename())) {
113 dialogBuilder.i18nBasename(metaData.getI18nBasename());
114 }
115
116 ParameterResolver parameters = getDialogFactoryParameters(metaData, context, dialogBuilder);
117 MethodInvocationUtils.invoke(metaData.getFactoryMethod(), metaData.getFactoryObject(), parameters);
118
119 if (metaData.getTabOrder() != null) {
120 sortTabs(context.getDialog(), metaData.getTabOrder());
121 }
122 }
123
124 protected void invokeClassDialogFactory(DialogFactoryMetaData metaData, DialogCreationContext context, DialogBuilder dialogBuilder) {
125
126 if (metaData.getI18nBasename() != null) {
127 dialogBuilder.i18nBasename(metaData.getI18nBasename());
128 }
129
130 Object factoryObject = metaData.getFactoryObject();
131
132 for (DialogFactoryClassMetaData classMetaData : metaData.getClassMetaData()) {
133
134 int tabPosition = 0;
135
136 for (Method tabFactory : classMetaData.getTabFactories()) {
137
138 TabFactory annotation = tabFactory.getAnnotation(TabFactory.class);
139 TabBuilder tabBuilder = new TabBuilder(annotation.value()).label(annotation.value());
140 dialogBuilder.form().definition().getTabs().add(tabPosition++, tabBuilder.definition());
141
142 ParameterResolver parameters = getTabFactoryParameters(metaData, context, tabBuilder);
143 MethodInvocationUtils.invoke(tabFactory, metaData.getFactoryObject(), parameters);
144 }
145
146 for (Method postCreateMethod : classMetaData.getPostCreateCallbacks()) {
147
148 ParameterResolver parameters = getPostCreateCallbackParameters(metaData, context, dialogBuilder);
149 MethodInvocationUtils.invoke(postCreateMethod, factoryObject, parameters);
150 }
151 }
152
153 for (Method postCreateMethod : metaData.getPostCreateCallbacks()) {
154
155 ParameterResolver parameters = getPostCreateCallbackParameters(metaData, context, dialogBuilder);
156 MethodInvocationUtils.invoke(postCreateMethod, factoryObject, parameters);
157 }
158
159 if (metaData.getTabOrder() != null) {
160 sortTabs(context.getDialog(), metaData.getTabOrder());
161 }
162 }
163
164 protected void sortTabs(FormDialogDefinition dialog, final String[] order) {
165 Collections.sort(dialog.getForm().getTabs(), new Comparator<Object>() {
166
167 @Override
168 public int compare(Object o1, Object o2) {
169 switch (((o1 instanceof TabDefinition) ? 2 : 0) + ((o2 instanceof TabDefinition) ? 1 : 0)) {
170 case 0:
171 return 0;
172 case 1:
173 return -1;
174 case 2:
175 return 1;
176 case 3:
177 return ArrayUtils.indexOf(order, ((TabDefinition) o1).getLabel()) - ArrayUtils.indexOf(order, ((TabDefinition) o2).getLabel());
178 }
179 return 0;
180 }
181 });
182 }
183
184 protected ParameterResolver getDialogFactoryParameters(DialogFactoryMetaData metaData, DialogCreationContext context, final DialogBuilder dialogBuilder) {
185 return new ParameterResolver(getStandardParameters(metaData, context)) {
186
187 @Override
188 public Object resolveParameter(Class<?> parameterType) {
189 if (parameterType.equals(DialogBuilder.class)) {
190 return dialogBuilder;
191 }
192 return super.resolveParameter(parameterType);
193 }
194 };
195 }
196
197 protected ParameterResolver getTabFactoryParameters(DialogFactoryMetaData metaData, DialogCreationContext context, final TabBuilder tabBuilder) {
198 return new ParameterResolver(getStandardParameters(metaData, context)) {
199
200 @Override
201 public Object resolveParameter(Class<?> parameterType) {
202 if (parameterType.equals(TabBuilder.class)) {
203 return tabBuilder;
204 }
205 return super.resolveParameter(parameterType);
206 }
207 };
208 }
209
210 protected ParameterResolver getPostCreateCallbackParameters(DialogFactoryMetaData metaData, DialogCreationContext context, final DialogBuilder dialogBuilder) {
211 return new ParameterResolver(getStandardParameters(metaData, context)) {
212
213 @Override
214 public Object resolveParameter(Class<?> parameterType) {
215 if (parameterType.isAssignableFrom(DialogBuilder.class)) {
216 return dialogBuilder;
217 }
218 return super.resolveParameter(parameterType);
219 }
220 };
221 }
222
223 protected ParameterResolver getStandardParameters(DialogFactoryMetaData metaData, final DialogCreationContext context) {
224 return new ParameterResolver() {
225
226 @Override
227 public Object resolveParameter(Class<?> parameterType) {
228 if (parameterType.isAssignableFrom(ConfiguredFormDialogDefinition.class)) {
229 return context.getDialog();
230 }
231 if (parameterType.equals(DialogCreationContext.class)) {
232 return context;
233 }
234 if (parameterType.equals(Node.class)) {
235 return context.getContentNode();
236 }
237 if (parameterType.equals(Item.class)) {
238 return context.getItem();
239 }
240 if (parameterType.equals(UiConfig.class)) {
241 return new UiConfig();
242 }
243 if (damConfigClass != null && parameterType == damConfigClass) {
244 return BeanUtils.instantiate(damConfigClass);
245 }
246 if (parameterType.isAssignableFrom(WebContext.class)) {
247 return MgnlContext.getWebContext();
248 }
249 if (parameterType.isAssignableFrom(Context.class)) {
250 return MgnlContext.getInstance();
251 }
252 if (parameterType.isAssignableFrom(User.class)) {
253 return MgnlContext.getUser();
254 }
255 if (parameterType.isAssignableFrom(MgnlUser.class)) {
256 return MgnlContext.getUser();
257 }
258 return super.resolveParameter(parameterType);
259 }
260 };
261 }
262 }