Skip to content
Snippets Groups Projects
SimpleServer.java 5.54 KiB
package mv3302;

import simkit.Priority;
import simkit.SimEntityBase;
import simkit.random.RandomVariate;

/**
 * Class that simulates a simple server by extending SimEntityBase
 *
 * @author dansl
 */
public class SimpleServer extends SimEntityBase {

    // Instance variables to hold the changing states during the simulation
    protected int numberInQueue;
    protected int numberAvailableServers;
    protected int numberServed;
    // Instance variables that hold the build settings of the simulation
    private int totalNumberServers;
    private RandomVariate serviceTimeGenerator;

    /**
     * Constructor method for the SimpleServer class; initializes the number of
     * servers and service times for the simulation
     *
     * @param numberServers
     * @param serviceTime
     */
    public SimpleServer(int numberServers, RandomVariate serviceTime) {
        totalNumberServers = numberServers;
        serviceTimeGenerator = serviceTime;
    }

    /**
     * Getter method for number of customers in the queue
     *
     * @return the numberInQueue
     */
    public int getNumberInQueue() {
        return numberInQueue;
    }

    /**
     * Getter method for the number of servers available in the simulation
     *
     * @return the numberAvailableServers
     */
    public int getNumberAvailableServers() {
        return numberAvailableServers;
    }

    /**
     * Getter method returns the total number of customers complete through the
     * processing process
     *
     * @return the numberServed
     */
    public int getNumberServed() {
        return numberServed;
    }

    /**
     * Getter method that returns the total number of servers in the simulation
     *
     * @return the totalNumberServers
     */
    public int getTotalNumberServers() {
        return totalNumberServers;
    }
    /**
     * Setter method sets the total number of servers the simulation will use
     *
     * @param totalNumberServers
     * @throws IllegalArgumentException if totalNumberServers <= 0 @ param
     * totalNumberServers the totalNumberServers
     */
    public void setTotalNumberServers(int totalNumberServers) {
        if (totalNumberServers <= 0) {
            throw new IllegalArgumentException("totalNumberServers must be > 0: "
                    + totalNumberServers);
        }
        this.totalNumberServers = totalNumberServers;
    }

    /**
     * Getter method that returns a service time value
     *
     * @return the serviceTimeGenerator
     */
    public RandomVariate getServiceTimeGenerator() {
        return serviceTimeGenerator;
    }

    /**
     * setter method that sets a service time value
     *
     * @param serviceTimeGenerator the serviceTimeGenerator to set
     */
    public void setServiceTimeGenerator(RandomVariate serviceTimeGenerator) {
        this.serviceTimeGenerator = serviceTimeGenerator;
    }

    /**
     * Reset method that returns the simulation to it's original state
     */
    @Override
    public void reset() {
        super.reset();
        numberInQueue = 0;
        numberAvailableServers = totalNumberServers;
        numberServed = 0;
    }

    /**
     * Run method fires the state changes to update the listeners
     */
    public void doRun() {
        firePropertyChange("numberInQueue", getNumberInQueue());
        firePropertyChange("numberAvailableServers", getNumberAvailableServers());
        firePropertyChange("numberServed", getNumberServed());
    }

    /**
     * Creates an arrival event, alters the total number of arrivals and
     * schedules the next event
     */
    public void doArrival() {
        int oldNumberInQueue = getNumberInQueue();
        numberInQueue = numberInQueue + 1;
        firePropertyChange("numberInQueue", oldNumberInQueue, getNumberInQueue());

        if (getNumberAvailableServers() > 0) {
            waitDelay("StartService", 0.0, Priority.HIGH);
        }
    }

    /**
     * Method decreases the number of customers waiting in the queue and the
     * number of available servers. Method then fires those changes for the
     * listeners then schedules the EndService
     */
    public void doStartService() {
        int oldNumberInQueue = getNumberInQueue();
        int oldNumberAvailableServers = getNumberAvailableServers();
        numberAvailableServers = numberAvailableServers - 1;
        numberInQueue = numberInQueue - 1;
        firePropertyChange("numberInQueue", oldNumberInQueue, getNumberInQueue());
        firePropertyChange("numberAvailableServers", oldNumberAvailableServers, getNumberAvailableServers());
        waitDelay("EndService", getServiceTimeGenerator());
    }

    /**
     * Method increases the number of customers that have been served and the
     * number of available servers. Method then fires those changes for the
     * listeners and schedules the StartService as long as the queue is greater
     * than one.
     */
    public void doEndService() {
        int oldNumberAvailableServers = getNumberAvailableServers();
        numberAvailableServers = numberAvailableServers + 1;
        int oldNumberServed = getNumberServed();
        numberServed = numberServed + 1;
        firePropertyChange("numberAvailableServers", oldNumberAvailableServers, getNumberAvailableServers());
        firePropertyChange("numberServed", oldNumberServed, getNumberServed());
        if (getNumberInQueue() > 0) {
            waitDelay("StartService", 0.0, Priority.HIGH);
        }
    }
}