From 2f0f3ead377bba8ba9ba6633b2b8dda1c28a732a Mon Sep 17 00:00:00 2001
From: brutzman <brutzman@nps.edu>
Date: Wed, 29 Apr 2020 16:22:22 -0700
Subject: [PATCH] refactor rename, many TODOs

---
 build.xml                                     |   9 ++
 .../nps/moves/dis7/examples/EntityUse.java    |   4 +-
 .../moves/dis7/examples/EspduReceiver.java    |   2 +-
 .../moves/dis7/examples/EspduReceiverNIO.java |   3 +-
 .../nps/moves/dis7/examples/EspduSender.java  |   2 +-
 .../moves/dis7/examples/PduListenerSaver.java |   4 +-
 .../moves/dis7/examples/PduReaderPlayer.java  |   4 +-
 .../dis7/examples/ThreadedNetExample.java     |   4 +-
 .../CoordinateConversions.java                |   2 +-
 .../{util => utilities}/DisNetworking.java    |   2 +-
 .../{util => utilities}/DisThreadedNetIF.java |   2 +-
 .../dis7/{util => utilities}/PduFactory.java  |   2 +-
 .../stream}/LogCompare.java                   |  26 +++--
 .../stream/PduPlayer.java}                    |  25 +++--
 .../stream}/PduReceiver.java                  |   2 +-
 .../stream/PduRecorder.java}                  | 103 ++++++++++--------
 .../stream}/ValidationPdusMakerV1.java        |  10 +-
 .../nps/moves/dis7/AllPduRoundTripTest.java   |  14 +--
 .../nps/moves/dis7/BitFieldRoundTripTest.java |   4 +-
 test/edu/nps/moves/dis7/CommentPdusTest.java  |   4 +-
 .../moves/dis7/DataQueryPduRoundTripTest.java |   4 +-
 .../FixedAndVariableDatumRoundTripTest.java   |   4 +-
 test/edu/nps/moves/dis7/PduFactoryTest.java   |   2 +-
 test/edu/nps/moves/dis7/SignalPdusTest.java   |   4 +-
 24 files changed, 140 insertions(+), 102 deletions(-)
 rename src/edu/nps/moves/dis7/{util => utilities}/CoordinateConversions.java (99%)
 rename src/edu/nps/moves/dis7/{util => utilities}/DisNetworking.java (99%)
 rename src/edu/nps/moves/dis7/{util => utilities}/DisThreadedNetIF.java (99%)
 rename src/edu/nps/moves/dis7/{util => utilities}/PduFactory.java (99%)
 rename src/edu/nps/moves/dis7/{util/playerrecorder => utilities/stream}/LogCompare.java (87%)
 rename src/edu/nps/moves/dis7/{util/playerrecorder/Player.java => utilities/stream/PduPlayer.java} (91%)
 rename src/edu/nps/moves/dis7/{util/playerrecorder => utilities/stream}/PduReceiver.java (60%)
 rename src/edu/nps/moves/dis7/{util/playerrecorder/Recorder.java => utilities/stream/PduRecorder.java} (60%)
 rename src/edu/nps/moves/dis7/{util/playerrecorder => utilities/stream}/ValidationPdusMakerV1.java (98%)

diff --git a/build.xml b/build.xml
index 69b2030c89..87507d6998 100644
--- a/build.xml
+++ b/build.xml
@@ -78,6 +78,15 @@
     test.  Running in other ways, such as individually, doesn't seem to work.
     https://blogs.apache.org/netbeans/entry/junit-5-apache-ant-and
     -->
+
+    <target name="pduRecord" depends="compile-test,-pre-test-run">
+        <echo message="$work.dir=${work.dir}"/>
+        <java dir="." 
+              classpath="${run.classpath}"  
+              classname="edu.nps.moves.dis7.util.playerrecorder.Recorder">
+        <!--  <arg line="*insert filename*"/> TODO in Recorder -->
+        </java>
+    </target>
     
     <target name="test" depends="compile-test,-pre-test-run">
         <echo message="$work.dir=${work.dir}"/>
