// Protocol.java package support; // protocol support package import java.util.*; // import Java utility classes /** This is the base class for protocols. @author Iain A. Robin, Kenneth J. Turner @version 1.0 (1st September 1999, IAR): initial version
1.4 (9th March 2006, KJT): updated for JDK 1.5
1.5 (27th July 2010, KJT): minor tidying */ public abstract class Protocol { /** Protocol entity list */ protected Vector entities; /** Protocol medium */ protected Medium medium; /** Return the protocol entity list @return protocol entities */ public Vector getEntities() { return(entities); } /** Return the column used by the medium. @return medium column number */ public int getMediumColumn() { return(entities.indexOf(medium)); } /** Return the random numbers maintained by a protocol. By default this does nothing, but can be overriden by particular protocols. The numbers are stored in a scenario file. @return random number list */ public Vector getRandomNumbers() { return(null); } /** Return the services offered by a protocol (normally overriden by an actual protocol). @return The services value */ public Vector getServices() { Vector list = new Vector(); for (Enumeration ee = entities.elements(); ee.hasMoreElements(); ) { ProtocolEntity entity = (ProtocolEntity) ee.nextElement(); for (Enumeration se = entity.getServices().elements(); se.hasMoreElements(); ) list.addElement(entity.getName() + ": " + (String) se.nextElement()); } return(list); } /** Initialise all protocol entities. */ public void init() { for (Enumeration enumeration = entities.elements(); enumeration.hasMoreElements(); ) { ProtocolEntity entity = (ProtocolEntity) enumeration.nextElement(); entity.initialise(); } } /** Perform service specified by the action string. This consists of an entity name and a service. First, identify the entity providing the service. @param action action @return resulting protocol events */ public Vector performService(String action) { for (Enumeration en = entities.elements(); en.hasMoreElements(); ) { ProtocolEntity entity = (ProtocolEntity) en.nextElement(); String name = entity.getName(); if (action.startsWith(name)) { String service = // remove entity name and ":" action.substring(name.length() + 2); Vector events = // service string to entity entity.performService(service); // check if any event contains a PDU whose timer needs to be enabled for (Enumeration enumeration = events.elements(); enumeration.hasMoreElements(); ) { ProtocolEvent event = (ProtocolEvent) enumeration.nextElement(); if (event == null) break; PDU pdu = event.getPDU(); if (pdu == null) break; ProtocolEntity source = pdu.getSource(); if (source != null && source instanceof Timeouts) { Timeouts sender = (Timeouts) source; if (sender.hasTimer(pdu.type)) { // this PDU type has a timer sender.setTimer(pdu, entity == medium); break; // don't time response PDUs } } } return(events); } } return(null); // entity name not recognised } /** This method is called by the protocol simulator. Override this method to allow protocol-specific parameters to be set externally (e.g. from JavaScript). The standard support is for a medium type. @param parameter parameter name @param value parameter value */ public void setParameter(String parameter, String value) { if (parameter.equals("mediumType")) try { medium.setMediumType(Integer.parseInt(value)); } catch (NumberFormatException exception) { // invalid numeric value System.out.println("number format exception for parameter '" + parameter + "' with value '" + value + "'"); } } /** Set the random numbers maintained by a protocol. By default this does nothing, but can be overriden by particular protocols. The numbers are retrieved from a scenario file. @param randoms random number list */ public void setRandomNumbers(Vector randoms) { } }