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