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.delta;
35
36 import javax.jcr.Node;
37 import javax.jcr.NodeIterator;
38 import javax.jcr.RepositoryException;
39
40 import org.apache.commons.lang.ArrayUtils;
41 import org.apache.commons.lang.StringUtils;
42
43 import info.magnolia.cms.filters.FilterManager;
44 import info.magnolia.jcr.util.NodeUtil;
45 import info.magnolia.module.InstallContext;
46
47
48
49
50
51
52
53
54 public class OrderFilterBeforeTask extends AbstractRepositoryTask {
55
56 private final String filterToBeOrderedName;
57 private final String[] requiredFiltersAfter;
58
59 public OrderFilterBeforeTask(String filterName, String[] requiredFiltersAfter) {
60 this(filterName, "Sets the new " + filterName + " in the proper place.", requiredFiltersAfter);
61 }
62
63 public OrderFilterBeforeTask(String filterName, String description, String[] requiredFiltersAfter) {
64 super("Setup " + filterName + " filter", description);
65 this.filterToBeOrderedName = filterName;
66 this.requiredFiltersAfter = requiredFiltersAfter;
67 }
68
69 @Override
70 protected void doExecute(InstallContext ctx) throws RepositoryException, TaskExecutionException {
71 final Node filtersNode = ctx.getConfigJCRSession().getNode(FilterManager.SERVER_FILTERS);
72
73 if (!filtersNode.hasNode(filterToBeOrderedName)) {
74 throw new TaskExecutionException("Filter with name " + filterToBeOrderedName + " can't be found.");
75 }
76
77 Node firstRequiredFilter = findFirstChildNode(filtersNode, requiredFiltersAfter);
78
79 if (firstRequiredFilter == null) {
80 ctx.warn("Could not sort filter " + filterToBeOrderedName + ". It should be positioned before " + StringUtils.join(requiredFiltersAfter, ", "));
81 return;
82 }
83
84 NodeUtil.orderBefore(filtersNode.getNode(filterToBeOrderedName), firstRequiredFilter.getName());
85 }
86
87 private Node findFirstChildNode(Node parentNode, String[] childNodeNames) throws RepositoryException {
88
89 NodeIterator nodes = parentNode.getNodes();
90 while (nodes.hasNext()) {
91 Node child = nodes.nextNode();
92 if (ArrayUtils.contains(childNodeNames, child.getName())) {
93 return child;
94 }
95 }
96 return null;
97 }
98 }