int state;
String identifier;
int version;
PropertyImpl prevProp;
PropertyDefinitionDatas defs;
ItemImpl prevItem =
dataManager.getItem(parentNode.nodeData(), new QPathEntry(propertyName, 0), true,
dataManager.isNew(parentNode.getIdentifier()), ItemType.PROPERTY, false);
NodeTypeDataManager ntm = session.getWorkspace().getNodeTypesHolder();
NodeData parentData = (NodeData)parentNode.getData();
boolean isMultiValue = multiValue;
PropertyImpl prevProperty = null;
if (prevItem == null || prevItem.isNode())
{ // new property
identifier = IdGenerator.generate();
version = -1;
if (propertyValues == null)
{
// new property null values;
TransientPropertyData nullData =
new TransientPropertyData(qpath, identifier, version, PropertyType.UNDEFINED,
parentNode.getInternalIdentifier(), isMultiValue);
PropertyImpl nullProperty = new PropertyImpl(nullData, session);
nullProperty.invalidate();
return nullProperty;
}
defs =
ntm.getPropertyDefinitions(propertyName, parentData.getPrimaryTypeName(), parentData.getMixinTypeNames());
prevProp = null;
state = ItemState.ADDED;
}
else
{
// update of the property
prevProp = (PropertyImpl)prevItem;
prevProperty = new AuditPropertyImpl(prevProp.getData(), prevProp.getSession());
isMultiValue = prevProp.isMultiValued();
defs =
ntm.getPropertyDefinitions(propertyName, parentData.getPrimaryTypeName(), parentData.getMixinTypeNames());
identifier = prevProp.getInternalIdentifier();
version = prevProp.getData().getPersistedVersion();
if (propertyValues == null)
{
state = ItemState.DELETED;
}
else
{
state = ItemState.UPDATED;
}
}
if (defs == null || defs.getAnyDefinition() == null)
{
throw new ConstraintViolationException("Property definition '" + propertyName.getAsString()
+ "' is not found.");
}
PropertyDefinitionData def = defs.getDefinition(isMultiValue);
if (def != null && def.isProtected())
{
throw new ConstraintViolationException("Can not set protected property "
+ locationFactory.createJCRPath(qpath).getAsString(false));
}