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.pages.setup;
35
36 import static info.magnolia.jcr.nodebuilder.Ops.*;
37
38 import info.magnolia.i18nsystem.setup.RemoveHardcodedI18nPropertiesFromDialogsTask;
39 import info.magnolia.i18nsystem.setup.RemoveHardcodedI18nPropertiesFromSubappsTask;
40 import info.magnolia.jcr.util.NodeTypes;
41 import info.magnolia.module.DefaultModuleVersionHandler;
42 import info.magnolia.module.InstallContext;
43 import info.magnolia.module.delta.ArrayDelegateTask;
44 import info.magnolia.module.delta.BootstrapConditionally;
45 import info.magnolia.module.delta.BootstrapSingleModuleResource;
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.NewPropertyTask;
50 import info.magnolia.module.delta.NodeExistsDelegateTask;
51 import info.magnolia.module.delta.OrderNodeAfterTask;
52 import info.magnolia.module.delta.PartialBootstrapTask;
53 import info.magnolia.module.delta.PropertyExistsDelegateTask;
54 import info.magnolia.module.delta.RemoveNodeTask;
55 import info.magnolia.module.delta.RemovePropertyTask;
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.jcr.nodebuilder.task.ErrorHandling;
60 import info.magnolia.jcr.nodebuilder.task.NodeBuilderTask;
61 import info.magnolia.pages.app.PagesContentApp;
62 import info.magnolia.pages.app.action.PreviewPreviousVersionActionDefinition;
63 import info.magnolia.pages.app.action.RestorePreviousVersionActionDefinition;
64 import info.magnolia.pages.app.editor.PagesEditorSubAppDescriptor;
65 import info.magnolia.repository.RepositoryConstants;
66 import info.magnolia.ui.admincentral.setup.ConvertAclToAppPermissionTask;
67 import info.magnolia.ui.contentapp.ConfiguredContentAppDescriptor;
68 import info.magnolia.ui.contentapp.ContentApp;
69 import info.magnolia.ui.contentapp.availability.IsNotVersionedDetailLocationRule;
70 import info.magnolia.ui.contentapp.browser.action.ShowVersionsActionDefinition;
71 import info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor;
72 import info.magnolia.ui.contentapp.setup.for5_3.ContentAppMigrationTask;
73 import info.magnolia.ui.framework.setup.AddIsPublishedRuleToAllDeactivateActionsTask;
74 import info.magnolia.ui.framework.setup.SetWritePermissionForActionsTask;
75
76 import java.util.ArrayList;
77 import java.util.List;
78
79
80
81
82 public class PagesModuleVersionHandler extends DefaultModuleVersionHandler {
83
84 public static final String PAGES_APP_ACTIONS = "/modules/pages/apps/pages/subApps/browser/actions/";
85
86 public PagesModuleVersionHandler() {
87 super();
88
89 register(DeltaBuilder.update("5.0", "Configuration update for Magnolia 5.0")
90 .addTask(new IsModuleInstalledOrRegistered("", "", "adminInterface",
91 new BootstrapConditionally("Bootstrap activation commands", "Bootstraps the default activation and deletion commands which no longer reside under adminInterface.", "config.modules.pages.commands.xml")))
92 .addTask(new ConvertAclToAppPermissionTask("Convert permissions for Pages app", "Convert ACL permissions for old 'Website' menu to new 'pages-app' permission", "/modules/adminInterface/config/menu/website", "/modules/pages/apps/pages", true)));
93
94 register(DeltaBuilder.update("5.0.1", "")
95 .addTask(new NodeExistsDelegateTask("Remove dialog links Node", "Remove dialog definition in pages/dialogs/links", RepositoryConstants.CONFIG, "/modules/pages/dialogs/link",
96 new RemoveNodeTask("Remove dialog links Node", "Remove dialog definition in pages/dialogs/links", RepositoryConstants.CONFIG, "/modules/pages/dialogs/link")))
97 .addTask(new NodeExistsDelegateTask("Add title to CreatePage dialog", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/createPage/form",
98 new NewPropertyTask("Add title to CreatePage dialog", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/createPage/form", "label", "pages.dialog.add_page"))));
99
100 register(DeltaBuilder.update("5.0.2", "")
101
102 .addTask(new PartialBootstrapTask("Add new confirmation action definition", "", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/browser/actions/confirmDeletion"))
103
104 .addTask(new NodeExistsDelegateTask("Remove action availability from delete action", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete/availability",
105 new RemoveNodeTask("", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete/availability")))
106 .addTask(new PropertyExistsDelegateTask("Remove label for delete action", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete", "label",
107 new RemovePropertyTask("", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete", "label")))
108 .addTask(new PropertyExistsDelegateTask("Remove icon for delete action", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete", "icon",
109 new RemovePropertyTask("", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete", "icon")))
110
111
112 .addTask(new NodeExistsDelegateTask("Update actionbar configuration", "Rename action mapping to new confirmation action", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actionbar",
113 new RenameNodesTask("Rename action bar items", "Rename delete to confirmDeletion", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actionbar", "delete", "confirmDeletion", NodeTypes.ContentNode.NAME))));
114
115 register(DeltaBuilder.update("5.1", "")
116 .addTask(new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "confirmDeletion",
117 new NewPropertyTask("", "", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "confirmDeletion/availability", "multiple", true)))
118
119
120
121
122 .addTask(new NodeBuilderTask("Create showVersions action", "", ErrorHandling.logging, RepositoryConstants.CONFIG, PAGES_APP_ACTIONS,
123 addNode("showVersions", NodeTypes.ContentNode.NAME).then(
124 addProperty("class", ShowVersionsActionDefinition.class.getName()),
125 addProperty("icon", "icon-show-versions"),
126 addNode("availability", NodeTypes.ContentNode.NAME).then(
127 addProperty("ruleClass", "info.magnolia.ui.api.availability.HasVersionsRule")
128 )
129 )
130 ))
131
132 .addTask(new NodeExistsDelegateTask("Bootstrap actionbar section group for versionActions", "", RepositoryConstants.CONFIG, "/pages/subApps/browser/actionbar/sections/pageActions/groups/versionActions", null,
133 new PartialBootstrapTask("", "", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/browser/actionbar/sections/pageActions/groups/versionActions")
134 ))
135
136
137 .addTask(new RemoveHardcodedI18nPropertiesFromSubappsTask("pages"))
138
139
140 .addTask(new NodeExistsDelegateTask("remove the activate command chain from pages app", "", RepositoryConstants.CONFIG, "/modules/pages/commands/website/activate",
141 new RemoveNodeTask("", "", RepositoryConstants.CONFIG, "/modules/pages/commands/website/activate")))
142 .addTask(new NodeExistsDelegateTask("remove the deactivate command chain from pages app", "", RepositoryConstants.CONFIG, "/modules/pages/commands/website/deactivate",
143 new RemoveNodeTask("", "", RepositoryConstants.CONFIG, "/modules/pages/commands/website/deactivate")))
144
145 .addTask(new PartialBootstrapTask("Bootstrap new activate commands to website catalog.", "", "/mgnl-bootstrap/pages/config.modules.pages.commands.xml", "/commands/website/activate"))
146 .addTask(new PartialBootstrapTask("Bootstrap new deactivate commands to website catalog.", "", "/mgnl-bootstrap/pages/config.modules.pages.commands.xml", "/commands/website/deactivate"))
147
148
149 .addTask(new NodeBuilderTask("Add availability rule to edit action", "", ErrorHandling.logging, RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/detail/actions/edit",
150 addNode("availability", NodeTypes.ContentNode.NAME).then(
151 addProperty("ruleClass", IsNotVersionedDetailLocationRule.class.getName())
152 )
153 ))
154 .addTask(new NodeBuilderTask("Add availability rule to activate action", "", ErrorHandling.logging, RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/detail/actions/activate",
155 addNode("availability", NodeTypes.ContentNode.NAME).then(
156 addProperty("ruleClass", IsNotVersionedDetailLocationRule.class.getName())
157 )
158 ))
159 .addTask(new NodeBuilderTask("Add availability rule to deactivate action", "", ErrorHandling.logging, RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/detail/actions/deactivate",
160 addNode("availability", NodeTypes.ContentNode.NAME).then(
161 addProperty("ruleClass", IsNotVersionedDetailLocationRule.class.getName())
162 )
163 ))
164
165 .addTask(new PartialBootstrapTask("Bootstrap move action in Pages app", "",
166 "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/browser/actions/move"))
167 .addTask(new PartialBootstrapTask("Bootstrap move action to Pages app actionbar", "Adds action move to folder/editingActions section in actionbar.",
168 "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/browser/actionbar/sections/pageActions/groups/editingActions/items/move")));
169
170 register(DeltaBuilder.update("5.1.1", "")
171 .addTask(new NodeExistsDelegateTask("Add root availability to import", "Add root availability to import action in Pages app", RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "import/availability",
172 new NewPropertyTask("Add root availability to import", "Add root availability to import action in Pages app", RepositoryConstants.CONFIG,
173 PAGES_APP_ACTIONS + "import/availability", "root", true))));
174
175 register(DeltaBuilder.update("5.2.2", "")
176 .addTask(new RemoveHardcodedI18nPropertiesFromDialogsTask("pages"))
177 .addTask(new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/pages/apps/pages", "class", ConfiguredContentAppDescriptor.class.getName()))
178 .addTask(new SetPropertyTask(RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "import/availability", "root", "true"))
179 .addTask(new PartialBootstrapTask("Bootstrap restore version action", "", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "pages/subApps/browser/actions/restoreVersion"))
180 .addTask(new NodeExistsDelegateTask("Bootstrap restore version action to actionbar", "", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actionbar/sections/pageActions/groups/versionActions/items",
181 new ArrayDelegateTask("",
182 new PartialBootstrapTask("", "", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/browser/actionbar/sections/pageActions/groups/versionActions/items/restoreVersion"),
183 new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actionbar/sections/pageActions/groups/versionActions/items/showVersions",
184 new OrderNodeAfterTask("", "", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actionbar/sections/pageActions/groups/versionActions/items/restoreVersion", "showVersions"))))));
185
186 register(DeltaBuilder.update("5.2.3", "")
187 .addTask(new SetWritePermissionForActionsTask(PAGES_APP_ACTIONS,
188 new String[] { "add", "confirmDeletion", "edit", "editPageName", "editTemplate", "restorePreviousVersion", "import", "move", "restoreVersion" }))
189 .addTask(new SetWritePermissionForActionsTask("/modules/pages/apps/pages/subApps/detail/actions", new String[] { "edit" })));
190
191 register(DeltaBuilder.update("5.2.5", "")
192 .addTask(new IsModuleInstalledOrRegistered("Configure recursive activation and deletion as asynchronous", "scheduler", new ArrayDelegateTask("",
193 new NodeExistsDelegateTask("Configure recursive activation as asynchronous", PAGES_APP_ACTIONS + "activateRecursive",
194 new SetPropertyTask(RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "activateRecursive", "asynchronous", "true")),
195 new NodeExistsDelegateTask("Configure deletion as asynchronous", PAGES_APP_ACTIONS + "delete",
196 new SetPropertyTask(RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete", "asynchronous", "true"))
197 ))));
198
199 register(DeltaBuilder.update("5.3", "")
200 .addTask(new ArrayDelegateTask("Make dialogs light", "Turns edit page and edit template dialogs into light dialogs.",
201 new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/editPage",
202 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/editPage", "modalityLevel", "light")),
203 new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/createPage",
204 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/createPage", "modalityLevel", "strong")),
205 new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/editTemplate",
206 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/pages/dialogs/editTemplate", "modalityLevel", "light"))))
207 .addTask(new ContentAppMigrationTask("/modules/pages", RestorePreviousVersionActionDefinition.class, PreviewPreviousVersionActionDefinition.class)));
208
209 register(DeltaBuilder.update("5.3.1", "")
210 .addTask(new SetWritePermissionForActionsTask(PAGES_APP_ACTIONS, new String [] { "activate", "activateRecursive", "deactivate", "activateDeletion" })));
211
212 register(DeltaBuilder.update("5.3.3", "")
213 .addTask(new UpdatePageEditorActionAvailability()));
214
215 register(DeltaBuilder.update("5.3.4", "")
216 .addTask(new NodeExistsDelegateTask("Make action available on multiple nodes", "Makes restorePreviousVersion action available on multiple nodes.",
217 RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actions/restorePreviousVersion/availability",
218 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actions/restorePreviousVersion/availability", "multiple", true)))
219 .addTask(new NodeExistsDelegateTask("Configure restorePreviousVersion", "Makes restorePreviousVersion action act only on mgnl:page node type.",
220 RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actions/restorePreviousVersion",
221 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actions/restorePreviousVersion", "parentNodeTypeOnly", true)))
222
223 .addTask(new NodeExistsDelegateTask("Bootstrap actionbar availability.", "/modules/pages/apps/pages/subApps/detail/actionbar/sections",
224 new ArrayDelegateTask("Bootstrap actionbar availability for pageActions and pagePreviewActions.",
225 new PartialBootstrapTask("Bootstrap pagePreviewActions actionbar section availability rule.",
226 "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml",
227 "/pages/subApps/detail/actionbar/sections/pagePreviewActions/availability/rules/isPageElement"),
228 new PartialBootstrapTask("Bootstrap pagePreviewActions actionbar section availability rule.",
229 "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml",
230 "/pages/subApps/detail/actionbar/sections/pagePreviewActions/availability/rules/isNotDeleted"),
231 new PartialBootstrapTask("Bootstrap pageActions actionbar section availability rule.",
232 "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml",
233 "/pages/subApps/detail/actionbar/sections/pageActions/availability/rules/isPageElement"),
234 new PartialBootstrapTask("Bootstrap pageActions actionbar section availability rule.",
235 "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml",
236 "/pages/subApps/detail/actionbar/sections/pageActions/availability/rules/isNotDeleted"))))
237 );
238
239 register(DeltaBuilder.update("5.3.6", "")
240 .addTask(new AddIsPublishedRuleToAllDeactivateActionsTask("","/modules/pages/apps/"))
241 .addTask(new ArrayDelegateTask("Bootstrap IsPublishableRule",
242 new PartialBootstrapTask("", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/browser/actions/activate/availability/rules/IsPublishableRule"),
243 new PartialBootstrapTask("", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/browser/actions/activateRecursive/availability/rules/IsPublishableRule"))));
244 register(DeltaBuilder.update("5.3.8", "")
245 .addTask(new NodeExistsDelegateTask("Bootstrap newComponent dialog", "newComponent dialog is no longer hard-coded within CreateComponentAction, bootstrap it if it doesn't exist already.",
246 RepositoryConstants.CONFIG, "/modules/pages/dialogs/newComponent",
247 null, new BootstrapSingleModuleResource("", "", "dialogs/config.modules.pages.dialogs.newComponent.xml")))
248 );
249 register(DeltaBuilder.update("5.3.9", "")
250 .addTask(new NodeExistsDelegateTask("Configure multiple", "Allow select multiple items for activateDeletion action.",
251 RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actions/activateDeletion/availability",
252 new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/browser/actions/activateDeletion/availability", "multiple", "true"))
253 )
254 );
255 register(DeltaBuilder.update("5.4", "")
256 .addTask(new NodeExistsDelegateTask("Bootstrap page editor extensions.", "/modules/pages/apps/pages/subApps/detail", new ArrayDelegateTask("",
257 new CheckAndModifyPropertyValueTask("/modules/pages/apps/pages/subApps/detail", "class", DetailSubAppDescriptor.class.getName(), PagesEditorSubAppDescriptor.class.getName()),
258 new CheckAndModifyPropertyValueTask("/modules/pages/apps/pages", "appClass", ContentApp.class.getName(), PagesContentApp.class.getName()),
259 new PartialBootstrapTask("Bootstrap pageBar extensions", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/detail/pageBar"),
260 new PartialBootstrapTask("Bootstrap statusBar extensions", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/detail/statusBar"))))
261 .addTask(new NodeExistsDelegateTask("Add IsPageEditableRule to apps/pages/subApps/detail/actions/editProperties", "/modules/pages/apps/pages/subApps/detail/actions/editProperties",
262 new ArrayDelegateTask("", "",
263 new NodeExistsDelegateTask("", "/modules/pages/apps/pages/subApps/detail/actions/editProperties/availability", null,
264 new info.magnolia.jcr.nodebuilder.task.NodeBuilderTask("", "", info.magnolia.jcr.nodebuilder.task.ErrorHandling.logging, RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/detail/actions/editProperties",
265 addNode("availability", NodeTypes.ContentNode.NAME))),
266 new NodeExistsDelegateTask("", "/modules/pages/apps/pages/subApps/detail/actions/editProperties/availability/rules", null,
267 new info.magnolia.jcr.nodebuilder.task.NodeBuilderTask("", "", info.magnolia.jcr.nodebuilder.task.ErrorHandling.logging, RepositoryConstants.CONFIG, "/modules/pages/apps/pages/subApps/detail/actions/editProperties/availability",
268 addNode("rules", NodeTypes.ContentNode.NAME))),
269 new NodeExistsDelegateTask("", "/modules/pages/apps/pages/subApps/detail/actions/editProperties/availability/rules/isPageEditable", null,
270 new PartialBootstrapTask("", "/mgnl-bootstrap/pages/config.modules.pages.apps.pages.xml", "/pages/subApps/detail/actions/editProperties/availability/rules/isPageEditable"))))));
271
272 }
273
274 @Override
275 protected List<Task> getExtraInstallTasks(InstallContext installContext) {
276 List<Task> tasks = new ArrayList<Task>();
277 tasks.addAll(super.getExtraInstallTasks(installContext));
278 tasks.add(new IsModuleInstalledOrRegistered("Configure recursive activation and deletion as asynchronous", "scheduler", new ArrayDelegateTask("",
279 new NodeExistsDelegateTask("Configure recursive activation as asynchronous", PAGES_APP_ACTIONS + "activateRecursive",
280 new SetPropertyTask(RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "activateRecursive", "asynchronous", "true")),
281 new NodeExistsDelegateTask("Configure deletion as asynchronous", PAGES_APP_ACTIONS + "delete",
282 new SetPropertyTask(RepositoryConstants.CONFIG, PAGES_APP_ACTIONS + "delete", "asynchronous", "true"))
283 )));
284 return tasks;
285 }
286 }