diff --git a/pom.xml b/pom.xml
index 2db4bc6b..abfadc09 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,16 @@
true
+
+ jklm.releases
+ http://mvn.jkeylockmanager.de
+
+ true
+
+
+ false
+
+
@@ -234,6 +244,11 @@
joda-time
2.2
+
+ de.jkeylockmanager
+ jkeylockmanager
+ 1.0.0
+
net.java.dev.rome
diff --git a/src/main/java/com/commafeed/backend/LockMap.java b/src/main/java/com/commafeed/backend/LockMap.java
deleted file mode 100644
index 4fef65c2..00000000
--- a/src/main/java/com/commafeed/backend/LockMap.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.commafeed.backend;
-
-import java.lang.ref.WeakReference;
-import java.util.WeakHashMap;
-
-// A map that creates and stores lock objects for arbitrary keys values.
-// Lock objects which are no longer referenced are automatically released during garbage collection.
-// Author: Christian d'Heureuse, www.source-code.biz
-// Based on IdMutexProvider by McDowell, http://illegalargumentexception.blogspot.ch/2008/04/java-synchronizing-on-transient-id.html
-// See also http://stackoverflow.com/questions/5639870/simple-java-name-based-locks
-public class LockMap {
-
- private WeakHashMap, WeakReference>> map;
-
- public LockMap() {
- map = new WeakHashMap, WeakReference>>();
- }
-
- // Returns a lock object for the specified key.
- public synchronized Object get(KEY key) {
- if (key == null) {
- throw new NullPointerException();
- }
- KeyWrapper newKeyWrapper = new KeyWrapper(key);
- WeakReference> ref = map.get(newKeyWrapper);
- KeyWrapper oldKeyWrapper = (ref == null) ? null : ref.get();
- if (oldKeyWrapper != null) {
- return oldKeyWrapper;
- }
- map.put(newKeyWrapper,
- new WeakReference>(newKeyWrapper));
- return newKeyWrapper;
- }
-
- // Returns the number of used entries in the map.
- public synchronized int size() {
- return map.size();
- }
-
- // KeyWrapper wraps a key value and is used in three ways:
- // - as the key for the internal WeakHashMap
- // - as the value for the internal WeakHashMap, additionally wrapped in a
- // WeakReference
- // - as the lock object associated to the key
- private static class KeyWrapper {
- private KEY key;
- private int hashCode;
-
- public KeyWrapper(KEY key) {
- this.key = key;
- hashCode = key.hashCode();
- }
-
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
- if (obj instanceof KeyWrapper) {
- return ((KeyWrapper>) obj).key.equals(key);
- }
- return false;
- }
-
- public int hashCode() {
- return hashCode;
- }
- }
-
-} // end class LockMap
\ No newline at end of file
diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java
index b93bddb4..7054e52e 100644
--- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java
+++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java
@@ -14,7 +14,6 @@ import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.commafeed.backend.LockMap;
import com.commafeed.backend.dao.FeedDAO;
import com.commafeed.backend.dao.FeedSubscriptionDAO;
import com.commafeed.backend.model.ApplicationSettings;
@@ -26,13 +25,17 @@ import com.commafeed.backend.pubsubhubbub.SubscriptionHandler;
import com.commafeed.backend.services.ApplicationSettingsService;
import com.commafeed.backend.services.FeedUpdateService;
+import de.jkeylockmanager.manager.KeyLockManager;
+import de.jkeylockmanager.manager.KeyLockManagers;
+import de.jkeylockmanager.manager.LockCallback;
+
@Singleton
public class FeedRefreshUpdater {
protected static Logger log = LoggerFactory
.getLogger(FeedRefreshUpdater.class);
- private static LockMap lockMap = new LockMap();
+ private static final KeyLockManager lockManager = KeyLockManagers.newLock();
@Inject
FeedUpdateService feedUpdateService;
@@ -107,11 +110,14 @@ public class FeedRefreshUpdater {
}
- private void updateEntry(Feed feed, FeedEntry entry,
- List subscriptions) {
- synchronized (lockMap.get(entry.getGuid())) {
- feedUpdateService.updateEntry(feed, entry, subscriptions);
- }
+ private void updateEntry(final Feed feed, final FeedEntry entry,
+ final List subscriptions) {
+ lockManager.executeLocked(entry.getGuid(), new LockCallback() {
+ @Override
+ public void doInLock() throws Exception {
+ feedUpdateService.updateEntry(feed, entry, subscriptions);
+ }
+ });
}
private void handlePubSub(final Feed feed) {
diff --git a/src/main/java/com/commafeed/backend/services/UserService.java b/src/main/java/com/commafeed/backend/services/UserService.java
index 56f32ede..502e7771 100644
--- a/src/main/java/com/commafeed/backend/services/UserService.java
+++ b/src/main/java/com/commafeed/backend/services/UserService.java
@@ -46,8 +46,9 @@ public class UserService {
PasswordEncryptionService encryptionService;
public User login(String name, String password) {
- Preconditions.checkNotNull(name);
- Preconditions.checkNotNull(password);
+ if (name == null || password == null) {
+ return null;
+ }
User user = userDAO.findByName(name);
if (user != null && !user.isDisabled()) {