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