@Override
  public void run() {
    Logger.debug((lock ? "Lock" : "Unlock") + " request received from " + from + " for " + key);
    boolean success = false;
    try {
      int localClock = LocalClock.get();
      if (senderClock > localClock) LocalClock.advance(senderClock);
      AbstractDistinguishable object =
          ((DTL2Directory) DirectoryManager.getManager()).getLocalObject(key);
      if (object != null) {
        if (!lock) {
          LockTable.unLock(object, null);
          Logger.debug("Remote Unlocked " + key);
          return;
        }

        LockTable.remoteLockResponse(object);
        Logger.debug("Remote Locked granted " + key);
        success = true;
      }
    } catch (TransactionException e) {
      Logger.debug("Remote Locked refused " + key);
    }
    try {
      CommunicationManager.getManager().send(from, new LockResponse(key, success, hashCode));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 public static void remoteUnlockRequest(GlobalObject key) {
   if (key == null) return;
   try {
     Logger.debug("Remote Lock release for " + key + " sent to " + key.getHome());
     CommunicationManager.getManager().send(key.getHome(), new LockRequest(key, false, 0));
   } catch (IOException e) {
     e.printStackTrace();
   }
 }
 public static void remoteLockRequest(AbstractContext context, GlobalObject key) {
   int hashCode = context.hashCode();
   pendingLocks.put(hashCode, context);
   synchronized (context) {
     try {
       Logger.debug(
           "Request remote lock for " + key + " hashcode is " + hashCode + " for " + context);
       CommunicationManager.getManager().send(key.getHome(), new LockRequest(key, true, hashCode));
       context.wait();
       Logger.debug("Request remote lock come back...");
     } catch (InterruptedException e) {
       e.printStackTrace();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
   pendingLocks.remove(hashCode);
 }