/** * send the message according to the rule * * @param message the message to send * @throws IOException */ void send(TimeStampedMessage message) throws IOException { /* if is the first time to send the message set up the socket for later use */ if (isFirstSetup) { setupCommunication(message); isFirstSetup = false; } /* check if the configuration file is edited */ File configFile = new File(configFileName); long modifiedTime = configFile.lastModified(); if (modifiedTime != fileEditTime) { parseYamlFile(configFileName); fileEditTime = modifiedTime; } /* increase the sequence number */ message.set_seqNum(seqNum++); int ruleState = parseRules(message, SEND_OPTION); /* update clock service */ // sedLock.lock(); // clkService.updateTimestamp(); TimeStampedMessage timeStampMsg = new TimeStampedMessage(message, null); setOriginTSMsg(message.getTimeStamp(), timeStampMsg.getTimeStamp()); // sedLock.unlock(); /* deal with the message according to the rule */ switch (ruleState) { case DROP: { System.out.print("DROP MESSAGE"); printALine(); System.out.println(timeStampMsg); printALine(); return; } case DELAY: { System.out.print("DELAY MESSAGE"); printALine(); System.out.println(timeStampMsg); printALine(); senderMsgQueue.add(new TimeStampedMessage(timeStampMsg)); return; } case DUPLICATE: { System.out.println("Duplicate Message Sent..."); TimeStampedMessage dupMsg = new TimeStampedMessage(timeStampMsg); /* set the duplicate field to true */ dupMsg.set_duplicate(true); sendMsg(dupMsg); } default: { sendMsg(timeStampMsg); /* clear the delay queue */ sedLock.lock(); clearSenderDelayQueue(); sedLock.unlock(); } } }