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