@Override public Object setProperty( final SecurityContext securityContext, final GraphObject obj, final T value) throws FrameworkException { final PropertyConverter converter = databaseConverter(securityContext, obj); final Object convertedValue; if (converter != null) { convertedValue = converter.convert(value); } else { convertedValue = value; } final PropertyContainer propertyContainer = obj.getPropertyContainer(); if (propertyContainer != null) { if (!TransactionCommand.inTransaction()) { throw new NotInTransactionException("setProperty outside of transaction"); } boolean internalSystemPropertiesUnlocked = (obj instanceof CreationContainer); // notify only non-system properties // collect modified properties if (obj instanceof AbstractNode) { if (!unvalidated) { TransactionCommand.nodeModified( securityContext.getCachedUser(), (AbstractNode) obj, AbstractPrimitiveProperty.this, propertyContainer.hasProperty(dbName()) ? propertyContainer.getProperty(dbName()) : null, value); } internalSystemPropertiesUnlocked = ((AbstractNode) obj).internalSystemPropertiesUnlocked; } else if (obj instanceof AbstractRelationship) { if (!unvalidated) { TransactionCommand.relationshipModified( securityContext.getCachedUser(), (AbstractRelationship) obj, AbstractPrimitiveProperty.this, propertyContainer.hasProperty(dbName()) ? propertyContainer.getProperty(dbName()) : null, value); } internalSystemPropertiesUnlocked = ((AbstractRelationship) obj).internalSystemPropertiesUnlocked; } // catch all sorts of errors and wrap them in a FrameworkException try { // save space if (convertedValue == null) { propertyContainer.removeProperty(dbName()); } else { if (!isSystemInternal() || internalSystemPropertiesUnlocked) { propertyContainer.setProperty(dbName(), convertedValue); } else { logger.warn( "Tried to set internal system property {} to {}. Action was denied.", new Object[] {dbName(), convertedValue}); } } updateAccessInformation(securityContext, propertyContainer); } catch (Throwable t) { // throw FrameworkException with the given cause final FrameworkException fex = new FrameworkException( 500, "Unable to set property " + jsonName() + " on entity with ID " + obj.getUuid() + ": " + t.toString()); fex.initCause(t); throw fex; } if (isIndexed()) { // do indexing, needs to be done after // setProperty to make spatial index // work if (!isPassivelyIndexed()) { index(obj, convertedValue); } } } return null; }