public void apply(
NodeState node, BatchedItemOperations itemOps,
NodeTypeRegistry ntReg, ReferenceChangeTracker refTracker)
throws RepositoryException {
PropertyState prop = null;
PropDef def = null;
if (node.hasPropertyName(name)) {
// a property with that name already exists...
PropertyId idExisting = new PropertyId(node.getNodeId(), name);
prop = (PropertyState) itemOps.getItemState(idExisting);
def = ntReg.getPropDef(prop.getDefinitionId());
if (def.isProtected()) {
// skip protected property
log.debug("skipping protected property "
+ itemOps.safeGetJCRPath(idExisting));
return;
}
if (!def.isAutoCreated()
|| (prop.getType() != type && type != PropertyType.UNDEFINED)
|| def.isMultiple() != prop.isMultiValued()) {
throw new ItemExistsException(itemOps.safeGetJCRPath(prop.getPropertyId()));
}
} else {
// there's no property with that name,
// find applicable definition
def = getApplicablePropertyDef(itemOps.getEffectiveNodeType(node));
if (def.isProtected()) {
// skip protected property
log.debug("skipping protected property " + name);
return;
}
// create new property
prop = itemOps.createPropertyState(node, name, type, def);
}
// check multi-valued characteristic
if (values.length != 1 && !def.isMultiple()) {
throw new ConstraintViolationException(itemOps.safeGetJCRPath(prop.getPropertyId())
+ " is not multi-valued");
}
// convert serialized values to InternalValue objects
int targetType = getTargetType(def);
InternalValue[] iva = new InternalValue[values.length];
for (int i = 0; i < values.length; i++) {
iva[i] = values[i].getInternalValue(targetType);
}
// set values
prop.setValues(iva);
// make sure property is valid according to its definition
itemOps.validate(prop);
if (prop.getType() == PropertyType.REFERENCE) {
// store reference for later resolution
refTracker.processedReference(prop);
}
// store property