CargoLockingServiceInMem.java 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /**
  2. * Purpose
  3. * @author peter
  4. * @created 2009-sep-07
  5. * $Id$
  6. */
  7. package se.citerus.dddsample.application;
  8. import se.citerus.dddsample.domain.model.cargo.TrackingId;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.concurrent.locks.Lock;
  12. import java.util.concurrent.locks.ReentrantLock;
  13. public class CargoLockingServiceInMem implements CargoLockingService {
  14. private final Map<TrackingId, Lock> locks = new HashMap<TrackingId, Lock>();
  15. @Override
  16. public void assertLocked(final TrackingId trackingId) {
  17. final Lock lock = getLockFor(trackingId);
  18. if (!lock.tryLock()) {
  19. throw new RuntimeException("Lock not held");
  20. }
  21. }
  22. @Override
  23. public void unlock(final TrackingId trackingId) {
  24. final Lock lock = getLockFor(trackingId);
  25. lock.unlock();
  26. }
  27. @Override
  28. public void lock(final TrackingId trackingId) {
  29. final Lock lock = getLockFor(trackingId);
  30. if (!lock.tryLock()) {
  31. throw new RuntimeException("Could not lock");
  32. }
  33. }
  34. private Lock getLockFor(final TrackingId trackingId) {
  35. Lock lock = locks.get(trackingId);
  36. if (lock == null) {
  37. lock = new ReentrantLock();
  38. locks.put(trackingId, lock);
  39. }
  40. return lock;
  41. }
  42. }