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.ui.framework.setup;
35
36 import static info.magnolia.nodebuilder.Ops.*;
37
38 import info.magnolia.i18nsystem.setup.RemoveHardcodedI18nPropertiesFromDialogsTask;
39 import info.magnolia.jcr.util.NodeTypes;
40 import info.magnolia.module.DefaultModuleVersionHandler;
41 import info.magnolia.module.InstallContext;
42 import info.magnolia.module.delta.ArrayDelegateTask;
43 import info.magnolia.module.delta.BootstrapSingleModuleResource;
44 import info.magnolia.module.delta.BootstrapSingleResource;
45 import info.magnolia.module.delta.ChangeAllPropertiesWithCertainValueTask;
46 import info.magnolia.module.delta.CheckAndModifyPropertyValueTask;
47 import info.magnolia.module.delta.DeltaBuilder;
48 import info.magnolia.module.delta.IsModuleInstalledOrRegistered;
49 import info.magnolia.module.delta.ModuleDependencyBootstrapTask;
50 import info.magnolia.module.delta.MoveNodeTask;
51 import info.magnolia.module.delta.NewPropertyTask;
52 import info.magnolia.module.delta.NodeExistsDelegateTask;
53 import info.magnolia.module.delta.PartialBootstrapTask;
54 import info.magnolia.module.delta.PropertyValueDelegateTask;
55 import info.magnolia.module.delta.RemoveNodeTask;
56 import info.magnolia.module.delta.RenameNodesTask;
57 import info.magnolia.module.delta.SetPropertyTask;
58 import info.magnolia.module.delta.Task;
59 import info.magnolia.nodebuilder.task.ErrorHandling;
60 import info.magnolia.nodebuilder.task.NodeBuilderTask;
61 import info.magnolia.repository.RepositoryConstants;
62 import info.magnolia.ui.dialog.action.CallbackDialogActionDefinition;
63 import info.magnolia.ui.dialog.setup.migration.CheckBoxRadioControlMigrator;
64 import info.magnolia.ui.dialog.setup.migration.CheckBoxSwitchControlMigrator;
65 import info.magnolia.ui.dialog.setup.migration.ControlMigratorsRegistry;
66 import info.magnolia.ui.dialog.setup.migration.DateControlMigrator;
67 import info.magnolia.ui.dialog.setup.migration.EditCodeControlMigrator;
68 import info.magnolia.ui.dialog.setup.migration.EditControlMigrator;
69 import info.magnolia.ui.dialog.setup.migration.FckEditControlMigrator;
70 import info.magnolia.ui.dialog.setup.migration.FileControlMigrator;
71 import info.magnolia.ui.dialog.setup.migration.HiddenControlMigrator;
72 import info.magnolia.ui.dialog.setup.migration.LinkControlMigrator;
73 import info.magnolia.ui.dialog.setup.migration.MultiSelectControlMigrator;
74 import info.magnolia.ui.dialog.setup.migration.SelectControlMigrator;
75 import info.magnolia.ui.dialog.setup.migration.StaticControlMigrator;
76 import info.magnolia.ui.form.field.definition.BasicTextCodeFieldDefinition;
77 import info.magnolia.ui.form.field.definition.CompositeFieldDefinition;
78 import info.magnolia.ui.form.field.definition.MultiValueFieldDefinition;
79 import info.magnolia.ui.form.field.definition.SwitchableFieldDefinition;
80 import info.magnolia.ui.form.field.factory.BasicTextCodeFieldFactory;
81 import info.magnolia.ui.form.field.factory.CompositeFieldFactory;
82 import info.magnolia.ui.form.field.factory.MultiValueFieldFactory;
83 import info.magnolia.ui.form.field.factory.RichTextFieldFactory;
84 import info.magnolia.ui.form.field.factory.SwitchableFieldFactory;
85 import info.magnolia.ui.framework.command.CleanTempFilesCommand;
86
87 import java.util.ArrayList;
88 import java.util.List;
89
90 import javax.inject.Inject;
91
92
93
94
95 public class UiFrameworkModuleVersionHandler extends DefaultModuleVersionHandler {
96
97 private static final String UI_FRAMEWORK_DIALOGS = "/modules/ui-framework/dialogs";
98
99 private static final class RenameLegacyI18nNodeIfExistingTask extends IsModuleInstalledOrRegistered {
100 public RenameLegacyI18nNodeIfExistingTask() {
101 super("Rename legacy i18n node", "Renames /server/i18n/authoring as authoringLegacy. Only run if adminInterface legacy module is installed.", "adminInterface", new RenameNodesTask("", "", RepositoryConstants.CONFIG, "/server/i18n", "authoring", "authoringLegacy", NodeTypes.ContentNode.NAME));
102 }
103 }
104
105 @Inject
106 public UiFrameworkModuleVersionHandler(ControlMigratorsRegistry controlMigratorsRegistry) {
107
108 controlMigratorsRegistry.register("edit", new EditControlMigrator());
109 controlMigratorsRegistry.register("fckEdit", new FckEditControlMigrator());
110 controlMigratorsRegistry.register("date", new DateControlMigrator());
111 controlMigratorsRegistry.register("select", new SelectControlMigrator());
112 controlMigratorsRegistry.register("checkbox", new CheckBoxRadioControlMigrator(true));
113 controlMigratorsRegistry.register("checkboxSwitch", new CheckBoxSwitchControlMigrator());
114 controlMigratorsRegistry.register("radio", new CheckBoxRadioControlMigrator(false));
115 controlMigratorsRegistry.register("uuidLink", new LinkControlMigrator());
116 controlMigratorsRegistry.register("link", new LinkControlMigrator());
117 controlMigratorsRegistry.register("multiselect", new MultiSelectControlMigrator(false));
118 controlMigratorsRegistry.register("file", new FileControlMigrator());
119 controlMigratorsRegistry.register("static", new StaticControlMigrator());
120 controlMigratorsRegistry.register("hidden", new HiddenControlMigrator());
121 controlMigratorsRegistry.register("editCode", new EditCodeControlMigrator());
122
123 register(DeltaBuilder.update("5.0.1", "")
124 .addTask(new RenameLegacyI18nNodeIfExistingTask())
125 .addTask(new RenameNodesTask("Rename 5.0 i18n node", "Renames /server/i18n/authoring50 as authoring.", RepositoryConstants.CONFIG, "/server/i18n", "authoring50", "authoring", NodeTypes.ContentNode.NAME))
126 .addTask(new BootstrapSingleModuleResource("Add dialogs to ui-framework", "", "config.modules.ui-framework.dialogs.xml")));
127
128 register(DeltaBuilder.update("5.1", "")
129 .addTask(new BootstrapSingleModuleResource("Register WorkbenchFieldDefinition", "", "config.modules.ui-framework.fieldTypes.workbenchField.xml"))
130 .addTask(new RemoveNodeTask("Remove MultiLinkField definition mapping", "", RepositoryConstants.CONFIG, "/modules/ui-framework/fieldTypes/multiLinkField"))
131 .addTask(createNewFieldDefinition("basicTextCodeField", BasicTextCodeFieldDefinition.class.getName(), BasicTextCodeFieldFactory.class.getName()))
132 .addTask(createNewFieldDefinition("switchableField", SwitchableFieldDefinition.class.getName(), SwitchableFieldFactory.class.getName()))
133 .addTask(createNewFieldDefinition("multiField", MultiValueFieldDefinition.class.getName(), MultiValueFieldFactory.class.getName()))
134 .addTask(createNewFieldDefinition("compositeField", CompositeFieldDefinition.class.getName(), CompositeFieldFactory.class.getName()))
135 .addTask((new ReplaceMultiLinkFieldDefinitionTask("Change the MultiLinkFieldDefinition by MultiValueFieldDefinition ", "", RepositoryConstants.CONFIG, " select * from [nt:base] as t where contains(t.*,'info.magnolia.ui.form.field.definition.MultiLinkFieldDefinition') ")))
136 .addTask((new ReplaceSaveModeTypeFieldDefinitionTask("Update field definition sub task from 'saveModeType' to 'transformerClass' ", "", RepositoryConstants.CONFIG, " select * from [nt:base] as t where name(t) = 'saveModeType' ")))
137 .addTask(new ChangeAllPropertiesWithCertainValueTask("Change package name of CallbackDialogActionDefinition class", "", RepositoryConstants.CONFIG, "info.magnolia.ui.admincentral.dialog.action.CallbackDialogActionDefinition", CallbackDialogActionDefinition.class.getName()))
138 .addTask((new RemoveHardcodedI18nPropertiesFromDialogsTask("ui-framework"))));
139
140 register(DeltaBuilder.update("5.2.2", "")
141 .addTask(new NodeExistsDelegateTask("Register WorkbenchFieldDefinition if not yet done", "", RepositoryConstants.CONFIG, "/modules/ui-framework/fieldTypes/workbenchField", null, new BootstrapSingleModuleResource("Register WorkbenchFieldDefinition", "", "config.modules.ui-framework.fieldTypes.workbenchField.xml")))
142 .addTask(new NodeExistsDelegateTask("Rename fieldType if it's misspelled", "/modules/ui-framework/fieldTypes/compositField",
143 new MoveNodeTask("Rename misspelled fieldType", "/modules/ui-framework/fieldTypes/compositField", "/modules/ui-framework/fieldTypes/compositeField", false)
144 ))
145 .addTask(new NodeExistsDelegateTask("Rename command catalog if it's incorrect", "Rename command catalog to 'default' if it's incorrect", RepositoryConstants.CONFIG, "/modules/ui-framework/commands/deafult",
146 new MoveNodeTask("Rename command catalog", "Rename command catalog to 'default'", RepositoryConstants.CONFIG, "/modules/ui-framework/commands/deafult",
147 "/modules/ui-framework/commands/default", false)
148 ))
149 .addTask(new NodeExistsDelegateTask("Bootstrap 'importZip' command it doesn't exists yet", "Bootstrap 'importZip' command it doesn't exists yet", RepositoryConstants.CONFIG, "/modules/ui-framework/commands/default/importZip", null, new BootstrapSingleModuleResource("Bootstrap 'importZip' command", "Bootstrap 'importZip' command", "config.modules.ui-framework.commands.xml"
150 )))
151 .addTask(new NodeExistsDelegateTask("Bootstrap 'importZip' dialog it doesn't exists yet", "Bootstrap 'importZip' dialog it doesn't exists yet", RepositoryConstants.CONFIG, "/modules/ui-framework/dialog/importZip", null,
152 new PartialBootstrapTask("Bootstrap 'importZip' dialog", "Bootstraps 'importZip' dialog.", "/mgnl-bootstrap/ui-framework/config.modules.ui-framework.dialogs.xml", "dialogs/importZip")))
153 .addTask(new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/ui-framework/dialogs/importZip/form/tabs/import/fields/encoding/options/utf-8", "label", "UTF-8"))
154 .addTask(new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/ui-framework/dialogs/importZip/form/tabs/import/fields/encoding/options/windows", "label", "CP437")));
155
156 register(DeltaBuilder.update("5.3", "")
157 .addTask(new ArrayDelegateTask("Make dialogs light", "Turns edit node name and edit folder name dialogs into light dialogs.",
158 new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/ui-framework/dialogs/rename",
159 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/ui-framework/dialogs/rename", "modalityLevel", "light")),
160 new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/ui-framework/dialogs/folder",
161 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/ui-framework/dialogs/folder", "modalityLevel", "light"))
162 )));
163
164 register(DeltaBuilder.update("5.4", "")
165 .addTask(new PartialBootstrapTask("Add new code fieldType", "/mgnl-bootstrap/ui-framework/config.modules.ui-framework.fieldTypes.xml", "fieldTypes/code"))
166 );
167
168 register(DeltaBuilder.update("5.4.2", "")
169 .addTask(new NodeExistsDelegateTask("Check if path '/modules/ui-framework/dialogs/importZip/form/tabs/import/fields/name' exist.", "/modules/ui-framework/dialogs/importZip/form/tabs/import/fields/name",
170 new ArrayDelegateTask("",
171 new CheckAndModifyPropertyValueTask("Add mimeType application/octet-stream that is used by google chrome for zip files.", "Add mimeType application/octet-stream that is used by google chrome for zip files.", RepositoryConstants.CONFIG, "/modules/ui-framework/dialogs/importZip/form/tabs/import/fields/name", "allowedMimeTypePattern", "application/(zip|x-zip|x-zip-compressed)", "application/(zip|x-zip|x-zip-compressed|octet-stream)")))));
172 register(DeltaBuilder.update("5.4.3", "")
173 .addTask(new NodeExistsDelegateTask("Configure 'cleanTempFiles' command if does not exists.", "/modules/ui-framework/commands/default/cleanTempFiles", null,
174 new PartialBootstrapTask("Configure 'cleanTempFiles' command.", "/mgnl-bootstrap/ui-framework/config.modules.ui-framework.commands.xml", "commands/default/cleanTempFiles")))
175 .addTask(new IsModuleInstalledOrRegistered("Configure 'CleanTempFiles' job - check if scheduler module is installed.", "scheduler",
176 new NodeExistsDelegateTask("Check if 'cleanTempFiles' command was already configured.", "/modules/ui-framework/commands/default/cleanTempFiles",
177 new PropertyValueDelegateTask("Check if 'class' property of 'cleanTempFiles' command has required value 'info.magnolia.ui.framework.command.CleanTempFilesCommand'.", "/modules/ui-framework/commands/default/cleanTempFiles", "class", CleanTempFilesCommand.class.getName(), false,
178 new NodeExistsDelegateTask("Configure 'CleanTempFiles' job if does not exist.", "/modules/scheduler/config/jobs/cleanTempFiles", null,
179 new BootstrapSingleResource("", "Configure 'CleanTempFiles' job.", "/info/magnolia/module/ui-framework/setup/scheduler/config.modules.scheduler.config.jobs.cleanTempFiles.xml")))))));
180
181 register(DeltaBuilder.update("5.4.4", "")
182 .addTask(new PartialBootstrapTask("Add JCR node-type selector field", "/mgnl-bootstrap/ui-framework/config.modules.ui-framework.fieldTypes.xml", "fieldTypes/nodeTypeField"))
183 );
184
185 register(DeltaBuilder.update("5.4.8", "")
186 .addTask(new IsModuleInstalledOrRegistered("Check if dam-app module is installed", "dam-app", (Task)null,
187 new NodeExistsDelegateTask("Change AssetsEnabledRichTextFieldFactory to RichTextFieldFactory", "/modules/ui-framework/fieldTypes/textArea",
188 new CheckAndModifyPropertyValueTask("/modules/ui-framework/fieldTypes/textArea", "factoryClass", "info.magnolia.dam.app.ui.field.factory.AssetsEnabledRichTextFieldFactory", RichTextFieldFactory.class.getName()))))
189 .addTask(new IsModuleInstalledOrRegistered("Check if form module is installed", "form", (Task)null,
190 new RemoveNodeTask("Remove formStaticField", "/modules/ui-framework/fieldTypes/formStaticField")))
191 );
192 register(DeltaBuilder.update("5.5", "")
193 .addTask(new ChangeAllPropertiesWithCertainValueTask(RepositoryConstants.CONFIG, UI_FRAMEWORK_DIALOGS, "info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition", info.magnolia.ui.dialog.action.SaveDialogActionDefinition.class.getName()))
194 .addTask(new ChangeAllPropertiesWithCertainValueTask(RepositoryConstants.CONFIG, UI_FRAMEWORK_DIALOGS, "info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition", info.magnolia.ui.dialog.action.CancelDialogActionDefinition.class.getName()))
195 );
196 }
197
198 @Override
199 protected List<Task> getExtraInstallTasks(InstallContext installContext) {
200 ArrayList<Task> tasks = new ArrayList<Task>();
201 tasks.add(new ModuleDependencyBootstrapTask("scheduler"));
202 return tasks;
203 }
204
205
206
207
208 private NodeBuilderTask createNewFieldDefinition(String fieldName, String definitionClass, String factoryClass) {
209 return new NodeBuilderTask("Add definition for the newly introduce field: " + fieldName, "", ErrorHandling.logging, RepositoryConstants.CONFIG, "/modules/ui-framework",
210 getNode("fieldTypes").then(
211 addNode(fieldName, NodeTypes.ContentNode.NAME),
212 getNode(fieldName).then(
213 addProperty("definitionClass", definitionClass),
214 addProperty("factoryClass", factoryClass)
215 )
216 ));
217 }
218 }