1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.workflow.setup;
35
36 import info.magnolia.cms.beans.config.ContentRepository;
37 import info.magnolia.cms.core.Content;
38 import info.magnolia.cms.security.Permission;
39 import info.magnolia.module.DefaultModuleVersionHandler;
40 import info.magnolia.module.InstallContext;
41 import info.magnolia.module.admininterface.setup.AddMainMenuItemTask;
42 import info.magnolia.module.admininterface.setup.AddSubMenuItemTask;
43 import info.magnolia.module.admininterface.trees.WebsiteTreeConfiguration;
44 import info.magnolia.module.delta.AddPermissionTask;
45 import info.magnolia.module.delta.AddRoleToGroupTask;
46 import info.magnolia.module.delta.AddUserToGroupTask;
47 import info.magnolia.module.delta.ArrayDelegateTask;
48 import info.magnolia.module.delta.BackupTask;
49 import info.magnolia.module.delta.BootstrapResourcesTask;
50 import info.magnolia.module.delta.BootstrapSingleModuleResource;
51 import info.magnolia.module.delta.BootstrapSingleResource;
52 import info.magnolia.module.delta.CheckAndModifyPropertyValueTask;
53 import info.magnolia.module.delta.ConditionalDelegateTask;
54 import info.magnolia.module.delta.Delta;
55 import info.magnolia.module.delta.DeltaBuilder;
56 import info.magnolia.module.delta.IsModuleInstalledOrRegistered;
57 import info.magnolia.module.delta.ModuleDependencyBootstrapTask;
58 import info.magnolia.module.delta.NodeExistsDelegateTask;
59 import info.magnolia.module.delta.PropertyValueDelegateTask;
60 import info.magnolia.module.delta.RemovePermissionTask;
61 import info.magnolia.module.delta.Task;
62 import info.magnolia.module.delta.TaskExecutionException;
63 import info.magnolia.module.delta.WarnTask;
64 import info.magnolia.module.workflow.setup.for3_5.AddNewDefaultConfig;
65 import info.magnolia.module.workflow.setup.for3_5.CheckAndUpdateDefaultWorkflowDefinition;
66 import info.magnolia.module.workflow.setup.for3_5.RemoveMetadataFromExpressionsWorkspace;
67 import info.magnolia.module.workflow.setup.for3_5.SetDefaultWorkflowForActivationFlowCommands;
68 import info.magnolia.module.workflow.trees.WorkflowWebsiteTreeConfiguration;
69
70 import java.util.ArrayList;
71 import java.util.List;
72
73 import javax.jcr.ImportUUIDBehavior;
74 import javax.jcr.RepositoryException;
75
76
77
78
79
80
81 public class WorkflowModuleVersionHandler extends DefaultModuleVersionHandler {
82
83 private static final String BACKUP_PATH = "/server/install/backup";
84 private final Task inboxMenu = new AddMainMenuItemTask("inbox", "menu.inbox", "info.magnolia.module.workflow.messages",
85 "MgnlAdminCentral.showContent('/.magnolia/pages/inbox.html', false, false)", "/.resources/icons/24/mail.gif",
86 "security");
87 private final Task flowsPageMenu = new AddSubMenuItemTask("config", "workflows", "menu.config.workflows",
88 "MgnlAdminCentral.showContent('/.magnolia/pages/flows.html');", "/.resources/icons/16/dot.gif");
89
90 private final Task bootstrapSecurityConfig = new BootstrapResourcesTask("New ACL configuration", "Bootstraps the new configuration for the ACL dialogs") {
91 protected String[] getResourcesToBootstrap(final InstallContext installContext) {
92 return new String[]{
93 "/mgnl-bootstrap/workflow/config.modules.adminInterface.config.securityConfiguration.repositories.Expressions.xml",
94 "/mgnl-bootstrap/workflow/config.modules.adminInterface.config.securityConfiguration.repositories.Store.xml"
95 };
96 }
97 };
98
99 private Task changeWebsiteTreeConfigurationTask = new CheckAndModifyPropertyValueTask("Website tree configuration", "Modifies the website tree configuration so that a message window pops up for activation.",
100 ContentRepository.CONFIG,
101 "/modules/adminInterface/trees/website",
102 "configurationClass",
103 WebsiteTreeConfiguration.class.getName(),
104 WorkflowWebsiteTreeConfiguration.class.getName());
105
106 private Task changeDMSTreeConfigurationTask = new IsModuleInstalledOrRegistered(
107 "DMS tree configuration", "Modifies the dms tree configuration so that a comment window pops up for activation.",
108 "dms",
109 new CheckAndModifyPropertyValueTask("DMS tree configuration", "Modifies the dms tree configuration so that a comment window pops up for activation.",
110 ContentRepository.CONFIG,
111 "/modules/dms/trees/dms",
112 "configurationClass",
113
114 "info.magnolia.module.dms.DMSAdminTreeConfig",
115 "info.magnolia.module.dms.WorkflowDMSAdminTreeConfig"
116 ));
117
118
119 public WorkflowModuleVersionHandler() {
120 final Delta delta35 = DeltaBuilder.update("3.5", "")
121 .addTask(inboxMenu)
122 .addTask(flowsPageMenu)
123 .addTask(new BootstrapSingleResource("Bootstrap", "Bootstraps the Workflow Utils page.", "/mgnl-bootstrap/workflow/config.modules.workflow.pages.flows.xml"))
124 .addTask(new BootstrapSingleResource("Bootstrap", "Bootstraps the Inbox Subpages.", "/mgnl-bootstrap/workflow/config.modules.workflow.pages.inboxSubPages.xml"))
125
126 .addTask(new ArrayDelegateTask("Backup and Bootstrap", "Makes a backup of the current 'EditWorkItem' dialog and re-installs it.", new Task[] {
127 new BackupTask(ContentRepository.CONFIG, "/modules/workflow/dialogs/editWorkItem", true),
128 new BootstrapSingleResource("Bootstrap", "Bootstraps the Inbox Subpages.", "/mgnl-bootstrap/workflow/config.modules.workflow.dialogs.editWorkItem.xml", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW),
129 new WarnTask("Note: ", "Note that the 'EditWorkItem' dialog was re-installed. Magnolia put a backup of original dialog into '" + BACKUP_PATH + "/editWorkItem'. Please review the changes manually.")
130 }))
131 .addTask(new BootstrapSingleResource("Bootstrap", "Bootstraps the 'EditActivationWorkItem' dialog", "/mgnl-bootstrap/workflow/config.modules.workflow.dialogs.editActivationWorkItem.xml"))
132 .addTask(new AddNewDefaultConfig())
133 .addTask(new CheckAndUpdateDefaultWorkflowDefinition())
134 .addTask(new RemoveMetadataFromExpressionsWorkspace())
135 .addTask(new SetDefaultWorkflowForActivationFlowCommands())
136 .addTask(bootstrapSecurityConfig)
137
138 .addTask(new BootstrapSingleResource("Bootstrap", "Bootstraps the 'editors' group.", "/mgnl-bootstrap/workflow/usergroups.editors.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING))
139 .addTask(new BootstrapSingleResource("Bootstrap", "Bootstraps the 'publishers' group.", "/mgnl-bootstrap/workflow/usergroups.publishers.xml", ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING))
140 .addTask(new BootstrapSingleResource("Bootstrap", "Bootstraps the 'workflow-base' role.", "/mgnl-bootstrap/workflow/userroles.workflow-base.xml"));
141 register(delta35);
142
143 register(DeltaBuilder.update("3.6", "")
144 .addTask(changeWebsiteTreeConfigurationTask)
145 .addTask(changeDMSTreeConfigurationTask)
146 .addTask(new BootstrapSingleResource("Comment on activation dialog", "Registers the dialog for activation comments.", "/mgnl-bootstrap/workflow/config.modules.workflow.dialogs.startActivationWorkflow.xml"))
147 .addTask(new IsModuleInstalledOrRegistered("Sample users and groups", "Adds sample users to sample editors and publishers group, if the sample module is installed or registered.",
148 "samples", new ArrayDelegateTask("",
149 new AddUserToGroupTask("Sample user", "eve", "editors"),
150 new AddUserToGroupTask("Sample user", "patrick", "publishers"))
151 )));
152
153 register(DeltaBuilder.update("3.6.4", "")
154 .addTask(new ArrayDelegateTask("Update tree configuration",
155 new BootstrapSingleResource("Update tree configuration", "Adds Store workspace tree configuration.", "/mgnl-bootstrap/workflow/config.modules.adminInterface.trees.Store.xml"),
156 new BootstrapSingleResource("Update tree configuration", "Adds Expressions workspace tree configuration.", "/mgnl-bootstrap/workflow/config.modules.adminInterface.trees.Expressions.xml")))
157 );
158 register(DeltaBuilder.update("4.0", "")
159 .addTask(new AddUserToGroupTask("Superuser", "superuser", "publishers"))
160 );
161 register(DeltaBuilder.update("4.2", "")
162
163
164 .addTask(new IsModuleInstalledOrRegistered("Versioning", "Update of DMS specific versioning command.", "dms",
165 new PropertyValueDelegateTask("", "", ContentRepository.CONFIG, "/modules/dms/commands/dms/activate/version", "class", "info.magnolia.module.admininterface.commands.VersionCommand", false,
166 new CheckAndModifyPropertyValueTask("", "", ContentRepository.CONFIG, "/modules/dms/commands/dms/activate/version", "class", "info.magnolia.module.admininterface.commands.VersionCommand", "info.magnolia.module.dms.commands.DocumentVersionCommand"))))
167 .addTask(new IsModuleInstalledOrRegistered("Activation update","Enable workflow use for activation of data entries.", "data",
168 new ConditionalDelegateTask("", "", new ArrayDelegateTask("","", new BackupTask(ContentRepository.CONFIG, "/modules/data/commands/data/activate"), new BootstrapSingleResource("","", "/info/magnolia/module/workflow/setup/data/config.modules.data.commands.data.activate.xml"))) {
169 @Override
170 protected boolean condition(InstallContext installContext) throws TaskExecutionException {
171
172 try {
173 Content activation = installContext.getHierarchyManager(ContentRepository.CONFIG).getContentByUUID("a71a96a9-0c2b-4358-90f0-0be55e79361c");
174 return activation == null;
175 } catch (RepositoryException e) {
176
177 return true;
178 }
179 }
180 }))
181 );
182
183 register(DeltaBuilder.update("4.2.3", "")
184
185 .addTask(new AddPermissionTask("Update base role", "Adds permission to read the workflow definitions.", "workflow-base", "config", "/modules/workflow/config/flows", Permission.READ, true))
186 );
187
188 register(DeltaBuilder.update("4.3", "")
189
190 .addTask(new BootstrapSingleModuleResource("Publication date","Add new controls to the activation dialog.", "config.modules.workflow.dialogs.startActivationWorkflow.xml"))
191 .addTask(new BootstrapSingleModuleResource("Publication date","Add new controls to the workitem dialog", "config.modules.workflow.dialogs.editActivationWorkItem.xml"))
192 .addTask(new RemovePermissionTask("Update workflow-base role", "Updates the workflow-base role, removing unnecessary permission to self.", "workflow-base", "userroles", "/workflow-base", Permission.READ)));
193
194 register(DeltaBuilder.update("4.3.3", "")
195 .addTask(new NodeExistsDelegateTask("StartActivationWorkflowDialog", "Checs if startActivationWorkflow node exists", ContentRepository.CONFIG, "/modules/workflow/dialogs/startActivationWorkflow", new CheckAndModifyPropertyValueTask("StartActivationWorkflowDialog", "Increases the height to 450px to prevent visual artefacts on FF on Linux", ContentRepository.CONFIG, "/modules/workflow/dialogs/startActivationWorkflow", "height", "400", "450")))
196 );
197 }
198
199 protected List<Task> getExtraInstallTasks(InstallContext ctx) {
200 final List<Task> tasks = new ArrayList<Task>();
201 tasks.add(new ModuleDependencyBootstrapTask("dms"));
202 tasks.add(new ModuleDependencyBootstrapTask("data"));
203 tasks.add(inboxMenu);
204 tasks.add(flowsPageMenu);
205 tasks.add(new InstallWorkflowDefinitionTask("Setup default activation workflow definition", "Adds the default activation workflow definition under the /modules/workflow/config/flows/activation config node.",
206 "activation", "info/magnolia/module/workflow/default-activation-workflow.xml"));
207 tasks.add(changeWebsiteTreeConfigurationTask);
208 tasks.add(changeDMSTreeConfigurationTask);
209
210
211 if (ctx.isModuleRegistered("samples")) {
212 tasks.add(new AddUserToGroupTask("Sample user", "eve", "editors"));
213 tasks.add(new AddUserToGroupTask("Sample user", "patrick", "publishers"));
214 tasks.add(new AddRoleToGroupTask("Update editors group with samples role", "editors","editors"));
215 }
216
217 tasks.add(new AddUserToGroupTask("Superuser", "superuser", "publishers"));
218
219
220
221
222 tasks.add(new AddPermissionTask("Update Superuser Role", "Add all those permissions explicitly which could be overwritten by assigning the workflow base role.", "superuser", "config", "/modules/workflow/config/flows", Permission.ALL, true));
223
224 return tasks;
225 }
226
227 }