String lockOwner = session.getUserID();
DnaLock lock = createLock(lockOwner, lockUuid, nodeUuid, isDeep, isSessionScoped);
Graph.Batch batch = repository.createSystemGraph(sessionContext).batch();
PropertyFactory propFactory = sessionContext.getPropertyFactory();
PathFactory pathFactory = sessionContext.getValueFactories().getPathFactory();
Property lockOwnerProp = propFactory.create(JcrLexicon.LOCK_OWNER, lockOwner);
Property lockIsDeepProp = propFactory.create(JcrLexicon.LOCK_IS_DEEP, isDeep);
DateTimeFactory dateFactory = sessionContext.getValueFactories().getDateFactory();
DateTime expirationDate = dateFactory.create();
expirationDate = expirationDate.plusMillis(JcrEngine.LOCK_EXTENSION_INTERVAL_IN_MILLIS);
batch.create(pathFactory.create(locksPath, pathFactory.createSegment(lockUuid.toString())),
propFactory.create(JcrLexicon.PRIMARY_TYPE, DnaLexicon.LOCK),
propFactory.create(DnaLexicon.WORKSPACE, workspaceName),
propFactory.create(DnaLexicon.LOCKED_UUID, nodeUuid.toString()),
propFactory.create(DnaLexicon.IS_SESSION_SCOPED, isSessionScoped),
propFactory.create(DnaLexicon.LOCKING_SESSION, session.sessionId()),
propFactory.create(DnaLexicon.EXPIRATION_DATE, expirationDate),
// This gets set after the lock succeeds and the lock token gets added to the session
propFactory.create(DnaLexicon.IS_HELD_BY_SESSION, false),
lockOwnerProp,
lockIsDeepProp).ifAbsent().and();
batch.execute();
SessionCache cache = session.cache();