View Javadoc
1   /**
2    * This file Copyright (c) 2008-2017 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.module.templatingkit.setup;
35  
36  import info.magnolia.cms.core.Content;
37  import info.magnolia.cms.util.ContentUtil;
38  import info.magnolia.jcr.util.NodeTypes;
39  import info.magnolia.module.DefaultModuleVersionHandler;
40  import info.magnolia.module.InstallContext;
41  import info.magnolia.module.delta.AbstractRepositoryTask;
42  import info.magnolia.module.delta.ArrayDelegateTask;
43  import info.magnolia.module.delta.BootstrapSingleResource;
44  import info.magnolia.module.delta.CheckAndModifyPropertyValueTask;
45  import info.magnolia.module.delta.CheckOrCreatePropertyTask;
46  import info.magnolia.module.delta.CopyNodeTask;
47  import info.magnolia.module.delta.CreateNodePathTask;
48  import info.magnolia.module.delta.CreateNodeTask;
49  import info.magnolia.module.delta.DeltaBuilder;
50  import info.magnolia.module.delta.IsModuleInstalledOrRegistered;
51  import info.magnolia.module.delta.ModuleDependencyBootstrapTask;
52  import info.magnolia.module.delta.NodeExistsDelegateTask;
53  import info.magnolia.module.delta.OrderNodeAfterTask;
54  import info.magnolia.module.delta.PartialBootstrapTask;
55  import info.magnolia.module.delta.PropertyExistsDelegateTask;
56  import info.magnolia.module.delta.RemovePropertiesTask;
57  import info.magnolia.module.delta.RemovePropertyTask;
58  import info.magnolia.module.delta.SetPropertyTask;
59  import info.magnolia.module.delta.Task;
60  import info.magnolia.module.delta.TaskExecutionException;
61  import info.magnolia.module.delta.WarnTask;
62  import info.magnolia.module.model.Version;
63  import info.magnolia.module.site.setup.DefaultSiteExistsDelegateTask;
64  import info.magnolia.module.templatingkit.setup.for2_7.ReorderSTKAppsTask;
65  import info.magnolia.repository.RepositoryConstants;
66  
67  import java.util.ArrayList;
68  import java.util.Arrays;
69  import java.util.List;
70  
71  import javax.jcr.ImportUUIDBehavior;
72  import javax.jcr.Node;
73  import javax.jcr.RepositoryException;
74  
75  /**
76   * STK Module VersionHandler.
77   */
78  public class STKModuleVersionHandler extends DefaultModuleVersionHandler {
79  
80      private final Task setStkSiteAsActiveInSiteModule = new NodeExistsDelegateTask("Set STK site as an active site if possible", "/modules/standard-templating-kit/config/site",
81              new ArrayDelegateTask("",
82                      new NodeExistsDelegateTask("Check if any site already exists", "/modules/site/config/site",
83                              new PropertyExistsDelegateTask("Check extends property and update or create it", "/modules/site/config/site", "extends",
84                                      new CheckAndModifyPropertyValueTask("/modules/site/config/site", "extends", "/modules/travel-demo/config/travel", "/modules/standard-templating-kit/config/site"),
85                                      new DefaultSiteExistsDelegateTask("", "",
86                                              new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/site/config/site", "extends", "/modules/standard-templating-kit/config/site"))),
87                              new ArrayDelegateTask("",
88                                      new CreateNodeTask("Create site node", "/modules/site/config", "site", NodeTypes.ContentNode.NAME),
89                                      new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/site/config/site", "extends", "/modules/standard-templating-kit/config/site"))),
90                      new CheckOrCreatePropertyTask("Set correct site class for stk site", "/modules/standard-templating-kit/config/site", "class", "info.magnolia.module.templatingkit.sites.Site"),
91                      new CheckOrCreatePropertyTask("Set correct class for stk prototype", "/modules/standard-templating-kit/config/site/templates/prototype", "class", "info.magnolia.module.templatingkit.templates.pages.STKPage")));
92  
93      public STKModuleVersionHandler() {
94  
95          register(DeltaBuilder.checkPrecondition("3.0", "3.1"));
96  
97          register(DeltaBuilder.update("3.0.1", "")
98                  .addTask(new NodeExistsDelegateTask("Update 'tabLogin' in dialog 'stkPURLoginForm'", "/modules/standard-templating-kit/dialogs/components/pur/stkPURLoginForm",
99                          new BootstrapSingleResource("", "", "/mgnl-bootstrap/standard-templating-kit/dialogs/components/pur/config.modules.standard-templating-kit.dialogs.components.pur.stkPURLoginForm.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING)))
100 
101                 .addTask(new PropertyExistsDelegateTask("Update template 'stkPURAuthSubmit'", "/modules/standard-templating-kit/templates/components/pur/stkPURAuthSubmit", "modelClass",
102                         new RemovePropertyTask("", "/modules/standard-templating-kit/templates/components/pur/stkPURAuthSubmit", "modelClass")))
103                 .addTask(new PropertyExistsDelegateTask("Update template 'stkPURNotAuthSubmit'", "/modules/standard-templating-kit/templates/components/pur/stkPURNotAuthSubmit", "modelClass",
104                         new RemovePropertyTask("", "/modules/standard-templating-kit/templates/components/pur/stkPURNotAuthSubmit", "modelClass")))
105                 .addTask(new PropertyExistsDelegateTask("Update template 'stkPURIntranet'", "/modules/standard-templating-kit/templates/components/pur/stkPURIntranet", "modelClass",
106                         new RemovePropertyTask("", "/modules/standard-templating-kit/templates/components/pur/stkPURIntranet", "modelClass")))
107 
108                 .addTask(new PropertyExistsDelegateTask("Update template 'stkPURLoginForm'", "/modules/standard-templating-kit/templates/components/pur/stkPURLoginForm", "modelClass",
109                         new RemovePropertyTask("", "/modules/standard-templating-kit/templates/components/pur/stkPURLoginForm", "modelClass")))
110 
111                 .addTask(new NodeExistsDelegateTask("Update template 'stkPURPasswordChangeForm'", "/modules/standard-templating-kit/templates/components/pur/stkPURPasswordChangeForm",
112                         new CheckAndModifyPropertyValueTask("/modules/standard-templating-kit/templates/components/pur/stkPURPasswordChangeForm", "modelClass",
113                                 "info.magnolia.module.publicuserregistration.frontend.action.RegistrationModel", "info.magnolia.module.form.templates.components.FormModel")))
114                 .addTask(new NodeExistsDelegateTask("Update template 'stkPURPasswordForm'", "/modules/standard-templating-kit/templates/components/pur/stkPURPasswordForm",
115                         new CheckAndModifyPropertyValueTask("/modules/standard-templating-kit/templates/components/pur/stkPURPasswordForm", "modelClass",
116                                 "info.magnolia.module.publicuserregistration.frontend.action.RegistrationModel", "info.magnolia.module.form.templates.components.FormModel")))
117                 .addTask(new NodeExistsDelegateTask("Update template 'stkPURRegistrationForm'", "/modules/standard-templating-kit/templates/components/pur/stkPURRegistrationForm",
118                         new CheckAndModifyPropertyValueTask("/modules/standard-templating-kit/templates/components/pur/stkPURRegistrationForm", "modelClass",
119                                 "info.magnolia.module.publicuserregistration.frontend.action.RegistrationModel", "info.magnolia.module.form.templates.components.FormModel")))
120                 .addTask(new NodeExistsDelegateTask("Update template 'stkPURUpdateForm'", "/modules/standard-templating-kit/templates/components/pur/stkPURUpdateForm",
121                         new CheckAndModifyPropertyValueTask("/modules/standard-templating-kit/templates/components/pur/stkPURUpdateForm", "modelClass",
122                                 "info.magnolia.module.publicuserregistration.frontend.action.RegistrationModel", "info.magnolia.module.form.templates.components.FormModel")))
123 
124                 .addTask(new NodeExistsDelegateTask("Add new double-opt-in form template", "/modules/standard-templating-kit/templates/components/pur/stkPURDoubleOptInForm", null,
125                         new BootstrapSingleResource("", "", "/mgnl-bootstrap/standard-templating-kit/templates/components/pur/config.modules.standard-templating-kit.templates.components.pur.stkPURDoubleOptInForm.xml")))
126                 .addTask(new NodeExistsDelegateTask("Add new double-opt-in form dialog", "/modules/standard-templating-kit/dialogs/components/pur/stkPURDoubleOptInForm", null,
127                         new BootstrapSingleResource("", "", "/mgnl-bootstrap/standard-templating-kit/dialogs/components/pur/config.modules.standard-templating-kit.dialogs.components.pur.stkPURDoubleOptInForm.xml")))
128                 .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,
129                         new PartialBootstrapTask("", "/mgnl-bootstrap/standard-templating-kit/templates/pages/config.modules.standard-templating-kit.templates.pages.stkPublicUserRegistration.xml",
130                                 "/stkPublicUserRegistration/areas/main/areas/content/availableComponents/stkPURDoubleOptInForm")))
131 
132                 .addTask(new RemovePropertiesTask("Remove legacy properties from configuration", RepositoryConstants.CONFIG, Arrays.asList(
133                         "/modules/standard-templating-kit/dialogs/generic/controls/inheritable/selected",
134                         "/modules/standard-templating-kit/dialogs/generic/controls/hideInNav/selected",
135                         "/modules/standard-templating-kit/dialogs/generic/teasers/hideTeaserImage/selected",
136                         "/modules/standard-templating-kit/dialogs/generic/teasers/highlighted/selected",
137                         "/modules/standard-templating-kit/dialogs/functional/stkRedirect/form/tabs/tabRedirect/fields/hideInNav/selected",
138                         "/modules/standard-templating-kit/dialogs/components/teasers/stkTeaserEventsList/form/tabs/tabTeaser/fields/showAbstract/selected",
139                         "/modules/standard-templating-kit/dialogs/components/teasers/stkTeaserNewsList/form/tabs/tabTeaser/fields/hideTeaserImage/selected",
140                         "/modules/standard-templating-kit/dialogs/components/features/stkEventsOverview/form/tabs/tabTeaser/fields/showAbstract/selected",
141                         "/modules/standard-templating-kit/dialogs/components/features/stkFAQ/form/tabs/tabMain/fields/useIndex/selected",
142                         "/modules/standard-templating-kit/dialogs/components/features/stkNewsOverview/form/tabs/tabTeaser/fields/hideTeaserImage/selected",
143                         "/modules/standard-templating-kit/dialogs/components/features/stkSiteMap/form/tabs/tabMain/fields/showSiteMapRoot/selected",
144 
145                         "/modules/standard-templating-kit/dialogs/components/features/stkFAQ/form/tabs/tabMain/fields/indexString/lineSemi",
146                         "/modules/standard-templating-kit/dialogs/components/features/stkSiteMap/form/tabs/tabMain/fields/link/lineSemi",
147 
148                         "/modules/standard-templating-kit/dialogs/pages/home/stkHomeProperties/form/tabs/tabMain/fields/searchUUID/labelDescription",
149                         "/modules/standard-templating-kit/dialogs/components/features/stkSiteMap/form/tabs/tabMain/fields/link/labelDescription",
150                         "/modules/standard-templating-kit/dialogs/components/features/stkSiteMap/form/tabs/tabMain/fields/showSiteMapRoot/labelDescription",
151                         "/modules/standard-templating-kit/dialogs/components/features/stkFAQ/form/tabs/tabMain/fields/indexString/labelDescription",
152                         "/modules/standard-templating-kit/dialogs/components/features/stkFAQ/form/tabs/tabMain/fields/useIndex/labelDescription",
153 
154                         "/modules/standard-templating-kit/dialogs/components/teasers/stkTeaserContact/form/tabs/tabTeaser/fields/contact/tree",
155 
156                         "/modules/standard-templating-kit/dialogs/pages/home/stkHomeProperties/form/tabs/tabMain/fields/searchUUID/path",
157 
158                         "/modules/standard-templating-kit/dialogs/components/features/stkSiteMap/form/tabs/tabMain/fields/titleToUse/cols"
159                 ), true))
160         );
161     }
162 
163     @Override
164     protected List<Task> getExtraInstallTasks(InstallContext ctx) {
165         final List<Task> tasks = new ArrayList<>();
166         tasks.addAll(super.getExtraInstallTasks(ctx));
167         tasks.add(new InstallSTKResourcesTask());
168 
169         // order templates
170         tasks.add(new AbstractRepositoryTask("Order templates", "") {
171             @Override
172             protected void doExecute(InstallContext ctx) throws RepositoryException, TaskExecutionException {
173                 Node templatesNodes = ctx.getConfigJCRSession().getNode("/modules/standard-templating-kit/templates/pages");
174                 Content templatesContent = ContentUtil.asContent(templatesNodes);
175                 ContentUtil.orderNodes(templatesContent, new String[]{"stkHome", "stkSection", "stkArticle", "stkLargeArticle", "stkNews", "stkEvent", "stkImageGallery", "stkFAQ", "stkForm", "stkSearchResult", "stkSiteMap", "stkRedirect"});
176             }
177         });
178 
179         tasks.add(new RemoveETKParagraphs());
180 
181         tasks.add(new WarnTask("SMTP Configuration", "Please set the config: /modules/mail/config/smtp to a valid smtp configuration"));
182         tasks.add(new IsModuleInstalledOrRegistered("Use of commenting module", "Use of commenting module by default in STK", "commenting",
183                 new CheckAndModifyPropertyValueTask("", "", RepositoryConstants.CONFIG, "/modules/standard-templating-kit/config/site/templates/prototype/areas/main/areas/comments/availableComponents/stkComments", "id", "standard-templating-kit:components/features/stkComments", "commenting:components/comments")));
184         tasks.add(new STKLegacyUiToMagnolia5AppProviderTask("Provide STK with a Magnolia 5 UI", "Turns legacy UI into a Magnolia 5 browser app."));
185         tasks.add(new OrderNodeAfterTask("STK AppLauncher group ordering", "Moves the stk app group after the tools group", RepositoryConstants.CONFIG, "/modules/ui-admincentral/config/appLauncherLayout/groups/stk", "tools"));
186         tasks.add(new ReorderSTKAppsTask());
187         tasks.add(new ModuleDependencyBootstrapTask("contacts"));
188         tasks.add(new ModuleDependencyBootstrapTask("categorization"));
189         tasks.add(setStkSiteAsActiveInSiteModule);
190         tasks.add(new IsModuleInstalledOrRegistered("Configure STK site for multisite", "multisite",
191                 new NodeExistsDelegateTask("Check if stk can be moved to the multisite", "/modules/standard-templating-kit/config/site",
192                         new ArrayDelegateTask("", "",
193                                 new NodeExistsDelegateTask("Check for default site", "Check whether default site already exists or not - if no, site from stk will be copied to multisite", RepositoryConstants.CONFIG, "/modules/multisite/config/sites/default",
194                                         new WarnTask("Default already site exists", "Default site already exists. No actions will be taken."),
195                                         new ArrayDelegateTask("", "",
196                                                 new CreateNodePathTask("", "/modules/multisite/config/sites/", NodeTypes.ContentNode.NAME),
197                                                 new CopyNodeTask("Default site configuration", "Copy the configuration of the STK site", "config", "/modules/standard-templating-kit/config/site", "/modules/multisite/config/sites/default", false),
198                                                 new ModuleDependencyBootstrapTask("multisite"),
199                                                 new CheckOrCreatePropertyTask("Add class property to legacy site", "/modules/multisite/config/sites/default", "class", "info.magnolia.module.templatingkit.sites.Site"),
200                                                 new SetPropertyTask("config", "/modules/multisite/config/sites/default", "label", "Default"))),
201                                 new NodeExistsDelegateTask("", "/modules/multisite/config/sites/fallback",
202                                         new NodeExistsDelegateTask("", "/modules/multisite/config/sites/default",
203                                                 new PropertyExistsDelegateTask("name", "/modules/multisite/config/sites/fallback", "extends",
204                                                         new CheckAndModifyPropertyValueTask("/modules/multisite/config/sites/fallback", "extends", "../travel", "../default"),
205                                                         new SetPropertyTask(RepositoryConstants.CONFIG, "/modules/multisite/config/sites/fallback", "extends", "../default"))))))));
206         tasks.add(new AddSTKRolesToRelevantAppsTask());
207         return tasks;
208     }
209 
210     @Override
211     protected List<Task> getDefaultUpdateTasks(Version forVersion) {
212         final List<Task> tasks = new ArrayList<>();
213         tasks.addAll(super.getDefaultUpdateTasks(forVersion));
214         return tasks;
215     }
216 }