Author: tolusha
Date: 2009-11-09 02:13:07 -0500 (Mon, 09 Nov 2009)
New Revision: 499
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/LockCacheLoader.java
Log:
EXOJCR-205: LockManager refactored
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java
===================================================================
---
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java 2009-11-08
22:04:52 UTC (rev 498)
+++
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java 2009-11-09
07:13:07 UTC (rev 499)
@@ -709,8 +709,10 @@
* @param sessionId
* @param nodeIdentifier
* @throws LockException
+ *
+ * TODO: Changed from private to public. Need for LockCacheLoader.
*/
- private synchronized void internalUnLock(String sessionId, String nodeIdentifier)
throws LockException
+ public synchronized void internalUnLock(String sessionId, String nodeIdentifier)
throws LockException
{
LockData lData = locks.get(nodeIdentifier);
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/LockCacheLoader.java
===================================================================
---
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/LockCacheLoader.java 2009-11-08
22:04:52 UTC (rev 498)
+++
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/LockCacheLoader.java 2009-11-09
07:13:07 UTC (rev 499)
@@ -16,17 +16,25 @@
*/
package org.exoplatform.services.jcr.impl.storage.jbosscache;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.core.lock.LockManager;
import org.exoplatform.services.jcr.impl.core.lock.LockManagerImpl;
+import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
+import org.exoplatform.services.jcr.util.IdGenerator;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
import org.jboss.cache.CacheException;
import org.jboss.cache.Modification;
+import org.jboss.cache.Modification.ModificationType;
import java.util.ArrayList;
import java.util.List;
+import javax.jcr.lock.LockException;
+
/**
* Created by The eXo Platform SAS.
*
@@ -38,25 +46,33 @@
public class LockCacheLoader extends AbstractWriteOnlyCacheLoader
{
+ /**
+ * Lock manager.
+ */
private LockManagerImpl lockManager;
/**
+ * Logger.
+ */
+ private final Log log = ExoLogger.getLogger("jcr.LockCacheLoader");
+
+ /**
* {@inheritDoc}
*/
@Override
public void put(List<Modification> modifications) throws Exception
{
- LockChanges lockChanges = new LockChanges();
+ List<Modification> lockChanges = new ArrayList<Modification>();
for (Modification m : modifications)
{
- // TODO $properties
if (m.getFqn().hasElement(JBossCacheStorage.PROPS))
{
switch (m.getType())
{
case PUT_DATA :
break;
+
case PUT_KEY_VALUE :
if (m.getKey().equals(JBossCacheStorage.ITEM_DATA))
{
@@ -65,51 +81,124 @@
if (propertyName.equals(Constants.JCR_LOCKISDEEP) ||
propertyName.equals(Constants.JCR_LOCKOWNER))
{
+ lockChanges.add(m);
}
}
break;
+
case REMOVE_DATA :
break;
+
case REMOVE_KEY_VALUE :
+ PropertyData propertyData = (PropertyData)m.getValue();
+ InternalQName propertyName = propertyData.getQPath().getName();
+
+ if (propertyName.equals(Constants.JCR_LOCKISDEEP) ||
propertyName.equals(Constants.JCR_LOCKOWNER))
+ {
+ lockChanges.add(m);
+ }
break;
+
case REMOVE_NODE :
break;
+
case MOVE :
break;
+
default :
throw new CacheException("Unknown modification " +
m.getType());
}
}
+
+ if (lockChanges.size() == 2)
+ {
+ if (lockChanges.get(0).getType() == ModificationType.PUT_KEY_VALUE
+ && lockChanges.get(1).getType() ==
ModificationType.PUT_KEY_VALUE)
+ {
+ performLock(lockChanges);
+ }
+ else if (lockChanges.get(0).getType() == ModificationType.REMOVE_KEY_VALUE
+ && lockChanges.get(1).getType() ==
ModificationType.REMOVE_KEY_VALUE)
+ {
+ performUnLock(lockChanges);
+ }
+ else
+ {
+
+ }
+ }
+
+ lockChanges = new ArrayList<Modification>();
}
+
+ if (lockChanges.size() != 0)
+ {
+ log.error("Incorrect changes log size for lock or unlock
operation");
+ }
}
- private void processLock()
+ /**
+ * Perform lock operation.
+ *
+ * @param lockChanges
+ * @throws LockException
+ */
+ private void performLock(List<Modification> lockChanges) throws Exception
{
- // String nodeIdentifier = data.getParentIdentifier();
- // if (lockManager.hasPendingLocks(nodeIdentifier))
- // {
- // lockManager.internalLock(nodeIdentifier);
- // }
- // else
- // {
- //
- // }
+ String nodeIdentifier =
((PropertyData)lockChanges.get(0).getValue()).getParentIdentifier();
+
+ if (lockManager.hasPendingLocks(nodeIdentifier))
+ {
+ lockManager.internalLock(nodeIdentifier);
+ }
+ else
+ {
+ log.warn("No lock in pendingLocks for identifier " + nodeIdentifier +
" Probably lock come from replication.");
+
+ String lockToken = IdGenerator.generate();
+ Modification ownerModification = getModification(lockChanges,
Constants.JCR_LOCKOWNER);
+ Modification isDeepModification = getModification(lockChanges,
Constants.JCR_LOCKISDEEP);
+
+ if (ownerModification != null && isDeepModification != null)
+ {
+
+ String owner =
+ new
String(((((TransientPropertyData)(ownerModification.getValue())).getValues()).get(0))
+ .getAsByteArray(), Constants.DEFAULT_ENCODING);
+
+ boolean isDeep =
+ Boolean.valueOf(
+ new
String(((((TransientPropertyData)(isDeepModification.getValue())).getValues()).get(0))
+ .getAsByteArray(), Constants.DEFAULT_ENCODING)).booleanValue();
+
+ // TODO sessionId
+ lockManager.createRemoteLock("sessionId", nodeIdentifier,
lockToken, isDeep, false, owner);
+ }
+ }
}
- private void processUnLock()
+ private void performUnLock(List<Modification> lockChanges) throws Exception
{
-
+ // TODO sessionId
+ // TODO nodeIdentifier
+ lockManager.internalUnLock("sessionId", "nodeIdentifier");
}
/**
+ * Search item with name <code>itemName<code> in modification list
*
+ * @param changes
+ * @param itemName
+ * @return Item
*/
- private class LockChanges
+ private Modification getModification(List<Modification> changes, InternalQName
itemName)
{
- PropertyData lockIsDeepData;
-
- PropertyData lockOwnerData;
-
+ for (Modification m : changes)
+ {
+ if
(((PropertyData)changes.get(0).getValue()).getQPath().getName().equals(itemName))
+ return m;
+ }
+ return null;
}
}
Show replies by date