package tmcsim.cadsimulator.paramicscontrol;
import java.io.ByteArrayInputStream;
import java.util.logging.Level;
import javax.xml.parsers.SAXParserFactory;
import org.w3c.dom.Node;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import tmcsim.cadsimulator.managers.ParamicsSimulationManager;
import tmcsim.common.CADEnums.PARAMICS_STATUS;
/**
* ParamicsStatusReader extends from the Abstrct ParamicsReader to provide
* the methods necessary to read the Paramics Status file. The receive()
* method is overloaded to parse the XML node for status information.
* The ParamicsSimulationManager is notified after each successful parse
* of a Paramics Status Node.
*
* @author Matthew Cechini
* @version
*/
public class ParamicsStatusReader extends ParamicsReader {
/** Current Paramics Status. */
protected PARAMICS_STATUS currentStatus;
/** Current Network ID that has been loaded. */
protected int currentNetwork;
/**
* Reference to the ParamicsSimulationManager used to send notifications
* of Paramics status changes.
*/
protected ParamicsSimulationManager paramicsSimMgr = null;
/** SAX Handler that is used to parse the recieved Paramics Status Node. */
protected ParamicsStatusHandler psh = null;
/**
* Constructor. Initialize Paramics Status to UNKNOWN and network loaded to -1.
*
* @param theParamSimMgr The ParamicsSimulationManager object.
*/
public ParamicsStatusReader(ParamicsSimulationManager theParamSimMgr) {
paramicsSimMgr = theParamSimMgr;
psh = new ParamicsStatusHandler();
currentStatus = PARAMICS_STATUS.UNKNOWN;
currentNetwork = -1;
}
/** Get the current paramics status */
public PARAMICS_STATUS getStatus() { return currentStatus; }
/** Get the ID of the current paramics network. (Default: -1) */
public int getNetworkID() { return currentNetwork; }
/**
* Reset the Paramics Status info. The currentStatus will be set to UNKNOWN
* and the currentNetwork set to -1.
*/
public void resetStatusInfo() {
currentStatus = PARAMICS_STATUS.UNKNOWN;
currentNetwork = -1;
}
/**
* This method parses the received XML Node with the local
* ParamicsStatusHandler. The parsed Paramics Status is sent to the
* ParamicsSimulationManager.
*/
public void receive(Node rxMessage) {
try {
if(rxMessage.getTextContent().length() > 0)
SAXParserFactory.newInstance().newSAXParser().parse(
new ByteArrayInputStream(rxMessage.getTextContent().getBytes()), psh);
}
catch (Exception e) {
paramLogger.logp(Level.SEVERE, "ParamicsStatusReader", "receive",
"Exception in parsing received ParamicsCommMessage.", e);
paramLogger.logp(Level.INFO, "ParamicsStatusReader", "receive",
"Invalid received bytes", rxMessage.getTextContent().getBytes());
}
paramicsSimMgr.updateParamicsStatus(currentStatus);
}
/**
* Internal SAX Handler used to parse the Camera Status Document read by
* the remote Status Reader. The schema for this document is:
*
*
* ("LOADING", "WARMING", or "LOADED")
* (integer network ID)
*
*/
protected class ParamicsStatusHandler extends DefaultHandler {
/** String XML creation. Tag contains information for the paramics status. */
private final String NETWORK_STATUS = "Network_Status";
/** String XML creation. Tag contains information for the loaded paramics network id. */
private final String NETWORK_ID = "Network_ID";
private StringBuffer parsedValue = new StringBuffer();
public void startDocument() {
}
public void characters(char[] ch, int start, int length) {
parsedValue.append(new String(ch, start, length).trim());
}
public void endElement(String uri, String localName, String qName) {
if(qName.equals(NETWORK_STATUS)) {
currentStatus = PARAMICS_STATUS.UNKNOWN;
for(PARAMICS_STATUS val : PARAMICS_STATUS.values()) {
if(val.toString().equals(parsedValue.toString()))
currentStatus = val;
}
}
else if(qName.equals(NETWORK_ID)) {
currentNetwork = Integer.parseInt(parsedValue.toString());
}
parsedValue.setLength(0);
}
public void error(SAXParseException e) {
paramLogger.logp(Level.SEVERE, "ParamicsStatusReader:ParamicsStatusHandler",
"error", "Error in parsing received ParamicsCommMessage.", e);
}
public void fatalError(SAXParseException e) {
paramLogger.logp(Level.SEVERE, "ParamicsStatusReader:ParamicsStatusHandler",
"error", "Fatal error in parsing received ParamicsCommMessage.", e);
}
public void warning(SAXParseException e) {
paramLogger.logp(Level.WARNING, "ParamicsStatusReader:ParamicsStatusHandler",
"error", "Warning in parsing received ParamicsCommMessage.", e);
}
}
}