--- /dev/null
+/*******************************************************************************
+ * Copyright © Igor Barma, Alexandre Desoubeaux, Christian Martel, Eric Brun, Mathieu Amblard, Gwenael Gevet, Pierre Guillot, 2012
+ *
+ * This file is part of the work and learning management system Pentila Nero.
+ *
+ * Pentila Nero is free software. You can redistribute it and/or modify since
+ * you respect the terms of either (at least one of the both license) :
+ * - under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ * - the CeCILL-C as published by CeCILL-C; either version 1 of the
+ * License, or any later version
+ * - the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the license,
+ * or (at your option) any later version.
+ *
+ * There are special exceptions to the terms and conditions of the
+ * licenses as they are applied to this software. View the full text of
+ * the exception in file LICENSE-PROJECT.txt in the directory of this software
+ * distribution.
+ *
+ * Pentila Nero is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Licenses for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and the CeCILL-C and the GNU Lesser General Public License along with
+ * Pentila Nero. If not, see :
+ * <http://www.gnu.org/licenses/> and
+ * <http://www.cecill.info/licences.fr.html>.
+ ******************************************************************************/
+/**
+ * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ */
+
+package com.pentila.entSavoie.mail.util;
+
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.util.StringPool;
+import com.liferay.portal.kernel.util.Time;
+import com.pentila.entSavoie.kernel.util.StringBundler;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author Scott Lee
+ * @author Alexander Chow
+ */
+public class AccountLock {
+
+ public static boolean acquireLock(String key) {
+ synchronized (key) {
+ long nowTime = System.currentTimeMillis();
+
+ if (_locks.containsKey(key)) {
+ long timeLocked = _locks.get(key);
+ long expireTime = timeLocked + _EXPIRY_TIME;
+
+ if (nowTime < expireTime) {
+ if (_log.isDebugEnabled()) {
+ _log.debug("Lock has not expired for " + key);
+ }
+
+ return false;
+ }
+ }
+
+ _locks.put(key, nowTime);
+ }
+
+ return true;
+ }
+
+ public static String getKey(long userId, long accountEntryId) {
+ StringBundler sb = new StringBundler(7);
+
+ sb.append(userId);
+ sb.append(StringPool.UNDERLINE);
+ sb.append(accountEntryId);
+
+ return sb.toString();
+ }
+
+ public static void releaseLock(String key) {
+ synchronized (key) {
+ _locks.remove(key);
+ }
+ }
+
+ private static final long _EXPIRY_TIME = Time.MINUTE * 15;
+
+ private static Log _log = LogFactoryUtil.getLog(AccountLock.class);
+
+ private static ConcurrentHashMap<String, Long> _locks =
+ new ConcurrentHashMap<String, Long>();
+
+}