@Override protected List<Task> getExtraInstallTasks(InstallContext installContext) { final List<Task> tasks = new ArrayList<Task>(); tasks.add(new BootstrapConditionally("Observation listeners", "Installs observation listeners by keeping already existing ones, possibly provided by other modules.", "/mgnl-bootstrap/listenerConfigs/config.modules.observation.config.xml", new ArrayDelegateTask("", new PartialBootstrapTask("", "", "/mgnl-bootstrap/listenerConfigs/config.modules.observation.config.xml", "/config/listenerConfigurations/sendMailOnPageChanges"), new PartialBootstrapTask("", "", "/mgnl-bootstrap/listenerConfigs/config.modules.observation.config.xml", "/config/listenerConfigurations/activateAddedPages")))); tasks.add(usePublicationCommand); return tasks; } }
@Test public void testDifferentPlatformEncoding() throws Exception { // GIVEN PartialBootstrapTask task = new PartialBootstrapTask("", "", "website.testPartialBootstrapWithUtf8.xml", "/testPartialBootstrapWithUtf8/level1/level2"); // hack to set different platform encoding String originalPlatformEncoding = System.getProperty("file.encoding"); System.setProperty("file.encoding", "ISO-8859-1"); Field charset = Charset.class.getDeclaredField("defaultCharset"); charset.setAccessible(true); charset.set(null, null); assertEquals("ISO-8859-1", System.getProperty("file.encoding")); // WHEN task.execute(ctx); // THEN 'java.lang.RuntimeException: Invalid byte 2 of 3-byte UTF-8 sequence' does not occur AND: assertTrue(session.itemExists("/testPartialBootstrapWithUtf8")); assertTrue(session.itemExists("/testPartialBootstrapWithUtf8/level1/level2")); // AFTER back to original platform encoding System.setProperty("file.encoding", originalPlatformEncoding); charset = Charset.class.getDeclaredField("defaultCharset"); charset.setAccessible(true); charset.set(null, null); }
@Test public void testAutogeneratedDescription() throws Exception { // GIVEN Task task; // WHEN task = new PartialBootstrapTask("name", "resource", "/item/Path"); // THEN assertEquals("Bootstrap part '/item/Path' of resource 'resource'.", task.getDescription()); } }
public UpdateSendMailOnPagesNotificationTask() { super("Update sendMailOnPageChanges configuration", "Updates sendMailOnPageChanges listener configuration in order to use a freemarker template for sending an email.", new RemovePropertyTask("", "", RepositoryConstants.CONFIG, listenerParams, "from"), new RemovePropertyTask("", "", RepositoryConstants.CONFIG, listenerParams, "subject"), new RemovePropertyTask("", "", RepositoryConstants.CONFIG, listenerParams, "text"), new PropertyExistsDelegateTask("", "", RepositoryConstants.CONFIG, listenerParams, "type", new CheckAndModifyPropertyValueTask("", "", RepositoryConstants.CONFIG, listenerParams, "type", "text", "freemarker")), new PropertyExistsDelegateTask("", "", RepositoryConstants.CONFIG, listenerParams, "mailTemplate", new SetPropertyTask("", RepositoryConstants.CONFIG, listenerParams, "mailTemplate", "pageChangeNotification")), new PartialBootstrapTask("", "", "/mgnl-bootstrap/listenerConfigs/config.modules.observation.config.xml", "/config/listenerConfigurations/sendMailOnPageChanges/listener/params/model")); } }
@Test public void testGetOutputResourceName() throws Exception { // GIVEN PartialBootstrapTask task = new PartialBootstrapTask("", "", "/mgnl-bootstrap/form/config.modules.form.dialogs.form.xml", "/form/tabConfirmEmail/confirmContentType"); // WHEN String outputResourceName = task.getOutputResourceName(task.getResource(), task.getItemPath()); // THEN assertEquals("config.modules.form.dialogs.form.tabConfirmEmail.confirmContentType", outputResourceName); // GIVEN dots in bootstrap file names task = new PartialBootstrapTask("", "", "/mgnl-bootstrap/form/config.modules.form..baz.dialogs.form.xml", "/form/tabConfirmEmail/confirmContentType.qux"); // WHEN outputResourceName = task.getOutputResourceName(task.getResource(), task.getItemPath()); // THEN assertEquals("config.modules.form..baz.dialogs.form.tabConfirmEmail.confirmContentType..qux", outputResourceName); }
.addTask(new NodeExistsDelegateTask("Remove dialog folder Node", "Remove dialog definition in dam/dialogs/folder", RepositoryConstants.CONFIG, "/modules/dam/dialogs/folder", new RemoveNodeTask("Remove dialog folder Node", "Remove dialog definition in dam/dialogs/folder", RepositoryConstants.CONFIG, "/modules/dam/dialogs/folder"))) .addTask(new PartialBootstrapTask("Add renameAsset dialog", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.dialogs.xml", "/dialogs/renameAsset")) .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")) .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)) .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")) .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")) .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")) .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")) .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")) .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")) .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")) .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")) .addTask(new PartialBootstrapTask("Bootstrap move action in Assets app", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/move")) .addTask(new PartialBootstrapTask("Bootstrap moveFolder action in Assets app", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actions/moveFolder")) .addTask(new PartialBootstrapTask("Bootstrap move action to Assets app actionbar", "Adds action move to assets/editActions actionbar.", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/asset/groups/editActions/items/move")) .addTask(new PartialBootstrapTask("Bootstrap moveFolder action to Assets app actionbar", "Adds action moveFolder to folder/editActions actionbar.", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.apps.assets.xml", "/assets/subApps/browser/actionbar/sections/folder/groups/editActions/items/moveFolder"))); .addTask(new PartialBootstrapTask("Bootstrap upload asset zip command in DAM", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.commands.xml", "/commands/dam/importAssetZip")) .addTask(new PartialBootstrapTask("Bootstrap upload asset zip dialog in DAM", "", "/mgnl-bootstrap/dam-app-1-x/config.modules.dam.dialogs.xml", "/dialogs/importZip"))
.addTask(new NodeExistsDelegateTask("Change folder action to reference ui-framework", "", RepositoryConstants.CONFIG, "/modules/contacts/apps/contacts/subApps/browser/actions/editFolder", new CheckAndModifyPartOfPropertyValueTask("Change rename-folder dialog reference", "Change rename-folder action to reference 'ui-framework:folder'", RepositoryConstants.CONFIG, "/modules/contacts/apps/contacts/subApps/browser/actions/editFolder", "dialogName", "contacts:folder", "ui-framework:folder"))) .addTask(new PartialBootstrapTask("Add renameContact dialog", "", "/mgnl-bootstrap/contacts/config.modules.contacts.dialogs.xml", "/dialogs/renameContact")) .addTask(new PartialBootstrapTask("Add renameContact action", "Adds the renameContact action in contacts browser subApp", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actions/renameContact")) .addTask(new CreateNodeTask("Add renameContact to contact actionBar section", "", RepositoryConstants.CONFIG, "/modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/editActions/items", "renameContact", NodeTypes.Content.NAME)) .addTask(new OrderNodeAfterTask("Move renameContact action to proper location", "Move it to after editContact", RepositoryConstants.CONFIG, "/modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/editActions/items/renameContact", "editContact")) .addTask(new PartialBootstrapTask("Add new confirmDeleteContact action definition", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actions/confirmDeleteContact")) .addTask(new PartialBootstrapTask("Add new confirmDeleteFolder action definition", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actions/confirmDeleteFolder")) .addTask(new PartialBootstrapTask("Bootstrap new actionbar section in Contacts app.", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actionbar/sections/multiple")) .addTask(new PartialBootstrapTask("Bootstrap new action in Contacts app.", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actions/confirmDeleteItems")) .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/contacts/apps/contacts/subApps/browser/actions/confirmDeleteContact/availability", "multiple", "true")) .addTask(new PartialBootstrapTask("Bootstrap availability rule for commit action in detail form", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/detail/actions/commit/availability")) .addTask(new PartialBootstrapTask("Bootstrap showVersions action in browser", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actions/showVersions")) .addTask(new PartialBootstrapTask("Bootstrap showVersions action in browser", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actionbar/sections/contact/groups/versionsActions"))); .addTask(new PartialBootstrapTask("Bootstrap restore version action", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actions/restoreVersion")) .addTask(new NodeExistsDelegateTask("Bootstrap restore version action to actionbar", "", RepositoryConstants.CONFIG, "/modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/versionsActions/items", new ArrayDelegateTask("", new PartialBootstrapTask("", "", "/mgnl-bootstrap/contacts/config.modules.contacts.apps.contacts.xml", "/contacts/subApps/browser/actionbar/sections/contact/groups/versionsActions/items/restoreVersion"), new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/versionsActions/items/showVersions", new OrderNodeAfterTask("", "", RepositoryConstants.CONFIG, "/modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/versionsActions/items/restoreVersion", "showVersions")))))
.addTask(new NodeExistsDelegateTask("Check if the apps have been installed yet", "Install those that are missing and move existing ones to the ApplLauncher tools group.", RepositoryConstants.CONFIG, "/modules/activation/apps/activation", new ArrayDelegateTask("", new PartialBootstrapTask("Bootstrap app", "Bootstrap activation monitor app", "/mgnl-bootstrap/activation/config.modules.activation.apps.xml", "/apps/activationMonitor"), new NodeExistsDelegateTask("Remove Activation tools from dev group of appLauncher", "", RepositoryConstants.CONFIG, "/modules/ui-admincentral/config/appLauncherLayout/groups/dev/apps/activation", new RemoveNodeTask("Remove Activation tools from dev group of appLauncher", "", RepositoryConstants.CONFIG, "/modules/ui-admincentral/config/appLauncherLayout/groups/dev/apps/activation"))
.addTask(new BootstrapSingleModuleResource("Bootstrap button", "Bootstrap button for immediate import", "config.modules.rssaggregator.fieldTypes.xml")) .addTask(setDefaultValues) .addTask(new PartialBootstrapTask("Bootstrap schedule tab", "Updates app with tab enabling RSS scheduling", "/mgnl-bootstrap/rssaggregator/app/config.modules.rssaggregator.apps.xml", "/apps/rssAggregator/subApps/detail/editor/form/tabs/scheduleTab", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)) .addTask(new PartialBootstrapTask("Bootstrap command", "Bootstraps default rss import command", "/mgnl-bootstrap/rssaggregator/config/commands/config.modules.rssaggregator.commands.xml", "/commands/rss", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)) .addTask(new RemoveNodeTask("Remove config", "Remove old configuration app co the new one can be bootstrapen", RepositoryConstants.CONFIG, "/modules/rssaggregator/apps/rssAggregator/subApps/config")) .addTask(new PartialBootstrapTask("Bootstrap new config", "Bootstraps new configuration sub-app", "/mgnl-bootstrap/rssaggregator/app/config.modules.rssaggregator.apps.xml", "/apps/rssAggregator/subApps/config", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)) .addTask(new PartialBootstrapTask("Bootstrap action", "Bootstraps import action", "/mgnl-bootstrap/rssaggregator/app/config.modules.rssaggregator.apps.xml", "/apps/rssAggregator/subApps/browser/actions/runImport", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)) .addTask(new PartialBootstrapTask("Bootstrap action", "Bootstraps import all action", "/mgnl-bootstrap/rssaggregator/app/config.modules.rssaggregator.apps.xml", "/apps/rssAggregator/subApps/browser/actions/runImportOnAllRSS", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)) .addTask(new PartialBootstrapTask("Bootstrap action", "Place import all action to action bar", "/mgnl-bootstrap/rssaggregator/app/config.modules.rssaggregator.apps.xml", "/apps/rssAggregator/subApps/browser/actionbar/sections/root/groups/feedImportActions", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)) .addTask(new PartialBootstrapTask("Bootstrap action", "Place import action to action bar", "/mgnl-bootstrap/rssaggregator/app/config.modules.rssaggregator.apps.xml", "/apps/rssAggregator/subApps/browser/actionbar/sections/rssAggregator/groups/feedImportActions", ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW)) .addTask(new OrderNodeBeforeTask("Order action bar", "Place import feed action to proper place", RepositoryConstants.CONFIG, "/modules/rssaggregator/apps/rssAggregator/subApps/browser/actionbar/sections/rssAggregator/groups/feedImportActions", "importExportActions")) .addTask(new NodeExistsDelegateTask("Add property", "Add property for vertical layout of fields", RepositoryConstants.CONFIG, "/modules/rssaggregator/apps/rssAggregator/subApps/detail/editor/form/tabs/mainTab/fields/feeds/field", new NewPropertyTask("", "", RepositoryConstants.CONFIG, "/modules/rssaggregator/apps/rssAggregator/subApps/detail/editor/form/tabs/mainTab/fields/feeds/field", "layout", "vertical"))) new RemoveNodeTask("Remove old cron field from config.","/modules/rssaggregator/apps/rssAggregator/subApps/config/formDefinitions/main/tabs/main/fields/cron")), new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/rssaggregator/apps/rssAggregator/subApps/config/formDefinitions/main/tabs/main/fields", new PartialBootstrapTask("Add new switchable field to config.", "", "/mgnl-bootstrap/rssaggregator/app/config.modules.rssaggregator.apps.xml", "/apps/rssAggregator/subApps/config/formDefinitions/main/tabs/main/fields")), new NodeExistsDelegateTask("", "", RepositoryConstants.CONFIG, "/modules/rssaggregator/apps/rssAggregator/subApps/detail/editor/form/tabs/scheduleTab/fields/overrideDefault", new RemoveNodeTask("Remove old overrideDefault field from detail.", "/modules/rssaggregator/apps/rssAggregator/subApps/detail/editor/form/tabs/scheduleTab/fields/overrideDefault")),
.addTask(new NodeExistsDelegateTask("AuditLogging configurations", "Add auditLogging configurations for delete action", "config", "/server/auditLogging/logConfigurations/delete", null, new PartialBootstrapTask("", "", "/mgnl-bootstrap/core/config.server.auditLogging.xml", "/auditLogging/logConfigurations/delete", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW))) .addTask(new CheckAndModifyPropertyValueTask("AuditLogging configurations", "Change auditLogging class", "config", "/server/auditLogging", "class", "info.magnolia.logging.AuditLoggingManager", "info.magnolia.audit.AuditLoggingManager"))); new PartialBootstrapTask("Add csrfSecurity Filter", "", "/mgnl-bootstrap/core/config.server.filters.xml", "/filters/csrfSecurity/bypasses/BypassWhenVaadinRequest", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW)), new PartialBootstrapTask("Add csrfSecurity Filter", "", "/mgnl-bootstrap/core/config.server.filters.xml", "/filters/csrfSecurity", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW))) .addTask(new NodeExistsDelegateTask("Order csrfSecurity Filter", "Put csrfSecurity before uriSecurity Filter.", RepositoryConstants.CONFIG, "/server/filters/uriSecurity", new OrderNodeBeforeTask("Order csrfSecurity Filter", "Put csrfSecurity before uriSecurity Filter.", RepositoryConstants.CONFIG, "/server/filters/csrfSecurity", "uriSecurity"), new WarnTask("CSRF Security Filter is inactive.", "CSRF Security Filter inactive. The installed csrfFilter would normally be ordered before the uriSecurity filter, but could not be moved there as a uriFilter node does not exist in the /server/filters node. The installed csrfFilter must be moved up the filters list manually."))) .addTask(new NodeExistsDelegateTask("Add csrfSecurity Filter", "/server/auditLogging/logConfigurations/security", null, new PartialBootstrapTask("Add 'security' AuditLogging logConfiguration.", "", "/mgnl-bootstrap/core/config.server.auditLogging.xml", "/auditLogging/logConfigurations/security", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW))));
.addTask(new NodeExistsDelegateTask("Make InReplyTo property read only", "Make InReplyTo property read only in forum app dialog", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/inReplyTo", new SetPropertyTask("", RepositoryConstants.CONFIG, "/modules/forum/dialogs/messageEdit/form/tabs/tabMain/fields/inReplyTo", "readOnly", "true"))) .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' action for browser subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.browser.actions.xml", "actions/addMessage")) .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' configuration for editActions group of thread in browser subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.browser.actionbar.xml", "actionbar/sections/thread/groups/editActions/items/addMessage")) .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' configuration for editActions group of message in browser subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.browser.actionbar.xml", "actionbar/sections/message/groups/editActions/items/addMessage")) .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' action for moderation subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.moderation.actions.xml", "actions/addMessage")) .addTask(new PartialBootstrapTask("Bootstrap 'addMessage' configuration for editActions group of message in moderation subApp", "", "/mgnl-bootstrap/forum/apps/config.modules.forum.apps.forum.subApps.moderation.actionbar.xml", "actionbar/sections/message/groups/editActions/items/addMessage")) .addTask(new BootstrapSingleModuleResource("Bootstrap 'messageAdd' dialog configuration", "", "dialogs/config.modules.forum.dialogs.messageAdd.xml")) .addTask(new NodeExistsDelegateTask("Order 'addMessage' action to the first position for browser subApp", "", RepositoryConstants.CONFIG, "/modules/forum/apps/forum/subApps/browser/actions/addMessage",
new BootstrapSingleResource("", "", "/mgnl-bootstrap/standard-templating-kit/dialogs/components/pur/config.modules.standard-templating-kit.dialogs.components.pur.stkPURDoubleOptInForm.xml"))) .addTask(new NodeExistsDelegateTask("Add new double-opt-in form to component availability of PUR page template", "/modules/standard-templating-kit/templates/pages/stkPublicUserRegistration/areas/main/areas/content/availableComponents/stkPURDoubleOptInForm", null, new PartialBootstrapTask("", "/mgnl-bootstrap/standard-templating-kit/templates/pages/config.modules.standard-templating-kit.templates.pages.stkPublicUserRegistration.xml", "/stkPublicUserRegistration/areas/main/areas/content/availableComponents/stkPURDoubleOptInForm")))
.addTask(new ArrayDelegateTask("Disable browser cache only when magnolia.develop=true", new RemoveNodeTask("", "/modules/cache/config/contentCaching/defaultPageCache/browserCachePolicy/policies/never"), new PartialBootstrapTask("", "/mgnl-bootstrap/cache/config.modules.cache.config.contentCaching.defaultPageCache.xml", "/defaultPageCache/browserCachePolicy/policies/disableBrowserCacheInDevelopMode"), new OrderNodeToFirstPositionTask("", "modules/cache/config/contentCaching/defaultPageCache/browserCachePolicy/policies/disableBrowserCacheInDevelopMode") ))
); register(DeltaBuilder.update("5.2", "") .addTask(new PartialBootstrapTask("Add asset link transformer in order to create an asset ItemKey", "Add asset link transformer in order to create an asset ItemKey", "/mgnl-bootstrap/mail/config.modules.mail.apps.xml", "/apps/mail/subApps/verify/formDefinitions/simple/tabs/simple/fields/attachment/identifierToPathConverter"))); .addTask(new PartialBootstrapTask("Rebootstrap the mail app dialog fields", "Rebootstrap the mail app dialog fields to support new SMTP configuration fnad Google Oauth", "/mgnl-bootstrap/mail/config.modules.mail.apps.xml", "/apps/mail/subApps/main/formDefinitions/main/tabs/main/fields/"))