/**
* ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium.
*/
package org.esupportail.helpdesk.services.expiration;
import org.esupportail.commons.utils.Assert;
import org.esupportail.commons.utils.lock.Lock;
import org.esupportail.commons.utils.lock.LockException;
import org.esupportail.helpdesk.domain.DomainService;
import org.springframework.beans.factory.InitializingBean;
/**
* A lockable abstract implementation of Expirator.
*/
@SuppressWarnings("serial")
public abstract class AbstractLockableExpirator implements Expirator, InitializingBean {
/**
* The domain service.
*/
private DomainService domainService;
/**
* Bean constructor.
*/
public AbstractLockableExpirator() {
super();
}
/**
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() {
Assert.notNull(domainService,
"property domainService of class " + this.getClass().getName()
+ " can not be null");
}
/**
* Lock.
* @return true on success.
*/
protected boolean tryLock() {
return getLock().tryLock();
}
/**
* @return the lock.
*/
protected abstract Lock getLock();
/**
* @see org.esupportail.helpdesk.services.expiration.Expirator#unlock()
*/
@Override
public void unlock() {
getLock().unlock();
}
/**
* @see org.esupportail.helpdesk.services.expiration.Expirator#expire(boolean)
*/
@Override
public boolean expire(final boolean alerts) {
if (!tryLock()) {
throw new LockException(
"task expire-tickets is already running, "
+ "please retry in a few minutes or run task unlock-expire-tickets "
+ "if you are sure that task expire-tickets is not running");
}
boolean result;
try {
result = expireTicketsInternal(alerts);
} catch (RuntimeException e) {
try {
unlock();
} catch (RuntimeException e2) {
// forget...
}
throw e;
}
unlock();
return result;
}
/**
* Expire non approved tickets.
* @param alerts
* @return true if the method should be called again.
*/
protected abstract boolean expireTicketsInternal(
boolean alerts);
/**
* @return the domainService
*/
protected DomainService getDomainService() {
return domainService;
}
/**
* @param domainService the domainService to set
*/
public void setDomainService(final DomainService domainService) {
this.domainService = domainService;
}
}