package org.jfrog.wharf.ivy.lock; import java.io.IOException; /** * Date: 9/15/11 * Time: 11:18 AM * * @author Fred Simon */ public class WaitingLockHolder extends LockHolderDelegator { public WaitingLockHolder(InternalLockHolder delegate) { super(delegate); } @Override public void releaseLock() { delegate.releaseLock(); } @Override public boolean acquireLock() { long start = System.currentTimeMillis(); do { if (delegate.acquireLock()) { delegate.appendLastMessage(" waiting lock acquired in " + (System.currentTimeMillis() - start) + "ms"); if (delegate.getLogger().isDebugEnabled()) { delegate.getLogger().log(stateMessage()); } return true; } try { Thread.sleep(delegate.getFactory().getSleepTimeInMs()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // reset interrupt status String message = stateMessage() + " waiting lock interrupted after waiting for " + (System.currentTimeMillis() - start) + "ms :" + e.getMessage(); delegate.setLastMessage(message); throw new RuntimeException(stateMessage(), e); } } while (System.currentTimeMillis() - start < delegate.getFactory().getTimeoutInMs()); delegate.appendLastMessage(" waiting lock timeout waiting for " + (System.currentTimeMillis() - start) + "ms"); return false; } @Override public void close() throws IOException { delegate.close(); } }