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.dam.app.setup;
35  
36  import static info.magnolia.nodebuilder.Ops.*;
37  
38  import info.magnolia.dam.app.assets.editor.AssetDetailSubApp;
39  import info.magnolia.dam.app.assets.field.DamWorkbenchFieldDefinition;
40  import info.magnolia.dam.app.commands.ImportAssetZipCommand;
41  import info.magnolia.dam.app.commands.MarkAssetFolderAsDeletedCommand;
42  import info.magnolia.dam.app.setup.for2_0.UpdateDamAppConfigurationTask;
43  import info.magnolia.dam.app.setup.for2_0.UpdateDamAssetFileNamePropertiesTask;
44  import info.magnolia.dam.app.setup.migration.DamControlMigrator;
45  import info.magnolia.dam.app.setup.migration.DamLinkControlMigrator;
46  import info.magnolia.dam.app.ui.field.DamFilePreviewComponent;
47  import info.magnolia.dam.app.ui.field.configuration.icon.IconThumbnailComponentProvider;
48  import info.magnolia.dam.app.ui.field.configuration.image.ImagePreviewComponentProvider;
49  import info.magnolia.dam.app.ui.field.configuration.image.ImageThumbnailComponentProvider;
50  import info.magnolia.dam.app.ui.field.definition.DamUploadFieldDefinition;
51  import info.magnolia.dam.app.ui.field.factory.AssetsEnabledRichTextFieldFactory;
52  import info.magnolia.dam.app.ui.field.factory.DamUploadFieldFactory;
53  import info.magnolia.dam.core.setup.DamVersionHandler;
54  import info.magnolia.i18nsystem.setup.RemoveHardcodedI18nPropertiesFromDialogsTask;
55  import info.magnolia.i18nsystem.setup.RemoveHardcodedI18nPropertiesFromSubappsTask;
56  import info.magnolia.jcr.util.NodeTypes;
57  import info.magnolia.module.InstallContext;
58  import info.magnolia.module.delta.AddPermissionTask;
59  import info.magnolia.module.delta.ArrayDelegateTask;
60  import info.magnolia.module.delta.BootstrapConditionally;
61  import info.magnolia.module.delta.BootstrapSingleModuleResource;
62  import info.magnolia.module.delta.ChangeAllPropertiesWithCertainValueTask;
63  import info.magnolia.module.delta.CheckAndModifyPartOfPropertyValueTask;
64  import info.magnolia.module.delta.CheckAndModifyPropertyValueTask;
65  import info.magnolia.module.delta.CheckOrCreatePropertyTask;
66  import info.magnolia.module.delta.CreateNodeTask;
67  import info.magnolia.module.delta.DeltaBuilder;
68  import info.magnolia.module.delta.IsAuthorInstanceDelegateTask;
69  import info.magnolia.module.delta.IsModuleInstalledOrRegistered;
70  import info.magnolia.module.delta.NewPropertyTask;
71  import info.magnolia.module.delta.NodeExistsDelegateTask;
72  import info.magnolia.module.delta.OrderNodeAfterTask;
73  import info.magnolia.module.delta.OrderNodeBeforeTask;
74  import info.magnolia.module.delta.PartialBootstrapTask;
75  import info.magnolia.module.delta.PropertyExistsDelegateTask;
76  import info.magnolia.module.delta.PropertyValueDelegateTask;
77  import info.magnolia.module.delta.RemoveNodeTask;
78  import info.magnolia.module.delta.RemovePropertiesTask;
79  import info.magnolia.module.delta.RemovePropertyTask;
80  import info.magnolia.module.delta.RenameNodesTask;
81  import info.magnolia.module.delta.SetPropertyTask;
82  import info.magnolia.module.delta.Task;
83  import info.magnolia.nodebuilder.task.ErrorHandling;
84  import info.magnolia.nodebuilder.task.NodeBuilderTask;
85  import info.magnolia.repository.RepositoryConstants;
86  import info.magnolia.ui.admincentral.setup.AppLauncherReorderingTask;
87  import info.magnolia.ui.admincentral.setup.AppLauncherReorderingTask.Order;
88  import info.magnolia.ui.admincentral.setup.ConvertAclToAppPermissionTask;
89  import info.magnolia.ui.contentapp.field.WorkbenchFieldDefinition;
90  import info.magnolia.ui.contentapp.setup.for5_3.ContentAppMigrationTask;
91  import info.magnolia.ui.dialog.setup.migration.ControlMigratorsRegistry;
92  import info.magnolia.ui.form.field.definition.StaticFieldDefinition;
93  import info.magnolia.ui.form.field.definition.TextFieldDefinition;
94  import info.magnolia.ui.framework.action.ConfirmationActionDefinition;
95  import info.magnolia.ui.framework.action.DeleteConfirmationActionDefinition;
96  import info.magnolia.ui.framework.action.DownloadBinaryActionDefinition;
97  import info.magnolia.ui.framework.availability.IsNotDeletedRule;
98  import info.magnolia.ui.framework.setup.AddIsPublishedRuleToAllDeactivateActionsTask;
99  import info.magnolia.ui.framework.setup.SetWritePermissionForActionsTask;
100 
101 import java.util.ArrayList;
102 import java.util.List;
103 
104 import javax.inject.Inject;
105 import javax.jcr.ImportUUIDBehavior;
106 
107 import org.apache.jackrabbit.JcrConstants;
108 
109 import com.google.common.collect.ImmutableList;
110 
111 /**
112  * Version handler for the dam-app module.
113  */
114 public class DamAppVersionHandler extends DamVersionHandler {
115 
116     @Inject
117     public DamAppVersionHandler(ControlMigratorsRegistry controlMigratorsRegistry) {
118         // Register control migration task.
119         controlMigratorsRegistry.register("dam", new DamControlMigrator());
120         // Override link control migration in order to support dms to dam link migration.
121         controlMigratorsRegistry.register("link", new DamLinkControlMigrator());
122 
123         register(DeltaBuilder.update("1.0.1", "")
124                 // Dialogs
125                 .addTask(new NodeExistsDelegateTask("Remove link dialog Node", "Remove dialog definition in dam/dialogs/link", RepositoryConstants.CONFIG, "/modules/dam/dialogs/link",
126                         new RemoveNodeTask("Remove link dialog Node", "Remove dialog definition in dam/dialogs/link", RepositoryConstants.CONFIG, "/modules/dam/dialogs/link")))
127                 .addTask(new NodeExistsDelegateTask("Remove dialog folder Node", "Remove dialog definition in dam/dialogs/folder", RepositoryConstants.CONFIG, "/modules/dam/dialogs/folder",
128                         new RemoveNodeTask("Remove dialog folder Node", "Remove dialog definition in dam/dialogs/folder", RepositoryConstants.CONFIG, "/modules/dam/dialogs/folder")))
129                 .addTask(new PartialBootstrapTask("Add renameAsset dialog", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.dialogs.xml", "/dialogs/renameAsset"))
130 
131                 .addTask(new NodeExistsDelegateTask("Change folder action to reference ui-framework", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/editFolder",
132                         new CheckAndModifyPartOfPropertyValueTask("Change rename-folder dialog reference", "Change rename-folder action to reference 'ui-framework:folder'", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/editFolder", "dialogName", "dam:folder", "ui-framework:folder")))
133 
134                 .addTask(new NodeBuilderTask("Add new control to editor subapp", "Adds a new edit control 'caption' to the asset editor subapp.", ErrorHandling.logging, RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields",
135                         addNode("caption", NodeTypes.ContentNode.NAME).then(
136                                 addProperty("class", TextFieldDefinition.class.getName()),
137                                 addProperty("description", "A caption to display next to asset"),
138                                 addProperty("label", "Caption"),
139                                 addProperty("name", "caption")
140                                 )
141                         ))
142                 .addTask(new OrderNodeAfterTask("Move caption control", "Move caption control after the resource control in the asset editor subapp", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields/caption", "resource"))
143 
144                 .addTask(new PartialBootstrapTask("Add renameAsset action", "Adds the renameAsset action in assets browser subApp", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/renameAsset"))
145                 .addTask(new CreateNodeTask("Add renameAsset to asset actionBar section", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/asset/groups/editActions/items", "renameAsset", NodeTypes.Content.NAME))
146                 .addTask(new OrderNodeAfterTask("Move renameAsset action to proper location", "Move it to after editAsset", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/asset/groups/editActions/items/renameAsset", "editAsset"))
147                 .addTask(new CreateNodeTask("Add renameAsset to assetDeleted actionBar section", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/deletedAsset/groups/editActions/items", "renameAsset", NodeTypes.Content.NAME))
148                 .addTask(new OrderNodeAfterTask("Move renameAsset action to proper location", "Move it to after editAsset", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/deletedAsset/groups/editActions/items/renameAsset", "editAsset"))
149 
150                 .addTask(new NodeExistsDelegateTask("Change label of foldercreation action to 'Add folder'", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/addFolder",
151                         new CheckAndModifyPartOfPropertyValueTask("Change label of foldercreation action to 'Add folder'", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/addFolder", "label", "New folder", "Add folder"))));
152 
153         register(DeltaBuilder.update("1.0.2", "")
154                 // new action for confirmation
155                 .addTask(new PartialBootstrapTask("Add new confirmDeleteAsset action definition", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/confirmDeleteAsset"))
156                 .addTask(new PartialBootstrapTask("Add new confirmDeleteFolder action definition", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/confirmDeleteFolder"))
157 
158                 .addTask(new NodeExistsDelegateTask("Remove action availability from deleteAsset action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteAsset",
159                         new RemoveNodeTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteAsset/availability")))
160                 .addTask(new PropertyExistsDelegateTask("Remove label for deleteAsset action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteAsset", "label",
161                         new RemovePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteAsset", "label")))
162                 .addTask(new PropertyExistsDelegateTask("Remove icon for deleteAsset action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteAsset", "icon",
163                         new RemovePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteAsset", "icon")))
164 
165                 .addTask(new NodeExistsDelegateTask("Remove action availability from deleteFolder action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder",
166                         new RemoveNodeTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder/availability")))
167                 .addTask(new PropertyExistsDelegateTask("Remove label for deleteFolder action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder", "label",
168                         new RemovePropertyTask("Remove label for deleteFolder action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder", "label")))
169                 .addTask(new PropertyExistsDelegateTask("Remove icon for deleteFolder action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder", "icon",
170                         new RemovePropertyTask("Remove icon for deleteFolder action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder", "icon")))
171 
172                 // update actionbar action mappings deleteFolder -> confirmDeleteFolder, deleteAsset > confirmDeleteAsset
173                 .addTask(new NodeExistsDelegateTask("update actionbar mappings", "update actionbar mappings", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar",
174                         new RenameNodesTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar", "deleteAsset", "confirmDeleteAsset", NodeTypes.ContentNode.NAME)))
175 
176                 .addTask(new NodeExistsDelegateTask("update actionbar mappings", "update actionbar mappings", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar",
177                         new RenameNodesTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar", "deleteFolder", "confirmDeleteFolder", NodeTypes.ContentNode.NAME))));
178 
179         register(DeltaBuilder.update("1.1", "")
180                 .addTask(new PartialBootstrapTask("Bootstrap new actionbar section in Assets app.", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/multiple"))
181                 .addTask(new NewPropertyTask("Set Delete actions multi-item", "Sets multiple=true in ConfirmDelete actions' availability, i.e. Delete action now supports multiple items.", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/confirmDeleteAsset/availability", "multiple", "true"))
182 
183                 .addTask(new PropertyExistsDelegateTask("Rename the metadataStandard field type ", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard", "class",
184                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard", "class", StaticFieldDefinition.class.getName())))
185                 .addTask(new PropertyExistsDelegateTask("Remove default value of the metadataStandard field Definition ", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard", "defaultValue",
186                         new RemovePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard", "defaultValue")))
187                 .addTask(new PropertyExistsDelegateTask("Set value property of the static metadataStandard field ", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard", "defaultValue",
188                         new SetPropertyTask("Set value of the static metadataStandard field ", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard", "value", "Simple Dublin Core Metadata Element Set (DCMES)")))
189 
190                 // Enable versioning
191                 .addTask(new NodeExistsDelegateTask("Add catalog 'versioned' to activate action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/activate",
192                         new CheckOrCreatePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/activate", "catalog", "versioned")))
193                 .addTask(new NodeExistsDelegateTask("Add catalog 'versioned' to deactivate action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deactivate",
194                         new CheckOrCreatePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deactivate", "catalog", "versioned")))
195                 .addTask(new NodeExistsDelegateTask("Add catalog 'versioned' to activateDeleted action", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/activateDeleted",
196                         new CheckOrCreatePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/activateDeleted", "catalog", "versioned")))
197 
198                 // Bootstrap new versions action
199                 .addTask(new PartialBootstrapTask("Bootstrap availability rule for commit action in detail form", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/detail/actions/commit/availability"))
200                 .addTask(new PartialBootstrapTask("Bootstrap showVersions action in browser", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/showVersions"))
201                 .addTask(new PartialBootstrapTask("Bootstrap actionbar section group in browser", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/asset/groups/versionsActions"))
202 
203                 // Remove hardcoded i18n properties, e.g. label, description, etc.
204                 .addTask(new RemoveHardcodedI18nPropertiesFromDialogsTask("dam"))
205                 .addTask(new RemoveHardcodedI18nPropertiesFromSubappsTask("dam"))
206 
207                 .addTask(new PropertyExistsDelegateTask("Replace DetailSubApp by AssetDetailSubApp ", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail", "subAppClass",
208                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/detail", "subAppClass", AssetDetailSubApp.class.getName())))
209 
210                 .addTask(new PartialBootstrapTask("Bootstrap move action in Assets app", "",
211                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/move"))
212                 .addTask(new PartialBootstrapTask("Bootstrap moveFolder action in Assets app", "",
213                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/moveFolder"))
214                 .addTask(new PartialBootstrapTask("Bootstrap move action to Assets app actionbar", "Adds action move to assets/editActions actionbar.",
215                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/asset/groups/editActions/items/move"))
216                 .addTask(new PartialBootstrapTask("Bootstrap moveFolder action to Assets app actionbar", "Adds action moveFolder to folder/editActions actionbar.",
217                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/folder/groups/editActions/items/moveFolder")));
218 
219         register(DeltaBuilder.update("1.1.1", "")
220                 .addTask(new NodeExistsDelegateTask("Rename action deleteAsset to delete", "So that it is standardized.", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions",
221                         new RenameNodesTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions", "deleteAsset", "delete", NodeTypes.ContentNode.NAME)))
222                 .addTask(new NodeExistsDelegateTask("Remove label of the moveFolder action", "So that it is standardized.", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/moveFolder",
223                         new RemovePropertyTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/moveFolder", "label")))
224                 .addTask(new NodeExistsDelegateTask("In confirmDeleteAsset: Rename action deleteAsset to delete", "So that it is standardized.", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/confirmDeleteAsset",
225                         new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/confirmDeleteAsset", "successActionName", "delete")))
226                 .addTask(new NodeExistsDelegateTask("Set a valid text voter expression for text documents", "", RepositoryConstants.CONFIG, "/modules/dam/config/mediaTypes/document/voter/text_voter",
227                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam/config/mediaTypes/document/voter/text_voter", "pattern", "text/.*")))
228                 .addTask(new NodeExistsDelegateTask("Set a valid factory class for rich-text fields", "", RepositoryConstants.CONFIG, "/modules/ui-framework/fieldTypes/textArea",
229                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/ui-framework/fieldTypes/textArea", "factoryClass", AssetsEnabledRichTextFieldFactory.class.getName())))
230                 .addTask(new ConvertAclToAppPermissionTask("Convert permissions for 'assets' app", "Convert ACL permissions to dms to new 'assets' app permissions", "/modules/adminInterface/config/menu/dms", "/modules/dam/apps/assets", true)));
231 
232         register(DeltaBuilder.update("1.2", "")
233                 .addTask(new PartialBootstrapTask("Bootstrap upload asset zip command in DAM", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.commands.xml", "/commands/dam/importAssetZip"))
234                 .addTask(new PartialBootstrapTask("Bootstrap upload asset zip dialog in DAM", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.dialogs.xml", "/dialogs/importZip"))
235                 .addTask(new PartialBootstrapTask("Bootstrap upload zip action in Assets app", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/importZip"))
236 
237                 .addTask(new PartialBootstrapTask("Bootstrap upload zip action to Assets app actionbar", "Adds action move to root/addActions actionbar.",
238                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/root/groups/addActions/items/importZip"))
239                 .addTask(new NodeExistsDelegateTask("Reorder actions in actionbar", "Puts 'import zip' action before 'add folder' action in root/addActions", RepositoryConstants.CONFIG,
240                         "/modules/dam/apps/assets/subApps/browser/actionbar/sections/root/groups/addActions/items/addFolder",
241                         new OrderNodeBeforeTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/root/groups/addActions/items/importZip", "addFolder")))
242 
243                 .addTask(new PartialBootstrapTask("Bootstrap upload zip action to Assets app actionbar", "Adds action upload zip to folder/addActions actionbar.",
244                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/folder/groups/addActions/items/importZip"))
245                 .addTask(new NodeExistsDelegateTask("Reorder actions in actionbar", "Puts 'import zip' action before 'add folder' action in folder/addActions", RepositoryConstants.CONFIG,
246                         "/modules/dam/apps/assets/subApps/browser/actionbar/sections/folder/groups/addActions/items/addFolder",
247                         new OrderNodeBeforeTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/folder/groups/addActions/items/importZip", "addFolder")))
248 
249                 .addTask(new PartialBootstrapTask("Bootstrap upload zip action to Assets app actionbar", "Adds action upload zip to deletedFolder/addActions actionbar.",
250                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/deletedFolder/groups/addActions/items/importZip"))
251                 .addTask(new NodeExistsDelegateTask("Reorder actions in actionbar", "Puts 'import zip' action before 'add folder' action in deletedFolder/addActions", RepositoryConstants.CONFIG,
252                         "/modules/dam/apps/assets/subApps/browser/actionbar/sections/deletedFolder/groups/addActions/items/addFolder",
253                         new OrderNodeBeforeTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/deletedFolder/groups/addActions/items/importZip", "addFolder"))));
254 
255         register(DeltaBuilder.update("1.2.1", "")
256                 .addTask(new PartialBootstrapTask("Replace renameAsset configuration", "Replaces buggy renameAsset configuration.", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.dialogs.xml", "/dialogs/renameAsset", ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING))
257 
258                 .addTask(new PartialBootstrapTask("Bootstrap activate recursive action in Assets app", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/activateRecursive"))
259 
260                 .addTask(new PartialBootstrapTask("Bootstrap action activate recursive to folder actionbar.", "",
261                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/folder/groups/activationActions/items/activateRecursive"))
262                 .addTask(new NodeExistsDelegateTask("Reorder actions in actionbar", "Puts 'activate recursive' action after 'activate' action in folder", RepositoryConstants.CONFIG,
263                         "/modules/dam/apps/assets/subApps/browser/actionbar/sections/folder/groups/activationActions/items/activate",
264                         new OrderNodeAfterTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/folder/groups/activationActions/items/activateRecursive", "activate"))));
265 
266         register(DeltaBuilder.update("1.2.2", "")
267                 .addTask(new NodeExistsDelegateTask("Bootstrap activate recursive action in Assets app if not yet done", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/activateRecursive", null,
268                         new PartialBootstrapTask("Bootstrap activate recursive action in Assets app", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/activateRecursive")))
269                 .addTask(new NodeExistsDelegateTask("Bootstrap action activate recursive to folder actionbar if not yet done", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/folder/groups/activationActions/items/activateRecursive", null,
270                         new PartialBootstrapTask("Bootstrap action activate recursive to folder actionbar", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/folder/groups/activationActions/items/activateRecursive")))
271 
272                 .addTask(new PropertyExistsDelegateTask("Remove obsolete 'categoryName' if exists", "Remove '/modules/dam/apps/assets/categoryName' if exists.",
273                         RepositoryConstants.CONFIG, "/modules/dam/apps/assets/", "categoryName",
274                         new RemovePropertyTask("Remove obsolete 'categoryName'", "Remove '/modules/dam/apps/assets/categoryName'", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/", "categoryName")))
275                 .addTask(new PartialBootstrapTask("Bootstrap 'chooseDialog'", "Bootstrap chooseDialog into 'assets' app",
276                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/chooseDialog"))
277                 .addTask(new PartialBootstrapTask("Rebootstrap 'metadataStandard'", "Rebootstrap 'config:modules/dam/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard'.",
278                         "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/detail/editor/form/tabs/asset/fields/metadataStandard"))
279                 .addTask(new BootstrapConditionally("Bootstrap ZIP archive import action field types", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.fieldTypes.xml"))
280                 .addTask(new PartialBootstrapTask("Bootstrap restore version action", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/restoreVersion"))
281                 .addTask(new NodeExistsDelegateTask("Bootstrap restore version action to actionbar", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/asset/groups/versionsActions/items",
282                         new ArrayDelegateTask("",
283                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/asset/groups/versionsActions/items/restoreVersion"),
284                                 new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/asset/groups/versionsActions/items/showVersions",
285                                         new OrderNodeAfterTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/asset/groups/versionsActions/items/restoreVersion", "showVersions"))))));
286 
287         register(DeltaBuilder.update("1.2.4", "")
288                 .addTask(new PartialBootstrapTask("Bootstrap new Type column", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/workbench/contentViews/list/columns/type"))
289                 .addTask(new OrderNodeAfterTask("", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/workbench/contentViews/list/columns/type", "title")));
290 
291         register(DeltaBuilder.update("1.2.5", "")
292                 .addTask(new ArrayDelegateTask("Register download action for assets.", "",
293                         new NodeBuilderTask("", "", ErrorHandling.strict, RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions",
294                                 addNode("downloadAsset", NodeTypes.ContentNode.NAME).then(
295                                         addNode("availibility").then(
296                                                 addNode("rules").then(
297                                                         addNode(IsNotDeletedRule.class.getSimpleName()).then(
298                                                                 addProperty("implementationClass", IsNotDeletedRule.class.getName())
299                                                                 )
300                                                         )
301                                                 ),
302                                         addProperty("class", DownloadBinaryActionDefinition.class.getName()),
303                                         addProperty("icon", "icon-download"),
304                                         addProperty("binaryNodeName", JcrConstants.JCR_CONTENT)
305                                         )),
306                         new NodeBuilderTask("Add downloadActions", "Add downloadActions section to actionbar", ErrorHandling.strict, RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actionbar/sections/asset/groups",
307                                 addNode("downloadActions", NodeTypes.ContentNode.NAME).then(
308                                         addNode("items", NodeTypes.ContentNode.NAME).then(
309                                                 addNode("downloadAsset", NodeTypes.ContentNode.NAME)
310                                                 ))),
311                         new OrderNodeAfterTask("", "/modules/dam/apps/assets/subApps/browser/actionbar/sections/asset/groups/downloadActions", "activationActions")))
312 
313                 .addTask(configureActionsAsAsynchronous()));
314 
315         register(DeltaBuilder.update("1.2.6", "")
316                 .addTask(new ArrayDelegateTask("Configure icons for assets app",
317                         new PropertyExistsDelegateTask("", "/modules/dam/apps/assets/subApps/browser/workbench/nodeTypes/mainNodeType", "icon",
318                                 new RemovePropertyTask("", "/modules/dam/apps/assets/subApps/browser/workbench/nodeTypes/mainNodeType", "icon")),
319                         new NodeExistsDelegateTask("", "/modules/dam/apps/assets/subApps/browser/workbench/contentViews/list/columns/asset",
320                                 new CheckAndModifyPropertyValueTask("Change asset name column definition class", "", RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/workbench/contentViews/list/columns/asset", "class", "info.magnolia.ui.workbench.column.definition.PropertyColumnDefinition", "info.magnolia.dam.app.assets.column.AssetNameColumnDefinition")),
321                         new NodeExistsDelegateTask("", "/modules/dam/apps/assets/subApps/browser/workbench/contentViews/list/columns/asset",
322                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/workbench/contentViews/list/columns/asset", "formatterClass", "info.magnolia.dam.app.assets.column.AssetNameColumnFormatter")),
323                         new BootstrapSingleModuleResource("config.server.MIMEMapping.audio.xml"),
324                         new BootstrapSingleModuleResource("config.server.MIMEMapping.video.xml"),
325                         new BootstrapSingleModuleResource("config.server.MIMEMapping.image.xml"),
326                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
327                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/txt", "iconStyle", "icon-file-text")),
328                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
329                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/doc", "iconStyle", "icon-file-word")),
330                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
331                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/docx", "iconStyle", "icon-file-word")),
332                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
333                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/xls", "iconStyle", "icon-file-excel")),
334                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
335                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/xlsx", "iconStyle", "icon-file-excel")),
336                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
337                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/ppt", "iconStyle", "icon-file-powerpoint")),
338                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
339                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/pptx", "iconStyle", "icon-file-powerpoint")),
340                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
341                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/pdf", "iconStyle", "icon-file-pdf")),
342                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
343                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/htm", "iconStyle", "icon-file-webpage")),
344                         new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
345                                 new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/html", "iconStyle", "icon-file-webpage")))));
346 
347         register(DeltaBuilder.update("2.0", "")
348                 .addTask(new UpdateDamAppConfigurationTask("Move and update dam module configuration to dam-app module configuration", "Update configuration form 1.x to 2.0"))
349                 .addTask(new UpdateDamAssetFileNamePropertiesTask("Update the Asset fileName property", "Asset fileName property now has to contain the filename and the file extension"))
350                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.asset.field.DamFilePreviewComponent", DamFilePreviewComponent.class.getName()))
351                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.asset.field.definition.DamUploadFieldDefinition", DamUploadFieldDefinition.class.getName()))
352                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.asset.field.factory.DamUploadFieldFactory", DamUploadFieldFactory.class.getName()))
353                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.asset.field.configuration.image.ImagePreviewComponentProvider", ImagePreviewComponentProvider.class.getName()))
354                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.commands.MarkAssetFolderAsDeletedCommand", MarkAssetFolderAsDeletedCommand.class.getName()))
355                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.asset.field.factory.AssetsEnabledRichTextFieldFactory", AssetsEnabledRichTextFieldFactory.class.getName()))
356                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.asset.field.configuration.icon.IconThumbnailComponentProvider", IconThumbnailComponentProvider.class.getName()))
357                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.asset.field.configuration.image.ImageThumbnailComponentProvider", ImageThumbnailComponentProvider.class.getName()))
358                 .addTask(new ChangeAllPropertiesWithCertainValueTask("info.magnolia.dam.commands.ImportAssetZipCommand", ImportAssetZipCommand.class.getName()))
359                 .addTask(new ContentAppMigrationTask("/modules/dam-app"))
360                 .addTask(new NodeExistsDelegateTask("Change the reference of the renameAsset dialog name", "/modules/dam-app/apps/assets/subApps/browser/actions/renameAsset",
361                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/browser/actions/renameAsset", "dialogName", "dam-app:renameAsset")))
362                 .addTask(new NodeExistsDelegateTask("Change the reference of the importZip dialog name", "/modules/dam-app/apps/assets/subApps/browser/actions/importZip",
363                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/browser/actions/importZip", "dialogName", "dam-app:importZip")))
364 
365                 .addTask(new NodeExistsDelegateTask("Bootstrap new name field", "", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/detail/editor/form/tabs/asset/fields/name",
366                         new ArrayDelegateTask("",
367                                 new RemoveNodeTask("", "/modules/dam-app/apps/assets/subApps/detail/editor/form/tabs/asset/fields/name"),
368                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/detail/editor/form/tabs/asset/fields/name"),
369                                 new OrderNodeAfterTask("", "/modules/dam-app/apps/assets/subApps/detail/editor/form/tabs/asset/fields/name", "resource"))))
370                 .addTask(new NodeExistsDelegateTask("Bootstrap new column name formater", "", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/browser/workbench/contentViews/list/columns/asset",
371                         new ArrayDelegateTask("",
372                                 new RemoveNodeTask("", "/modules/dam-app/apps/assets/subApps/browser/workbench/contentViews/list/columns/asset"),
373                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/workbench/contentViews/list/columns/asset"),
374                                 new OrderNodeBeforeTask("/modules/dam-app/apps/assets/subApps/browser/workbench/contentViews/list/columns/asset", "path"))))
375                 .addTask(new NodeExistsDelegateTask("Bootstrap new renameAsset dialog definition", "", RepositoryConstants.CONFIG, "/modules/dam-app/dialogs/renameAsset",
376                         new ArrayDelegateTask("",
377                                 new RemoveNodeTask("", "/modules/dam-app/dialogs/renameAsset"),
378                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.dialogs.xml", "/dialogs/renameAsset"))))
379                 .addTask(new NodeExistsDelegateTask("Bootstrap new detail sub app image providerdefinition", "", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/detail",
380                         new ArrayDelegateTask("",
381                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/detail/imageProvider"),
382                                 new OrderNodeAfterTask("", "/modules/dam-app/apps/assets/subApps/detail/imageProvider", "contentConnector"))))
383                 .addTask(new NodeExistsDelegateTask("Bootstrap download asset avalability", "/modules/dam-app/apps/assets/subApps/browser/actions/downloadAsset/availability", null,
384                         new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/downloadAsset/availability")))
385                 .addTask(new RemovePropertyTask("Remove icon property", "/modules/dam-app/apps/assets/subApps/browser/contentConnector/nodeTypes/mainNodeType", "icon"))
386 
387                 .addTask(new NodeExistsDelegateTask("Bootstrap new detail sub app contentConnector", "", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/detail/contentConnector",
388                         new ArrayDelegateTask("",
389                                 new RemoveNodeTask("", "/modules/dam-app/apps/assets/subApps/detail/contentConnector"),
390                                 new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/detail/contentConnector"),
391                                 new OrderNodeAfterTask("", "/modules/dam-app/apps/assets/subApps/detail/contentConnector", "actions")))));
392 
393         register(DeltaBuilder.update("2.0.1", "")
394                 .addTask(new SetWritePermissionForActionsTask("/modules/dam-app/apps/assets/subApps/browser/actions/", "importZip", "restoreVersion", "move", "activateDeleted", "restorePreviousVersion", "deactivate", "activateRecursive", "activate", "import", "uploadAsset", "addFolder", "editFolder", "editAsset", "renameAsset", "confirmDeleteAsset", "createVariant")));
395 
396         register(DeltaBuilder.update("2.0.2", "")
397                 .addTask(new NodeExistsDelegateTask("", "/modules/dam-app/apps/assets/subApps/detail/editor/form/tabs/asset/fields/resource",
398                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/detail/editor/form/tabs/asset/fields/resource", "editFileFormat", "false"))));
399 
400         register(DeltaBuilder.update("2.0.4", "")
401                 .addTask(new ArrayDelegateTask("Bootstrap new 'Upload & edit' action",
402                         new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.dialogs.xml", "/dialogs/uploadAndEdit"),
403                         new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/chooseDialog/actions/uploadAndEdit"),
404                         new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/chooseDialog/actionArea/secondaryActions/uploadAndEdit"),
405                         new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/chooseDialog/actionArea/actionRenderers/uploadAndEdit"))));
406 
407         register(DeltaBuilder.update("2.0.5", "")
408                 .addTask(new ArrayDelegateTask("Bootstrap new 'Download' action",
409                         new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/detail/actions/downloadVersion"),
410                         new PartialBootstrapTask("", "", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/detail/editor/actions/downloadVersion"),
411                         new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/detail/editor/actions/cancel",
412                                 new OrderNodeBeforeTask("/modules/dam-app/apps/assets/subApps/detail/editor/actions/downloadVersion", "cancel")))));
413 
414         register(DeltaBuilder.update("2.0.6", "")
415                 .addTask(new AddIsPublishedRuleToAllDeactivateActionsTask("", "/modules/dam-app/apps/")));
416         register(DeltaBuilder.update("2.0.8", "")
417                 .addTask(new PartialBootstrapTask("Edit asset configuration for SVGs", "Prevents SVGs from being edited within the Dam app.", "/mgnl-bootstrap/dam-app/config.modules.dam-app.config.editAssetAppConfigurations.xml", "/editAssetAppConfigurations/svgUploadConfig")));
418         register(DeltaBuilder.update("2.0.9", "")
419                 .addTask(new NodeExistsDelegateTask("Modify configuration of restorePreviousVersion action", "/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersion",
420                         new ArrayDelegateTask("",
421                                 new CheckAndModifyPropertyValueTask("/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersion", "class", "info.magnolia.ui.contentapp.detail.action.RestorePreviousVersionActionDefinition", "info.magnolia.ui.contentapp.browser.action.RestoreItemPreviousVersionActionDefinition"),
422                                 new NodeExistsDelegateTask("Configure availability for multiple items", "/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersion/availability",
423                                         new PropertyExistsDelegateTask("", "/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersion/availability", "multiple", null,
424                                                 new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersion/availability", "multiple", "true"))))))
425                 .addTask(new NodeExistsDelegateTask("Configure IsPublishableRule for availability of activate action", "/modules/dam-app/apps/assets/subApps/browser/actions/activate/availability/rules",
426                         new NodeExistsDelegateTask("","/modules/dam-app/apps/assets/subApps/browser/actions/activate/availability/rules/IsPublishableRule", null,
427                                 new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/activate/availability/rules/IsPublishableRule"))))
428                 .addTask(new NodeExistsDelegateTask("Configure IsPublishableRule for availability of activateRecursive action", "/modules/dam-app/apps/assets/subApps/browser/actions/activateRecursive/availability/rules",
429                         new NodeExistsDelegateTask("","/modules/dam-app/apps/assets/subApps/browser/actions/activateRecursive/availability/rules/IsPublishableRule", null,
430                                 new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/activateRecursive/availability/rules/IsPublishableRule"))))
431                 .addTask(new PartialBootstrapTask("Edit dialog configuration for form", "Add two fields in dialog renameAsset.", "/mgnl-bootstrap/dam-app/config.modules.dam-app.dialogs.xml", "/dialogs/renameAsset/form")));
432 
433         register(DeltaBuilder.update("2.1.1", "")
434                 .addTask(new RemovePropertyTask("Remove obsolete permission demo-project-base", "/modules/dam-app/apps/assets/permissions/roles", "demo-project-base")));
435         register(DeltaBuilder.update("2.1.2", "")
436                 .addTask(new PartialBootstrapTask("Edit asset configuration for TIFF, WEPB, ICO, CRW and PSD", "Prevents TIFF, WEPB, ICO, CRW and PSD from being edited within the Dam app.", "/mgnl-bootstrap/dam-app/config.modules.dam-app.config.editAssetAppConfigurations.xml", "/editAssetAppConfigurations/imageUploadConfigWithoutEdit")));
437         register(DeltaBuilder.update("2.1.6", "")
438                 .addTask(new ArrayDelegateTask("Configure actions for restoring deleted assets and folders", "Configure actions for restoring previous versions of assets and folders",
439                     new NodeExistsDelegateTask("", "/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersion",
440                         new ArrayDelegateTask("",
441                                 new NodeExistsDelegateTask("", "/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersion/params", null,
442                                     new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/restorePreviousVersion/params")))),
443                     new NodeExistsDelegateTask("", "/modules/dam-app/apps/assets/subApps/browser/actionbar/sections/deletedFolder/groups/deletedActions/items/restorePreviousVersion",
444                             new NodeExistsDelegateTask("", "/modules/dam-app/apps/assets/subApps/browser/actionbar/sections/deletedFolder/groups/deletedActions/items/restorePreviousVersionIncludingChildren", null,
445                             new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/deletedFolder/groups/deletedActions/items/restorePreviousVersionIncludingChildren"))),
446                     new NodeExistsDelegateTask("", "/modules/dam-app/apps/assets/subApps/browser/actions/restorePreviousVersionIncludingChildren", null,
447                     new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/restorePreviousVersionIncludingChildren")))));
448 
449         register(DeltaBuilder.update("2.1.7", "")
450                 .addTask(new NodeExistsDelegateTask("Set mgnl:folder for nodeType property", "", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/browser/actions/importZip",
451                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/browser/actions/importZip", "nodeType", NodeTypes.Folder.NAME))));
452         register(DeltaBuilder.update("2.2", "")
453                 .addTask(new ArrayDelegateTask("Add copy and paste functionality into the asset browser.", "Add ability to copy and paste the components in the asset browser.",
454                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/copy"),
455                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/paste"),
456                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/root/groups/editActions/items/copy"),
457                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/root/groups/editActions/items/paste"),
458                         new OrderNodeAfterTask("", "/modules/dam-app/apps/assets/subApps/browser/actionbar/sections/root/groups/editActions/items/paste", "copy"),
459                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/asset/groups/editActions/items/copy"),
460                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/asset/groups/editActions/items/paste"),
461                         new OrderNodeAfterTask("", "/modules/dam-app/apps/assets/subApps/browser/actionbar/sections/asset/groups/editActions/items/paste", "copy"),
462                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/folder/groups/editActions/items/copy"),
463                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/folder/groups/editActions/items/paste"),
464                         new OrderNodeAfterTask("", "/modules/dam-app/apps/assets/subApps/browser/actionbar/sections/folder/groups/editActions/items/paste", "copy"),
465                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/multiple/groups/editActions/items/copy"),
466                         new PartialBootstrapTask("", "/mgnl-bootstrap/dam-app/config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/multiple/groups/editActions/items/paste"),
467                         new OrderNodeAfterTask("", "/modules/dam-app/apps/assets/subApps/browser/actionbar/sections/multiple/groups/editActions/items/paste", "copy"))));
468         register(DeltaBuilder.update("2.2.1", "")
469                 .addTask(new RemovePropertiesTask("Remove legacy properties from app's configuration", RepositoryConstants.CONFIG, ImmutableList.of(
470                         "/modules/dam-app/apps/assets/chooseDialog/field/path",
471                         "/modules/dam-app/apps/assets/subApps/browser/actions/editFolder/nodeType",
472                         "/modules/dam-app/apps/assets/subApps/browser/actions/renameAsset/nodeType"), true))
473                 .addTask(new ArrayDelegateTask("Asset previews in choose-dialogs.", "This task updates the asset choose dialog configuration to support the preview bar.",
474                         new PartialBootstrapTask("Bootstrap new asset choose dialog field type", "/mgnl-bootstrap/dam-app/config.modules.dam-app.fieldTypes.xml", "/fieldTypes/damWorkbenchField"),
475                         new NodeExistsDelegateTask("", "/modules/dam-app/apps/assets/chooseDialog/field",
476                                 new CheckAndModifyPropertyValueTask("/modules/dam-app/apps/assets/chooseDialog/field", "class", WorkbenchFieldDefinition.class.getName(), DamWorkbenchFieldDefinition.class.getName())))));
477         register(DeltaBuilder.update("2.2.4", "")
478                 .addTask(new NodeExistsDelegateTask("Use DeleteConfirmationAction instead of ConfirmationAction to warn about modified sub-nodes prior deletion.", "/modules/dam-app/apps/assets/subApps/browser/actions/confirmDeleteAsset",
479                         new CheckAndModifyPropertyValueTask("/modules/dam-app/apps/assets/subApps/browser/actions/confirmDeleteAsset", "class", ConfirmationActionDefinition.class.getName(), DeleteConfirmationActionDefinition.class.getName()))));
480         register(DeltaBuilder.update("2.2.5", "")
481                 .addTask(new NodeExistsDelegateTask("Use ExportActionDefinition.", "Do not extend export action from configuration app, but use ExportActionDefinition.", RepositoryConstants.CONFIG, "/modules/dam-app/apps/assets/subApps/browser/actions/export",
482                         new PropertyValueDelegateTask("", "/modules/dam-app/apps/assets/subApps/browser/actions/export", "extends", "/modules/ui-admincentral/apps/configuration/subApps/browser/actions/export", false,
483                                 new BootstrapSingleModuleResource("", "", "config.modules.dam-app.apps.assets.xml", "/assets/subApps/browser/actions/export")))));
484     }
485 
486     private Task configureActionsAsAsynchronous() {
487         return new IsModuleInstalledOrRegistered("Configure actions as asynchronous", "Configure actions as asynchronous if scheduler module is installed", "scheduler", new ArrayDelegateTask("", "",
488                 new NodeExistsDelegateTask("Configure activation as asynchronous", "/modules/dam/apps/assets/subApps/browser/actions/activate",
489                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/activate", "asynchronous", "true")),
490                 new NodeExistsDelegateTask("Configure recursive activation as asynchronous", "/modules/dam/apps/assets/subApps/browser/actions/activateRecursive",
491                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/activateRecursive", "asynchronous", "true")),
492                 new NodeExistsDelegateTask("Configure deletion as asynchronous", "/modules/dam/apps/assets/subApps/browser/actions/delete",
493                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/delete", "asynchronous", "true")),
494                 new NodeExistsDelegateTask("Configure deletion of folder as asynchronous", "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder",
495                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/dam/apps/assets/subApps/browser/actions/deleteFolder", "asynchronous", "true"))
496                 ));
497     }
498 
499     @Override
500     protected List<Task> getExtraInstallTasks(InstallContext ctx) {
501 
502         final List<Task> tasks = new ArrayList<Task>();
503 
504         tasks.add(new IsAuthorInstanceDelegateTask("Add permissions only for public instance", "", null,
505                 new AddPermissionTask("Add read on dam for anonymous role", "", "anonymous", "dam", "/", info.magnolia.cms.security.Permission.READ, true)
506                 ));
507         tasks.add(new NodeExistsDelegateTask("Set a valid factory class for rich-text fields", "", RepositoryConstants.CONFIG, "/modules/ui-framework/fieldTypes/textArea",
508                 new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/ui-framework/fieldTypes/textArea", "factoryClass", AssetsEnabledRichTextFieldFactory.class.getName()))
509                 );
510         tasks.add(new AppLauncherReorderingTask("assets", "edit", Order.AFTER, "pages"));
511         tasks.add(new ArrayDelegateTask("Configure icons for assets app",
512                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
513                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/txt", "iconStyle", "icon-file-text")),
514                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
515                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/doc", "iconStyle", "icon-file-word")),
516                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
517                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/docx", "iconStyle", "icon-file-word")),
518                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
519                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/xls", "iconStyle", "icon-file-excel")),
520                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
521                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/xlsx", "iconStyle", "icon-file-excel")),
522                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
523                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/ppt", "iconStyle", "icon-file-powerpoint")),
524                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
525                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/pptx", "iconStyle", "icon-file-powerpoint")),
526                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
527                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/pdf", "iconStyle", "icon-file-pdf")),
528                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
529                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/htm", "iconStyle", "icon-file-webpage")),
530                 new NodeExistsDelegateTask("", "/server/MIMEMapping/txt",
531                         new SetPropertyTask(RepositoryConstants.CONFIG, "/server/MIMEMapping/html", "iconStyle", "icon-file-webpage"))
532                 ));
533         tasks.add(new ConvertAclToAppPermissionTask("Convert permissions for 'assets' app", "Convert ACL permissions to dms to new 'assets' app permissions", "/modules/adminInterface/config/menu/dms", "/modules/dam-app/apps/assets", true));
534         return tasks;
535     }
536 }