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.objectfactory.Components;
42 import info.magnolia.objectfactory.MgnlInstantiationException;
43 import info.magnolia.objectfactory.NoSuchComponentException;
44 import info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition;
45 import info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition;
46 import info.magnolia.ui.api.app.AppController;
47 import info.magnolia.ui.api.location.Location;
48 import info.magnolia.ui.dialog.DialogDefinition;
49 import info.magnolia.ui.dialog.definition.ConfiguredFormDialogDefinition;
50
51 import java.util.Optional;
52 import java.util.function.Predicate;
53
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57
58
59
60 public class DialogCreatorDefinitionDecorator implements DefinitionDecorator<DialogDefinition> {
61 private static final Logger log = LoggerFactory.getLogger(DialogCreatorDefinitionDecorator.class);
62 private final BlossomDialogDescription dialogDescription;
63
64 public DialogCreatorDefinitionDecorator(BlossomDialogDescription dialogDescription) {
65 this.dialogDescription = dialogDescription;
66 }
67
68 @Override
69 public DefinitionDecoratorMetadata metadata() {
70 return () -> "blossom";
71 }
72
73 @Override
74 public boolean appliesTo(DefinitionProvider<DialogDefinition> definitionProvider) {
75 if (definitionProvider instanceof BlossomDialogDefinitionProvider
76 && dialogDescription.getId().equals(definitionProvider.get().getId())) {
77 return new CompatibilityPagesAppPredicate().test(((BlossomDialogDefinitionProvider) definitionProvider));
78 }
79 return false;
80 }
81
82 @Override
83 public DefinitionProvider<DialogDefinition> decorate(DefinitionProvider<DialogDefinition> definitionProvider) {
84
85 DialogCreationContext context = Optional.ofNullable(DialogCreationContextHolder.get())
86 .orElse(new DialogCreationContext());
87
88 context.setId(dialogDescription.getId());
89
90 DialogCreator dialogCreator = dialogDescription.getDialogCreator();
91 DialogFactoryMetaData factoryMetaData = dialogDescription.getFactoryMetaData();
92 try {
93 dialogCreator.createDialog(factoryMetaData, context);
94 } catch (Exception e) {
95 String factoryMetaDataInfo = factoryMetaData.getFactoryMethod() != null ?
96 factoryMetaData.getFactoryMethod().toString() :
97 factoryMetaData.getFactoryObject().getClass().toString();
98 log.error("Failed to create dialog for {}", factoryMetaDataInfo, e);
99 throw new Registry.InvalidDefinitionException(dialogDescription.getId());
100 }
101
102 ConfiguredFormDialogDefinition dialog = context.getDialog();
103
104 if (dialog != null && dialog.getActions().isEmpty()) {
105 SaveDialogActionDefinition callbackAction = new SaveDialogActionDefinition();
106 callbackAction.setName("commit");
107 callbackAction.setLabel("save");
108 dialog.getActions().put(callbackAction.getName(), callbackAction);
109
110 CancelDialogActionDefinition cancelAction = new CancelDialogActionDefinition();
111 cancelAction.setName("cancel");
112 cancelAction.setLabel("cancel");
113 dialog.getActions().put(cancelAction.getName(), cancelAction);
114 }
115
116 return new DefinitionProviderWrapper<DialogDefinition>(definitionProvider) {
117 @Override
118 public DialogDefinition get() throws Registry.InvalidDefinitionException {
119 return dialog;
120 }
121 };
122 }
123
124
125
126
127
128
129
130
131
132
133 class CompatibilityPagesAppPredicate implements Predicate<BlossomDialogDefinitionProvider> {
134 private static final String NEW_PAGES_APP_NAME = "pages-app";
135 private static final String OLD_PAGES_APP_NAME = "pages";
136
137 @Override
138 public boolean test(BlossomDialogDefinitionProvider definitionProvider) {
139 AppController appController;
140 try {
141 appController = Components.getComponent(AppController.class);
142 } catch (MgnlInstantiationException | NoSuchComponentException e) {
143 log.warn("No AppController available while invoking Blossom dialog with id {}. Not invoking dialog controller.", definitionProvider.getMetadata().getReferenceId());
144 return false;
145 }
146
147 Location currentAppLocation = appController.getCurrentAppLocation();
148 if (currentAppLocation == null) {
149 log.warn("Unable to determine current app location while invoking Blossom dialog with id {}. Not invoking dialog controller.", definitionProvider.getMetadata().getReferenceId());
150 return false;
151 }
152
153
154 if (OLD_PAGES_APP_NAME.equals(currentAppLocation.getAppName())) {
155 if (DialogCreationContextHolder.get() == null) {
156 log.debug("Dialog creator initially invoked for old pages app without a DialogCreationContext set. Skipping dialog controller.");
157 return false;
158 }
159 } else if (!NEW_PAGES_APP_NAME.equals(currentAppLocation.getAppName())) {
160 log.debug("Dialog creator invoked outside of both old/new pages app. Skipping dialog controller.");
161 return false;
162 }
163
164 return true;
165 }
166 }
167 }