View Javadoc

1   /**
2    * This file Copyright (c) 2003-2012 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.module.DefaultModuleVersionHandler;
38  import info.magnolia.module.InstallContext;
39  import info.magnolia.module.delta.AddPermissionTask;
40  import info.magnolia.module.delta.AddRoleToUserTask;
41  import info.magnolia.module.delta.ArrayDelegateTask;
42  import info.magnolia.module.delta.BootstrapSingleModuleResource;
43  import info.magnolia.module.delta.DeltaBuilder;
44  import info.magnolia.module.delta.MoveNodeTask;
45  import info.magnolia.module.delta.NodeExistsDelegateTask;
46  import info.magnolia.module.delta.PropertyExistsDelegateTask;
47  import info.magnolia.module.delta.RemoveNodeWoChildren;
48  import info.magnolia.module.delta.RemoveNodesTask;
49  import info.magnolia.module.delta.RemovePermissionTask;
50  import info.magnolia.module.delta.RemovePropertyTask;
51  import info.magnolia.module.delta.SetPropertyTask;
52  import info.magnolia.module.delta.Task;
53  import info.magnolia.module.delta.WarnTask;
54  import info.magnolia.module.forum.DefaultForumManager;
55  import info.magnolia.repository.RepositoryConstants;
56  import info.magnolia.ui.admincentral.setup.AppLauncherReorderingTask;
57  import info.magnolia.ui.admincentral.setup.AppLauncherReorderingTask.Order;
58  import info.magnolia.ui.contentapp.setup.for5_3.ContentAppMigrationTask;
59  import info.magnolia.ui.dialog.setup.migration.ControlMigratorsRegistry;
60  import info.magnolia.ui.framework.setup.SetWritePermissionForActionsTask;
61  
62  import java.util.ArrayList;
63  import java.util.Arrays;
64  import java.util.List;
65  
66  import javax.inject.Inject;
67  import javax.jcr.ImportUUIDBehavior;
68  
69  /**
70   * Version handler for forum module.
71   */
72  public class ForumModuleVersionHandler extends DefaultModuleVersionHandler {
73  
74      protected static final String FORUM_APP_ACTIONS = "/modules/forum/apps/forum/subApps/browser/actions/";
75      private final AddRoleToUserTask grantAllToSuperuser = new AddRoleToUserTask("Grant all forum permissions to superuser", "superuser", DefaultForumManager.ROLE_FORUM_ALL_ADMIN);
76  
77      private final Task removeObsoleteConfiguration = new ArrayDelegateTask("Removing custom-security-config from 4.5 which is no more working/supported by M5",
78              new RemoveNodesTask("Remove obsolete configuration", RepositoryConstants.CONFIG, Arrays.asList(
79                      "/modules/forum/trees/forum",
80                      "/modules/adminInterface/config/securityConfiguration/repositories/forum"
81                      ), false),
82              new NodeExistsDelegateTask("Remove deprecated tree if exists", "/modules/forum/trees",
83                      new RemoveNodeWoChildren("Remove deprecated tree", "/modules/forum/trees"))
84              );
85  
86      private final Task fixObsoletePermissions = new ArrayDelegateTask("Fix obsolete permissions which are not supported",
87              new RemovePermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_USER, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.WRITE),
88              new RemovePermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_ADMIN, DefaultForumManager.FORUM_WORKSPACE, "/*", 111L),
89              new RemovePermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_MODERATOR, DefaultForumManager.FORUM_WORKSPACE, "/*", 79L),
90  
91              new AddPermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_USER, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.ALL, false),
92              new AddPermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_ADMIN, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.ALL, false),
93              new AddPermissionTask("", DefaultForumManager.ROLE_FORUM_ALL_MODERATOR, DefaultForumManager.FORUM_WORKSPACE, "/*", Permission.ALL, false)
94              );
95  
96      @Inject
97      public ForumModuleVersionHandler(ControlMigratorsRegistry controlMigratorsRegistry) {
98  
99          ForumDialogMigrationTask dialogMigrationTask = new ForumDialogMigrationTask("forum");
100         controlMigratorsRegistry.register("checkboxSwitch", dialogMigrationTask.new ForumCheckBoxSwitchControlMigrator());
101         controlMigratorsRegistry.register("info.magnolia.module.forum.admin.dialog.NodeNameControl", dialogMigrationTask.new RemoveControlMigrator());
102         controlMigratorsRegistry.register("info.magnolia.module.forum.admin.dialog.ReferenceControl", dialogMigrationTask.new ForumEditControlMigrator());
103         controlMigratorsRegistry.register("uuidLink", dialogMigrationTask.new ForumLinkControlMigrator());
104 
105         register(DeltaBuilder.checkPrecondition("1.3", "3.0"));
106 
107         register(DeltaBuilder.update("3.0.1", "")
108                 .addTask(new PropertyExistsDelegateTask("Rename property", "", RepositoryConstants.CONFIG, "/modules/forum/dialogs/forumEdit/tabForum/allowsNestingMessages", "checked",
109                         new ArrayDelegateTask("",
110                                 new RemovePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/forum/dialogs/forumEdit/tabForum/allowsNestingMessages", "checked"),
111                                 new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/forumEdit/tabForum/allowsNestingMessages", "selected", Boolean.FALSE)
112                         )
113                         )));
114 
115         register(DeltaBuilder.update("3.3", "")
116                 .addTask(new WarnTask(String.format("Roles '%s' and '%s' aren't used anymore.", DefaultForumManager.ROLE_FORUM_BASE, DefaultForumManager.ROLE_FORUM_MODERATOR_BASE),
117                         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.",
118                                 DefaultForumManager.ROLE_FORUM_BASE, DefaultForumManager.ROLE_FORUM_MODERATOR_BASE)))
119                 //
120                 // => add applauncher-conf. for the new forum-app
121                 .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))
122                 //
123                 // adding the complete apps-conf for both subApps
124                 // ... we do not expect to find /modules/forum/apps ... but if there are, we move it
125                 .addTask(moveExistingApps("/modules/forum/apps_old"))
126                 // now adding app and subapps
127                 .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))
128                 .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))
129                 // subApp browser
130                 .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))
131                 .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))
132                 .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))
133                 .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))
134                 // subApp moderation
135                 .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))
136                 .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))
137                 .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))
138                 .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))
139                 //
140                 // dialogs
141                 // migrating the existing dialogs
142                 .addTask(dialogMigrationTask)
143                 // adding 2 new dialogs
144                 .addTask(new BootstrapSingleModuleResource("Bootstrap dialog addForum.", "Bootstrap dialog addForum.", "dialogs/config.modules.forum.dialogs.forumAdd.xml", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW))
145                 .addTask(new BootstrapSingleModuleResource("Bootstrap dialog threadNewUIA.", "Bootstrapping dialog threadNewUIA.", "dialogs/config.modules.forum.dialogs.threadNewUIA.xml", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW))
146 
147                 // activate-command
148                 .addTask(new BootstrapSingleModuleResource("Bootstrap activation command.", "Bootstraping activation command.", "commands/forum/config.modules.forum.commands.forum.activate.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW))
149 
150                 .addTask(removeObsoleteConfiguration)
151                 .addTask(fixObsoletePermissions));
152 
153         register(DeltaBuilder.update("3.4", "")
154                 .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))
155                 .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))
156                 .addTask(new ContentAppMigrationTask("/modules/forum"))
157                 .addTask(new AppLauncherReorderingTask("forum", "edit", Order.AFTER, "assets"))
158         );
159         register(DeltaBuilder.update("3.4.1", "")
160                 .addTask(new SetWritePermissionForActionsTask(FORUM_APP_ACTIONS, new String[] { "addForum", "deleteForum", "lockForum", "unlockForum", "createThread", "confirmDeleteForum", "confirmDeleteThread", "deleteThread", "editThread", "editForum",
161                         "editMessage", "confirmDeleteMessage", "deleteMessage", "validateMessage", "invalidateMessage", "lockThread", "unlockThread", "activate", "deactivate" }))
162                 .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)));
163 
164     }
165 
166     @Override
167     protected List<Task> getExtraInstallTasks(InstallContext installContext) {
168         final List<Task> tasks = new ArrayList<Task>();
169         tasks.add(grantAllToSuperuser);
170         tasks.add(new AppLauncherReorderingTask("forum", "edit", Order.AFTER, "assets"));
171         return tasks;
172     }
173 
174     /*
175      * moves the app-folder (/modules/forum/apps) if it already exists
176      */
177     private Task moveExistingApps(String dest) {
178         String src = "/modules/forum/apps";
179         Task moveAppsTask = new MoveNodeTask("Move " + src + " to " + dest, "Moving " + src + " to " + dest, RepositoryConstants.CONFIG, src, dest, false);
180         Task checkNodeTask = new NodeExistsDelegateTask("Check if " + src + " exists.", "Check if " + src + " exists.", RepositoryConstants.CONFIG, "/modules/forum/apps", moveAppsTask);
181         return checkNodeTask;
182     }
183 
184 }