/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.concurrency;
import org.apereo.portal.EntityIdentifier;
/**
* Defines an api for acquiring lock objects, <code>IEntityLocks</code>, that can be used to control
* concurrent access to portal entities. A lock is associated with a particular entity and has an
* <code>owner</code>, a <code>lockType</code> and a service-controlled <code>expirationTime</code>.
* Currently supported lock types are READ_LOCK and WRITE_LOCK.
*
* <p>If I want to lock an entity for update, I ask the service for a write lock:
*
* <p><code>int lockType = IEntityLockService.WRITE_LOCK;<br>
* EntityIdentifier eid = myEntity.getEntityIdentifier();<br>
* IEntityLock lock = svc.newLock(eid, lockType, lockOwner);</code>
*
* <p>If there is no conflicting lock on the entity, the service responds with the requested lock.
* If I acquire the lock, I know that no other client will get be able to get a conflicting lock.
* From then on, I communicate with the service via the lock:
*
* <p><code>
* lock.convert(int newType);<br>
* lock.isValid();<br>
* lock.release();<br>
* lock.renew();<br>
* </code>
*
* <p>A READ lock guarantees repeatable reads; other clients can get READ locks but not WRITE locks.
* A WRITE lock guarantees exclusive access; no other clients can get either READ or WRITE locks on
* the entity.
*
* <p>NB: since the locking service is not part of a transactional or object persistence framework,
* it has no way to enforce its own use.
*
*/
public interface IEntityLockService {
// The different types of locks:
public static int READ_LOCK = 0;
public static int WRITE_LOCK = 1;
/**
* Attempts to change the lock's <code>lockType</code> to <code>newType</code>.
*
* @param lock IEntityLock
* @param newType int
* @exception LockingException
*/
public void convert(IEntityLock lock, int newType) throws LockingException;
/**
* Attempts to change the lock's <code>lockType</code> to <code>newType</code>.
*
* @param lock IEntityLock
* @param newType int
* @param newDuration int
* @exception org.apereo.portal.concurrency.LockingException
*/
public void convert(IEntityLock lock, int newType, int newDuration) throws LockingException;
/**
* Answer if this <code>IEntityLock</code> exists in the store.
*
* @return boolean
* @param lock
*/
public boolean existsInStore(IEntityLock lock) throws LockingException;
/**
* Answers if this <code>IEntityLock</code> represents a lock that is still good. To be valid, a
* lock must exist in the underlying store and be unexpired and unreleased.
*
* @param lock IEntityLock
* @exception org.apereo.portal.concurrency.LockingException
*/
public boolean isValid(IEntityLock lock) throws LockingException;
/**
* Returns a lock for the entity, lock type and owner.
*
* @return org.apereo.portal.concurrency.IEntityLock
* @param entityType Class
* @param entityKey String
* @param lockType int
* @param owner String
* @exception org.apereo.portal.concurrency.LockingException
*/
public IEntityLock newLock(Class entityType, String entityKey, int lockType, String owner)
throws LockingException;
/**
* Returns a lock for the entity, lock type and owner.
*
* @return org.apereo.portal.concurrency.IEntityLock
* @param entityType Class
* @param entityKey String
* @param lockType int
* @param owner String
* @param durationSecs int
* @exception org.apereo.portal.concurrency.LockingException
*/
public IEntityLock newLock(
Class entityType, String entityKey, int lockType, String owner, int durationSecs)
throws LockingException;
/**
* Returns a lock for the entity, lock type and owner.
*
* @return org.apereo.portal.concurrency.IEntityLock
* @param entityID EntityIdentifier
* @param lockType int
* @param owner String
* @exception org.apereo.portal.concurrency.LockingException
*/
public IEntityLock newLock(EntityIdentifier entityID, int lockType, String owner)
throws LockingException;
/**
* Returns a lock for the entity, lock type and owner.
*
* @return org.apereo.portal.concurrency.IEntityLock
* @param entityID EntityIdentifier
* @param lockType int
* @param owner String
* @param durationSecs int
* @exception org.apereo.portal.concurrency.LockingException
*/
public IEntityLock newLock(
EntityIdentifier entityID, int lockType, String owner, int durationSecs)
throws LockingException;
/**
* Releases the <code>IEntityLock</code>.
*
* @param lock IEntityLock
* @exception org.apereo.portal.concurrency.LockingException
*/
public void release(IEntityLock lock) throws LockingException;
/**
* Extends the expiration time of the lock by the default increment.
*
* @param lock IEntityLock
* @exception org.apereo.portal.concurrency.LockingException
*/
public void renew(IEntityLock lock) throws LockingException;
/**
* Extends the expiration time of the lock by <code>duration</code> seconds.
*
* @param lock IEntityLock
* @param duration
* @exception LockingException
*/
public void renew(IEntityLock lock, int duration) throws LockingException;
}