View Javadoc

    1   /*
    2    * @(#) Counter.java Sep 21, 2003
    3    *
    4    * Copyright (c) 2003 Delft University of Technology Jaffalaan 5, 2628 BX Delft,
    5    * the Netherlands All rights reserved.
    6    *
    7    * This software is proprietary information of Delft University of Technology
    8    * The code is published under the General Public License
    9    */
    10  package nl.tudelft.simulation.dsol.statistics;
    11
    12  import java.rmi.RemoteException;
    13
    14  import javax.naming.InitialContext;
    15  import javax.naming.NamingException;
    16
    17  import nl.tudelft.simulation.dsol.context.ContextUtil;
    18  import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
    19  import nl.tudelft.simulation.event.Event;
    20  import nl.tudelft.simulation.event.EventInterface;
    21  import nl.tudelft.simulation.event.EventProducerInterface;
    22  import nl.tudelft.simulation.event.EventType;
    23  import nl.tudelft.simulation.logger.Logger;
    24
    25  /***
    26   * The counter extends the counter and links this it to the dsol framework <br>
    27   * (c) copyright 2003 <a href="http://www.simulation.tudelft.nl">Delft
    28   * University of Technology </a>, the Netherlands. <br>
    29   * See for project information <a href="http://www.simulation.tudelft.nl">
    30   * www.simulation.tudelft.nl </a> <br>
    31   * License of use: <a href="http://www.gnu.org/copyleft/gpl.html">General Public
    32   * License (GPL) </a>, no warranty <br>
    33   *
    34   * @version 1.0 18.08.2003 <br>
    35   * @author <a href="http://www.simulation.tudelft.nl/people/jacobs.html">Peter
    36   *         Jacobs </a>
    37   */
    38  public class Counter extends nl.tudelft.simulation.jstats.statistics.Counter
    39  {
    40  	/*** the simulator to subscribe to and from */
    41  	private SimulatorInterface simulator = null;
    42
    43  	/*** we stopped the counter */
    44  	private boolean stopped = false;
    45
    46  	/***
    47  	 * constructs a new Counter
    48  	 *
    49  	 * @param description refers to the description of this counter
    50  	 * @param simulator the simulator
    51  	 * @throws RemoteException on network failure
    52  	 */
    53  	public Counter(final String description, final SimulatorInterface simulator)
    54  			throws RemoteException
    55  	{
    56  		super(description);
    57  		this.simulator = simulator;
    58  		if (this.simulator.getSimulatorTime() > this.simulator.getReplication()
    59  				.getRunControl().getWarmupPeriod())
    60  		{
    61  			this.initialize();
    62  		} else
    63  		{
    64  			this.simulator.addListener(this, SimulatorInterface.WARMUP_EVENT,
    65  					false);
    66  		}
    67  		this.simulator.addListener(this,
    68  				SimulatorInterface.END_OF_REPLICATION_EVENT, false);
    69  		ContextUtil.bindToContext(simulator, this);
    70  	}
    71
    72  	/***
    73  	 * constructs a new Counter
    74  	 *
    75  	 * @param description the description
    76  	 * @param simulator the simulator of this model
    77  	 * @param target the target on which to count
    78  	 * @param field the field which is counted
    79  	 * @throws RemoteException on network failure
    80  	 */
    81  	public Counter(final String description,
    82  			final SimulatorInterface simulator,
    83  			final EventProducerInterface target, final EventType field)
    84  			throws RemoteException
    85  	{
    86  		this(description, simulator);
    87  		target.addListener(this, field, false);
    88  	}
    89
    90  	/***
    91  	 * @see nl.tudelft.simulation.event.EventListenerInterface
    92  	 *      #notify(nl.tudelft.simulation.event.EventInterface)
    93  	 */
    94  	public void notify(final EventInterface event)
    95  	{
    96  		if (this.stopped)
    97  		{
    98  			return;
    99  		}
    100 		try
    101 		{
    102 			if (event.getSource().equals(this.simulator))
    103 			{
    104 				if (event.getType().equals(SimulatorInterface.WARMUP_EVENT))
    105 				{
    106 					this.simulator.removeListener(this,
    107 							SimulatorInterface.WARMUP_EVENT);
    108 					super.initialize();
    109 					return;
    110 				}
    111 				if (event.getType().equals(
    112 						SimulatorInterface.END_OF_REPLICATION_EVENT))
    113 				{
    114 					this.stopped = true;
    115 					this.simulator.removeListener(this,
    116 							SimulatorInterface.END_OF_REPLICATION_EVENT);
    117 					this.endOfReplication();
    118 					return;
    119 				}
    120 			} else if (this.isInitialized())
    121 			{
    122 				super.notify(event);
    123 			}
    124 		} catch (RemoteException remoteException)
    125 		{
    126 			Logger.warning(this, "notify", remoteException);
    127 		}
    128 	}
    129
    130 	/***
    131 	 * endOfReplication is invoked to store the final results
    132 	 */
    133 	protected void endOfReplication()
    134 	{
    135 		try
    136 		{
    137 			String[] parts = nl.tudelft.simulation.naming.context.ContextUtil
    138 					.resolveKey(this).split("/");
    139 			String key = "";
    140 			for (int i = 0; i < parts.length; i++)
    141 			{
    142 				if (i != parts.length - 2)
    143 				{
    144 					key = key + parts[i] + "/";
    145 				}
    146 			}
    147 			key = key.substring(0, key.length() - 1);
    148 			nl.tudelft.simulation.jstats.statistics.Tally tally = null;
    149 			try
    150 			{
    151 				tally = (nl.tudelft.simulation.jstats.statistics.Tally) new InitialContext()
    152 						.lookup(key);
    153 			} catch (NamingException exception)
    154 			{
    155 				tally = new nl.tudelft.simulation.jstats.statistics.Tally(
    156 						this.description);
    157 				new InitialContext().bind(key, tally);
    158 				tally.initialize();
    159 			}
    160 			tally.notify(new Event(null, this, new Long(this.count)));
    161 		} catch (Exception exception)
    162 		{
    163 			Logger.warning(this, "endOfReplication", exception);
    164 		}
    165 	}
    166 }