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.jcr.util.PropertyUtil;
37 import info.magnolia.module.InstallContext;
38
39 import java.text.MessageFormat;
40 import java.util.Arrays;
41 import java.util.Collection;
42
43 import javax.jcr.Node;
44 import javax.jcr.Property;
45 import javax.jcr.RepositoryException;
46
47 import org.apache.commons.lang3.StringUtils;
48
49
50
51
52 public abstract class PropertyValuesTask extends AbstractTask {
53
54 public PropertyValuesTask(String name, String description) {
55 super(name, description);
56 }
57
58
59
60
61 protected void checkAndModifyPropertyValue(InstallContext ctx, Node node, String propertyName, String expectedCurrentValue, String newValue) throws RepositoryException {
62 checkAndModifyPropertyValue(ctx, node, propertyName, Arrays.asList(expectedCurrentValue), newValue);
63 }
64
65
66
67
68 protected void checkAndModifyPropertyValue(InstallContext ctx, Node node, String propertyName, Collection<String> expectedCurrentValues, String newValue) throws RepositoryException {
69 if (node.hasProperty(propertyName)) {
70 final Property prop = node.getProperty(propertyName);
71 final String currentValue = prop.getString();
72
73 if(StringUtils.equals(currentValue, newValue)){
74 return;
75 }
76
77 if (expectedCurrentValues.contains(currentValue)) {
78 prop.setValue(newValue);
79 } else {
80 String msg;
81 if (expectedCurrentValues.size() == 1) {
82 msg = format("Property \"{0}\" was expected to exist at {1} with value \"{2}\" but has the value \"{3}\" instead.",
83 propertyName, node.getPath(), expectedCurrentValues.iterator().next(), currentValue);
84 } else {
85 msg = format("Property \"{0}\" was expected to exist at {1} with one of values {2} but has the value \"{3}\" instead.",
86 propertyName, node.getPath(), expectedCurrentValues.toString(), currentValue);
87 }
88 ctx.warn(msg);
89 }
90 } else {
91 String msg;
92 if (expectedCurrentValues.size() == 1) {
93 msg = format("Property \"{0}\" was expected to exist at {1} with value \"{2}\" but does not exist.",
94 propertyName, node.getPath(), expectedCurrentValues.iterator().next());
95 } else {
96 msg = format("Property \"{0}\" was expected to exist at {1} with one of values {2} but does not exist.",
97 propertyName, node.getPath(), expectedCurrentValues.toString());
98 }
99 ctx.warn(msg);
100 }
101 }
102
103
104
105
106 protected void checkAndModifyPartOfPropertyValue(InstallContext ctx, Node node, String propertyName, String expectedValue, String newValue) throws RepositoryException {
107 if (node.hasProperty(propertyName)) {
108 final Property prop = node.getProperty(propertyName);
109 final String currentvalue = prop.getString();
110 if (currentvalue.contains(expectedValue)) {
111 prop.setValue(StringUtils.replace(currentvalue, expectedValue, newValue));
112 } else {
113 final String msg = format("Property \"{0}\" was expected to exist at {1} with part string \"{2}\" but does not contain this string.",
114 propertyName, node.getPath(), expectedValue);
115 ctx.warn(msg);
116 }
117 } else {
118 final String msg = format("Property \"{0}\" was expected to exist at {1} with part string \"{2}\" but does not exist.",
119 propertyName, node.getPath(), expectedValue);
120 ctx.warn(msg);
121 }
122 }
123
124 protected void checkOrCreateProperty(InstallContext ctx, Node node, String propertyName, String expectedValue) throws RepositoryException {
125
126 if (node.hasProperty(propertyName)) {
127 final Property prop = node.getProperty(propertyName);
128 final String currentvalue = prop.getString();
129
130 if (!currentvalue.equals(expectedValue)) {
131 final String msg = format("Property \"{0}\" was expected to exist at {1} with value \"{2}\" but {3,choice,0#does not exist|1#has the value \"{4}\" instead}.",
132 propertyName, node.getPath(), expectedValue, 1, currentvalue);
133 ctx.warn(msg);
134 }
135 } else {
136 node.setProperty(propertyName, expectedValue);
137 }
138 }
139
140
141
142
143 protected void newProperty(InstallContext ctx, Node node, String propertyName, Object value) throws RepositoryException {
144 if (!node.hasProperty(propertyName)) {
145 PropertyUtil.setProperty(node, propertyName, value);
146 } else {
147 final String msg = format("Property \"{0}\" was expected not to exist at {1}, but exists with value \"{2}\" and was going to be created with value \"{3}\".",
148 propertyName, node.getPath(), node.getProperty(propertyName).getValue().getString(), value);
149 ctx.warn(msg);
150 }
151 }
152
153
154 protected String format(String pattern, Object arg0, Object arg1, Object arg2, Object arg3, Object arg4) {
155 return MessageFormat.format(pattern, arg0, arg1, arg2, arg3, arg4);
156 }
157
158 protected String format(String pattern, Object arg0, Object arg1, Object arg2, Object arg3) {
159 return format(pattern, arg0, arg1, arg2, arg3, null);
160 }
161
162 protected String format(String pattern, Object arg0, Object arg1, Object arg2) {
163 return format(pattern, arg0, arg1, arg2, null);
164 }
165 }