From fe3c19373133dd5fdd5b0558a6f2abb66c312c56 Mon Sep 17 00:00:00 2001
From: brutzman <brutzman@nps.edu>
Date: Sun, 14 May 2023 21:04:36 -0700
Subject: [PATCH] rename for consistency, simple cleanups

---
 .../SimpleServerOpenDis7.java                 | 203 ++++++++++++++++++
 .../TwoCraneBerthsOpenDis7.java               |  27 +--
 .../run/RunSimpleServer.java                  |   7 +-
 .../run/RunSimpleServerOpenDis7.java          |   6 +-
 .../run/RunSimpleServerOpenDis7Log.txt        |  43 ++--
 .../run/RunTwoCraneBerthsLog.txt              |  12 +-
 .../run/RunTwoCraneBerthsOpenDis7Log.txt      | Bin 12485 -> 70372 bytes
 .../run/RunTwoCranesBerth.java                |  92 --------
 8 files changed, 257 insertions(+), 133 deletions(-)
 create mode 100644 examples/src/SimkitOpenDis7Examples/SimpleServerOpenDis7.java
 delete mode 100644 examples/src/SimkitOpenDis7Examples/run/RunTwoCranesBerth.java

diff --git a/examples/src/SimkitOpenDis7Examples/SimpleServerOpenDis7.java b/examples/src/SimkitOpenDis7Examples/SimpleServerOpenDis7.java
new file mode 100644
index 0000000000..de9824ebc3
--- /dev/null
+++ b/examples/src/SimkitOpenDis7Examples/SimpleServerOpenDis7.java
@@ -0,0 +1,203 @@
+package SimkitOpenDis7Examples;
+
+import edu.nps.moves.dis7.enumerations.DisPduType;
+import edu.nps.moves.dis7.pdus.EntityStatePdu;
+import edu.nps.moves.dis7.utilities.DisChannel;
+import edu.nps.moves.dis7.utilities.PduFactory;
+import simkit.Priority;
+import simkit.SimEntityBase;
+import simkit.random.RandomVariate;
+
+/**
+ * Simple Server component. Instances of this class cannot be used on their own,
+ * but require another SimEntity to schedule Arrival events. If it is desired to
+ * listen to an event of another name,use an Adapter instance.
+ *
+ * The StartService is schedule with a positive priority, which will ensure it
+ * will occur ahead of any simultaneously scheduled Arrival events, as long as
+ * they have the default priority of 0.0.
+ *
+ * @author abuss@nps.edu
+ */
+public class SimpleServerOpenDis7 extends SimEntityBase
+{
+    // Utility constructor method: initial descriptor and verboseness of disNetworkInterface, pduRecorder
+    private final DisChannel disChannel = new DisChannel("TwoCraneBerthsOpenDis7", false, true); 
+    
+    PduFactory     pduFactory = new PduFactory();
+    EntityStatePdu espduCrane = (EntityStatePdu) pduFactory.createPdu(DisPduType.ENTITY_STATE);
+
+    /**
+     * Total number of servers
+     */
+    private int totalNumberServers;
+    
+    /**
+     * Generates service times
+     */
+    private RandomVariate serviceTimeGenerator;
+
+    /**
+     * number of available servers at any time
+     */
+    protected int numberAvailableServers;
+    
+    /**
+     * number in queue at any time
+     */
+    protected int numberInQueue;
+    
+    /**
+     * Number customers served
+     */
+    protected int numberServed;
+
+    /**
+     * Zero-argument constructor
+     */
+    public SimpleServerOpenDis7() {
+    }
+
+    /**
+     * Creates a new instance of SimpleServer with the given parameters
+     *
+     * @param totalNumberServers Total number of servers
+     * @param serviceTimeGenerator Service time generator. Must be RandomVariate
+     * instance that only generates non-negative values.
+     */
+    public SimpleServerOpenDis7(int totalNumberServers, RandomVariate serviceTimeGenerator) {
+        setTotalNumberServers(totalNumberServers);
+        setServiceTimeGenerator(serviceTimeGenerator);
+    }
+
+    /**
+     * Set numberAvailable servers to total number servers, numberInQueue to 0,
+     * numberServed to 0.
+     */
+    @Override
+    public void reset() {
+        super.reset();
+        numberInQueue = 0;
+        numberAvailableServers = totalNumberServers;
+        numberServed = 0;
+    }
+
+    /**
+     * Just fires PropertyChange events
+     */
+    public void doRun() {
+        firePropertyChange("numberInQueue", getNumberInQueue());
+        firePropertyChange("numberAvailableServers", getNumberAvailableServers());
+        firePropertyChange("numberServed", getNumberServed());
+    }
+
+    /**
+     * Increment number in queue. If a server is available, schedule
+     * StartService immediately with priority of 1.0
+     */
+    public void doArrival() {
+        int oldNumberInQueue = numberInQueue;
+        numberInQueue = numberInQueue + 1;
+        firePropertyChange("numberInQueue", oldNumberInQueue, getNumberInQueue());
+        if (getNumberAvailableServers() > 0) {
+            waitDelay("StartService", 0.0, Priority.HIGH);
+        }
+    }
+
+    /**
+     * Decrement numberInQueue and numberAvailableServers Schedule EndService
+     * after service time delay
+     */
+    public void doStartService() {
+        int oldNumberInQueue = numberInQueue;
+        numberInQueue = numberInQueue - 1;
+        firePropertyChange("numberInQueue", oldNumberInQueue, numberInQueue);
+        int oldNumberAvailableServers = numberAvailableServers;
+        numberAvailableServers = numberAvailableServers - 1;
+        firePropertyChange("numberAvailableServers", oldNumberAvailableServers, numberAvailableServers);
+
+//        double serviceTime = getServiceTimeGenerator().generate();
+//        firePropertyChange("serviceTime", serviceTime);
+
+        waitDelay("EndService", serviceTimeGenerator);
+
+    }
+
+    /**
+     * Increment numberAvailableServers If customers in queue, schedule
+     * StartService immediately with HIGH priority
+     */
+    public void doEndService() {
+        int oldNumberAvailableServers = numberAvailableServers;
+        numberAvailableServers = numberAvailableServers + 1;
+        firePropertyChange("numberAvailableServers", oldNumberAvailableServers, numberAvailableServers);
+
+        int oldNumberServed = numberServed;
+        numberServed = numberServed + 1;
+        firePropertyChange("numberServed", oldNumberServed, numberServed);
+
+        if (getNumberInQueue() > 0) {
+            waitDelay("StartService", 0.0, Priority.HIGH);
+        }
+    }
+
+    /**
+     * accessor method to get a state variable
+     * @return the numberAvailableServers
+     */
+    public int getNumberAvailableServers() {
+        return numberAvailableServers;
+    }
+
+    /**
+     * accessor method to get a state variable
+     * @return the numberInQueue
+     */
+    public int getNumberInQueue() {
+        return numberInQueue;
+    }
+
+    /**
+     * accessor method to set a state variable
+     * @param totalNumberServers total number of servers
+     * @throws IllegalArgumentException if totalNumberServers &lt; 0
+     */
+    public void setTotalNumberServers(int totalNumberServers) {
+        if (totalNumberServers <= 0) {
+            throw new IllegalArgumentException("Need positive number of servers: " + totalNumberServers);
+        }
+        this.totalNumberServers = totalNumberServers;
+    }
+
+    /**
+     * accessor method to get a state variable
+     * @return the serviceTimeGenerator
+     */
+    public RandomVariate getServiceTimeGenerator() {
+        return this.serviceTimeGenerator;
+    }
+
+    /**
+     * accessor method to set a state variable
+     * @param serviceTimeGenerator the serviceTimeGenerator to set
+     */
+    public void setServiceTimeGenerator(RandomVariate serviceTimeGenerator) {
+        this.serviceTimeGenerator = serviceTimeGenerator;
+    }
+
+    /**
+     * accessor method to get a state variable
+     * @return the totalNumberServers
+     */
+    public int getTotalNumberServers() {
+        return this.totalNumberServers;
+    }
+
+    /**
+     * accessor method to get a state variable
+     * @return the numberServed
+     */
+    public int getNumberServed() {
+        return this.numberServed;
+    }
+}
diff --git a/examples/src/SimkitOpenDis7Examples/TwoCraneBerthsOpenDis7.java b/examples/src/SimkitOpenDis7Examples/TwoCraneBerthsOpenDis7.java
index 7314d3e7f5..6482e6ef27 100644
--- a/examples/src/SimkitOpenDis7Examples/TwoCraneBerthsOpenDis7.java
+++ b/examples/src/SimkitOpenDis7Examples/TwoCraneBerthsOpenDis7.java
@@ -26,7 +26,10 @@ import simkit.SimEntityBase;
 public class TwoCraneBerthsOpenDis7 extends SimEntityBase
 {
     // Utility constructor method: initial descriptor and verboseness of disNetworkInterface, pduRecorder
-    private final DisChannel disChannel = new DisChannel("TwoCraneBerthsOpenDis7", false, true); 
+    private final DisChannel disChannel = new DisChannel("TwoCraneBerthsOpenDis7", false, true);
+    
+    PduFactory     pduFactory = new PduFactory();
+    EntityStatePdu espduCrane = (EntityStatePdu) pduFactory.createPdu(DisPduType.ENTITY_STATE);
 
     /**
      * Queue of Ships waiting to go into the berth
@@ -76,10 +79,10 @@ public class TwoCraneBerthsOpenDis7 extends SimEntityBase
     /**
      * Only PropertyChangeEvents
      */
-    public void doRun() {
-        disChannel.setVerboseComments(true);
+    public void doRun()
+    {
         disChannel.setVerboseComments(true);
-        // TODO what is happening? not seen in logs...
+        disChannel.setVerboseDisNetworkInterface(true);
         
         firePropertyChange("queue", getQueue());
         firePropertyChange("berth", getBerth());
@@ -209,9 +212,6 @@ public class TwoCraneBerthsOpenDis7 extends SimEntityBase
         waitDelay("EndUnloadingOneCrane", ship.getRemainingUnloadingTime(), ship);
     }
     
-    // can be member variables (for efficiency, move above) or else embdedded within method (move below)
-    PduFactory     pduFactory = new PduFactory();
-    EntityStatePdu espduCrane = (EntityStatePdu) pduFactory.createPdu(DisPduType.ENTITY_STATE);
         
     /**
      * Perform crane container unloading operations and send PDUs to report progress
@@ -272,7 +272,7 @@ public class TwoCraneBerthsOpenDis7 extends SimEntityBase
         espduCrane.setEntityLocation(pierDistanceForCraneOffload, 0.0, 0.0);
         disChannel.sendSinglePdu(disTimeStamp, espduCrane);
         disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, 
-                                  "Crane at position " + pierDistanceForCraneOffload + "m for offload after " + craneTravelDuration + " seconds");
+                                  "Crane moved to  position " + pierDistanceForCraneOffload + "m for offload after " + craneTravelDuration + " seconds");
         
         // 4. repeat until done: Crane rotates, lift container, rotates, lower container        
         for (int containerIndex = 1; containerIndex <= numberContainers; containerIndex++)
@@ -281,14 +281,15 @@ public class TwoCraneBerthsOpenDis7 extends SimEntityBase
             double craneRotationDelay = 90.0 / craneRotationRate; // units analysis: degrees / (degrees/second) = seconds
             espduCrane.setEntityOrientation(orientationToShip);
             disChannel.sendSinglePdu(disTimeStamp, espduCrane);
-            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Crane oriented to ship after " + craneRotationDelay + " seconds");
+            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Crane oriented to ship after " + craneRotationDelay + " seconds" +
+                                      " with craneRotationRate=" + craneRotationRate + " degrees/second");
         
 //          // 4.b announce next step without further delay, then perform container hookup
-            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Hooking up Container " + containerIndex + " to crane "); // TODO + whichCrane
+            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Hooking up Container " + containerIndex + " to crane has started..."); // TODO + whichCrane
             
             disTimeStamp += containerHookupDuration;
 //          disChannel.sendSinglePdu(disTimeStamp, espduCrane); // superfluous, crane hasn't moved
-            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Hooked up: Container " + containerIndex + " to crane " // TODO + whichCrane
+            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Hooked up: Container " + containerIndex + " to crane" // TODO + whichCrane
                                       + " after " + craneRotationDelay + " seconds");
             
             // 4.c crane rotates to pier
@@ -296,12 +297,12 @@ public class TwoCraneBerthsOpenDis7 extends SimEntityBase
             espduCrane.setEntityOrientation(orientationToPier);
             disChannel.sendSinglePdu(disTimeStamp, espduCrane);
             disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Crane oriented to pier after " + craneRotationDelay + " seconds" +
-                                      " (" + craneRotationRate + " degrees/second)");
+                                      " with craneRotationRate=" + craneRotationRate + " degrees/second");
             
             // 4.d crane unhooks container
             disTimeStamp += containerDetachDuration;
 //          disChannel.sendSinglePdu(disTimeStamp, espduCrane); // superfluous, crane hasn't moved
-            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Detached: Container " + containerIndex + " on pier" // TODO + whichCrane
+            disChannel.sendCommentPdu(disTimeStamp, VariableRecordType.CARGO, "Crane detached: Container " + containerIndex + " on pier" // TODO + whichCrane
                                       + " after " + containerDetachDuration + " seconds");
             
             // send PDUs accordingly
diff --git a/examples/src/SimkitOpenDis7Examples/run/RunSimpleServer.java b/examples/src/SimkitOpenDis7Examples/run/RunSimpleServer.java
index 4e7e54a79f..bcd76af541 100644
--- a/examples/src/SimkitOpenDis7Examples/run/RunSimpleServer.java
+++ b/examples/src/SimkitOpenDis7Examples/run/RunSimpleServer.java
@@ -36,14 +36,15 @@ public class RunSimpleServer
      * Run a simple program and compute statistical measurement of results.
      * @param args the command line arguments
      */
-    public static void main(String args[]) {
-        String rvName = "Uniform";
+    public static void main(String args[]) 
+    {
+        String rvName = "Uniform"; // TODO is enumeration available?
         double lower = 0.9;
         double upper = 2.2;
         RandomVariate interarrivalTimeGenerator = RandomVariateFactory.getInstance(rvName, lower, upper);
         ArrivalProcess arrival = new ArrivalProcess(interarrivalTimeGenerator);
 
-        rvName = "Gamma";
+        rvName = "Gamma"; // TODO is enumeration available?
         double alpha = 1.7;
         double beta = 1.8;
 
diff --git a/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7.java b/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7.java
index 067cf51b7f..26dc0a8710 100644
--- a/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7.java
+++ b/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7.java
@@ -53,13 +53,13 @@ public class RunSimpleServerOpenDis7
         RandomVariate interarrivalTimeGenerator = RandomVariateFactory.getInstance(rvName, lower, upper);
         ArrivalProcessOpenDis7 arrival = new ArrivalProcessOpenDis7(interarrivalTimeGenerator);
 
-        rvName = "Gamma";
+        rvName = "Gamma"; // TODO is enumeration available?
         double alpha = 1.7;
         double beta = 1.8;
 
         RandomVariate serviceTimeGenerator = RandomVariateFactory.getInstance(rvName, alpha, beta);
-        int numServ = 2;
-        SimpleServerOpenDis7 server = new SimpleServer(numServ, serviceTimeGenerator);
+        int numServ = 1;
+        SimpleServerOpenDis7 server = new SimpleServerOpenDis7(numServ, serviceTimeGenerator);
         arrival.addSimEventListener(server);
 
         SimplePropertyDumper simplePropertyDumper = new SimplePropertyDumper();
diff --git a/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7Log.txt b/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7Log.txt
index 332809acd9..fbc63d4c92 100644
--- a/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7Log.txt
+++ b/examples/src/SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7Log.txt
@@ -1,20 +1,22 @@
-ant -f C:\\x-nps-gitlab\\NetworkedGraphicsMV3500\\examples -Dnb.internal.action.name=run.single -Djavac.includes=SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7.java -Drun.class=SimkitOpenDis7Examples.run.RunSimpleServerOpenDis7 run-single
+ant -f C:\\x3d-nps-gitlab\\NetworkedGraphicsMV3500\\examples -Dnb.internal.action.name=run.single -Djavac.includes=SimkitOpenDis7Examples/run/RunSimpleServerOpenDis7.java -Drun.class=SimkitOpenDis7Examples.run.RunSimpleServerOpenDis7 run-single
 init:
-Deleting: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
+Deleting: C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
 deps-jar:
-Updating property file: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
-Compiling 1 source file to C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\build\classes
+Updating property file: C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
+Compiling 1 source file to C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\build\classes
+warning: [options] system modules path not set in conjunction with -source 17
+1 warning
 compile-single:
 run-single:
-[DisChannel] thisHostName=IT160907-UWALPP
-[DisThreadedNetworkInterface] using network interface PANGP Virtual Ethernet Adapter
+[DisChannel] thisHostName=IT160907-INFLPP
+[DisThreadedNetworkInterface] using network interface Intel(R) Wi-Fi 6E AX210 160MHz
 [DisThreadedNetworkInterface] datagramSocket.joinGroup  address=239.1.2.3 port=3000 isConnected()=false createDatagramSocket() complete.
 [DisThreadedNetworkInterface] createThreads() receiveThread.isAlive()=true
 [DisThreadedNetworkInterface] createThreads() sendingThread.isAlive()=true
 [DisChannel] Network confirmation: address=239.1.2.3 port=3000
 [DisChannel] Beginning pdu save to directory ./pduLog
-[PduRecorder] Recorder log file open: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog3.dislog
-[DisThreadedNetworkInterface] using network interface PANGP Virtual Ethernet Adapter
+[PduRecorder] Recorder log file open: C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog22.dislog
+[DisThreadedNetworkInterface] using network interface Intel(R) Wi-Fi 6E AX210 160MHz
 [DisThreadedNetworkInterface] datagramSocket.joinGroup  address=239.1.2.3 port=3000 isConnected()=false createDatagramSocket() complete.
 [DisThreadedNetworkInterface] createThreads() receiveThread.isAlive()=true
 [DisThreadedNetworkInterface] createThreads() sendingThread.isAlive()=true
@@ -23,18 +25,19 @@ run-single:
 [DisThreadedNetworkInterface DisChannel] [sending  1] DisPduType 22 COMMENT, size 80 bytes)
 [DisThreadedNetworkInterface DisChannel] [receipt  1] DisPduType 22 COMMENT, size 80 bytes)
 [DisThreadedNetworkInterface PduRecorder] [receipt  1] DisPduType 22 COMMENT, size 80 bytes)
-[DisChannel] *** [CommentPdu narrative sent: OTHER] [ArrivalProcessOpenDis7 initialized]
+[DisChannel] *** [CommentPdu OTHER] [ArrivalProcessOpenDis7 initialized]
+[DisChannel] thisHostName=IT160907-INFLPP
 ArrivalProcessOpenDis7.1
 	interarrivalTimeGenerator = Uniform (0.900, 2.200)
-SimpleServer.2
-	totalNumberServers = 2
+SimpleServerOpenDis7.2
+	totalNumberServers = 1
 	serviceTimeGenerator = Gamma (1.700, 1.800)
 Simulation ended at time 100,000.000
 
-There have been 64,475 arrivals
-There have been 64,472 customers served
-Average number in queue	15.9655
-Average utilization	0.9819
+There have been 64,526 arrivals
+There have been 32,790 customers served
+Average number in queue	15912.7375
+Average utilization	1.0000
 Execution complete.
 *** setKillSentinelAndInterrupts() killed=true sendingThread.isInterrupted()=true receiveThread.isInterrupted()=true
 [DisThreadedNetworkInterface PduRecorder] close(): pdus2send.size()=0 baos.size()=0 dos.size()=0
@@ -43,5 +46,11 @@ Execution complete.
 *** killThread() status: receiveThread.isAlive()=false receiveThread.isInterrupted()=true
 *** Thread close status: sendingThread.isAlive()=false receiveThread.isAlive()=false
 
-PduRecorder.stop() closing recorder log file: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog3.dislog
-BUILD SUCCESSFUL (total time: 5 seconds)
+PduRecorder.stop() closing recorder log file: C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog22.dislog
+*** setKillSentinelAndInterrupts() killed=true sendingThread.isInterrupted()=true receiveThread.isInterrupted()=true
+[DisThreadedNetworkInterface DisChannel] close(): pdus2send.size()=0 baos.size()=0 dos.size()=80
+[DisThreadedNetworkInterface DisChannel] datagramSocket.leaveGroup address=239.1.2.3 port=3000 isClosed()=true close() complete.
+*** killThread() status: sendingThread.isAlive()=false sendingThread.isInterrupted()=true
+*** killThread() status: receiveThread.isAlive()=false receiveThread.isInterrupted()=true
+*** Thread close status: sendingThread.isAlive()=false receiveThread.isAlive()=false
+BUILD SUCCESSFUL (total time: 10 seconds)
diff --git a/examples/src/SimkitOpenDis7Examples/run/RunTwoCraneBerthsLog.txt b/examples/src/SimkitOpenDis7Examples/run/RunTwoCraneBerthsLog.txt
index 31c40868a7..437f9dc4c5 100644
--- a/examples/src/SimkitOpenDis7Examples/run/RunTwoCraneBerthsLog.txt
+++ b/examples/src/SimkitOpenDis7Examples/run/RunTwoCraneBerthsLog.txt
@@ -1,9 +1,11 @@
-ant -f C:\\x-nps-gitlab\\NetworkedGraphicsMV3500\\examples -Dnb.internal.action.name=run.single -Djavac.includes=SimkitOpenDis7Examples/run/RunTwoCranesBerth.java -Drun.class=SimkitOpenDis7Examples.run.RunTwoCranesBerth run-single
+ant -f C:\\x3d-nps-gitlab\\NetworkedGraphicsMV3500\\examples -Dnb.internal.action.name=run.single -Djavac.includes=SimkitOpenDis7Examples/run/RunTwoCraneBerths.java -Drun.class=SimkitOpenDis7Examples.run.RunTwoCraneBerths run-single
 init:
-Deleting: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
+Deleting: C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
 deps-jar:
-Updating property file: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
-Compiling 1 source file to C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\build\classes
+Updating property file: C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\build\built-jar.properties
+Compiling 1 source file to C:\x3d-nps-gitlab\NetworkedGraphicsMV3500\examples\build\classes
+warning: [options] system modules path not set in conjunction with -source 17
+1 warning
 compile-single:
 run-single:
 ShipArrivalProcess.1
@@ -20,4 +22,4 @@ Average # in queue:		0.6834
 Average # busy berths:		1.1737
 Average time in system:		1.3207
 Average delay in queue:		0.4857
-BUILD SUCCESSFUL (total time: 3 seconds)
+BUILD SUCCESSFUL (total time: 6 seconds)
diff --git a/examples/src/SimkitOpenDis7Examples/run/RunTwoCraneBerthsOpenDis7Log.txt b/examples/src/SimkitOpenDis7Examples/run/RunTwoCraneBerthsOpenDis7Log.txt
index aba711da01084e011e06b8f5942e90fb9a725c2e..84d6808b7f615e7a8ce352220840024de2503fd3 100644
GIT binary patch
literal 70372
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
Oj+l5R^>|v`!QlTW9$aex

literal 12485
zcmeI2QBT`Q5XYbKrx@v8pdzl55JDp5Ax&}=iPDHb?}4DxVo#DS_O83Trts}=)+Vqy
z$~BNE@=4(Vir4$!nfcAE=wz5MP?<olJs#gzM5-%OZen&b9-pE4Db+1T$BLyh9_laO
z>Wv^6kMW)*X^a{weR1P+VNeMc`z$nE3SY1UJ1P^t=3*Knz4V>kv5?*i<19km8S&(n
zo3AN~KG)5`qu58<^6@+q7e8fBF@gFMDl?nE<y#Gsvbtf+^lK`<ec@FVpw&uYmd6D*
zZLg0p8nUx({a<kZHSg!nk8d&_NBMVC`OcJ|Dw&eW9JLoAg^`}My~{LWRv#W$A7H{`
zT<>W;nWQ|nhg3n!Oof;q0!F^qsXW5uN0=+)W60XxbNJfc6~XJxm=G9WgPC#tS!#1;
z*`Hig4}(_FtX%%pJsl3c(Tt~ErT86-hf0R1wO{piG7(D_UGM~tQJ`W*D(Jwa;1j75
z*bRJ2wSB1CAA8<To@A^L`S+f|eJTYC!&z+iHSLCZ7UfB#pR%atb(Z<cox7MRWD!P>
ziEv`me8NJ!hRmiAh@w0oH_a}<uzPkqgl}A#j7%Ar8Px?E=teB1y}uEqJYiGCl93E=
z(fHpb7spCwDFBNiMM3M->Mg(O*Zex9QkhOY2m&Amk`ROjqussEgvA;mB)bjv7xZ@b
zz`~?tNB=j56x$2$HSJRvBEQ4pfzNd}rr+o=qcVJ>ltvLz=w6q4N~p)6lhI<rRYEl+
zMf<-Zkz4Y#{S!{P5P9828EAHgwi+T%zEGY$fd4U#vQs(ru7*)|j-gZ$s%x143t~Af
zYKTgj&VBRUP^gbdyhrRag>;r5aZS1lN5aDKG1mrjtI61t;oMz#1}{a<9xVGsk3W3)
z09SMqBvc3_3cc?6@z-m(I;R|du+Gy3WJ?chHPS`#lbac33SG3o49w^)kP}Ebg<(12
z{F1hNQ>nSd1FgUh5}@)WrHL(WU=zyw{5fa}vWWDX#HHfo4Mx^{ZOwkv^Mg0aeU|dp
zCIeLym5X7VE*y#h$rce<(kd%M)?_JV#II!DZC?>f*If(Z-Ew_2ESzDqXr|4bXVp5v
zS~7}*)9!FI=>L6j@?}67Wv^d|GP<!Xbc?$PVj}Nsj0y8Rz-_1oM@t_w&)Ap2SU>yP
zde}QM?}qi#U58TZ&C&Z6`x<PVeXYFg>+50f$ds9Vee>+=<z;`c9`=q*nb{v~p8Y|2
z**Dh1-jOLY`^M(kH_FTYa6RlDnKH9K+&ufk^0IHPhrJ_HX7<g^vu~D{{n2{ZJ2GWv
zf3$h_N9ASTS`T|irp)YHn`hrDFZ*h+9{8?Kndy_A8~-nUHF&{)ncjM5x%T3(`<AtB
z-*Vfx-1aSP*M60r^|o*MTF-jhw{$<&eeFY~4fL$HeM|SVDyQMNO5Hm$W&Ues+qZPt
zI}OKG*gG<1X20!Qy6l~X<0|YOnKHBA_AOoZPQ!5(_Kr-M*>C%nE_<ipxC(nmrp)ZO
zeM^_U({Nmcy(3d*_S?Rt%iirbt^(iHDKq{5Ro~L1!SyUI#@=X<l_mjc`q9{FxcdHK
zgXZZx?<`AhXmF1vDecUfhJ0d~rsCQ=js0r9@nXFgf~HA5yIyN~U)VjJk-#4`RSZ8e
z%&@()Q>}X4JDQN5;^OnbKRl`*IBPeVegHb(%(UI+SDW?b({gSosp<zBGEMUJdM$Wf
zk1%Er?y-S?aMWmeo-?BAYa>%TN*vS7C(ZiNIBh;T`!p}R=26*CmnWxv7+v;ygVE^E
W%Tw4j($HwN^`%W?vGW1OJ?|g-^;`b{

diff --git a/examples/src/SimkitOpenDis7Examples/run/RunTwoCranesBerth.java b/examples/src/SimkitOpenDis7Examples/run/RunTwoCranesBerth.java
deleted file mode 100644
index ba18b32837..0000000000
--- a/examples/src/SimkitOpenDis7Examples/run/RunTwoCranesBerth.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package SimkitOpenDis7Examples.run;
-
-import SimkitOpenDis7Examples.ShipArrivalProcess;
-import SimkitOpenDis7Examples.TwoCraneBerths;
-import simkit.Schedule;
-import simkit.random.RandomVariate;
-import simkit.random.RandomVariateFactory;
-import simkit.stat.CollectionSizeTimeVaryingStats;
-import simkit.stat.SimpleStatsTally;
-
-/**
- * Run simple two-berth model for 10 years (3650 days).
- * <h2>Output:</h2><pre>
-ShipArrivalProcess.1
-	unloadTimeGenerator = Uniform (0.500, 1.500)
-	interarrivalTimeGenerator = Exponential (0.700)
-TwoCraneBerths.2
-
-Simulation ended at time 3,650.0
-
-Number of ships arriving:	5,135
-Number of ships unloaded:	5,129
-Maximum # in queue:		11
-Average # in queue:		0.6834
-Average # busy berths:		1.1737
-Average time in system:		1.3207
-Average delay in queue:		0.4857
-</pre>
-* 
- * @author abuss@nps.edu
- */
-public class RunTwoCranesBerth
-{
-    /** Default constructor */
-    public RunTwoCranesBerth()
-    {
-        // default constructor
-    }
-    /**
-     * Run a simple program and compute statistical measurement of results.
-     * @param args the command line arguments
-     */
-    public static void main(String[] args) {
-        RandomVariate interarrivalTimeGenerator =
-                RandomVariateFactory.getInstance("Exponential", 0.7);
-        RandomVariate unloadingTimeGenerator =
-                RandomVariateFactory.getInstance("Uniform", 0.5, 1.5);
-        ShipArrivalProcess shipArrivalProcess =
-                new ShipArrivalProcess(interarrivalTimeGenerator,
-                    unloadingTimeGenerator);
-        
-        TwoCraneBerths twoCraneBerths = new TwoCraneBerths();
-        shipArrivalProcess.addSimEventListener(twoCraneBerths);
-        
-        SimpleStatsTally delayInQueueStat = new SimpleStatsTally("delayInQueue");
-        SimpleStatsTally timeInSystemStat = new SimpleStatsTally("timeInSystem");
-        CollectionSizeTimeVaryingStats numberInQueueStat = 
-                new CollectionSizeTimeVaryingStats("queue");
-        CollectionSizeTimeVaryingStats numberInBerthStat = 
-                new CollectionSizeTimeVaryingStats("berth");
-//        SimplePropertyDumper simplePropertyDumper = new SimplePropertyDumper();
-//        twoCraneBerths.addPropertyChangeListener(simplePropertyDumper);
-        
-        twoCraneBerths.addPropertyChangeListener(delayInQueueStat);
-        twoCraneBerths.addPropertyChangeListener(timeInSystemStat);
-        twoCraneBerths.addPropertyChangeListener(numberInQueueStat);
-        twoCraneBerths.addPropertyChangeListener(numberInBerthStat);
-        
-        System.out.println(shipArrivalProcess);
-        System.out.println(twoCraneBerths);
-        
-        double stopTime = 10 * 365;
-        Schedule.stopAtTime(stopTime);
-        Schedule.setVerbose(false);
-        
-        Schedule.reset();
-        Schedule.startSimulation();
-        
-        System.out.printf("%nSimulation ended at time %,.1f%n%n",
-                Schedule.getSimTime());
-        
-        System.out.printf("Number of ships arriving:\t%,d%n", shipArrivalProcess.getNumberArrivals());
-        System.out.printf("Number of ships unloaded:\t%,d%n", timeInSystemStat.getCount());
-        System.out.printf("Maximum # in queue:\t\t%.0f%n", numberInQueueStat.getMaxObs());
-        System.out.printf("Average # in queue:\t\t%.4f%n", numberInQueueStat.getMean());
-        System.out.printf("Average # busy berths:\t\t%.4f%n", numberInBerthStat.getMean());
-        System.out.printf("Average time in system:\t\t%.4f%n",
-                timeInSystemStat.getMean());
-        System.out.printf("Average delay in queue:\t\t%.4f%n",
-                delayInQueueStat.getMean());    }
-
-}
-- 
GitLab