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