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.cache.setup;
35
36 import info.magnolia.jcr.iterator.FilteringPropertyIterator;
37 import info.magnolia.jcr.predicate.JCRMgnlPropertyHidingPredicate;
38 import info.magnolia.jcr.util.NodeTypes;
39 import info.magnolia.module.InstallContext;
40 import info.magnolia.module.cache.AbstractListeningFlushPolicy;
41 import info.magnolia.module.cache.FlushAllListeningPolicy;
42 import info.magnolia.module.delta.NodeVisitorTask;
43 import info.magnolia.objectfactory.Components;
44 import info.magnolia.repository.RepositoryConstants;
45 import info.magnolia.repository.RepositoryManager;
46
47 import java.util.ArrayList;
48 import java.util.Collection;
49
50 import javax.jcr.Node;
51 import javax.jcr.PropertyIterator;
52 import javax.jcr.RepositoryException;
53
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57
58
59
60 public class MigrateFlushListeningPolicyTask extends NodeVisitorTask {
61
62 private static final Logger log = LoggerFactory.getLogger(MigrateFlushListeningPolicyTask.class);
63
64 protected static final String EXCLUDED_WORKSPACES = "excludedWorkspaces";
65 protected static final String REPOSITORIES = "repositories";
66 private static final String TASK_NAME = String.format("Migrate '%s' configuration.", FlushAllListeningPolicy.class.getName());
67 private final String abstractListeningFlushPolicyClassName;
68
69 public MigrateFlushListeningPolicyTask(String path, Class<? extends AbstractListeningFlushPolicy> abstractListeningFlushPolicyClass) {
70 super(TASK_NAME, TASK_NAME, RepositoryConstants.CONFIG, "/" + path);
71 this.abstractListeningFlushPolicyClassName = abstractListeningFlushPolicyClass.getName();
72 }
73
74 @Override
75 protected boolean nodeMatches(Node node) {
76 try {
77 return node.hasProperty("class") && abstractListeningFlushPolicyClassName.equals(node.getProperty("class").getString());
78 } catch (RepositoryException e) {
79 log.error("Cannot check if '{}' matches.", node, e);
80 }
81 return false;
82 }
83
84 @Override
85 protected void operateOnNode(InstallContext installContext, Node node) {
86 Collection<String> includedRepositories = new ArrayList<String>();
87 Collection<String> includedWorkspaces = Components.getComponent(RepositoryManager.class).getWorkspaceNames();
88 try {
89 if (node.hasNode(REPOSITORIES)) {
90 Node repositores = node.getNode(REPOSITORIES);
91 PropertyIterator propertyIterator = new FilteringPropertyIterator(repositores.getProperties(), new JCRMgnlPropertyHidingPredicate());
92 while (propertyIterator.hasNext()) {
93 includedRepositories.add(propertyIterator.nextProperty().getString());
94 }
95 repositores.remove();
96 }
97 includedWorkspaces.removeAll(includedRepositories);
98 Node excludedWorkspaces = node.addNode(EXCLUDED_WORKSPACES, NodeTypes.ContentNode.NAME);
99
100 for (String workspace : includedWorkspaces) {
101 excludedWorkspaces.setProperty(workspace, workspace);
102 }
103 installContext.info(String.format("The configuration '%s' was migrated. All workspaces are now registered by default except those defined under '%s'. "
104 + "The obsolete property '%s' was removed.", node, EXCLUDED_WORKSPACES, REPOSITORIES));
105
106 } catch (RepositoryException e) {
107 installContext.error(String.format("Cannot execute task '%s' for node '%s'", this.getDescription(), node), e);
108 }
109 }
110 }