diff --git a/src/edu/nps/moves/dis7/examples/EntityUse.java b/src/edu/nps/moves/dis7/examples/EntityUse.java
index d89154f98a..351f5fc673 100644
--- a/src/edu/nps/moves/dis7/examples/EntityUse.java
+++ b/src/edu/nps/moves/dis7/examples/EntityUse.java
@@ -7,8 +7,8 @@ package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.EntityStatePdu;
 import edu.nps.moves.dis7.EntityType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import edu.nps.moves.dis7.entities.EntityTypeFactory;
 import edu.nps.moves.dis7.enumerations.DISPDUType;
 import java.io.IOException;
diff --git a/src/edu/nps/moves/dis7/examples/EspduReceiver.java b/src/edu/nps/moves/dis7/examples/EspduReceiver.java
index e5ecdcde29..e1dabd6d16 100644
--- a/src/edu/nps/moves/dis7/examples/EspduReceiver.java
+++ b/src/edu/nps/moves/dis7/examples/EspduReceiver.java
@@ -9,7 +9,7 @@ import edu.nps.moves.dis7.EntityID;
 import edu.nps.moves.dis7.EntityStatePdu;
 import edu.nps.moves.dis7.Pdu;
 import edu.nps.moves.dis7.Vector3Double;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.net.DatagramPacket;
 import java.net.MulticastSocket;
 import java.util.Iterator;
diff --git a/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java b/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java
index c5853bfe07..f8cb0f51d5 100644
--- a/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java
+++ b/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java
@@ -5,7 +5,7 @@
 package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.Pdu;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.net.DatagramPacket;
 import java.net.InetAddress;
 import java.net.MulticastSocket;
@@ -38,6 +38,7 @@ public class EspduReceiverNIO
       // Specify the socket to receive data
       socket = new MulticastSocket(EspduSender.DIS_DESTINATION_PORT);
       address = InetAddress.getByName(EspduSender.DEFAULT_MULTICAST_GROUP);
+      // TODO fix deprecation by adding NetworkInterface (hopefully DisThreadedNetworkInterface)
       socket.joinGroup(address);
 
       // Loop infinitely, receiving datagrams
diff --git a/src/edu/nps/moves/dis7/examples/EspduSender.java b/src/edu/nps/moves/dis7/examples/EspduSender.java
index 16cf917837..45c73ae96f 100644
--- a/src/edu/nps/moves/dis7/examples/EspduSender.java
+++ b/src/edu/nps/moves/dis7/examples/EspduSender.java
@@ -6,7 +6,7 @@
 package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.*;
-import edu.nps.moves.dis7.util.CoordinateConversions;
+import edu.nps.moves.dis7.utilities.CoordinateConversions;
 import java.io.*;
 import java.net.*;
 import java.util.*;
diff --git a/src/edu/nps/moves/dis7/examples/PduListenerSaver.java b/src/edu/nps/moves/dis7/examples/PduListenerSaver.java
index eba90c07b8..a4a0fe31fc 100644
--- a/src/edu/nps/moves/dis7/examples/PduListenerSaver.java
+++ b/src/edu/nps/moves/dis7/examples/PduListenerSaver.java
@@ -4,7 +4,7 @@
  */
 package edu.nps.moves.dis7.examples;
 
-import edu.nps.moves.dis7.util.playerrecorder.Recorder;
+import edu.nps.moves.dis7.utilities.stream.PduRecorder;
 import java.io.IOException;
 import java.util.Scanner;
 
