Author: tchemit Date: 2014-01-30 11:56:59 +0100 (Thu, 30 Jan 2014) New Revision: 1541 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1541 Log: refs #3875 (review API) Modified: trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderEvent.java trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderListener.java trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecord.java trunk/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecordTest.java Modified: trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java =================================================================== --- trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java 2014-01-30 09:33:35 UTC (rev 1540) +++ trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java 2014-01-30 10:56:59 UTC (rev 1541) @@ -49,40 +49,25 @@ /** Logger. */ private static final Log log = LogFactory.getLog(FeedReader.class); + /** + * Ichtyometer client given in the {@code start} method. + */ protected IchtyometerClient client; + /** + * Reader runnable code (to be used in a thread). + */ protected ReadingRunnable readingRunnable; -// protected StreamConnection connection; - + /** + * To keep list of {@link FeedReaderListener} listeners. + */ protected final EventListenerList listenerList; public FeedReader() { listenerList = new EventListenerList(); } - public void addFeedModeReaderListener(FeedReaderListener listener) { - listenerList.add(FeedReaderListener.class, listener); - } - - public void removeFeedModeReaderListener(FeedReaderListener listener) { - listenerList.remove(FeedReaderListener.class, listener); - } - - public boolean containsFeedModeReaderListener(FeedReaderListener listener) { - boolean result = false; - FeedReaderListener[] existingListeners = listenerList.getListeners(FeedReaderListener.class); - if (existingListeners != null) { - for (FeedReaderListener existingListener : existingListeners) { - if (listener == existingListener) { - result = true; - break; - } - } - } - return result; - } - public void start(IchtyometerClient client) throws IOException { Preconditions.checkNotNull(client, "client can not be null"); @@ -94,19 +79,13 @@ // get input stream DataInputStream dataInputStream = connection.openDataInputStream(); - if (log.isDebugEnabled()) { - log.debug("Open data stream: " + dataInputStream); - } - // start a reading stream + // create the reader runnable readingRunnable = new ReadingRunnable(dataInputStream); -// Thread readingThread = new Thread(readingRunnable); - + // start the reader thread new Thread(readingRunnable).start(); -// waitLock(); - if (log.isDebugEnabled()) { log.debug("Ready to read remote device..."); } @@ -119,7 +98,7 @@ Preconditions.checkState(client.isOpen(), "client must be opened"); try { - readingRunnable.setStop(true); + readingRunnable.stop(); } finally { @@ -131,137 +110,67 @@ return client.getName(); } -// protected void waitLock() throws IOException { -// synchronized (readingRunnable.lock) { -// try { -// readingRunnable.lock.wait(); -// } catch (InterruptedException e) { -// throw new IOException("Could not wait..."); -// } -// } -// } + public void addFeedModeReaderListener(FeedReaderListener listener) { + listenerList.add(FeedReaderListener.class, listener); + } - protected void fireRecordRead(FeedReaderEvent e) { - for (FeedReaderListener listener : listenerList.getListeners(FeedReaderListener.class)) { - listener.recordRead(e); - } + public void removeFeedModeReaderListener(FeedReaderListener listener) { + listenerList.remove(FeedReaderListener.class, listener); } protected class ReadingRunnable implements Runnable { + /** + * Input stream to read new record. + */ protected final DataInputStream dataInputStream; -// protected final Object lock = new Object(); - + /** + * Flag to stop the runnable. + */ protected boolean stop; - public void setStop(boolean stop) { - this.stop = stop; + protected ReadingRunnable(DataInputStream dataInputStream) { + this.dataInputStream = dataInputStream; } - public ReadingRunnable(DataInputStream dataInputStream) { - this.dataInputStream = dataInputStream; + protected void stop() { + this.stop = true; } @Override public void run() { -// try { - if (log.isDebugEnabled()) { - log.debug("Starting... " + this); + if (log.isInfoEnabled()) { + log.info("Reader thread start... " + this); } -// DataInputStream dataInputStream = connection.openDataInputStream(); - -// if (log.isDebugEnabled()) { -// log.debug("Open data stream: " + dataInputStream); -// } -// -// notifyOthers(); - while (!stop) { -// String result = ""; -// -// // wait until got two \r -// -// int nbR = 0; -// -// String record = null; -// String crc = null; -// while (nbR != 2) { -// -// if (stop) { -// break; -// } -// while (dataInputStream.available() > 0) { -// if (stop) { -// break; -// } -// int c = dataInputStream.read(); -// -// if (c == '\r') { -// -// nbR++; -// if (nbR == 1) { -// record = result; -// if (log.isDebugEnabled()) { -// log.debug("Get record: " + record); -// } -// result = ""; -// } else if (nbR == 2) { -// crc = result; -// if (log.isDebugEnabled()) { -// log.debug("Get crc: " + crc); -// } -// } -// } else { -// -// result += (char) c; -// } -// } -// } -// -// if (stop) { -// break; -// } -// if (log.isDebugEnabled()) { -// log.debug(String.format("Record: %s / %s", record, crc)); -// } - - try { + // get a new record FeedReaderRecord readerRecord = readRecord(dataInputStream); if (!stop) { + + // send new record to listeners FeedReaderEvent e = new FeedReaderEvent(FeedReader.this, readerRecord); - fireRecordRead(e); + for (FeedReaderListener listener : listenerList.getListeners(FeedReaderListener.class)) { + listener.recordRead(e); + } } } catch (IOException e) { if (log.isErrorEnabled()) { log.error("Could not read record", e); } } - - } if (log.isInfoEnabled()) { log.info("Reader thread stop..." + this); } - -// } catch (IOException e) { -// if (log.isErrorEnabled()) { -// log.error("Reading error", e); -// } -// } finally { -// -// notifyOthers(); -// } - } - protected FeedReaderRecord readRecord(DataInputStream dataInputStream) throws IOException { String result = ""; @@ -315,11 +224,5 @@ } return readerRecord; } - -// protected void notifyOthers() { -// synchronized (lock) { -// lock.notifyAll(); -// } -// } } } Modified: trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderEvent.java =================================================================== --- trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderEvent.java 2014-01-30 09:33:35 UTC (rev 1540) +++ trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderEvent.java 2014-01-30 10:56:59 UTC (rev 1541) @@ -36,12 +36,8 @@ private static final long serialVersionUID = 1L; - protected FeedReaderRecord record; + protected final FeedReaderRecord record; - public FeedReaderEvent(FeedReader source) { - this(source, null); - } - public FeedReaderEvent(FeedReader source, FeedReaderRecord record) { super(source); this.record = record; Modified: trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderListener.java =================================================================== --- trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderListener.java 2014-01-30 09:33:35 UTC (rev 1540) +++ trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderListener.java 2014-01-30 10:56:59 UTC (rev 1541) @@ -27,7 +27,7 @@ import java.util.EventListener; /** - * To listen records from the ichtyometer. + * To listen new read records from the ichtyometer. * <p/> * Created on 1/24/14. * @@ -36,6 +36,11 @@ */ public interface FeedReaderListener extends EventListener { + /** + * When a new record was read. + * + * @param event event containing the new read record + */ void recordRead(FeedReaderEvent event); } Modified: trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecord.java =================================================================== --- trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecord.java 2014-01-30 09:33:35 UTC (rev 1540) +++ trunk/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecord.java 2014-01-30 10:56:59 UTC (rev 1541) @@ -41,18 +41,74 @@ /** Logger. */ private static final Log log = LogFactory.getLog(FeedReaderRecord.class); + /** + * Incoming raw record. + */ protected final String record; + /** + * Incoming crc. + */ protected final String crc; + /** + * Our computed crc. + */ protected final String computedCrc; + /** + * Extracted length (the first data of the record). + */ protected final Float length; - protected boolean valid; + /** + * Computed valid flag (if crc == computedCrc and length != null). + */ + protected final boolean valid; - public static String computeCRC(String record) { + public FeedReaderRecord(String record, String crc) { + this.record = record; + this.crc = crc; + this.computedCrc = computeCRC(record); + this.length = computeLength(record); + //FIXME Uncomment when computedCrc will be ok + this.valid = length != null; /*&& crc.equals(computedCrc);*/ + } + + public boolean isValid() { + return valid; + } + + public String getRecord() { + return record; + } + + public String getCrc() { + return crc; + } + + public String getComputedCrc() { + return computedCrc; + } + + public Float getLength() { + return length; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("record", record) + .append("crc", crc) + .append("computedCrc", computedCrc) + .append("valid", valid) + .append("length", length) + .toString(); + } + + protected String computeCRC(String record) { + // use long because int are signed and add doesn't work correctly long checksum = 0; @@ -88,11 +144,7 @@ return hex; } - public FeedReaderRecord(String record, String crc) { - this.record = record; - this.crc = crc; - this.computedCrc = computeCRC(record); - + protected Float computeLength(String record) { Float length; try { String[] cells = record.split("\\s*,\\s*"); @@ -103,47 +155,13 @@ // remove any starting 0 lengthCell = lengthCell.replaceAll("^0*", ""); - length = Float.valueOf(lengthCell) / 10; + length = Float.valueOf(lengthCell); } catch (Exception e) { if (log.isErrorEnabled()) { log.error("Could not get length from " + record, e); } length = null; } - this.length = length; - - //FIXME Uncomment when computedCrc will be ok - this.valid = length != null; /*&& crc.equals(computedCrc);*/ - } - - public boolean isValid() { - return valid; - } - - public String getRecord() { - return record; - } - - public String getCrc() { - return crc; - } - - public String getComputedCrc() { - return computedCrc; - } - - public Float getLength() { return length; } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("record", record) - .append("crc", crc) - .append("computedCrc", computedCrc) - .append("valid", valid) - .append("length", length) - .toString(); - } } Modified: trunk/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecordTest.java =================================================================== --- trunk/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecordTest.java 2014-01-30 09:33:35 UTC (rev 1540) +++ trunk/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecordTest.java 2014-01-30 10:56:59 UTC (rev 1541) @@ -45,38 +45,27 @@ @Test public void testComputeCRC() throws Exception { - computeCRC(" 00135, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AAC6340B"); - computeCRC(" 00158, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AAFE340B"); - computeCRC("00513, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AB16340B"); - computeCRC("00636, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AB6E340B"); - computeCRC("00047, 000000,5,AEG,56,,10/30/77 10:36, 00,Not set,,", "AAC7340B"); + testRecord(" 00135, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AAC6340B", 135f); + testRecord(" 00158, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AAFE340B", 158f); + testRecord("00513, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AB16340B", 513f); + testRecord("00636, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,,", "AB6E340B", 636f); + testRecord("00047, 000000,5,AEG,56,,10/30/77 10:36, 00,Not set,,", "AAC7340B", 47f); - computeCRC(" 00172, 000000,2,1,14,,02/03/14 17:17, 00,Not set,,", "E2AF3177"); - computeCRC("00172, 000000,2,1,14,,02/03/14 17:17, 00,Not set,,", "E2AF3177"); - computeCRC("22, 00172, 000000,2,1,14,,02/03/14 17:17, 00,Not set,,", "E2AF3177"); - - /** - * 00135, 000000,5,AEG,56,,10/30/77 10:35, 00,Not set,, - - - - - - - - - - - */ - + testRecord(" 00172, 000000,2,1,14,,02/03/14 17:17, 00,Not set,,", "E2AF3177", 172f); + testRecord("00172, 000000,2,1,14,,02/03/14 17:17, 00,Not set,,", "E2AF3177", 172f); + testRecord("22, 00172, 000000,2,1,14,,02/03/14 17:17, 00,Not set,,", "E2AF3177", 22f); } - protected void computeCRC(String record, String expectedCRC) { + protected void testRecord(String record, String expectedCRC, Float expectedLength) { - String actualCRC = FeedReaderRecord.computeCRC(record); + FeedReaderRecord feedReaderRecord = new FeedReaderRecord(record, expectedCRC); + String actualCRC = feedReaderRecord.getComputedCrc(); if (log.isInfoEnabled()) { - log.info("IncomingCRC: " + expectedCRC + " :: " + new BigInteger(expectedCRC, 16) + " got:" + actualCRC + " :: " + new BigInteger(actualCRC, 16)+ " -- "+new BigInteger(actualCRC, 16).multiply(BigInteger.valueOf(2))); + log.info("incoming CRC: " + expectedCRC + " (" + new BigInteger(expectedCRC, 16) + ") -- computed CRC: " + actualCRC + " (" + new BigInteger(actualCRC, 16) + ")"); } -// Assert.assertEquals("Bad crc for '" + record + "', should have " + expectedCRC + ", but get " + actualCRC, expectedCRC, actualCRC); + Assert.assertEquals("Bad computed length for " + record, expectedLength, feedReaderRecord.getLength()); + //FIXME Uncommnet this when computed CRC will be ok +// Assert.assertEquals("Bad computed CRC for "+record, expectedCRC, feedReaderRecord.getComputedCrc()); + Assert.assertTrue("Bad valid flag for " + record, feedReaderRecord.isValid()); } }