package org.opennaas.extensions.roadm.wonesys.protocols.listeners; import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.concurrent.CountDownLatch; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.opennaas.extensions.roadm.wonesys.transports.ITransportListener; import org.opennaas.extensions.roadm.wonesys.transports.rawsocket.RawSocketTransport; import org.osgi.service.event.Event; /** * * @author isart * */ public class CommandResponseListener implements ITransportListener { private final static Log log = LogFactory.getLog(CommandResponseListener.class); private final CountDownLatch latch = new CountDownLatch(1); private final String commandId; private String response; public CommandResponseListener(String sentMessage) { commandId = getCommandId(sentMessage); } private String getCommandId(String command) { return command.substring(12, 16); } /** * Command layout: Header (2B) | DeviceID (2B) | Reserved (2B) | CommandID (2B) | Reserved (4B) | DataLength (2B) | Data | XOR (1B) | EOS (1B) * * @param response * @return */ private boolean isCommand(String response) { return response.startsWith("5910") && response.substring(8, 12).equalsIgnoreCase("ffff") && response.substring(16, 24).equalsIgnoreCase( "ffffffff"); } /** * Errors are commands with CommandID's first byte = 0x0C * * @param response * @return */ private boolean isError(String response) { return getCommandId(response).substring(0, 2).equalsIgnoreCase("0c"); } @Override public void handleEvent(Event event) { if (event.getTopic().equals(RawSocketTransport.MSG_RCVD_EVENT_TOPIC)) { String message = (String) event.getProperty(RawSocketTransport.MESSAGE_PROPERTY_NAME); if (message != null) { log.info("CommandResponseListener received a message: " + message); // check message is a response to sentMessage if (isCommand(message)) { // FIXME assuming error is a response to the command we are waiting for (not to any other) if (getCommandId(message).equalsIgnoreCase(commandId) || isError(message)) { log.info("Response received: " + message); response = message; latch.countDown(); } } } } } public String getResponse(long timeout) throws InterruptedException { latch.await(timeout, MILLISECONDS); return (response == null) ? null : response.toString(); } }