/* * Copyright (C) 2009 eXo Platform SAS. * * This 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 software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.impl.core.lock; import java.util.HashSet; import java.util.Set; /** * Created by The eXo Platform SAS. * * @author <a href="mailto:gennady.azarenkov@exoplatform.com">Gennady Azarenkov</a> * @version $Id: LockData.java 11907 2008-03-13 15:36:21Z ksm $ */ public class LockData { /** * The time of birth. From this time we start count the time of death. death = birthday+TIME_OUT; */ private long birthday; /** * If isDeep is true then the lock applies to this node and all its descendant nodes; if false, * the lock applies only to this, the holding node. */ private final boolean deep; /** * */ private boolean live; /** * List of session id's which holds a lock tokens. */ private final Set<String> lockHolders = new HashSet<String>(); /** * A lock token is a string that uniquely identifies a particular lock and acts as a “key” * allowing a user to alter a locked node. */ private String lockToken; /** * Identifier of locked node. */ private String nodeIdentifier; /** * The owner of the locked node. */ private String owner; /** * If isSessionScoped is true then this lock will expire upon the expiration of the current * session (either through an automatic or explicit Session.logout); if false, this lock does not * expire until explicitly unlocked or automatically unlocked due to a implementation-specific * limitation, such as a timeout. */ private final boolean sessionScoped; /** * <B>8.4.9 Timing Out</B> An implementation may unlock any lock at any time due to * implementation-specific criteria, such as time limits on locks. */ private long timeOut; /** * @param nodeIdentifier * @param lockToken * @param deep * @param sessionScoped * @param owner * @param timeOut */ public LockData(String nodeIdentifier, String lockToken, boolean deep, boolean sessionScoped, String owner, long timeOut) { this.nodeIdentifier = nodeIdentifier; this.lockToken = lockToken; this.deep = deep; this.sessionScoped = sessionScoped; this.owner = owner; this.timeOut = timeOut; this.live = true; this.birthday = System.currentTimeMillis(); } /** * @param sessionId * @return */ public boolean addLockHolder(String sessionId) { return lockHolders.add(sessionId); } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (super.equals(obj)) { return true; } if (obj instanceof LockData) { return hashCode() == obj.hashCode(); } return false; } public int getLockHolderSize() { return lockHolders.size(); } public String getLockToken(String sessionId) { if (isLockHolder(sessionId)) { return lockToken; } return null; } /** * @return the nodeIdentifier */ public String getNodeIdentifier() { return nodeIdentifier; } /** * @return */ public String getOwner() { return owner; } /** * @return The time to death in millis */ public long getTimeToDeath() { return birthday + timeOut - System.currentTimeMillis(); } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return super.hashCode() + lockToken.hashCode(); } public boolean isDeep() { return deep; } /** * @return the live */ public boolean isLive() { return live; } /** * @param sessionId * @return */ public boolean isLockHolder(String sessionId) { return lockHolders.contains(sessionId); } /** * @return */ public boolean isSessionScoped() { return sessionScoped; } /** * */ public void refresh() { birthday = System.currentTimeMillis(); } /** * @param sessionId * @return */ public boolean removeLockHolder(String sessionId) { return lockHolders.remove(sessionId); } /** * @param live * live to set */ public void setLive(boolean live) { this.live = live; } /** * @param lockToken */ public void setLockToken(String lockToken) { this.lockToken = lockToken; } /** * @param nodeIdentifier * the nodeIdentifier to set */ public void setNodeIdentifier(String nodeIdentifier) { this.nodeIdentifier = nodeIdentifier; } /** * @param owner */ public void setOwner(String owner) { this.owner = owner; } /** * @return */ protected long getTimeOut() { return timeOut; } /** * @param timeOut */ protected void setTimeOut(long timeOut) { this.timeOut = timeOut; } }