@@ -51,7 +51,7 @@ public class PduListenerSaver
 
     System.out.println("Beginning pdu save to directory " + outDir);
     try {
-      Recorder recorder = new Recorder(outDir, mcast, port);
+      PduRecorder recorder = new PduRecorder(outDir, mcast, port);
 
       recorder.startResume();
       mystate state = mystate.RUNNING;
diff --git a/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java b/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java
index f8f860d130..db25342793 100644
--- a/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java
+++ b/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java
@@ -4,7 +4,7 @@
  */
 package edu.nps.moves.dis7.examples;
 
-import edu.nps.moves.dis7.util.playerrecorder.Player;
+import edu.nps.moves.dis7.utilities.stream.PduPlayer;
 import java.io.File;
 import java.io.IOException;
 import java.util.Scanner;
@@ -52,7 +52,7 @@ public class PduReaderPlayer
 
     System.out.println("Beginning pdu playback from directory " + outDir);
     try {
-      Player player = new Player(mcast, port, new File(outDir).toPath());
+      PduPlayer player = new PduPlayer(mcast, port, new File(outDir).toPath());
       player.startResume();
       mystate state = mystate.RUNNING;
       Scanner scan = new Scanner(System.in);
diff --git a/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java b/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java
index a4be300e49..c9a46394f2 100644
--- a/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java
+++ b/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java
@@ -6,8 +6,8 @@ package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.Pdu;
 import edu.nps.moves.dis7.enumerations.Country;
-import edu.nps.moves.dis7.util.DisThreadedNetIF;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisThreadedNetIF;
+import edu.nps.moves.dis7.utilities.PduFactory;
 
 /**
  * ThreadedNetExample.java created on Sep 9, 2019
diff --git a/src/edu/nps/moves/dis7/util/CoordinateConversions.java b/src/edu/nps/moves/dis7/utilities/CoordinateConversions.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/CoordinateConversions.java
rename to src/edu/nps/moves/dis7/utilities/CoordinateConversions.java
index bd70102cc5..4ed7996cb6 100644
--- a/src/edu/nps/moves/dis7/util/CoordinateConversions.java
+++ b/src/edu/nps/moves/dis7/utilities/CoordinateConversions.java
@@ -3,7 +3,7 @@
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
 
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 /**
  * Converts DIS (x,y,z) rectilinear coordinates (earth-centered RH coordinate system)
diff --git a/src/edu/nps/moves/dis7/util/DisNetworking.java b/src/edu/nps/moves/dis7/utilities/DisNetworking.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/DisNetworking.java
rename to src/edu/nps/moves/dis7/utilities/DisNetworking.java
index b91f740dab..4250a07d1a 100644
--- a/src/edu/nps/moves/dis7/util/DisNetworking.java
+++ b/src/edu/nps/moves/dis7/utilities/DisNetworking.java
@@ -2,7 +2,7 @@
  * Copyright (c) 2008-2020, MOVES Institute, Naval Postgraduate School (NPS). All rights reserved.
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 import edu.nps.moves.dis7.Pdu;
 import java.io.ByteArrayOutputStream;
diff --git a/src/edu/nps/moves/dis7/util/DisThreadedNetIF.java b/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/DisThreadedNetIF.java
rename to src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java
index b150ce02c8..6fa1553398 100644
--- a/src/edu/nps/moves/dis7/util/DisThreadedNetIF.java
+++ b/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java
@@ -2,7 +2,7 @@
  * Copyright (c) 2008-2020, MOVES Institute, Naval Postgraduate School (NPS). All rights reserved.
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 import edu.nps.moves.dis7.Pdu;
 import edu.nps.moves.dis7.enumerations.DISPDUType;
diff --git a/src/edu/nps/moves/dis7/util/PduFactory.java b/src/edu/nps/moves/dis7/utilities/PduFactory.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/PduFactory.java
rename to src/edu/nps/moves/dis7/utilities/PduFactory.java
index b9853aae2e..9c3bd6e2a9 100644
--- a/src/edu/nps/moves/dis7/util/PduFactory.java
+++ b/src/edu/nps/moves/dis7/utilities/PduFactory.java
@@ -3,7 +3,7 @@
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
 
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 import edu.nps.moves.dis7.*;
 import edu.nps.moves.dis7.enumerations.*;
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/LogCompare.java b/src/edu/nps/moves/dis7/utilities/stream/LogCompare.java
similarity index 87%
rename from src/edu/nps/moves/dis7/util/playerrecorder/LogCompare.java
rename to src/edu/nps/moves/dis7/utilities/stream/LogCompare.java
index 29b3866872..bd191e9019 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/LogCompare.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/LogCompare.java
@@ -1,8 +1,8 @@
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import edu.nps.moves.dis7.Pdu;
-import edu.nps.moves.dis7.util.PduFactory;
-import static edu.nps.moves.dis7.util.playerrecorder.Recorder.COMMENT_MARKER;
+import edu.nps.moves.dis7.utilities.PduFactory;
+import static edu.nps.moves.dis7.utilities.stream.PduRecorder.COMMENT_MARKER;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
@@ -17,16 +17,24 @@ import java.util.Base64;
  */
 public class LogCompare
 {
+    /**
+     * filepath1 and filepath2
+     */
   private static String[] paths = {
-    "/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog/Pdusave.dislog",
-    "/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog/Pdusave1.dislog"};
-
+    "Pdusave.dislog", // TODO 1
+    "Pdusave1.dislog" // TODO 2
+  };
+
+  
+  /** Invocation
+    * @param args filepath1 filepath2
+   */
   public static void main(String[] args)
   {
     if (args.length > 0)
-      paths[0] = args[0];
+      paths[0] = args[0]; // filepath1
     if (args.length > 1)
-      paths[1] = args[1];
+      paths[1] = args[1]; // filepath1
     main2(paths);
   }
 
@@ -35,7 +43,7 @@ public class LogCompare
   // Not same sequence of Pdus
   // Not same number of Pdus
   // Pdu content difference
-  public static void main2(String[] args)
+  public static void main2(String[] args) // TODO rename or remove middlemen
   {
     if (args.length < 2) {
       System.out.println("Usage: java LogCompare filepath1 filepath2");
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/Player.java b/src/edu/nps/moves/dis7/utilities/stream/PduPlayer.java
similarity index 91%
rename from src/edu/nps/moves/dis7/util/playerrecorder/Player.java
rename to src/edu/nps/moves/dis7/utilities/stream/PduPlayer.java
index b5302ff9e5..d8c7e401ef 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/Player.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/PduPlayer.java
@@ -3,7 +3,7 @@
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
 
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import com.google.common.primitives.Longs;
 
@@ -15,9 +15,9 @@ import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Base64;
 
-import static edu.nps.moves.dis7.util.playerrecorder.Recorder.*;
+import static edu.nps.moves.dis7.utilities.stream.PduRecorder.*;
 
-public class Player
+public class PduPlayer
 {
   public interface RawListener {
     void receiveBytes(byte[] ba);
@@ -27,7 +27,7 @@ public class Player
   private int port;
   private Thread thrd;
   
-  public Player(String ip, int port, Path disLogDirectory) throws IOException
+  public PduPlayer(String ip, int port, Path disLogDirectory) throws IOException
   {
     this.disLogDirectory = disLogDirectory;
     this.ip = ip;
@@ -65,7 +65,7 @@ public class Player
       System.out.println("Replaying DIS logs.");
       InetAddress addr = InetAddress.getByName(ip);
       
-      FilenameFilter filter = (dir, name) -> name.endsWith(Recorder.DISLOG_FILE_TAIL) && !name.startsWith(".");
+      FilenameFilter filter = (dir, name) -> name.endsWith(PduRecorder.DISLOG_FILE_EXTENSION) && !name.startsWith(".");
       
       File[] fs = disLogDirectory.toFile().listFiles(filter);
       if (fs == null)
@@ -146,7 +146,7 @@ public class Player
       if(rawListener != null)
         rawListener.receiveBytes(null); // indicate the end
     }
-    catch (Exception ex) {
+    catch (IOException ex) {
       System.err.println("Exception reading/writing pdus: "+ex.getClass().getSimpleName()+": "+ex.getLocalizedMessage());
       thrd = null;
       closer();
@@ -192,7 +192,7 @@ public class Player
         brdr = null;
       }
     }
-    catch (Exception ioex) {
+    catch (IOException ioex) {
       System.err.println("IOException closing reader in Player");
     }
   }
@@ -206,12 +206,12 @@ public class Player
       System.out.println(s + "  ");
       showPduCountsOneTime = true;  // get the first one in there
     }
-    else if (s.startsWith(STOP_COMMENT_MARKER)) {
+    else if (s.startsWith(FINISH_COMMENT_MARKER)) {
       System.out.print("Total PDUs: ");
       showCounts();
       System.out.println();
       System.out.println("End of replay from " + f.getName());
-      System.out.println(s.substring(STOP_COMMENT_MARKER.length()));
+      System.out.println(s.substring(FINISH_COMMENT_MARKER.length()));
       
       scenarioPduCount = 0;
       startNanoTime = null;
@@ -236,13 +236,16 @@ public class Player
     closer();
   }
   
+  /** Invocation
+    * @param args none supported
+   */
   public static void main(String[] args)
   {
     try {
       //new Player("230.0.0.0", 3000, new File("./pdulog").toPath()).startResume();
-      new Player("230.0.0.0", 3000, new File("/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog").toPath());
+      new PduPlayer("230.0.0.0", 3000, new File("./pdulog").toPath());
     }
-    catch (Exception ex) {
+    catch (IOException ex) {
       ex.printStackTrace();
     }
   }
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/PduReceiver.java b/src/edu/nps/moves/dis7/utilities/stream/PduReceiver.java
similarity index 60%
rename from src/edu/nps/moves/dis7/util/playerrecorder/PduReceiver.java
rename to src/edu/nps/moves/dis7/utilities/stream/PduReceiver.java
index 9a1e276921..1752027355 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/PduReceiver.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/PduReceiver.java
@@ -1,4 +1,4 @@
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 public interface PduReceiver
 {
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/Recorder.java b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java
similarity index 60%
rename from src/edu/nps/moves/dis7/util/playerrecorder/Recorder.java
rename to src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java
index 9710cf189b..e6549828ba 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/Recorder.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java
@@ -1,11 +1,9 @@
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import com.google.common.primitives.Longs;
-import edu.nps.moves.dis7.Pdu;
-import edu.nps.moves.dis7.enumerations.DISPDUType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.DisThreadedNetIF;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.DisThreadedNetIF;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import org.apache.commons.io.FilenameUtils;
 
 import java.io.BufferedWriter;
@@ -13,35 +11,37 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.file.Path;
+import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Base64;
+import java.util.Calendar;
 
-public class Recorder implements PduReceiver
+public class PduRecorder implements PduReceiver
 {
   static String DEFAULT_OUTDIR = "./pdulog";
-  static String DEFAULT_FILEPREFIX = "Pdusave";
+  static String DEFAULT_FILEPREFIX = "Pdusave"; // TODO better name
+  static String DISLOG_FILE_EXTENSION = ".dislog";
+  
   static String DEFAULT_MCAST = "230.0.0.0";
   static int    DEFAULT_PORT = 3000;
-  
-  static String DISLOG_FILE_TAIL = ".dislog";
-
-  public static String COMMENT_MARKER = "!";
-  static String START_COMMENT_MARKER = COMMENT_MARKER + "Begin" + COMMENT_MARKER;
-  static String STOP_COMMENT_MARKER  = COMMENT_MARKER + "End"   + COMMENT_MARKER;
+ 
+  public static final String COMMENT_MARKER = "#";
+  static String  START_COMMENT_MARKER = COMMENT_MARKER + " Start,  ";
+  static String FINISH_COMMENT_MARKER = COMMENT_MARKER + " Finish, ";
 
   private BufferedWriter bufferedWriter;
   private File           logFile;
   
   private DisThreadedNetIF disnetworking;
   
-  public Recorder() throws IOException
+  public PduRecorder() throws IOException
   {
     this(DEFAULT_OUTDIR,DEFAULT_MCAST,DEFAULT_PORT);
   }
   
-  public Recorder(String outputDir, String mcastaddr, int port) throws IOException
+  public PduRecorder(String outputDir, String mcastaddr, int port) throws IOException
   {
-    logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_TAIL );
+    logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_EXTENSION );
     bufferedWriter = new BufferedWriter(new FileWriter(logFile));
     
     disnetworking = new DisThreadedNetIF(port, mcastaddr);
@@ -73,7 +73,7 @@ public class Recorder implements PduReceiver
     bufferedWriter.flush();
     bufferedWriter.close();
     System.out.println();
-    System.out.println("Recorder log file closed");
+    System.out.println("Recorder log file closed: " + logFile.getPath());
     return logFile;
   }
  
@@ -126,17 +126,25 @@ public class Recorder implements PduReceiver
   
   private void writeHeader() throws IOException
   {
-    String template = "Beginning of DIS capture file, %s.";
-    String startComment = String.format(template, logFile.getName() + " (show transient progressing PDU count, then final total)");
-    bufferedWriter.write(START_COMMENT_MARKER + startComment);
+//    String template = ", DIS capture file %s.";
+//    String startComment = String.format(template, logFile.getName() + " (show transient progressing PDU count, then final total)");
+      
+    // https://stackoverflow.com/questions/5175728/how-to-get-the-current-date-time-in-java
+    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
+    
+    bufferedWriter.write( START_COMMENT_MARKER + timeStamp + ", DIS capture file, " + logFile.getPath());
     bufferedWriter.newLine();
   }
 
   private void writeFooter() throws IOException
   {
-    String template = "End of DIS capture file, %s.";
-    String endComment = String.format(template, logFile.getName());
-    bufferedWriter.write(STOP_COMMENT_MARKER + endComment);
+//    String template = ", DIS capture file, %s.";
+//    String endComment = String.format(template, logFile.getPath());
+      
+    // https://stackoverflow.com/questions/5175728/how-to-get-the-current-date-time-in-java
+    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
+    
+    bufferedWriter.write(FINISH_COMMENT_MARKER + timeStamp + ", DIS capture file, " + logFile.getPath());
     bufferedWriter.newLine();
   }
 
@@ -165,7 +173,9 @@ public class Recorder implements PduReceiver
     return f;
   }
   
-  /* Example test usage */
+  /** Invocation
+    * @param args none supported, TODO offer path/filename
+   */
   public static void main(String[] args)
   {
     PduFactory factory = new PduFactory(); //default appid, country, etc.
@@ -174,37 +184,44 @@ public class Recorder implements PduReceiver
     Path path = new File("./pdulog").toPath();
     String filename = "Pdusave";
     
-    Recorder recorder;
-    try{recorder = new Recorder();} catch(IOException ex) {
+    PduRecorder recorder;
+    try{recorder = new PduRecorder();} catch(IOException ex) {
       System.err.println("Exception creating recorder: "+ex.getLocalizedMessage());
       return;
     }
      
-    DISPDUType all[] = DISPDUType.values();
-    Arrays.stream(all).forEach(typ-> {
-      if(typ != DISPDUType.OTHER) {
-        try {
-          Pdu pdu = factory.createPdu(typ);
-          disnet.sendPdu(pdu);
-          sleep(100);
-        }
-        catch(Exception ex) {
-          System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage());
-        }
-      }
-      });
-    sleep(2000);
+//    // self test
+//    DISPDUType all[] = DISPDUType.values();
+//    Arrays.stream(all).forEach(typ-> {
+//      if(typ != DISPDUType.OTHER) {
+//        try {
+//          Pdu pdu = factory.createPdu(typ);
+//          disnet.sendPdu(pdu);
+//          sleep(100);
+//        }
+//        catch(Exception ex) {
+//          System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage());
+//        }
+//      }
+//      });
+
+    System.out.println("Record for 10 seconds..."); // TODO arrrrgh this is awful
+    sleep(10000);
+    System.out.println("Recording complete."); 
     
     try {
       recorder.end();
     }
-    catch(Exception ex) {
+    catch(IOException ex) {
       System.err.println("Exception closing recorder: "+ex.getClass().getSimpleName()+": "+ex.getLocalizedMessage());
     }
   }
   
   private static void sleep(long ms)
   {
-    try{Thread.sleep(ms);}catch(InterruptedException ex) {}
+    try{
+        Thread.sleep(ms);}
+    catch(InterruptedException ex) {
+    }
   }
 }
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/ValidationPdusMakerV1.java b/src/edu/nps/moves/dis7/utilities/stream/ValidationPdusMakerV1.java
similarity index 98%
rename from src/edu/nps/moves/dis7/util/playerrecorder/ValidationPdusMakerV1.java
rename to src/edu/nps/moves/dis7/utilities/stream/ValidationPdusMakerV1.java
index 75291cf74c..b6070e3815 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/ValidationPdusMakerV1.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/ValidationPdusMakerV1.java
@@ -3,11 +3,11 @@
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import edu.nps.moves.dis7.enumerations.Country;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import edu.nps.moves.dis7.*;
 import java.io.File;
 import java.io.IOException;
@@ -46,7 +46,7 @@ public class ValidationPdusMakerV1
   
   PduFactory factory;
   DisNetworking disnet;
-  Recorder recorder;
+  PduRecorder recorder;
   /**
    *
    * @param dir directory to save pdu log file
@@ -69,7 +69,7 @@ public class ValidationPdusMakerV1
      */
     factory = new PduFactory(COUNTRY_V1, EXERCISEID_V1, SITEID_V1, APPLICATIONID_V1, USEABSOLUTETIME_V1);
     disnet = new DisNetworking();
-    recorder = new Recorder(); //dirpath,fn);
+    recorder = new PduRecorder(); //dirpath,fn);
     
      // Start a thread to receive and record pdus; this is a datagram socket and is non-interruptible; thread will go away on Sys exit
     /*Thread receiverThrd = new Thread(() -> {
diff --git a/test/edu/nps/moves/dis7/AllPduRoundTripTest.java b/test/edu/nps/moves/dis7/AllPduRoundTripTest.java
index 8ebe66285e..1dc9d8a8e4 100644
--- a/test/edu/nps/moves/dis7/AllPduRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/AllPduRoundTripTest.java
@@ -19,10 +19,10 @@ package edu.nps.moves.dis7;
 import com.google.common.io.Files;
 import edu.nps.moves.dis7.enumerations.Country;
 import edu.nps.moves.dis7.enumerations.DISPDUType;
-import edu.nps.moves.dis7.util.DisThreadedNetIF;
-import edu.nps.moves.dis7.util.PduFactory;
-import edu.nps.moves.dis7.util.playerrecorder.Player;
-import edu.nps.moves.dis7.util.playerrecorder.Recorder;
+import edu.nps.moves.dis7.utilities.DisThreadedNetIF;
+import edu.nps.moves.dis7.utilities.PduFactory;
+import edu.nps.moves.dis7.utilities.stream.PduPlayer;
+import edu.nps.moves.dis7.utilities.stream.PduRecorder;
 import java.io.File;
 import java.util.HashMap;
 import java.util.concurrent.Semaphore;
@@ -185,7 +185,7 @@ public class AllPduRoundTripTest
   private HashMap<DISPDUType, Pdu> pduReadMap = new HashMap<>();
 
   DisThreadedNetIF disnetworking;
-  Recorder recorder;
+  PduRecorder recorder;
 
   private void setupReceiver()
   {
@@ -212,7 +212,7 @@ public class AllPduRoundTripTest
   private void setupRecorder() throws Exception
   {
     recorderDirectory = Files.createTempDir();
-    recorder = new Recorder(recorderDirectory.getAbsolutePath(), disnetworking.getMcastGroup(), disnetworking.getDisPort());
+    recorder = new PduRecorder(recorderDirectory.getAbsolutePath(), disnetworking.getMcastGroup(), disnetworking.getDisPort());
     System.out.println("Recorder log at " + recorderDirectory.getAbsolutePath());
   }
 
@@ -233,7 +233,7 @@ public class AllPduRoundTripTest
   private void getAllFromRecorder(Semaphore sem) throws Exception
   {
     sem.acquire();
-    Player player = new Player(disnetworking.getMcastGroup(), disnetworking.getDisPort(), recorderDirectory.toPath());
+    PduPlayer player = new PduPlayer(disnetworking.getMcastGroup(), disnetworking.getDisPort(), recorderDirectory.toPath());
     player.sendToNet(false);
     player.addRawListener(ba -> {
       if (ba != null) {
diff --git a/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java b/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java
index 8392c56e00..fc0ec2264d 100644
--- a/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java
@@ -7,8 +7,8 @@ package edu.nps.moves.dis7;
 import edu.nps.moves.dis7.enumerations.AppearanceCamouflageType;
 import edu.nps.moves.dis7.enumerations.ForceID;
 import edu.nps.moves.dis7.enumerations.LandPlatformAppearance;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/test/edu/nps/moves/dis7/CommentPdusTest.java b/test/edu/nps/moves/dis7/CommentPdusTest.java
index 8d697cfac0..6d5fc7dd76 100644
--- a/test/edu/nps/moves/dis7/CommentPdusTest.java
+++ b/test/edu/nps/moves/dis7/CommentPdusTest.java
@@ -5,8 +5,8 @@
 package edu.nps.moves.dis7;
 
 import edu.nps.moves.dis7.enumerations.VariableRecordType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.*;
diff --git a/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java b/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java
index 2417e5f4bd..f7e845a3da 100644
--- a/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java
@@ -5,8 +5,8 @@
 package edu.nps.moves.dis7;
 
 import edu.nps.moves.dis7.enumerations.VariableRecordType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java b/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java
index 1471a781fa..8bd6b2faef 100644
--- a/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java
@@ -6,8 +6,8 @@ package edu.nps.moves.dis7;
 
 import edu.nps.moves.dis7.enumerations.ActionResponseRequestStatus;
 import edu.nps.moves.dis7.enumerations.VariableRecordType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/test/edu/nps/moves/dis7/PduFactoryTest.java b/test/edu/nps/moves/dis7/PduFactoryTest.java
index feb5cbf070..e99ad4383d 100644
--- a/test/edu/nps/moves/dis7/PduFactoryTest.java
+++ b/test/edu/nps/moves/dis7/PduFactoryTest.java
@@ -11,7 +11,7 @@ package edu.nps.moves.dis7;
  */
 
 import edu.nps.moves.dis7.enumerations.Country;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
diff --git a/test/edu/nps/moves/dis7/SignalPdusTest.java b/test/edu/nps/moves/dis7/SignalPdusTest.java
index e9589edb86..7f8f815998 100644
--- a/test/edu/nps/moves/dis7/SignalPdusTest.java
+++ b/test/edu/nps/moves/dis7/SignalPdusTest.java
@@ -4,8 +4,8 @@
  */
 package edu.nps.moves.dis7;
 
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.*;
-- 
GitLab