package com.github.signed.sandboxes.jee.data;
import java.util.Map;
import java.util.UUID;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import org.joda.time.LocalDate;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Maps;
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@javax.ejb.Lock(LockType.READ)
public class DayLockBean {
private final Map<LockToken, LockMetadata> heldLocks = Maps.newHashMap();
public synchronized Optional<LockToken> acquireLockFor(final LocalDate day) {
boolean dayNotAlreadyLocked = FluentIterable.from(heldLocks.values()).filter(new Predicate<LockMetadata>() {
@Override
public boolean apply(LockMetadata input) {
return day.equals(input.day());
}
}).isEmpty();
if (dayNotAlreadyLocked) {
LockToken token = new LockToken(UUID.randomUUID().toString());
LockMetadata metadata = new LockMetadata(day);
heldLocks.put(token, metadata);
return Optional.of(token);
}
return Optional.absent();
}
public synchronized void release(LockToken token) {
heldLocks.remove(token);
}
}