View Javadoc
1   /**
2    * This file Copyright (c) 2014-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.resources.app.setup;
35  
36  import info.magnolia.jcr.util.NodeTypes;
37  import info.magnolia.module.InstallContext;
38  import info.magnolia.module.delta.AbstractCondition;
39  import info.magnolia.module.delta.AbstractRepositoryTask;
40  import info.magnolia.module.delta.AbstractTask;
41  import info.magnolia.module.delta.ArrayDelegateTask;
42  import info.magnolia.module.delta.BootstrapSingleModuleResource;
43  import info.magnolia.module.delta.BootstrapSingleResource;
44  import info.magnolia.module.delta.ChangeNodeTypeTask;
45  import info.magnolia.module.delta.CheckAndModifyPropertyValueTask;
46  import info.magnolia.module.delta.CheckOrCreatePropertyTask;
47  import info.magnolia.module.delta.Condition;
48  import info.magnolia.module.delta.CreateNodePathTask;
49  import info.magnolia.module.delta.DeltaBuilder;
50  import info.magnolia.module.delta.ModuleDependencyBootstrapTask;
51  import info.magnolia.module.delta.NodeExistsDelegateTask;
52  import info.magnolia.module.delta.OrderNodeAfterTask;
53  import info.magnolia.module.delta.PartialBootstrapTask;
54  import info.magnolia.module.delta.PathExistenceDelegateTask;
55  import info.magnolia.module.delta.RemoveNodeTask;
56  import info.magnolia.module.delta.RemoveNodesTask;
57  import info.magnolia.module.delta.RemovePropertiesTask;
58  import info.magnolia.module.delta.RenameNodeTask;
59  import info.magnolia.module.delta.SetPropertyTask;
60  import info.magnolia.module.delta.Task;
61  import info.magnolia.module.delta.TaskExecutionException;
62  import info.magnolia.module.resources.setup.ResourcesVersionHandler;
63  import info.magnolia.repository.RepositoryConstants;
64  import info.magnolia.ui.admincentral.setup.ConvertAclToAppPermissionTask;
65  import info.magnolia.ui.contentapp.setup.for5_3.ContentAppMigrationTask;
66  import info.magnolia.ui.framework.setup.AddIsPublishedRuleToAllDeactivateActionsTask;
67  
68  import java.util.ArrayList;
69  import java.util.List;
70  
71  import javax.jcr.RepositoryException;
72  
73  import com.google.common.collect.ImmutableList;
74  import com.google.common.collect.Lists;
75  
76  /**
77   * Version handler for Resources app module.
78   */
79  public class ResourcesAppModuleVersionHandler extends ResourcesVersionHandler {
80  
81      public ResourcesAppModuleVersionHandler() {
82          register(DeltaBuilder.update("2.0", "")
83                  .addTask(new ConvertAclToAppPermissionTask("Convert permissions for 'resources' app", "Convert ACL permissions for old 'Templating-kit/Resources' menu to new 'resources' app permission",
84                          "/modules/adminInterface/config/menu/templating-kit/resources ", "/modules/resources/apps/resources", true)));
85  
86          register(DeltaBuilder.update("2.2", "")
87                  .addTask(new BootstrapSingleResource("Bootstrap Resources app", "", "/mgnl-bootstrap-prior-2_3/resources/app/config.modules.resources.apps.xml"))
88                  .addTask(new BootstrapSingleResource("Add the app to the app launcher", "Adds the app to the app launcher menu.", "/mgnl-bootstrap/resources-app/config.modules.ui-admincentral.config.appLauncherLayout.groups.stk.apps.resources.xml"))
89                  .addTask(new BootstrapSingleResource("Bootstrap new resources dialogs", "", "/mgnl-bootstrap-prior-2_3/resources/app/config.modules.resources.dialogs.xml")));
90  
91          register(DeltaBuilder.update("2.2.1", "")
92                  .addTask(new ArrayDelegateTask("Add duplicate action", "Adds duplicate resource action.",
93                          new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_3/resources/app/config.modules.resources.apps.xml", "/apps/resources/subApps/browser/actions/duplicateResource"),
94                          new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_3/resources/app/config.modules.resources.apps.xml", "/apps/resources/subApps/browser/actionbar/sections/resource/groups/editActions/items/duplicateResource"))));
95  
96          register(DeltaBuilder.update("2.2.3", "")
97                  .addTask(new ArrayDelegateTask("Add editTemplate action", "Adds editTemplate of resource action.",
98                          new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_3/resources/app/config.modules.resources.apps.xml",
99                                  "/apps/resources/subApps/browser/actions/editTemplate"),
100                         new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_3/resources/app/config.modules.resources.apps.xml",
101                                 "/apps/resources/subApps/browser/actionbar/sections/resource/groups/editActions/items/editTemplate"),
102                         new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.dialogs.xml",
103                                 "/dialogs/editTemplate")
104                 )));
105 
106         register(DeltaBuilder.update("2.2.4", "")
107                 .addTask(
108                         new ArrayDelegateTask("Add support for extension handling",
109                                 new NodeExistsDelegateTask("", "/modules/resources/apps/resources/subApps/binary/editor/form/tabs/content/fields/binary",
110                                         new ArrayDelegateTask("",
111                                                 new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/resources/apps/resources/subApps/binary/editor/form/tabs/content/fields/binary",
112                                                         "editFileFormat", Boolean.TRUE),
113                                                 new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/resources/apps/resources/subApps/binary/editor/form/tabs/content/fields/binary",
114                                                         "editFileName", Boolean.TRUE))),
115                                 new PartialBootstrapTask("Add extension field", "Add extension field to the resource subapps.", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.apps.xml",
116                                         "/apps/resources/subApps/generic/code/editor/form/tabs/advanced/fields/extension"),
117                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/URI2RepositoryMapping/mappings/resources", "class",
118                                         "info.magnolia.module.resources.mapping.URI2ResourcesRepositoryMapping")))
119         );
120 
121         register(DeltaBuilder.update("2.3", "")
122                 // TODO formerly the following action would execute additional operations on EditResourceActionDefinition.class, ShowResourceVersionsActionDefinition.class actions
123                 // but since those classes are now gone - this is problematic to arrange. Even though it should not have any implications (the actions would be gone anyway eventually as of 2.4.3)
124                 // maybe ContentAppMigrationTask should accept String class names instead of the Class object - deep down it anyway boils down to comparing the class names.
125                 .addTask(new ContentAppMigrationTask("/modules/resources", new Class[]{})));
126 
127 
128         register(DeltaBuilder.update("2.3.1", "")
129                 .addTask(new NodeExistsDelegateTask("Replace ruleClass with rule", "Replaces editTemplate action availability rule.", RepositoryConstants.CONFIG, "/modules/resources/apps/resources/subApps/browser/actions/editTemplate/availability/ruleClass",
130                         new ArrayDelegateTask("",
131                                 new RemoveNodeTask("", "/modules/resources/apps/resources/subApps/browser/actions/editTemplate/availability/ruleClass"),
132                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.apps.xml", "/apps/resources/subApps/browser/actions/editTemplate/availability/rules")))));
133 
134 
135         register(DeltaBuilder.update("2.3.2", "")
136                 .addTask(new NodeExistsDelegateTask("Change nodeType of generic subapp", "", RepositoryConstants.CONFIG, "/modules/resources/apps/resources/subApps/generic",
137                         new ChangeNodeTypeTask("/modules/resources/apps/resources/subApps/generic", RepositoryConstants.CONFIG, NodeTypes.ContentNode.NAME)))
138                 .addTask(new PathExistenceDelegateTask("Add app for editing html resources", "", null,
139                         new String[]{"/modules/resources/dialogs/newResource/form/tabs/content/fields/mgnl-template/options", "/modules/resources/apps/resources/subApps/browser/actions/editResource/subAppMapping", "/modules/resources/templates"},
140                         new ArrayDelegateTask("",
141                                 new BootstrapSingleResource("", "", "/mgnl-bootstrap/resources/templates/config.modules.resources.templates.html.xml"),
142                                 new BootstrapSingleResource("", "", "/mgnl-bootstrap/resources/templates/config.modules.resources.templates.processedHtml.xml"),
143                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.apps.xml", "/apps/resources/subApps/html"),
144                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.apps.xml", "/apps/resources/subApps/generic/base/editor/form/tabs/content/fields/mgnl-template/options/html"),
145                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.apps.xml", "/apps/resources/subApps/generic/base/editor/form/tabs/content/fields/mgnl-template/options/processedHtml"),
146                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.dialogs.xml", "/dialogs/newResource/form/tabs/content/fields/mgnl-template/options/html"),
147                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap-prior-2_4/resources/app/config.modules.resources.dialogs.xml", "/dialogs/newResource/form/tabs/content/fields/mgnl-template/options/processedHtml"),
148                                 new CheckOrCreatePropertyTask("", "/modules/resources/apps/resources/subApps/browser/actions/editResource/subAppMapping", "html", "html"),
149                                 new CheckOrCreatePropertyTask("", "/modules/resources/apps/resources/subApps/browser/actions/editResource/subAppMapping", "processedHtml", "html")))));
150 
151         register(DeltaBuilder.update("2.3.3", "")
152                 .addTask(new AddIsPublishedRuleToAllDeactivateActionsTask("", "/modules/resources/apps/")));
153 
154         register(DeltaBuilder.update("2.4", "")
155                 .addTask(new AbstractRepositoryTask("Create module node", "This is the first version where resources-app module is extracted from resources module; makes sure the module node gets created.") {
156                         @Override
157                         protected void doExecute(InstallContext installContext) throws RepositoryException, TaskExecutionException {
158                                 installContext.getOrCreateCurrentModuleNode();
159                         }
160                 })
161                 .addTask(new UpdateResourcesAppConfigurationTask())
162 
163                 .addTask(new NodeExistsDelegateTask("", "/modules/resources-app/dialogs/editTemplate/form/tabs/tabTemplate/fields/template",
164                         new CheckAndModifyPropertyValueTask("/modules/resources-app/dialogs/editTemplate/form/tabs/tabTemplate/fields/template", "extends", "/modules/resources/apps/resources/subApps/generic/base/editor/form/tabs/content/fields/mgnl-template", "/modules/resources-app/apps/resources-legacy/subApps/generic/base/editor/form/tabs/content/fields/mgnl-template")))
165                 .addTask(new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources-legacy/subApps/browser/actions/addResource",
166                         new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources-legacy/subApps/browser/actions/addResource", "dialogName", "resources:newResource", "resources-app:newResource")))
167                 .addTask(new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources-legacy/subApps/browser/actions/renameResource",
168                         new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources-legacy/subApps/browser/actions/renameResource", "dialogName", "resources:renameResource", "resources-app:renameResource")))
169                 .addTask(new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources-legacy/subApps/browser/actions/renameResource",
170                         new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources-legacy/subApps/browser/actions/editTemplate", "dialogName", "resources:editTemplate", "resources-app:editTemplate")))
171                 .addTask(new NodeExistsDelegateTask("Yaml files sub-app", "/modules/resources-app/apps/resources-legacy/subApps",
172                         new PartialBootstrapTask("", "/mgnl-bootstrap-prior-2_4_3/config.modules.resources-app.apps.resources-legacy.xml", "/resources-legacy/subApps/yaml")))
173                 .addTask(new NodeExistsDelegateTask("Yaml type dialog option", "/modules/resources-app/dialogs/newResource/form/tabs/content/fields/mgnl-template/options",
174                         new PartialBootstrapTask("", "/mgnl-bootstrap-prior-2_4_3/config.modules.resources-app.dialogs.newResource.xml", "/newResource/form/tabs/content/fields/mgnl-template/options/yaml")))
175                 .addTask(new NodeExistsDelegateTask("Yaml option in template list", "/modules/resources-app/apps/resources-legacy/subApps/generic/base/editor/form/tabs/content/fields/mgnl-template/options",
176                         new PartialBootstrapTask("", "/mgnl-bootstrap-prior-2_4_3/config.modules.resources-app.apps.resources-legacy.xml", "/resources-legacy/subApps/generic/base/editor/form/tabs/content/fields/mgnl-template/options/yaml")))
177                 .addTask(new NodeExistsDelegateTask("Yaml mapping for editResource action", "/modules/resources-app/apps/resources-legacy/subApps/browser/actions/editResource/subAppMapping",
178                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/resources-app/apps/resources-legacy/subApps/browser/actions/editResource/subAppMapping", "yaml", "yaml")))
179 
180                 .addTask(new BootstrapSingleModuleResource("config.modules.resources-app.apps.resources.xml"))
181         );
182 
183         register(DeltaBuilder.update("2.4.2", "")
184                 .addTask(new PartialBootstrapTask("Bootstrap new activationStatus view", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/workbench/contentViews/views/columns/activationStatus"))
185 
186                 .addTask(new PartialBootstrapTask("Bootstrap activate action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/activate"))
187                 .addTask(new PartialBootstrapTask("Bootstrap deactivate action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/deactivate"))
188 
189                 .addTask(new AbstractTask("Add/Remove resource actions", "Install Add/Remove resource actions") {
190 
191                     private String appBootstrapFile = "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml";
192                     private String subAppPath = "/resources/subApps/browser/%s";
193                     private String absoluteAppPath = "/modules/resources-app/apps";
194 
195                     private ArrayDelegateTask delegateTask = new ArrayDelegateTask("",
196                             new RemoveNodeTask("Remove 'deleteHotfix' action", String.format(absoluteAppPath + subAppPath, "actions/removeHotfix")),
197                             new RemoveNodeTask("Remove 'hotfixResource' action", String.format(absoluteAppPath + subAppPath, "actions/hotfixResource")),
198                             new RemoveNodeTask("Remove whole group of hotfix actions from action bar", String.format(absoluteAppPath + subAppPath, "actionbar/sections/main/groups/hotfixActions")),
199                             new BootstrapSingleModuleResource("Install 'addFile' dialog", "", "config.modules.resources-app.dialogs.addFile.xml"),
200                             new PartialBootstrapTask("Install 'addFile' action", appBootstrapFile, String.format(subAppPath, "actions/addFile")),
201                             new PartialBootstrapTask("Install 'deleteFile' action", appBootstrapFile, String.format(subAppPath, "actions/markFileAsDeleted")),
202                             new PartialBootstrapTask("Install 'confirmFileDeletion' action", appBootstrapFile, String.format(subAppPath, "actions/confirmFileDeletion")),
203                             new ArrayDelegateTask("Setup 'addFile' action in action bar",
204                                     new CreateNodePathTask("", String.format(absoluteAppPath + subAppPath, "actionbar/sections/file/groups/addActions/items/addFile"), NodeTypes.ContentNode.NAME),
205                                     new NodeExistsDelegateTask("", String.format(absoluteAppPath + subAppPath, "actionbar/sections/file/groups/editActions/items/previewResource"),
206                                             new OrderNodeAfterTask("", String.format(absoluteAppPath + subAppPath, "actionbar/sections/file/groups/editActions/items/previewResource"), "addFile"))),
207                             new ArrayDelegateTask("Setup 'deleteFile' action in action bar",
208                                     new CreateNodePathTask("", String.format(absoluteAppPath + subAppPath, "actionbar/sections/file/groups/editActions/items/confirmFileDeletion"), NodeTypes.ContentNode.NAME),
209                                     new NodeExistsDelegateTask("", String.format(absoluteAppPath + subAppPath, "actionbar/sections/file/groups/editActions/items/editFile"),
210                                             new OrderNodeAfterTask("", String.format(absoluteAppPath + subAppPath, "actionbar/sections/file/groups/editActions/items/confirmFileDeletion"), "editFile"))));
211 
212                     @Override
213                     public void execute(InstallContext installContext) throws TaskExecutionException {
214                         delegateTask.execute(installContext);
215                     }
216                 })
217 
218                 .addTask(new PartialBootstrapTask("Bootstrap new upload action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/uploadFile"))
219                         .addTask(new PartialBootstrapTask("Bootstrap upload action in actionbar", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/file/groups/uploadActions/items/uploadFile"))
220                         .addTask(new BootstrapSingleModuleResource("Install 'uploadFile' dialog", "", "config.modules.resources-app.dialogs.uploadFile.xml"))
221 
222                         .addTask(new PartialBootstrapTask("Bootstrap imageProvider", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/imageProvider"))
223 
224                         .addTask(new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources/subApps/browser/actionbar/sections/main",
225                                 new RemoveNodeTask("Remove existing main actionbar", "/modules/resources-app/apps/resources/subApps/browser/actionbar/sections/main")))
226 
227                         .addTask(new ArrayDelegateTask("",
228                                 new PartialBootstrapTask("Bootstrap new deletion activation action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/activateDeletion"),
229                                 new PartialBootstrapTask("Bootstrap new restore version action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/restoreVersion"),
230                                 new PartialBootstrapTask("Bootstrap new restore previous version action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/restorePreviousVersion"),
231                                 new PartialBootstrapTask("Bootstrap new show versions action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/showVersions"),
232                                 new PartialBootstrapTask("Bootstrap new deleted file actionbar", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/deletedFile")))
233 
234                 .addTask(new PartialBootstrapTask("Bootstrap new mark folder as deleted action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/markFolderAsDeleted"))
235                 .addTask(new PartialBootstrapTask("Bootstrap new confirm folder as deleted action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/confirmFolderDeletion"))
236                         .addTask(new PartialBootstrapTask("Bootstrap new confirm folder as deleted action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/addFolder"))
237 
238                         .addTask(new PartialBootstrapTask("Bootstrap mark folder as deleted action in actionbar", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/editableFolder/groups/addActions/items/confirmFolderDeletion"))
239                         .addTask(new ArrayDelegateTask("Adjust actionbar",
240                                 new PartialBootstrapTask("", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/file"),
241                                 new PartialBootstrapTask("", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/deletedFile"),
242                                 new PartialBootstrapTask("", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/nonEditableFolder"),
243                                 new PartialBootstrapTask("", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/editableFolder"),
244                                 new PartialBootstrapTask("", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/deletedFolder"),
245                                 new PartialBootstrapTask("", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/main")
246                         ))
247 
248                 .addTask(new ArrayDelegateTask("Adjusting columns",
249                         new PartialBootstrapTask("Adding editable column", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/workbench/contentViews/views/columns/editable"),
250                         new NodeExistsDelegateTask("Adjusting overriding column width", "/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/overriding",
251                                 new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/overriding", "width", "71", "90")),
252                         new NodeExistsDelegateTask("Adjusting originName column width", "/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/originName",
253                                 new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/originName", "expandRatio", "0.25", "0.15")),
254                         new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/editable",
255                                 new OrderNodeAfterTask("Moving editable column after name", "/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/editable", "name")),
256                         new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/format",
257                                 new OrderNodeAfterTask("Moving format column after overriding", "/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/format", "overriding"))))
258                 .addTask(new BootstrapSingleModuleResource("Install 'addFolder' dialog", "", "config.modules.resources-app.dialogs.addFolder.xml"))
259 
260                 .addTask(new ArrayDelegateTask("Bootstrapping overriddenFiles",
261                         new PartialBootstrapTask("Adding overridingFile to actionbar", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actionbar/sections/overridingFile"),
262                         new OrderNodeAfterTask("Move 'overridingFile' section after 'file' section", "/modules/resources-app/apps/resources/subApps/browser/actionbar/sections/overridingFile", "file"),
263                         new PartialBootstrapTask("Adding overridingFile action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/confirmOverriddenFileDeletion")))
264 
265                 .addTask(new ArrayDelegateTask("Renaming actions from 'resource' to 'file'",
266                         new NodeExistsDelegateTask("Changing defaultAction name in actionbar", "/modules/resources-app/apps/resources/subApps/browser/actionbar",
267                                 new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources/subApps/browser/actionbar", "defaultAction", "openResource", "openFile")),
268                         new NodeExistsDelegateTask("Renaming from openResource to openFile", "/modules/resources-app/apps/resources/subApps/browser/actions/openResource",
269                                 new RenameNodeTask("", RepositoryConstants.CONFIG, "/modules/resources-app/apps/resources/subApps/browser/actions", "openResource", "openFile", true)),
270                         new NodeExistsDelegateTask("Renaming from viewResource to viewFile", "/modules/resources-app/apps/resources/subApps/browser/actions/viewResource",
271                                 new RenameNodeTask("", RepositoryConstants.CONFIG, "/modules/resources-app/apps/resources/subApps/browser/actions", "viewResource", "viewFile", true))))
272 
273                 .addTask(new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources/subApps/browser/actions/editResource",
274                         new ArrayDelegateTask("",
275                                 new RenameNodeTask("Renaming editResource to editFile", RepositoryConstants.CONFIG, "/modules/resources-app/apps/resources/subApps/browser/actions", "editResource", "editFile", true),
276                                 new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources/subApps/browser/actions/editFile", "class", "info.magnolia.ui.contentapp.detail.action.EditItemActionDefinition", "info.magnolia.resources.app.action.EditResourceActionDefinition"),
277                                 new RemoveNodeTask("", "/modules/resources-app/apps/resources/subApps/browser/actions/editFile/availability/rules/IsEditableRule"),
278                                 new PartialBootstrapTask("Adjusting availability rules of editFile action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/editFile/availability/rules/IsNotDeletedRule"))))
279 
280                 .addTask(new NodeExistsDelegateTask("", "/modules/resources-app/apps/resources/subApps/browser/actions/",
281                         new ArrayDelegateTask("Disabling preview/edit actions for binary resources",
282                                 new PartialBootstrapTask("Adjusting availability rules of viewFile action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/viewFile/availability/rules/IsNotBinaryFileRule"),
283                                 new PartialBootstrapTask("Adjusting availability rules of openFile action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/openFile/availability/rules/IsNotBinaryFileRule"),
284                                 new PartialBootstrapTask("Adjusting availability rules of editFile action", "/mgnl-bootstrap/resources-app/config.modules.resources-app.apps.resources.xml", "/resources/subApps/browser/actions/editFile/availability/rules/IsNotBinaryFileRule"))))
285         );
286 
287         register(DeltaBuilder.update("2.4.3", "")
288                 .addTask(new RemoveNodeTask("Remove legacy resources app", "/modules/resources-app/apps/resources-legacy"))
289                 .addTask(new RemoveNodesTask("Remove legacy resources app dialogs", RepositoryConstants.CONFIG, Lists.newArrayList(
290                         "/modules/resources-app/dialogs/editTemplate",
291                         "/modules/resources-app/dialogs/renameResource",
292                         "/modules/resources-app/dialogs/newResource"
293                 ), true)));
294 
295         register(DeltaBuilder.update("2.4.6", "")
296                 .addTask(new ModuleDependencyBootstrapTask("activation"))
297         );
298 
299         register(DeltaBuilder.update("2.5.1", "")
300                 .addTask(new RemovePropertiesTask("Remove legacy properties from configuration", RepositoryConstants.CONFIG, ImmutableList.of(
301                         "/modules/resources-app/apps/resources/subApps/browser/actions/addFile/appName",
302                         "/modules/resources-app/apps/resources/subApps/browser/workbench/contentViews/views/columns/originName/styleClass"
303                 ), true))
304         );
305 
306         register(DeltaBuilder.update("2.5.3", "")
307                 .addTask(new NodeExistsDelegateTask("Change viewFile action definition", "/modules/resources-app/apps/resources/subApps/browser/actions/viewFile",
308                         new CheckAndModifyPropertyValueTask("/modules/resources-app/apps/resources/subApps/browser/actions/viewFile", "class", "info.magnolia.ui.contentapp.detail.action.EditItemActionDefinition", "info.magnolia.resources.app.action.ViewResourceActionDefinition")
309                 ))
310         );
311 
312         register(DeltaBuilder.update("2.6", "")
313                 .addTask(new ModuleDependencyBootstrapTask("publishing-core"))
314         );
315     }
316 
317     @Override
318     protected List<Task> getExtraInstallTasks(InstallContext installContext) {
319         List<Task> tasks = new ArrayList<>(super.getExtraInstallTasks(installContext));
320         tasks.add(new ModuleDependencyBootstrapTask("publishing-core"));
321         tasks.add(new ModuleDependencyBootstrapTask("activation"));
322         return tasks;
323     }
324 
325     @Override
326     protected List<Condition> getInstallConditions() {
327         List<Condition> conditions = new ArrayList<>();
328         conditions.add(new PublishingOrActivationInstalledCondition());
329         return conditions;
330     }
331 
332     private class PublishingOrActivationInstalledCondition extends AbstractCondition {
333 
334         public PublishingOrActivationInstalledCondition() {
335             super("Publishing or Activation module is installed condition.", "Resources app module requires Publishing(recommended) or Activation module installed.");
336         }
337 
338         @Override
339         public boolean check(InstallContext installContext) {
340             return installContext.isModuleRegistered("publishing-core") || installContext.isModuleRegistered("activation");
341         }
342     }
343 }