package mil.nga.giat.geowave.format.stanag4676.parser; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.UUID; import mil.nga.giat.geowave.format.stanag4676.parser.model.IDdata; import mil.nga.giat.geowave.format.stanag4676.parser.model.NATO4676Message; import mil.nga.giat.geowave.format.stanag4676.parser.model.TrackRun; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TrackFileReader implements TrackReader { private TrackDecoder decoder; private static final Logger LOGGER = LoggerFactory.getLogger(TrackFileReader.class); private boolean streaming = false; private ProcessMessage handler = null; private TrackRun run = new TrackRun(); private String filename; // init is called by spring AFTER the decoder has been set in the // track-services.xml public void init() { if (decoder instanceof NATO4676Decoder) { LOGGER.info("*** 4676 enabled " + this.getClass().toString() + " Initialized***"); } } @Override public void setDecoder( final TrackDecoder decoder ) { this.decoder = decoder; } @Override public void setStreaming( final boolean stream ) { streaming = stream; } @Override public void setHandler( final ProcessMessage handler ) { this.handler = handler; } @Override public void initialize( final String algorithm, final String algorithmVersion, final long runDate, final String comment, final boolean streaming ) { if (run == null) { run = new TrackRun(); } run.clearParameters(); run.clearMessages(); run.setAlgorithm(algorithm); run.setAlgorithmVersion(algorithmVersion); run.setRunDate(runDate); run.setComment(comment); } public void setFilename( final String filename ) { this.filename = filename; } public void read( final byte[] input ) { final InputStream bis = new ByteArrayInputStream( input); run.setUuid(new UUID( Arrays.hashCode(input), Arrays.hashCode(input))); run.setRunDate(System.currentTimeMillis()); run.setComment("ByteArray Input"); handler.initialize(run); read(bis); { try { bis.close(); } catch (final IOException e2) { LOGGER.error( "Unable to close the InputStream", e2); } } } @Override public void read() { FileInputStream fis = null; // Open the filename try { final File f = new File( filename); run.setUuid(UUID.randomUUID()); run.setRunDate(f.lastModified()); run.setComment("Track source is " + filename); run.setSourceFilename(filename); handler.initialize(run); fis = new FileInputStream( f); read(fis); } catch (final FileNotFoundException | NullPointerException | SecurityException e) { LOGGER.error( "Unable to create input stream", e); } finally { { try { // HP Fortify "Null Dereference" false positive // NullPointerException is caught below fis.close(); } catch (final IOException | NullPointerException e2) { LOGGER.error( "Unable to close the InputStream", e2); } } } } public void read( final InputStream is ) { decoder.initialize(); // make sure the track hash is clear if (run == null) { run = new TrackRun(); } final IDdata sender = new IDdata(); sender.setStationId("GeoWave"); sender.setNationality("US"); NATO4676Message msg = null; boolean finished = false; while (!finished) { msg = decoder.readNext(is); if (msg != null) { msg.setSenderID(sender); if (streaming) { try { handler.notify(msg); } catch (final IOException | InterruptedException ex) { LOGGER.warn( "Unable to process notify message", ex); } } else { run.addMessage(msg); } } else { finished = true; } } // NOTE: In Streaming mode, the run will be EMPTY handler.notify(run); } }