View Javadoc

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