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; /** * ParamicsCameraStatusReader extends from the Abstract ParamicsReader to * provide the methods necessary to read the Paramics Camrea Status file. * The receive() method is overloaded to parse the XML node for camrea status * information. The ParamicsSimulationManager is notified after each * successful parse of a camera status update. * * @author Matthew Cechini (mcechini@calpoly.edu) * @version $Date: 2006/06/06 20:46:40 $ $Revision: 1.4 $ */ public class ParamicsCameraStatusReader extends ParamicsReader { /** * Reference to the ParamicsSimulationManager used to send notifications * of camera status changes. */ private ParamicsSimulationManager paramicsSimMgr; /** A SAX Handler that is used to parse received Camera Status Node. */ protected CameraStatusHandler csh = null; /** * Constructor. * * @param theParamSimMgr The ParamicsSimulationManager object. */ public ParamicsCameraStatusReader(ParamicsSimulationManager theParamSimMgr) { paramicsSimMgr = theParamSimMgr; csh = new CameraStatusHandler(); } /** * This method parses the received XML node with the local CameraStatusHandler. * All updated camera information 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()), csh); } } catch (Exception e) { paramLogger.logp(Level.SEVERE, "ParamicsCameraStatusReader", "receive", "Exception in parsing received ParamicsCommMessage.", e); paramLogger.logp(Level.INFO, "ParamicsCameraStatusReader", "receive", "Invalid received bytes", rxMessage.getTextContent().getBytes()); } } /** * Internal SAX Handler used to parse the Camera Status Document read by * the remote Status Reader. The schema for this document is:
* *
*
*
*
*
*
*
*
*

*

*/ protected class CameraStatusHandler extends DefaultHandler { private final String CAMERA = "Camera"; private final String CAMERA_ID = "Identifier"; private final String ROUTE = "Route"; private final String DIRECTION = "Direction"; private final String POSTMILE = "Postmile"; private final String AVG_SPEED_NE = "Ave_Speed_NE"; private final String AVG_SPEED_SW = "Ave_Speed_SW"; private StringBuffer parsedValue = new StringBuffer(); Integer cameraID = new Integer(-1); String route = ""; String direction = ""; float postmile = 0.0f; float avgSpeed_NE = 0.0f; float avgSpeed_SW = 0.0f; 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(CAMERA_ID)) { cameraID = Integer.parseInt(parsedValue.toString()); } else if(qName.equals(ROUTE)) { route = parsedValue.toString(); } else if(qName.equals(DIRECTION)) { direction = parsedValue.toString(); } else if(qName.equals(POSTMILE)) { postmile = Float.parseFloat(parsedValue.toString()); } else if(qName.equals(AVG_SPEED_NE)) { avgSpeed_NE = Float.parseFloat(parsedValue.toString()); } else if(qName.equals(AVG_SPEED_SW)) { avgSpeed_SW = Float.parseFloat(parsedValue.toString()); } else if(qName.equals(CAMERA)) { paramicsSimMgr.updateCameraInfo(cameraID, avgSpeed_NE, avgSpeed_SW); } parsedValue.setLength(0); } public void error(SAXParseException e) { paramLogger.logp(Level.SEVERE, "ParamicsCameraStatusReader:CameraStatusHandler", "error", "Error in parsing received ParamicsCommMessage.", e); } public void fatalError(SAXParseException e) { paramLogger.logp(Level.SEVERE, "ParamicsCameraStatusReader:CameraStatusHandler", "error", "Fatal error in parsing received ParamicsCommMessage.", e); } public void warning(SAXParseException e) { paramLogger.logp(Level.WARNING, "ParamicsCameraStatusReader:CameraStatusHandler", "error", "Warning in parsing received ParamicsCommMessage.", e); } } }