diff --git a/examples/src/OpenDis7Examples/DisChannel.java b/examples/src/OpenDis7Examples/DisChannel.java deleted file mode 100644 index 2905bd7ab884a412f176d13f60c675dea6b5d9ee..0000000000000000000000000000000000000000 --- a/examples/src/OpenDis7Examples/DisChannel.java +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package OpenDis7Examples; - -import edu.nps.moves.dis7.enumerations.VariableRecordType; -import edu.nps.moves.dis7.pdus.CommentPdu; -import edu.nps.moves.dis7.pdus.EntityID; -import edu.nps.moves.dis7.pdus.Pdu; -import edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface; -import edu.nps.moves.dis7.utilities.DisTime; -import edu.nps.moves.dis7.utilities.PduFactory; -import edu.nps.moves.dis7.utilities.stream.PduRecorder; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -// import jdk.internal.vm.annotation.IntrinsicCandidate; - -/** - * DisChannel integrates multiple utility capabilities to handle most networking and entity-management tasks. - * Provides a simplified interface wrapping DisThreadedNetworkInterface, PduRecorder and SimulationManager - * for programs connecting to OpenDis7 communications. - * TODO future work will confirm that multiple different DisChannel connections can be used simultaneously by a parent program. - * @author brutzman - */ -public class DisChannel -{ - private String descriptor = this.getClass().getSimpleName(); - /** - * Output prefix to help with logging by identifying this class. - */ - // might have different DisChannel objects created on different channels, so TRACE_PREFIX is non-static - private String TRACE_PREFIX = "[" + descriptor + "] "; - private static String thisHostName = "localhost"; - private static final String NETWORK_ADDRESS_DEFAULT = "239.1.2.3"; - private static final int NETWORK_PORT_DEFAULT = 3000; - private static final String DEFAULT_PDULOG_OUTPUT_DIRECTORY = "./pduLog"; - - protected boolean verboseComments = true; - String networkAddress = NETWORK_ADDRESS_DEFAULT; - int networkPort = NETWORK_PORT_DEFAULT; - static DisTime.TimestampStyle timestampStyle = DisTime.TimestampStyle.IEEE_ABSOLUTE; - - /** Creates DIS Protocol Data Unit (PDU) classes for simulation entities */ - private static PduFactory pduFactory; - - // class variables - private DisThreadedNetworkInterface disNetworkInterface; - DisThreadedNetworkInterface.PduListener pduListener; - Pdu receivedPdu; - private PduRecorder pduRecorder; - - /* VariableRecordType enumerations have potential use with CommentPdu logs */ - /* TODO contrast to EntityType */ - public final VariableRecordType descriptionCommentType = VariableRecordType.DESCRIPTION; - public final VariableRecordType narrativeCommentType = VariableRecordType.COMPLETE_EVENT_REPORT; - public final VariableRecordType statusCommentType = VariableRecordType.APPLICATION_STATUS; - public final VariableRecordType currentTimeStepCommentType = VariableRecordType.APPLICATION_TIMESTEP; - - /** SimulationManager class handles DIS joining, announcing and leaving tasks. - * It is instantiated here as an object */ - SimulationManager simulationManager = new SimulationManager(); - - /** Base constructor */ - public DisChannel() - { - // base constructor is not invoked automatically by other constructors - // https://stackoverflow.com/questions/581873/best-way-to-handle-multiple-constructors-in-java - - initialize(); - } - /** Constructor with new descriptor - * @param newDescriptor descriptor for this instance */ - public DisChannel(String newDescriptor) - { - descriptor = newDescriptor; - initialize(); - } - /** Initialize this class */ - private void initialize() - { - DisTime.setTimestampStyle(timestampStyle); // DISTime is a singleton shared class - pduFactory = new PduFactory(timestampStyle); - - try - { - thisHostName = InetAddress.getLocalHost().getHostName(); - printlnTRACE("thisHostName=" + thisHostName); - } - catch (UnknownHostException uhe) - { - printlnTRACE(thisHostName + " is not connected to network: " + uhe.getMessage()); - } - } - /** add entity using SimulationManager - * @param newEntity new entity to add for announcement by SimulationManager */ - public void addEntity(EntityID newEntity) - { - // TODO send simulation management PDUs - simulationManager.addEntity(newEntity); - } - - /** Join DIS channel using SimulationManager */ - public void join() - { - // TODO simulation management PDUs for startup, planning to design special class support -// simulationManager.addEntity(); - simulationManager.setDescriptor(descriptor); - simulationManager.addHost(getThisHostName()); - simulationManager.setDisThreadedNetworkInterface(disNetworkInterface); - - simulationManager.simulationJoin(); - simulationManager.simulationStart(); - // TODO consider boolean response indicating if join was successful - } - /** Leave DIS channel using SimulationManager */ - public void leave() - { - // TODO send simulation management PDUs - simulationManager.simulationStop(); - simulationManager.simulationLeave(); - // TODO consider boolean response indicating if leave was successful - } - - /** - * get current networkAddress as a string - * @return the networkAddress - */ - public String getNetworkAddress() { - return networkAddress; - } - - /** - * set current networkAddress using a string - * @param newNetworkAddress the networkAddress to set - */ - public final void setNetworkAddress(String newNetworkAddress) { - this.networkAddress = newNetworkAddress; - } - - /** - * get current networkPort - * @return the networkPort - */ - public int getNetworkPort() { - return networkPort; - } - - /** - * set current networkPort - * @param newNetworkPort the networkPort to set - */ - public final void setNetworkPort(int newNetworkPort) { - this.networkPort = newNetworkPort; - } - - /** - * Get timestampStyle used by PduFactory - * @return current timestampStyle - */ - public DisTime.TimestampStyle getTimestampStyle() { - return timestampStyle; - } - - /** - * Set timestampStyle used by PduFactory - * @param newTimestampStyle the timestampStyle to set - */ - public void setTimestampStyle(DisTime.TimestampStyle newTimestampStyle) { - timestampStyle = newTimestampStyle; - DisTime.setTimestampStyle(newTimestampStyle); - } - - /** - * Initialize network interface, choosing best available network interface - */ - public void setUpNetworkInterface() - { - if (disNetworkInterface != null) - { - printlnTRACE("*** Warning: setUpNetworkInterface() has already created disNetworkInterface, second invocation ignored"); - return; - } - disNetworkInterface = new DisThreadedNetworkInterface(getNetworkAddress(), getNetworkPort()); - getDisNetworkInterface().setDescriptor(descriptor); - printlnTRACE("Network confirmation:" + " address=" + getDisNetworkInterface().getAddress() + // disNetworkInterface.getMulticastGroup() + - " port=" + getDisNetworkInterface().getPort()); // + disNetworkInterface.getDisPort()); - pduListener = new DisThreadedNetworkInterface.PduListener() { - /** Callback handler for listener */ - @Override - public void incomingPdu(Pdu newPdu) { - receivedPdu = newPdu; - } - }; - getDisNetworkInterface().addListener(pduListener); - String pduLogOutputDirectory = DEFAULT_PDULOG_OUTPUT_DIRECTORY; - printlnTRACE("Beginning pdu save to directory " + pduLogOutputDirectory); - pduRecorder = new PduRecorder(pduLogOutputDirectory, getNetworkAddress(), getNetworkPort()); // assumes save - pduRecorder.setEncodingPduLog(PduRecorder.ENCODING_PLAINTEXT); - pduRecorder.setVerbose(true); // either sending, receiving or both - pduRecorder.start(); // begin running - } - - /** All done, release network resources */ - public void tearDownNetworkInterface() { - getPduRecorder().stop(); // handles disNetworkInterface.close(), tears down threads and sockets - } - - /** - * Send a single Protocol Data Unit (PDU) of any type - * @param pdu the pdu to send - */ - protected void sendSinglePdu(Pdu pdu) - { - if (getDisNetworkInterface() == null) - setUpNetworkInterface(); // ensure connected - try - { - getDisNetworkInterface().send(pdu); - Thread.sleep(100); // TODO consider refactoring the wait logic and moving externally - } - catch (InterruptedException ex) - { - System.err.println(this.getClass().getSimpleName() + " Error sending PDU: " + ex.getLocalizedMessage()); - System.exit(1); - } - } - /** - * Send Comment PDU - * @see <a href="https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html">Passing Information to a Method or a Constructor</a> Arbitrary Number of Arguments - * @param commentType enumeration value describing purpose of the narrative comment - * @param comments String array of narrative comments - */ - public void sendCommentPdu(VariableRecordType commentType, - // vararg... variable-length set of String comments can optionally follow - String... comments) - { - if ((comments != null) && (comments.length > 0)) - { - ArrayList<String> newCommentsList = new ArrayList<>(); - for (String comment : comments) - { - if (!comment.isEmpty()) - { - newCommentsList.add(comment); // OK found something to send - } - } - if (!newCommentsList.isEmpty()) - { - if (getDisNetworkInterface() == null) - setUpNetworkInterface(); // ensure connected - - if (commentType == null) - commentType = VariableRecordType.OTHER; // fallback value; TODO consider pushing into pduFactory - // now build the commentPdu from these string inputs, thus constructing a narrative entry - @SuppressWarnings("CollectionsToArray") - CommentPdu commentPdu = getPduFactory().makeCommentPdu(commentType, newCommentsList.toArray(new String[0])); // comments); - sendSinglePdu(commentPdu); - if (isVerboseComments()) - { - printlnTRACE("*** [CommentPdu narrative sent: " + commentType.name() + "] " + newCommentsList.toString()); - System.out.flush(); - } - } - } - } - - /** - * test for verboseComments mode - * @return whether verboseComments mode is enabled - */ - public boolean isVerboseComments() { - return verboseComments; - } - - /** - * set verboseComments mode - * @param newVerboseComments whether verboseComments mode is enabled - */ - public void setVerboseComments(boolean newVerboseComments) { - this.verboseComments = newVerboseComments; - } - - /** - * @return the TRACE_PREFIX - */ - public String getTRACE_PREFIX() { - return TRACE_PREFIX; - } - - /** - * @param newTRACE_PREFIX the TRACE_PREFIX to set - */ - public final void setTRACE_PREFIX(String newTRACE_PREFIX) { - if (newTRACE_PREFIX == null) - newTRACE_PREFIX = ""; - if (newTRACE_PREFIX.isBlank()) - TRACE_PREFIX = "[" + DisThreadedNetworkInterface.class.getSimpleName() + "] "; - else if (newTRACE_PREFIX.contains(this.getClass().getSimpleName())) - TRACE_PREFIX = "[" + newTRACE_PREFIX + "] "; - else TRACE_PREFIX = "[" + this.getClass().getSimpleName() + " " + newTRACE_PREFIX + "] "; - } - - /** - * Print message with TRACE_PREFIX prepended - * @param message String to print - */ - public void printTRACE(String message) { - System.out.print(TRACE_PREFIX + message); - } - /** - * Print message with TRACE_PREFIX prepended - * @param message String to print - */ - public void printlnTRACE(String message) { - System.out.println(TRACE_PREFIX + message); - } - - /** - * @return the pduFactory, simplifying program imports and configuration - */ - public PduFactory getPduFactory() { - if (pduFactory == null) - pduFactory = new PduFactory(timestampStyle); - return pduFactory; - } - - /** - * @return the disNetworkInterface - */ - public DisThreadedNetworkInterface getDisNetworkInterface() { - return disNetworkInterface; - } - - /** - * @return the thisHostName - */ - public static String getThisHostName() { - return thisHostName; - } - - /** - * @param aThisHostName the thisHostName to set - */ - public static void setThisHostName(String aThisHostName) { - thisHostName = aThisHostName; - } - - /** - * @return the pduRecorder - */ - public PduRecorder getPduRecorder() { - return pduRecorder; - } - - /** - * Get simple descriptor (such as parent class name) for this network interface, used in trace statements - * @return simple descriptor name - */ - public String getDescriptor() { - return descriptor; - } - - /** - * Set new simple descriptor (such as parent class name) for this network interface, used in trace statements - * @param newDescriptor simple descriptor name for this interface - */ - public void setDescriptor(String newDescriptor) { - // might have different DisChannel objects created on different channels, so descriptor is non-static - if (newDescriptor == null) - newDescriptor = ""; - this.descriptor = newDescriptor; - setTRACE_PREFIX(descriptor); - if (disNetworkInterface != null) - disNetworkInterface.setDescriptor(descriptor); - if (simulationManager != null) - simulationManager.setDescriptor(descriptor); - } -} diff --git a/examples/src/OpenDis7Examples/SimulationManager.java b/examples/src/OpenDis7Examples/SimulationManager.java deleted file mode 100644 index 266af451cfb11ed8be6b7a5e67fc1597d3ac2ded..0000000000000000000000000000000000000000 --- a/examples/src/OpenDis7Examples/SimulationManager.java +++ /dev/null @@ -1,703 +0,0 @@ -/* -Copyright (c) 1995-2022 held by the author(s). All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the names of the Naval Postgraduate School (NPS) - Modeling Virtual Environments and Simulation (MOVES) Institute - https://www.nps.edu and https://www.nps.edu/web/moves - nor the names of its contributors may be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -*/ -// TODO move into opendis7 distribution tree - -package OpenDis7Examples; - -import edu.nps.moves.dis7.pdus.CreateEntityPdu; -import edu.nps.moves.dis7.pdus.EntityID; -import edu.nps.moves.dis7.pdus.RemoveEntityPdu; -import edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface; -import edu.nps.moves.dis7.utilities.DisTime; -import java.util.ArrayList; - -/** - * Manage overall Simulation Management (SIMAN) choreography for a DIS channel participant. - * TODO once operation is working satisfactorily, this class will be moved into the opendis7-java distribution utilities. - * @see <a href="https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/-/blob/master/specifications/README.md" target="_blank">Networked Graphics MV3500, Specification Documents, IEEE and SISO</a> - * @see <a href="https://ieeexplore.ieee.org/document/6387564" target="_blank">1278.1-2012. IEEE Standard for Distributed Interactive Simulation (DIS) - Application Protocols</a> 5.6.3 The simulation management computer - * @see <a href="https://ieeexplore.ieee.org/document/587529" target="_blank">1278.3-1996. IEEE Recommended Practice for Distributed Interactive Simulation - Exercise Management and Feedback</a> - * @see IEEE 1278.1 DIS Application Protocols, 4.6.3.a.5 Timestamp, General Requirements, page 43 - * @see IEEE 1278.1 DIS Application Protocols, 4.6.3.c.1 Timestamp, Relative Timestamps, page 44 - * @see IEEE 1278.1 DIS Application Protocols, 5.6 Simulation management, page 89 - * @author brutzman - */ -public class SimulationManager -{ - private DisThreadedNetworkInterface disThreadedNetworkInterface; - private static ArrayList<RecordType> entityRecordList = new ArrayList<>(); - private static ArrayList<RecordType> hostRecordList = new ArrayList<>(); - private static ArrayList<RecordType> applicationRecordList = new ArrayList<>(); - private String descriptor = new String(); - private static int hostID = 0; - - private String TRACE_PREFIX = "[" + (SimulationManager.class.getSimpleName()) + "] "; - - /** - * Object constructor with descriptor - * @param newDescriptor simple descriptor name for this class - */ - public SimulationManager (String newDescriptor) - { - if (newDescriptor != null) - descriptor = newDescriptor.trim(); - else descriptor = ""; - } - /** - * Object constructor - */ - public SimulationManager () - { - this(""); - } - - /** - * Start the simulation according to specifications - */ - public void simulationStart() - { - // TODO - } - /** - * Pause the simulation according to specifications - */ - public void simulationPause() - { - // TODO - } - /** - * Resume the simulation according to specifications - */ - public void simulationResume() - { - // TODO - } - /** - * Stop the simulation according to specifications - */ - public void simulationStop() - { - // TODO - } - /** - * An entity can Join the simulation according to specifications - */ - public void simulationJoin() - { - CreateEntityPdu createEntityPdu = new CreateEntityPdu(); - createEntityPdu.setExerciseID(123); // TODO -// createEntityPdu.setPduStatus(); // TODO - - if (hasDisThreadedNetworkInterface()) - { - for (RecordType entity : entityRecordList) - { - // TODO set record parameters - createEntityPdu.setExerciseID(entity.getId()); - createEntityPdu.setTimestamp(DisTime.getCurrentDisTimestamp()); - disThreadedNetworkInterface.send(createEntityPdu); - } - } - else - { - System.err.println(TRACE_PREFIX + "addEntity() unable to send CreateEntityPdu since no disThreadedNetworkInterface found"); - // TODO consider queue for unsent entities - } - } - /** - * An entity can Leave the simulation according to specifications - */ - public void simulationLeave() - { - // TODO - } - - /** - * Simple simulation record type - */ - public class RecordType - { - private int id = -1; - private String name = new String(); - private String alias = new String(); - private String description = new String(); - private String reference = new String(); - private boolean isHostType = false; - - /** - * Constructor for new record - * @param id identifying number - * @param name common name - * @param description longer description - * @param reference formal reference for this record, if any - */ - public RecordType (int id, String name, String description, String reference) - { - this.id = id; - this.name = name; - this.description = description; - this.reference = reference; - // TODO create alias: if IP address then check for hostname, and vice versa - } - /** - * Utility constructor for new record, description and reference remain blank - * @param id identifying number - * @param name common name - */ - public RecordType (int id, String name) - { - this.id = id; - this.name = name; - this.description = ""; - this.reference = ""; - // TODO create alias: if IP address then check for hostname, and vice versa - } - /** - * Utility constructor for new record, description and reference remain blank - * @param id identifying number - * @param name common name - * @param isHostType whether or not this record is for a host - */ - public RecordType (int id, String name, boolean isHostType) - { - this.id = id; - this.name = name; - this.description = ""; - this.reference = ""; - this.isHostType = isHostType; - // TODO create alias: if IP address then check for hostname, and vice versa - } - - /** - * Simple representation of record - * @return id,name,"description" - */ - @Override - public String toString() - { - return "id" + "," + name + ",\"" + description + "\""; - } - - /** - * get record id - * @return the id - */ - public int getId() { - return id; - } - - /** - * set record id - * @param newID the id to set - * @return same object to permit progressive setters - */ - public RecordType setId(int newID) { - this.id = newID; - return this; - } - - /** - * get record name - * @return the name - */ - public String getName() { - return name; - } - - /** - * set record name - * @param newName the name to set - * @return same object to permit progressive setters - */ - public RecordType setName(String newName) { - this.name = newName; - return this; - } - - /** - * get record description - * @return the description - */ - public String getDescription() { - return description; - } - - /** - * set record description - * @param newDescription the description to set - * @return same object to permit progressive setters - */ - public RecordType setDescription(String newDescription) { - this.description = newDescription; - return this; - } - - /** - * get record reference - * @return the reference - */ - public String getReference() { - return reference; - } - - /** - * set record reference - * @param newReference the reference to set - * @return same object to permit progressive setters - */ - public RecordType setReference(String newReference) { - this.reference = newReference; - return this; - } - - /** - * get record alias name - * @return the alias - */ - public String getAlias() { - return alias; - } - - /** - * set record alias name - * @param alias the alias to set - * @return same object to permit progressive setters - */ - public RecordType setAlias(String alias) { - this.alias = alias; - return this; - } - - /** - * Does record represent a network address - * @return whether record is a network address - */ - public boolean isNetworkAddress() { - return isHostType; - } - - /** - * Set whether record represents a network address - * @param isAddress the isAddress to set - */ - public void setNetworkAddress(boolean isAddress) { - this.isHostType = isAddress; - } - } - - /** - * Get a single entityRecord from list - * @param index which record to retrieve - * @return the record matching this index - */ - public RecordType getEntityRecordByIndex(int index) - { - if (entityRecordList.isEmpty()) - { - System.err.println ("*** getEntityRecordByIndex list is empty, unable to get index=" + index); - return null; - } - else if (entityRecordList.size() <= index) - { - System.err.println ("*** getEntityRecordByIndex list has size=" + entityRecordList.size() + ", unable to get index=" + index); - return null; - } - else if (index < 0) - { - System.err.println ("*** getEntityRecordByIndex cannot retrieve illegal index=" + index); - return null; - } - else return entityRecordList.get(index); - } - - /** - * Get a single hostRecord from list - * @param index which record to retrieve - * @return the record matching this index - */ - public RecordType getHostRecordByIndex(int index) - { - if (hostRecordList.isEmpty()) - { - System.err.println ("*** getHostRecordByIndex list is empty, unable to get index=" + index); - return null; - } - else if (hostRecordList.size() <= index) - { - System.err.println ("*** getHostRecordByIndex list has size=" + hostRecordList.size() + ", unable to get index=" + index); - return null; - } - else if (index < 0) - { - System.err.println ("*** getHostRecordByIndex cannot retrieve illegal index=" + index); - return null; - } - else return hostRecordList.get(index); - } - - /** - * Get a single applicationRecord from list - * @param index which record to retrieve - * @return the record matching this index - */ - public RecordType getApplicationRecordByIndex(int index) - { - if (applicationRecordList.isEmpty()) - { - System.err.println ("*** getApplicationRecordByIndex list is empty, unable to get index=" + index); - return null; - } - else if (applicationRecordList.size() <= index) - { - System.err.println ("*** getApplicationRecordByIndex list has size=" + applicationRecordList.size() + ", unable to get index=" + index); - return null; - } - else if (index < 0) - { - System.err.println ("*** getApplicationRecordByIndex cannot retrieve illegal index=" + index); - return null; - } - else return applicationRecordList.get(index); - } - - /** - * Get a single entityRecord from list matching ID - * @param valueOfInterest id for record to retrieve - * @return the record matching this ID - */ - public RecordType getEntityRecordByID(int valueOfInterest) - { - for (RecordType entity : entityRecordList) - { - if (entity.getId() == valueOfInterest) - return entity; - } - System.err.println ("*** getEntityRecordByID cannot find id=" + valueOfInterest); - return null; - } - /** - * Get a single hostRecord from list matching ID - * @param valueOfInterest id for record to retrieve - * @return the record matching this ID - */ - public RecordType getHostRecordByID(int valueOfInterest) - { - for (RecordType host : hostRecordList) - { - if (host.getId() == valueOfInterest) - return host; - } - System.err.println ("*** getHostRecordByID cannot find id=" + valueOfInterest); - return null; - } - /** - * Get a single applicationRecord from list matching ID - * @param valueOfInterest id for record to retrieve - * @return the record matching this ID - */ - public RecordType getApplicationRecordByID(int valueOfInterest) - { - for (RecordType application : applicationRecordList) - { - if (application.getId() == valueOfInterest) - return application; - } - System.err.println ("*** getApplicationRecordByID cannot find id=" + valueOfInterest); - return null; - } - - /** - * Provide entire entityRecordList - * @return the entityRecordList - */ - public ArrayList<RecordType> getEntityRecordList() { - return entityRecordList; - } - - /** - * Provide entire hostRecordList - * @return the hostRecordList - */ - public ArrayList<RecordType> getHostRecordList() { - return hostRecordList; - } - - /** - * Provide entire applicationRecordList - * @return the applicationRecordList - */ - public ArrayList<RecordType> getApplicationRecordList() { - return applicationRecordList; - } - - /** - * Provide access to current disThreadedNetworkInterface - * @return the disThreadedNetworkInterface - */ - protected DisThreadedNetworkInterface getDisThreadedNetworkInterface() { - return disThreadedNetworkInterface; - } - /** - * Set the disThreadedNetworkInterface singleton to match other classes - * @param disThreadedNetworkInterface the disThreadedNetworkInterface to set - * @return same object to permit progressive setters - */ - public SimulationManager setDisThreadedNetworkInterface(DisThreadedNetworkInterface disThreadedNetworkInterface) { - this.disThreadedNetworkInterface = disThreadedNetworkInterface; - return this; - } - /** - * Check for disThreadedNetworkInterface - * @return whether singleton disThreadedNetworkInterface has been instantiated - */ - protected boolean hasDisThreadedNetworkInterface() - { - return (this.disThreadedNetworkInterface != null); - } - /** - * Create disThreadedNetworkInterface - */ - protected void createDisThreadedNetworkInterface() - { - this.disThreadedNetworkInterface = new DisThreadedNetworkInterface(descriptor); - } - /** - * Constructor for disThreadedNetworkInterface with descriptor, - * using default multicast address and port - * @param newDescriptor simple descriptor name for this interface - */ - protected void createDisThreadedNetworkInterface(String newDescriptor) - { - this.disThreadedNetworkInterface = new DisThreadedNetworkInterface(newDescriptor); - } - /** - * Constructor for disThreadedNetworkInterface using specified multicast address and port - * @param address the multicast group or unicast address to utilize - * @param port the multicast port to utilize - */ - protected void createDisThreadedNetworkInterface(String address, int port) - { - this.disThreadedNetworkInterface = new DisThreadedNetworkInterface(address, port, descriptor); - } - /** - * Constructor for disThreadedNetworkInterface using specified multicast address and port, plus descriptor. - * @param address the multicast group or unicast address to utilize - * @param port the multicast port to utilize - * @param newDescriptor simple descriptor name for this interface - */ - protected void createDisThreadedNetworkInterface(String address, int port, String newDescriptor) - { - this.disThreadedNetworkInterface = new DisThreadedNetworkInterface(address, port, newDescriptor); - } - /** - * Get simple descriptor (such as parent class name) for this SimulationManager, used in trace statements - * @return simple descriptor name - */ - public String getDescriptor() - { - return descriptor; - } - /** - * Set new simple descriptor (such as parent class name) for this SimulationManager, used in trace statements - * @param newDescriptor simple descriptor name for this interface - * @return same object to permit progressive setters */ - public SimulationManager setDescriptor(String newDescriptor) - { - if (newDescriptor != null) - this.descriptor = newDescriptor.trim(); - TRACE_PREFIX = "[" + DisThreadedNetworkInterface.class.getSimpleName() + " " + descriptor + "] "; - return this; - } - /** - * Reset descriptor - * @return same object to permit progressive setters */ - public SimulationManager clearDescriptor() - { - setDescriptor(""); - return this; - } - /** - * clear all lists - * @return same object to permit progressive setters */ - public SimulationManager clearAll() - { - entityRecordList.clear(); - hostRecordList.clear(); - applicationRecordList.clear(); - clearDescriptor(); - return this; - } - /** - * Add entity to simulation list, if this is first occurrence - * @param newEntityID new entity to add - * @return same object to permit progressive setters */ - public SimulationManager addEntity(EntityID newEntityID) - { - RecordType newEntity = new RecordType(newEntityID.getEntityID(), // short - "TODOname", - "TODO description", - "TODO reference"); - entityRecordList.add(newEntity); - return this; - } - /** - * Add entity to simulation list and announce using CreateEntityPdu - * @param newEntity new entity to add - * @return same object to permit progressive setters */ - public SimulationManager addEntity(RecordType newEntity) - { - if (!entityRecordList.contains(newEntity)) - { - // TODO check record type - entityRecordList.add(newEntity); - if (hasDisThreadedNetworkInterface()) - { - CreateEntityPdu createEntityPdu = new CreateEntityPdu(); - // TODO set record parameters - getDisThreadedNetworkInterface().send(createEntityPdu); - } - else - { - System.err.println(TRACE_PREFIX + "addEntity() unable to send CreateEntityPdu since no disThreadedNetworkInterface found"); - // TODO consider queue for unsent entities - } - } - return this; - } - /** - * Remove entity from simulation list, if found - * @param oldEntity old entity to remove - * @return same object to permit progressive setters */ - public SimulationManager removeEntity(RecordType oldEntity) - { - if (!entityRecordList.contains(oldEntity)) - { - // TODO check record type - entityRecordList.remove(oldEntity); - if (hasDisThreadedNetworkInterface()) - { - RemoveEntityPdu removeEntityPdu = new RemoveEntityPdu(); - // TODO set record parameters - getDisThreadedNetworkInterface().send(removeEntityPdu); - } - else - { - System.err.println(TRACE_PREFIX + "removeEntity() unable to send RemoveEntityPdu since no disThreadedNetworkInterface found"); - // TODO consider queue for unsent entities - } - } - return this; - } - /** - * Add host to simulation list, if this is first occurrence - * @param newHost new host to add - * @return same object to permit progressive setters */ - public SimulationManager addHost(String newHost) - { - boolean nameFound = false; - boolean aliasFound = false; - for (RecordType nextRecord : hostRecordList) - { - if ( nextRecord.name.equalsIgnoreCase(newHost.trim())) - nameFound = true; - if (nextRecord.alias.equalsIgnoreCase(newHost.trim())) - aliasFound = true; - if ((nameFound || aliasFound) && !nextRecord.isHostType) - nextRecord.isHostType = true; // make sure - } - if (!nameFound && !aliasFound) - { - RecordType newRecord = new RecordType(hostID, newHost, true); - // TODO set alias to IP number - hostRecordList.add(newRecord); - hostID++; - // no PDU sent - } - return this; - } - /** - * Remove host from simulation list, if found - * @param oldHost old host to remove - * @return same object to permit progressive setters */ - public SimulationManager removeHost(String oldHost) - { - boolean nameFound = false; - boolean aliasFound = false; - for (RecordType nextRecord : hostRecordList) - { - if ( nextRecord.name.equalsIgnoreCase(oldHost.trim())) - nameFound = true; - if (nextRecord.alias.equalsIgnoreCase(oldHost.trim())) - aliasFound = true; - if ((nameFound || aliasFound) && !nextRecord.isHostType) - nextRecord.isHostType = true; // make sure - - if (nameFound || aliasFound) - { - hostRecordList.remove(nextRecord); - // no PDU sent - break; - } - } - return this; - } - - /** Self test to check basic operation, invoked by main() */ - public void selfTest() - { - createDisThreadedNetworkInterface(); - - // TODO - - disThreadedNetworkInterface.close(); // tears down threads and sockets - } - - /** - * Main method for testing. - * @see <a href="https://docs.oracle.com/javase/tutorial/getStarted/application/index.html">Java Tutorials: A Closer Look at the "Hello World!" Application</a> - * @param args [address, port, descriptor] command-line arguments are an array of optional String parameters that are passed from execution environment during invocation - */ - public static void main(String[] args) - { - System.out.println("*** SimulationManager main() self test started..."); - - SimulationManager simulationManager = new SimulationManager("main() self test"); - - simulationManager.setDescriptor("main() self test"); - - simulationManager.selfTest(); - - System.out.println("*** SimulationManager main() self test complete."); - } -} diff --git a/examples/src/OpenDis7Examples/SimulationManagerLog.txt b/examples/src/OpenDis7Examples/SimulationManagerLog.txt deleted file mode 100644 index b75df43da0992c0188cbd98d508028708bfc63d2..0000000000000000000000000000000000000000 --- a/examples/src/OpenDis7Examples/SimulationManagerLog.txt +++ /dev/null @@ -1,21 +0,0 @@ -ant -f C:\\x-nps-gitlab\\NetworkedGraphicsMV3500\\examples -Dnb.internal.action.name=run.single -Djavac.includes=OpenDis7Examples/SimulationManager.java -Drun.class=OpenDis7Examples.SimulationManager run-single -init: -Deleting: C:\x-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 -compile-single: -run-single: -*** SimulationManager main() self test started... -[DisThreadedNetworkInterface] using network interface PANGP Virtual Ethernet Adapter -[DisThreadedNetworkInterface main() self test] datagramSocket.joinGroup address=239.1.2.3 port=3000 isConnected()=false createDatagramSocket() complete. -[DisThreadedNetworkInterface main() self test] createThreads() receiveThread.isAlive()=true -[DisThreadedNetworkInterface main() self test] createThreads() sendingThread.isAlive()=true -*** setKillSentinelAndInterrupts() killed=true sendingThread.isInterrupted()=true receiveThread.isInterrupted()=true -[DisThreadedNetworkInterface main() self test] close(): pdus2send.size()=0 baos.size()=0 dos.size()=0 -[DisThreadedNetworkInterface main() self test] 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 -*** SimulationManager main() self test complete. -BUILD SUCCESSFUL (total time: 2 seconds)