View Javadoc
1   /**
2    * This file Copyright (c) 2003-2017 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.module.forum.setup;
35  
36  import info.magnolia.cms.security.Permission;
37  import info.magnolia.i18nsystem.setup.RemoveHardcodedI18nPropertiesFromDialogsTask;
38  import info.magnolia.module.DefaultModuleVersionHandler;
39  import info.magnolia.module.InstallContext;
40  import info.magnolia.module.delta.AbstractCondition;
41  import info.magnolia.module.delta.AddPermissionTask;
42  import info.magnolia.module.delta.AddRoleToUserTask;
43  import info.magnolia.module.delta.ArrayDelegateTask;
44  import info.magnolia.module.delta.BootstrapSingleModuleResource;
45  import info.magnolia.module.delta.CheckAndModifyPropertyValueTask;
46  import info.magnolia.module.delta.Condition;
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.NodeExistsDelegateTask;
52  import info.magnolia.module.delta.OrderNodeToFirstPositionTask;
53  import info.magnolia.module.delta.PartialBootstrapTask;
54  import info.magnolia.module.delta.PropertyExistsDelegateTask;
55  import info.magnolia.module.delta.RemoveNodeWoChildren;
56  import info.magnolia.module.delta.RemoveNodesTask;
57  import info.magnolia.module.delta.RemovePermissionTask;
58  import info.magnolia.module.delta.RemovePropertiesTask;
59  import info.magnolia.module.delta.RemovePropertyTask;
60  import info.magnolia.module.delta.SetPropertyTask;
61  import info.magnolia.module.delta.Task;
62  import info.magnolia.module.delta.WarnTask;
63  import info.magnolia.module.forum.DefaultForumManager;
64  import info.magnolia.repository.RepositoryConstants;
65  import info.magnolia.ui.admincentral.setup.AppLauncherReorderingTask;
66  import info.magnolia.ui.admincentral.setup.AppLauncherReorderingTask.Order;
67  import info.magnolia.ui.contentapp.setup.for5_3.ContentAppMigrationTask;
68  import info.magnolia.ui.dialog.setup.migration.ControlMigratorsRegistry;
69  import info.magnolia.ui.framework.setup.AddIsPublishedRuleToAllDeactivateActionsTask;
70  import info.magnolia.ui.framework.setup.SetWritePermissionForActionsTask;
71  
72  import java.util.ArrayList;
73  import java.util.Arrays;
74  import java.util.List;
75  
76  import javax.inject.Inject;
77  import javax.jcr.ImportUUIDBehavior;
78  
79  /**
80   * Version handler for forum module.
81   */
82  public class ForumModuleVersionHandler extends DefaultModuleVersionHandler {
83  
84      protected static final String FORUM_APP_ACTIONS = "/modules/forum/apps/forum/subApps/browser/actions/";
85      private final AddRoleToUserTask grantAllToSuperuser = new AddRoleToUserTask("Grant all forum permissions to superuser", "superuser", DefaultForumManager.ROLE_FORUM_ALL_ADMIN);
86  
87      private final Task removeObsoleteConfiguration = new ArrayDelegateTask("Removing custom-security-config from 4.5 which is no more working/supported by M5",
88              new RemoveNodesTask("Remove obsolete configuration", RepositoryConstants.CONFIG, Arrays.asList(
89                      "/modules/forum/trees/forum",
90                      "/modules/adminInterface/config/securityConfiguration/repositories/forum"
91                      ), false),
92              new NodeExistsDelegateTask("Remove deprecated tree if exists", "/modules/forum/trees",
93                      new RemoveNodeWoChildren("Remove deprecated tree", "/modules/forum/trees"))
94              );
95  
96      private final Task fixObsoletePermissions = new ArrayDelegateTask("Fix obsolete permissions which are not supported",
97              new RemovePermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_USER, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.WRITE),
98              new RemovePermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_ADMIN, DefaultForumManager.FORUM_WORKSPACE, "/*", 111L),
99              new RemovePermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_MODERATOR, DefaultForumManager.FORUM_WORKSPACE, "/*", 79L),
100 
101             new AddPermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_USER, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.ALL, false),
102             new AddPermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_ADMIN, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.ALL, false),
103             new AddPermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_MODERATOR, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.ALL, false)
104             );
105 
106     @Inject
107     public ForumModuleVersionHandler(ControlMigratorsRegistry controlMigratorsRegistry) {
108 
109         ForumDialogMigrationTask dialogMigrationTask = new ForumDialogMigrationTask("forum");
110         controlMigratorsRegistry.register("checkboxSwitch", dialogMigrationTask.new ForumCheckBoxSwitchControlMigrator());
111         controlMigratorsRegistry.register("info.magnolia.module.forum.admin.dialog.NodeNameControl", dialogMigrationTask.new RemoveControlMigrator());
112         controlMigratorsRegistry.register("info.magnolia.module.forum.admin.dialog.ReferenceControl", dialogMigrationTask.new ForumEditControlMigrator());
113         controlMigratorsRegistry.register("uuidLink", dialogMigrationTask.new ForumLinkControlMigrator());
114 
115         register(DeltaBuilder.checkPrecondition("1.3", "3.0"));
116 
117         register(DeltaBuilder.update("3.0.1", "")
118                 .addTask(new PropertyExistsDelegateTask("Rename property", "", RepositoryConstants.CONFIG, "/modules/forum/dialogs/forumEdit/tabForum/allowsNestingMessages", "checked",
119                         new ArrayDelegateTask("",
120                                 new RemovePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/forum/dialogs/forumEdit/tabForum/allowsNestingMessages", "checked"),
121                                 new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/forumEdit/tabForum/allowsNestingMessages", "selected", Boolean.FALSE)
122                         )
123                         )));
124 
125         register(DeltaBuilder.update("3.3", "")
126                 .addTask(new WarnTask(String.format("Roles '%s' and '%s' aren't used anymore.", DefaultForumManager.ROLE_FORUM_BASE, DefaultForumManager.ROLE_FORUM_MODERATOR_BASE),
127                         String.format("The roles '%s and '%s' aren't used anymore in the forum module. Check your users and groups; you may want to remove theses roles from users and groups and delete them.",
128                                 DefaultForumManager.ROLE_FORUM_BASE, DefaultForumManager.ROLE_FORUM_MODERATOR_BASE)))
129                 //
130                 // => add applauncher-conf. for the new forum-app
131                 .addTask(new BootstrapSingleModuleResource("Bootstrap appLaucnher-layout conf.", "Bootstraping the applauncher-layout config.", "config.modules.ui-admincentral.config.appLauncherLayout.groups.edit.apps.forum.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
132                 //
133                 // adding the complete apps-conf for both subApps
134                 // ... we do not expect to find /modules/forum/apps ... but if there are, we move it
135                 .addTask(moveExistingApps("/modules/forum/apps_old"))
136                 // now adding app and subapps
137                 .addTask(new BootstrapSingleModuleResource("Bootstrap apps into forum.", "Bootstrapping the apps into the forum conf.", "apps/config.modules.forum.apps.forum.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
138                 .addTask(new BootstrapSingleModuleResource("Bootstrap subApp-folder.", "Bootstrapping subApp-folder into forum conf.", "apps/config.modules.forum.apps.forum.subApps.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
139                 // subApp browser
140                 .addTask(new BootstrapSingleModuleResource("Bootstrap subApp browser (rootNode).", "Bootstrapping browser-subApp-rootNode into forum conf.", "apps/config.modules.forum.apps.forum.subApps.browser.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
141                 .addTask(new BootstrapSingleModuleResource("Bootstrap actionbar for browser-subApp.", "Bootstrapping actionbar for browser-subApp.", "apps/config.modules.forum.apps.forum.subApps.browser.actionbar.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
142                 .addTask(new BootstrapSingleModuleResource("Bootstrap actions for browser-subApp.", "Bootstrapping action for browser-subApp.", "apps/config.modules.forum.apps.forum.subApps.browser.actions.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
143                 .addTask(new BootstrapSingleModuleResource("Bootstrap workbench for browser-subApp.", "Bootstrapping workbench for browser-subApp.", "apps/config.modules.forum.apps.forum.subApps.browser.workbench.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
144                 // subApp moderation
145                 .addTask(new BootstrapSingleModuleResource("Bootstrap subApp moderation (rootNode).", "Bootstrapping moderation-subApprootNode into forum conf.", "apps/config.modules.forum.apps.forum.subApps.moderation.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
146                 .addTask(new BootstrapSingleModuleResource("Bootstrap actionbar for moderation-subApp.", "Bootstrapping actionbar for moderation-subApp.", "apps/config.modules.forum.apps.forum.subApps.moderation.actionbar.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
147                 .addTask(new BootstrapSingleModuleResource("Bootstrap actions for moderation-subApp.", "Bootstrapping action for moderation-subApp.", "apps/config.modules.forum.apps.forum.subApps.moderation.actions.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
148                 .addTask(new BootstrapSingleModuleResource("Bootstrap workbench for moderation-subApp.", "Bootstrapping workbench for moderation-subApp.", "apps/config.modules.forum.apps.forum.subApps.moderation.workbench.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
149                 //
150                 // dialogs
151                 // migrating the existing dialogs
152                 .addTask(dialogMigrationTask)
153                 // adding 2 new dialogs
154                 .addTask(new BootstrapSingleModuleResource("Bootstrap dialog addForum.", "Bootstrap dialog addForum.", "dialogs/config.modules.forum.dialogs.forumAdd.xml", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW))
155                 .addTask(new BootstrapSingleModuleResource("Bootstrap dialog threadNewUIA.", "Bootstrapping dialog threadNewUIA.", "dialogs/config.modules.forum.dialogs.threadNewUIA.xml", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW))
156 
157                 // activate-command
158                 .addTask(new ModuleDependencyBootstrapTask("activation"))
159 
160                 .addTask(removeObsoleteConfiguration)
161                 .addTask(fixObsoletePermissions));
162 
163         register(DeltaBuilder.update("3.4", "")
164                 .addTask(new BootstrapSingleModuleResource("Bootstrap browser sub-app content connector.", "Bootstrapping browser sub-app content connector into forum conf.", "apps/config.modules.forum.apps.forum.subApps.browser.contentConnector.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
165                 .addTask(new BootstrapSingleModuleResource("Bootstrap moderation sub-app content connector.", "Bootstrapping moderation sub-app content connector into forum conf.", "apps/config.modules.forum.apps.forum.subApps.moderation.contentConnector.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
166                 .addTask(new ContentAppMigrationTask("/modules/forum"))
167                 .addTask(new AppLauncherReorderingTask("forum", "edit", Order.AFTER, "assets")));
168         register(DeltaBuilder.update("3.4.1", "")
169                 .addTask(new SetWritePermissionForActionsTask(FORUM_APP_ACTIONS, new String[] { "addForum", "deleteForum", "lockForum", "unlockForum", "createThread", "confirmDeleteForum", "confirmDeleteThread", "deleteThread", "editThread", "editForum",
170                         "editMessage", "confirmDeleteMessage", "deleteMessage", "validateMessage", "invalidateMessage", "lockThread", "unlockThread", "activate", "deactivate" }))
171                 .addTask(new BootstrapSingleModuleResource("Bootstrap actions for moderation-subApp.", "Bootstrapping action for moderation-subApp.", "apps/config.modules.forum.apps.forum.subApps.moderation.actions.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)));
172 
173         register(DeltaBuilder.update("3.4.2", "")
174                 .addTask(new RemoveNodesTask("Remove old forum roles when migration from 4.5 to 5.3", "Remove old forum roles when migration from 4.5 to 5.3", RepositoryConstants.USER_ROLES, Arrays.asList(
175                         "/forum-base",
176                         "/forum-moderator-base",
177                         "/forum-pagecomments-admin",
178                         "/forum-pagecomments-moderator"), true)));
179 
180         register(DeltaBuilder.update("3.4.4", "")
181                 .addTask(new NodeExistsDelegateTask("Add missing 'required' property", "Sets 'required' property of 'messageEdit/form/tabs/tabMain/fields/author' to 'true'", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/author",
182                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/author", "required", "true")))
183                 .addTask(new NodeExistsDelegateTask("Add missing 'required' property", "Sets 'required' property of 'messageEdit/form/tabs/tabMain/fields/content' to 'true'", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/content",
184                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/content", "required", "true")))
185                 .addTask(new NodeExistsDelegateTask("Add missing 'required' property", "Sets 'required' property of 'messageEdit/form/tabs/tabMetadata/fields/creationDate' to 'true'", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMetadata/fields/creationDate",
186                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMetadata/fields/creationDate", "required", "true")))
187                 .addTask(new RemoveHardcodedI18nPropertiesFromDialogsTask("forum"))
188                 .addTask(new NodeExistsDelegateTask("Change Creation Date column to use 'creationDate' rather than 'created' JCR property", "Change Creation Date column of forum app to use 'creationDate' rather than 'created' JCR property", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/browser/workbench/contentViews/list/columns/creation",
189                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/browser/workbench/contentViews/list/columns/creation", "propertyName", "creationDate")))
190                 .addTask(new NodeExistsDelegateTask("Change Creation Date column to use 'creationDate' rather than 'created' JCR property", "Change Creation Date column of forum app to use 'creationDate' rather than 'created' JCR property", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/moderation/workbench/contentViews/list/columns/creation",
191                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/moderation/workbench/contentViews/list/columns/creation", "propertyName", "creationDate")))
192                 .addTask(new NodeExistsDelegateTask("Make Creation Date property read only", "Make Creation Date property read only in forum app dialog", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMetadata/fields/creationDate",
193                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMetadata/fields/creationDate", "readOnly", "true")))
194                 .addTask(new NodeExistsDelegateTask("Make Author property read only", "Make Author property read only in forum app dialog", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/author",
195                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/author", "readOnly", "true")))
196                 .addTask(new NodeExistsDelegateTask("Make InReplyTo property read only", "Make InReplyTo property read only in forum app dialog", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/inReplyTo",
197                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/inReplyTo", "readOnly", "true")))
198                 .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' action for browser subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.browser.actions.xml", "actions/addMessage"))
199                 .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' configuration for editActions group of thread in browser subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.browser.actionbar.xml", "actionbar/sections/thread/groups/editActions/items/addMessage"))
200                 .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' configuration for editActions group of message in browser subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.browser.actionbar.xml", "actionbar/sections/message/groups/editActions/items/addMessage"))
201                 .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' action for moderation subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.moderation.actions.xml", "actions/addMessage"))
202                 .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' configuration for editActions group of message in moderation subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.moderation.actionbar.xml", "actionbar/sections/message/groups/editActions/items/addMessage"))
203                 .addTask(new BootstrapSingleModuleResource("Bootstrap 'messageAdd' dialog configuration", "", "dialogs/config.modules.forum.dialogs.messageAdd.xml"))
204                 .addTask(new NodeExistsDelegateTask("Order 'addMessage' action to the first position for browser subApp", "", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/browser/actions/addMessage",
205                         new OrderNodeToFirstPositionTask("", "modules/forum/apps/forum/subApps/browser/actions/addMessage")))
206                 .addTask(new NodeExistsDelegateTask("Order 'addMessage' action to the first position for editActions group of thread in browser subApp", "", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/browser/actionbar/sections/thread/groups/editActions/items/addMessage",
207                         new OrderNodeToFirstPositionTask("", "modules/forum/apps/forum/subApps/browser/actionbar/sections/thread/groups/editActions/items/addMessage")))
208                 .addTask(new NodeExistsDelegateTask("Order 'addMessage' action to the first position for editActions group of message in browser subApp", "", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/browser/actionbar/sections/message/groups/editActions/items/addMessage",
209                         new OrderNodeToFirstPositionTask("", "modules/forum/apps/forum/subApps/browser/actionbar/sections/message/groups/editActions/items/addMessage")))
210                 .addTask(new NodeExistsDelegateTask("Order 'addMessage' action to the first position for moderation subApp", "", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/moderation/actions/addMessage",
211                         new OrderNodeToFirstPositionTask("", "modules/forum/apps/forum/subApps/moderation/actions/addMessage")))
212                 .addTask(new NodeExistsDelegateTask("Order 'addMessage' action to the first position for editActions group of message in moderation subApp", "", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/moderation/actionbar/sections/message/groups/editActions/items/addMessage",
213                         new OrderNodeToFirstPositionTask("", "modules/forum/apps/forum/subApps/moderation/actionbar/sections/message/groups/editActions/items/addMessage")))
214                 .addTask(new NodeExistsDelegateTask("Order 'messageAdd' dialog to the first position", "", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageAdd",
215                         new OrderNodeToFirstPositionTask("", "modules/forum/dialogs/messageAdd")))
216                 .addTask(new RemoveNodesTask("Remove obsolete configuration", RepositoryConstants.CONFIG, Arrays.asList("/modules/forum/pages/forumModeration"), false)));
217 
218         register(DeltaBuilder.update("3.4.5", "")
219                 .addTask(new AddIsPublishedRuleToAllDeactivateActionsTask("", "/modules/forum/apps/")));
220 
221         register(DeltaBuilder.update("3.6", "")
222                 .addTask(new RemoveNodesTask("Remove adminInterface-legacy unused ACLs", RepositoryConstants.USER_ROLES,
223                         Arrays.asList(
224                                 "/forum_ALL-admin/acl_uri/0",
225                                 "/forum_ALL-user/acl_uri/0",
226                                 "/forum_ALL-moderator/acl_uri/0"), true)));
227 
228         register(DeltaBuilder.update("3.6.1", "")
229                 .addTask(new RemovePropertiesTask("Remove properties that are not used anymore", RepositoryConstants.CONFIG, Arrays.asList(
230                         "/modules/forum/templates/components/threadView/allowedParameters",
231                         "/modules/forum/templates/components/threadReply/allowedParameters",
232                         "/modules/forum/templates/components/threadList/allowedParameters",
233                         "/modules/forum/templates/components/threadNew/allowedParameters",
234                         "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/author/tree",
235                         "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/inReplyTo/editable",
236                         "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/inReplyTo/tree",
237                         "/modules/forum/dialogs/forumAdd/form/tabs/tabMain/fields/allowsNestingMessages/selected",
238                         "/modules/forum/dialogs/forumEdit/form/tabs/tabMain/fields/allowsNestingMessages/selected",
239                         "/modules/forum/apps/forum/subApps/browser/actions/editForum/nodeType",
240                         "/modules/forum/apps/forum/subApps/browser/actions/editForum/appName",
241                         "/modules/forum/apps/forum/chooseDialog/field/path",
242                         "/modules/forum/apps/forum/subApps/browser/actions/editMessage/nodeType",
243                         "/modules/forum/apps/forum/subApps/browser/actions/editMessage/appName",
244                         "/modules/forum/apps/forum/subApps/browser/actions/editMessage/subAppId",
245                         "/modules/forum/apps/forum/subApps/browser/actions/editThread/nodeType",
246                         "/modules/forum/apps/forum/subApps/browser/actions/editThread/appName"
247                 ), false))
248         );
249 
250         register(DeltaBuilder.update("3.7", "")
251                 .addTask(new IsModuleInstalledOrRegistered("Use PublicationCommand when publishing-core installed.", "publishing-core",
252                         new NodeExistsDelegateTask("Use PublicationCommand instead of ActivationCommand when publishing-core is installed.", "/modules/forum/commands/forum/activate",
253                                 new CheckAndModifyPropertyValueTask("/modules/forum/commands/forum/activate", "class", "info.magnolia.module.activation.commands.ActivationCommand", "info.magnolia.publishing.command.PublicationCommand"))))
254         );
255     }
256 
257     @Override
258     protected List<Task> getExtraInstallTasks(InstallContext installContext) {
259         final List<Task> tasks = new ArrayList<Task>();
260         tasks.add(grantAllToSuperuser);
261         tasks.add(new AppLauncherReorderingTask("forum", "edit", Order.AFTER, "assets"));
262         tasks.add(new NodeExistsDelegateTask("Order 'messageAdd' dialog to the first position", "", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageAdd", new OrderNodeToFirstPositionTask("", "modules/forum/dialogs/messageAdd")));
263         tasks.add(new ModuleDependencyBootstrapTask("publishing-core"));
264         tasks.add(new ModuleDependencyBootstrapTask("activation"));
265         return tasks;
266     }
267 
268     /*
269      * moves the app-folder (/modules/forum/apps) if it already exists
270      */
271     private Task moveExistingApps(String dest) {
272         String src = "/modules/forum/apps";
273         Task moveAppsTask = new MoveNodeTask("Move " + src + " to " + dest, "Moving " + src + " to " + dest, RepositoryConstants.CONFIG, src, dest, false);
274         Task checkNodeTask = new NodeExistsDelegateTask("Check if " + src + " exists.", "Check if " + src + " exists.", RepositoryConstants.CONFIG, "/modules/forum/apps", moveAppsTask);
275         return checkNodeTask;
276     }
277 
278     @Override
279     protected List<Condition> getInstallConditions() {
280         List<Condition> conditions = new ArrayList<>();
281         conditions.add(new PublishingOrActivationInstalledCondition());
282         return conditions;
283     }
284 
285     private class PublishingOrActivationInstalledCondition extends AbstractCondition {
286 
287         public PublishingOrActivationInstalledCondition() {
288             super("Publishing or Activation module is installed condition.", "Forum module requires Publishing(recommended) or Activation module installed.");
289         }
290 
291         @Override
292         public boolean check(InstallContext installContext) {
293             return installContext.isModuleRegistered("publishing-core") || installContext.isModuleRegistered("activation");
294         }
295     }
296 
297 }