View Javadoc
1   /**
2    * This file Copyright (c) 2013-2015 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
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   * Version handler for the pages app module.
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                 // new action for confirmation
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                 // update actionbar for confirmation
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                 // add show versions action
120                 // if module diff is installed, this task will create a second node showVersions
121                 // we'll handle the renaming of the correct node in module diff
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                 // bootstrap versionActions to action bar if it doesn't exists already
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                 // Remove hardcoded i18n properties, e.g. label, description, etc.
137                 .addTask(new RemoveHardcodedI18nPropertiesFromSubappsTask("pages"))
138 
139                 // cleanup pages commands
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                 // Add availability rules to detail view actions
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 }