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.cms.util;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.cms.core.NodeData;
38
39 import java.util.Collection;
40 import java.util.regex.Matcher;
41 import java.util.regex.Pattern;
42
43
44
45
46
47
48
49 public class SearchReplace implements ContentUtil.Visitor {
50 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(SearchReplace.class);
51
52 final String propertyNamePattern;
53 final String search;
54 final String replace;
55
56 private final Pattern searchPattern;
57
58
59
60
61
62 public SearchReplace(String propertyNamePattern, String search, String replace) {
63 this(propertyNamePattern, search, replace, Pattern.LITERAL);
64 }
65
66
67
68
69 public SearchReplace(String propertyNamePattern, String search, String replace, int regexFlags) {
70 this.propertyNamePattern = propertyNamePattern;
71 this.search = search;
72 this.replace = replace;
73
74 this.searchPattern = Pattern.compile(search, regexFlags);
75 }
76
77 @Override
78 public void visit(Content node) throws Exception {
79 final Collection<NodeData> props = node.getNodeDataCollection(propertyNamePattern);
80 for (NodeData prop : props) {
81 if (prop.isExist()) {
82 final String oldValue = prop.getString();
83 final StringBuffer newValue = new StringBuffer();
84 final Matcher matcher = searchPattern.matcher(oldValue);
85 int count = 0;
86 while (matcher.find()) {
87 final String group = matcher.group();
88 matcher.appendReplacement(newValue, replace);
89 count++;
90 }
91 matcher.appendTail(newValue);
92 onPropertyVisit(prop, count, oldValue, newValue);
93 prop.setValue(newValue.toString());
94 }
95 }
96 }
97
98 protected void onPropertyVisit(NodeData prop, int count, String oldValue, StringBuffer newValue) {
99 log.debug(String.format("Found %d occurences of %s at %s", count, search, prop.getHandle()));
100 log.debug(String.format(" old value:\n %s\n\nnew value:\n%s", oldValue, newValue.toString()));
101 }
102
103 }