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.config.registry.DefinitionProvider;
37 import info.magnolia.config.registry.DefinitionProviderWrapper;
38 import info.magnolia.config.registry.Registry;
39 import info.magnolia.config.registry.decoration.DefinitionDecorator;
40 import info.magnolia.config.registry.decoration.DefinitionDecoratorMetadata;
41 import info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition;
42 import info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition;
43 import info.magnolia.ui.dialog.DialogDefinition;
44 import info.magnolia.ui.dialog.definition.ConfiguredFormDialogDefinition;
45
46 import java.util.Optional;
47
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51
52
53
54 public class DialogCreatorDefinitionDecorator implements DefinitionDecorator<DialogDefinition> {
55 private static final Logger log = LoggerFactory.getLogger(DialogCreatorDefinitionDecorator.class);
56 private final BlossomDialogDescription dialogDescription;
57
58 public DialogCreatorDefinitionDecorator(BlossomDialogDescription dialogDescription) {
59 this.dialogDescription = dialogDescription;
60 }
61
62 @Override
63 public DefinitionDecoratorMetadata metadata() {
64 return () -> "blossom";
65 }
66
67 @Override
68 public boolean appliesTo(DefinitionProvider<DialogDefinition> definitionProvider) {
69 return definitionProvider instanceof BlossomDialogDefinitionProvider
70 && dialogDescription.getId().equals(definitionProvider.get().getId());
71 }
72
73 @Override
74 public DefinitionProvider<DialogDefinition> decorate(DefinitionProvider<DialogDefinition> definitionProvider) {
75
76 DialogCreationContext context = Optional.ofNullable(DialogCreationContextHolder.get())
77 .orElse(new DialogCreationContext());
78
79 context.setId(dialogDescription.getId());
80
81 DialogCreator dialogCreator = dialogDescription.getDialogCreator();
82 DialogFactoryMetaData factoryMetaData = dialogDescription.getFactoryMetaData();
83 try {
84 dialogCreator.createDialog(factoryMetaData, context);
85 } catch (Exception e) {
86 String factoryMetaDataInfo = factoryMetaData.getFactoryMethod() != null ?
87 factoryMetaData.getFactoryMethod().toString() :
88 factoryMetaData.getFactoryObject().getClass().toString();
89 log.error("Failed to create dialog for {}", factoryMetaDataInfo, e);
90 throw new Registry.InvalidDefinitionException(dialogDescription.getId());
91 }
92
93 ConfiguredFormDialogDefinition dialog = context.getDialog();
94
95 if (dialog.getActions().isEmpty()) {
96
97 SaveDialogActionDefinition callbackAction = new SaveDialogActionDefinition();
98 callbackAction.setName("commit");
99 callbackAction.setLabel("save");
100 dialog.getActions().put(callbackAction.getName(), callbackAction);
101
102 CancelDialogActionDefinition cancelAction = new CancelDialogActionDefinition();
103 cancelAction.setName("cancel");
104 cancelAction.setLabel("cancel");
105 dialog.getActions().put(cancelAction.getName(), cancelAction);
106 }
107
108 return new DefinitionProviderWrapper<DialogDefinition>(definitionProvider) {
109 @Override
110 public DialogDefinition get() throws Registry.InvalidDefinitionException {
111 return dialog;
112 }
113 };
114 }
115 }