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.ui.framework.setup;
35
36 import info.magnolia.jcr.util.NodeTypes;
37 import info.magnolia.jcr.util.NodeUtil;
38 import info.magnolia.jcr.util.NodeVisitor;
39 import info.magnolia.module.InstallContext;
40 import info.magnolia.module.delta.AbstractTask;
41 import info.magnolia.module.delta.TaskExecutionException;
42 import info.magnolia.repository.RepositoryConstants;
43
44 import javax.jcr.Node;
45 import javax.jcr.RepositoryException;
46 import javax.jcr.Session;
47
48
49
50
51 public class AddIsPublishedRuleToAllDeactivateActionsTask extends AbstractTask {
52
53 private static final String ACTIONS = "actions";
54 private static final String DEACTIVATE = "deactivate";
55 private static final String EXTENDS = "extends";
56 private static final String AVAILABILITY = "availability";
57 private static final String RULES = "rules";
58 private static final String RULE = "IsPublishedRule";
59 private static final String PROPERTY_NAME = "implementationClass";
60 private static final String PROPERTY_VALUE = "info.magnolia.ui.framework.availability.IsPublishedRule";
61 private String appRootNode;
62
63 private NodeVisitor nodeVisitor = new NodeVisitor() {
64 @Override
65 public void visit(Node node) throws RepositoryException {
66 if (node.getName().equals(ACTIONS)) {
67 if (node.hasNode(DEACTIVATE) && !(node.getNode(DEACTIVATE).hasProperty(EXTENDS) && node.getNode(DEACTIVATE).getProperty(EXTENDS).getString().endsWith(DEACTIVATE))) {
68 Node action = node.getNode(DEACTIVATE);
69 if (!action.hasNode(AVAILABILITY)) {
70 action.addNode(AVAILABILITY, NodeTypes.ContentNode.NAME);
71 }
72 Node actionAvailability = action.getNode(AVAILABILITY);
73 if (!actionAvailability.hasNode(RULES)) {
74 actionAvailability.addNode(RULES, NodeTypes.ContentNode.NAME);
75 }
76 Node availabilityRules = actionAvailability.getNode(RULES);
77 if (!availabilityRules.hasNode(RULE)) {
78 availabilityRules.addNode(RULE, NodeTypes.ContentNode.NAME);
79 }
80 Node newRule = availabilityRules.getNode(RULE);
81 if (!newRule.hasProperty(PROPERTY_NAME)) {
82 newRule.setProperty(PROPERTY_NAME, PROPERTY_VALUE);
83 }
84 }
85 }
86 }
87 };
88
89 public AddIsPublishedRuleToAllDeactivateActionsTask(String taskDescription, String appRootNode) {
90 super("Add IsPublishedRule to all deactivation actions.", taskDescription);
91 this.appRootNode = appRootNode;
92 }
93
94 @Override
95 public void execute(InstallContext ctx) throws TaskExecutionException {
96 try {
97 Session session = ctx.getJCRSession(RepositoryConstants.CONFIG);
98 if (session.nodeExists(appRootNode)) {
99 Node rootNode = session.getNode(appRootNode);
100 NodeUtil.visit(rootNode, nodeVisitor);
101 }
102 } catch (RepositoryException e) {
103 throw new TaskExecutionException(e.getMessage(), e);
104 }
105 }
106 }