if (logger.isDebugEnabled()) logger.debug(nsr.toString());
    private boolean propagatePermissions(RequestRecord rr) {        if (logger.isDebugEnabled()) logger.debug("Starting propagateChange() for: " + rr.getNodeID().toString());        DisconnectDefenseAgentEnabler enabler = DisconnectDefenseAgentEnabler.findOnBlackboard(rr.getNodeID().getType().toString(), rr.getNodeID().getName().toString(), blackboard);        if (enabler == null) {            logger.warn("could not find Enabler for" + rr.dump());            return false;        }        else { // propagate the permission            String request = rr.getRequest();            AssetID nodeID = rr.getNodeID();            Action.CompletionCode completionCode;            String enablerValue;            String finalState;            if (request.equals(ALLOW_DISCONNECT)) {                completionCode = Action.ACTIVE;                enablerValue = "ENABLED";                finalState = DISCONNECTED;            }            else {                completionCode = Action.COMPLETED;                enablerValue = "DISABLED";                finalState = CONNECTED;                cancelOverdueAlarm_Returned(nodeID);            }            // persist the knowledge Disconnect status change            try {                NodeStatusRecord nsr = new NodeStatusRecord(nodeID, rr.getAgentVector(), rr.getReconnectTime(), finalState);                nodeStatus.put(nodeID, nsr);                blackboard.persistNow();            }            catch (org.cougaar.core.persist.PersistenceNotEnabledException e)            {                logger.error(e.toString());            }            // tell the Node it can do what it requested            enabler.setValue(enablerValue);            blackboard.publishChange(enabler);            if (logger.isDebugEnabled()) logger.debug("Sent back to Node: " + enabler.toString());            // tell the Coord that all Actions have started & completed            Iterator iter = rr.getOriginalActions().iterator();            while (iter.hasNext()) {                DisconnectAction action = (DisconnectAction)iter.next();                try {                    action.start(request);                    action.stop(completionCode);                    action.setValuesOffered(NULL_SET); // remove offers - this has the added effect that the action will be considered by the Coord to be irrecocable                    if (logger.isDebugEnabled()) logger.debug("Setting Action: " +  action.dump());                    blackboard.publishChange(action);                } catch (IllegalValueException e) {                    logger.error("Attempt to start: "+action.dump()+" with illegal value "+e.toString());                    return false;                } catch (NoStartedActionException e) {                    logger.error("Attempt to stop: "+action.dump()+" with illegal value "+e.toString());                    return false;                }            }            // tell the Coord the new Diagnosis states            iter = rr.getOriginalDiagnoses().iterator();            while (iter.hasNext()) {                Diagnosis thisDiagnosis = (Diagnosis)iter.next();                try {                    thisDiagnosis.setValue(finalState);                    blackboard.publishChange(thisDiagnosis);                } catch (IllegalValueException e) {                    logger.error("Attempt to set: "+thisDiagnosis.toString()+" with illegal value "+e.toString());                    return false;                }            }            return true;        }    }