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 info.magnolia.cms.util.QueryUtil;
37 import info.magnolia.module.InstallContext;
38 import info.magnolia.repository.RepositoryConstants;
39
40 import javax.jcr.Node;
41 import javax.jcr.NodeIterator;
42 import javax.jcr.Property;
43 import javax.jcr.PropertyIterator;
44 import javax.jcr.PropertyType;
45 import javax.jcr.RepositoryException;
46 import javax.jcr.query.Query;
47
48
49
50
51
52
53
54
55
56
57
58
59 public class ChangeAllPropertiesWithCertainValueTask extends NodeVisitorTask {
60
61 private static final String DEFAULT_ABS_PATH = "/";
62 private static final String SELECT_NODES_WITH_CERTAIN_VALUES = "select * from [nt:base] as t where contains(t.*,'%s')";
63
64 private final String workspaceName;
65 private final String currentValue;
66 private final String newValue;
67 private final String absPath;
68
69 public ChangeAllPropertiesWithCertainValueTask(String currentValue, String newValue) {
70 this(RepositoryConstants.CONFIG, currentValue, newValue);
71 }
72
73 public ChangeAllPropertiesWithCertainValueTask(String workspaceName, String currentValue, String newValue) {
74 this("Change value of all properties with certain value.", String.format("Change value '%s' of all properties in '%s' workspace to '%s'.", currentValue, workspaceName, newValue),
75 workspaceName, DEFAULT_ABS_PATH, currentValue, newValue);
76 }
77
78 public ChangeAllPropertiesWithCertainValueTask(String workspaceName, String absPath, String currentValue, String newValue) {
79 this("Change value of all properties with certain value.", String.format("Change value '%s' of all properties of '%s' node and it's descendants in '%s' workspace to '%s'.", currentValue, absPath, workspaceName, newValue),
80 workspaceName, absPath, currentValue, newValue);
81 }
82
83 public ChangeAllPropertiesWithCertainValueTask(String name, String description, String workspaceName, String currentValue, String newValue) {
84 this(name, description, workspaceName, DEFAULT_ABS_PATH, currentValue, newValue);
85 }
86
87 public ChangeAllPropertiesWithCertainValueTask(String name, String description, String workspaceName, String absPath, String currentValue, String newValue) {
88 super(name, description, workspaceName, absPath);
89 this.workspaceName = workspaceName;
90 this.currentValue = currentValue;
91 this.newValue = newValue;
92 this.absPath = absPath;
93 }
94
95 @Override
96 protected void doExecute(InstallContext installContext) throws RepositoryException, TaskExecutionException {
97 if (DEFAULT_ABS_PATH.equals(absPath)) {
98 String query = String.format(SELECT_NODES_WITH_CERTAIN_VALUES, currentValue);
99 NodeIterator nodeIterator = QueryUtil.search(workspaceName, query, Query.JCR_SQL2);
100 while (nodeIterator.hasNext()) {
101 Node node = nodeIterator.nextNode();
102 PropertyIterator iterator = node.getProperties();
103 while (iterator.hasNext()) {
104 Property property = iterator.nextProperty();
105 if (property.getType() == PropertyType.STRING) {
106 if (property.getString().equals(currentValue)) {
107 property.setValue(newValue);
108 }
109 }
110 }
111 }
112 } else {
113 super.doExecute(installContext);
114 }
115 }
116
117 @Override
118 protected boolean nodeMatches(Node node) {
119 return true;
120 }
121
122 @Override
123 protected void operateOnNode(InstallContext installContext, Node node) {
124 try {
125 PropertyIterator iterator = node.getProperties();
126 while (iterator.hasNext()) {
127 Property property = iterator.nextProperty();
128 if (property.getType() == PropertyType.STRING) {
129 if (property.getString().equals(currentValue)) {
130 property.setValue(newValue);
131 }
132 }
133 }
134 } catch (RepositoryException e) {
135 installContext.error(e.getMessage(), e);
136 }
137 }
138 }