package org.jfrog.wharf.ivy.lock; import org.apache.ivy.core.settings.IvySettings; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * Date: 9/15/11 * Time: 5:09 PM * * @author Fred Simon */ public abstract class AbstractLockHolderFactory implements LockHolderFactory { private static final String LOCK_FILE_SUFFIX = ".lck"; private static final long DEFAULT_SLEEP_TIME = 400; private static final long DEFAULT_TIMEOUT = 15 * 1000; // Lock holder per Ivy settings private final ConcurrentMap<String, LockHolder> locks = new ConcurrentHashMap<String, LockHolder>(); private long sleepTimeInMs; private long timeoutInMs; private LockLogger logger; public AbstractLockHolderFactory() { sleepTimeInMs = DEFAULT_SLEEP_TIME; timeoutInMs = DEFAULT_TIMEOUT; logger = new LockLoggerImpl(null); } @Override public void setSettings(IvySettings settings) { logger = new LockLoggerImpl(settings); } @Override public LockLogger getLogger() { return logger; } @Override public String getLockFileSuffix() { return LOCK_FILE_SUFFIX; } @Override public long getTimeoutInMs() { return timeoutInMs; } @Override public long getSleepTimeInMs() { return sleepTimeInMs; } public void setSleepTimeInMs(long sleepTimeInMs) { this.sleepTimeInMs = sleepTimeInMs; } public void setTimeoutInMs(long timeoutInMs) { this.timeoutInMs = timeoutInMs; } public void setLogger(LockLogger logger) { this.logger = logger; } @Override public void close() throws IOException { try { for (LockHolder lockHolder : locks.values()) { if (lockHolder instanceof Closeable) { ((Closeable) lockHolder).close(); } } } finally { locks.clear(); } } @Override public LockHolder getOrCreateLockHolder(File protectedFile) { String path = protectedFile.getAbsolutePath(); LockHolder lockHolder = locks.get(path); if (lockHolder == null) { lockHolder = createLockHolder(protectedFile); LockHolder oldLockHolder = locks.putIfAbsent(path, lockHolder); if (oldLockHolder != null) { // Ignore the one created always take the old one lockHolder = oldLockHolder; } } return lockHolder; } @Override public LockHolder getLockHolder(File protectedFile) { return locks.get(protectedFile.getAbsolutePath()); } protected abstract LockHolder createLockHolder(File protectedFile); }