private void processNextClientRequest() { QueueEntry qe = (QueueEntry) qClientRequests.poll(); if (qe != null) { EventSocket sock = qe.sock; String message = qe.message; boolean isAllowed = false; LockHolder lock = getLockForCommand(message); if (lock != null) { // if the lock exists check whether the user is allowed to use this command int[] privs = lock.getAllowedPrivileges(); for (int priv : privs) if (priv == sock.getPrivilege()) isAllowed = true; if (isAllowed) { if (lockHolder == null) { // if no lock is set we try to execute the command setLock(lock.setLockAction(message)); Debg.print("lock set and executed"); } else { // if a lock is already set the command might contain an abort message String cmd = Parser.getValue(message, NanoComm.COMMAND_CMD); String[] abortCmds = lockHolder.getAbortCommands(); boolean isAbortable = false; if (abortCmds != null) for (int i = 0; i < abortCmds.length; i++) { if (cmd.equals(abortCmds[i])) isAbortable = true; } if (isAbortable) { setLock(lockHolder.takeAbortActions("Overwriting command has been sent")); } else sock.sendClientInfo("Please be patient, the remote experiment is still busy"); } } else sock.sendClientInfo("Sorry, you are not allowed to use this command!"); } else Debg.print("No lock found for: " + message); } if (qClientRequests.size() > 10) { Debg.err( "I have been flooded by " + qClientRequests.size() + " client requests! I dropped everything except for the oldest one"); qe = (QueueEntry) qClientRequests.poll(); qClientRequests.clear(); qClientRequests.add(qe); } }
/** * Searches for the LockHolder associated with the value for the command tag. * * @param msg The string holding the command=value pair. * @return The LockHolder if the command exists, or null. */ public synchronized LockHolder getLockForCommand(String msg) { String cmd = Parser.getValue(msg, NanoComm.COMMAND_CMD); if (cmd != null) return commandLocks.get(cmd); else return null; }