in vault-core/src/main/java/org/apache/jackrabbit/vault/util/DocViewProperty.java [491:549]
public boolean apply(Node node) throws RepositoryException {
Property prop = node.hasProperty(name) ? node.getProperty(name) : null;
// check if multiple flags are equal
if (prop != null && isMulti != prop.getDefinition().isMultiple()) {
prop.remove();
prop = null;
}
if (prop != null) {
int propType = prop.getType();
if (propType != type && (propType != PropertyType.STRING || type != PropertyType.UNDEFINED)) {
// never compare if types differ
prop = null;
}
}
if (isMulti) {
Value[] vs = prop == null ? null : prop.getValues();
if (type == PropertyType.BINARY) {
return applyBinary(node, vs);
}
if (vs != null && vs.length == values.length) {
// quick check all values
boolean modified = false;
for (int i=0; i<vs.length; i++) {
if (!vs[i].getString().equals(values[i])) {
modified = true;
}
}
if (!modified) {
return false;
}
}
if (type == PropertyType.UNDEFINED) {
node.setProperty(name, values);
} else {
node.setProperty(name, values, type);
}
// assume modified
return true;
} else {
Value v = prop == null ? null : prop.getValue();
if (type == PropertyType.BINARY) {
return applyBinary(node, v);
}
if (v == null || !v.getString().equals(values[0])) {
try {
if (type == PropertyType.UNDEFINED) {
node.setProperty(name, values[0]);
} else {
node.setProperty(name, values[0], type);
}
} catch (ValueFormatException e) {
// forcing string
node.setProperty(name, values[0], PropertyType.STRING);
}
return true;
}
}
return false;
}