001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026:
027: package org.cougaar.mlm.examples;
028:
029: import java.util.Date;
030: import java.util.Vector;
031:
032: import org.cougaar.core.mts.MessageAddress;
033: import org.cougaar.planning.ldm.ClusterServesPlugin;
034: import org.cougaar.planning.plugin.legacy.SimplePlugin;
035:
036: /**
037: * this plugin is a point-test for (demo-time) clock advance functionality.
038: * It can do two things:
039: * 1. when it is passed an argument, it is a clock setter, advancing the
040: * COUGAAR time by 10 minutes every 10 (realtime) seconds.
041: * 2. otherwise it sets wake timers 30 minutes in advance of the current
042: * time each time it is waked, reporting on the current time each time
043: * around.
044: *
045: * So, it shows examples of:
046: * 1. how to set the society time (be careful!)
047: * 2. how to look at the society time.
048: * 3. how to request that your plugin be activated approximately at a
049: * specific scenario time (or after scenario time has elapsed).
050: * 4. how to code a timer based on real (system) time.
051: *
052: * to try it out:
053: * One cluster ini file should have the following line (for the advancer)
054: * plugin = org.cougaar.mlm.examples.ClockTest(advance)
055: * another cluster should have (for the watcher):
056: * plugin = org.cougaar.mlm.examples.ClockTest
057: **/
058:
059: public class ClockTest extends SimplePlugin {
060: ClusterServesPlugin cluster = null;
061: MessageAddress cid = null;
062:
063: public ClockTest() {
064: setThreadingChoice(SINGLE_THREAD);
065: }
066:
067: // "initialization" method
068: public void setupSubscriptions() {
069: cluster = getCluster();
070: cid = getMessageAddress();
071:
072: System.err.println("ClockTest at " + cid + " initializing.");
073: // see if we are a supposed to be a setter
074: Vector argv = getParameters();
075: if (argv != null && argv.size() > 0) {
076: startAdvancer();
077: } else {
078: // set up a waker
079: nextWake();
080: }
081:
082: // don't actually set up any subscriptions
083: }
084:
085: public void execute() {
086: System.err.println("ClockTest at " + cid + " executing at "
087: + new Date(currentTimeMillis()));
088: nextWake();
089: }
090:
091: private void nextWake() {
092: long ms = currentTimeMillis() + (30 * 60 * 1000); // wake in 30 minutes
093:
094: System.err.println("ClockTest at " + cid + " will wake at "
095: + new Date(ms));
096: wakeAt(ms);
097: }
098:
099: private void startAdvancer() {
100: System.err
101: .println("ClockTest at " + cid + " starting advancer");
102:
103: Thread t = new Thread(new Advancer());
104: t.start();
105: }
106:
107: private class Advancer implements Runnable {
108: public void run() {
109: while (true) {
110:
111: // sleep for 10 seconds
112: try {
113: synchronized (this ) {
114: this .wait(10 * 1000);
115: }
116: } catch (InterruptedException ie) {
117: }
118:
119: // advance the clock by 10 minutes
120:
121: // Note - we can do this directly (without a transaction)
122: // because time is not LDM controlled.
123: System.err
124: .println("ClockTest at "
125: + cid
126: + " Advancing to "
127: + new Date(
128: currentTimeMillis() + 10 * 60 * 1000));
129: cluster.advanceTime(10 * 60 * 1000);
130:
131: // if we were using this loop to *activate* the plugin
132: // every 10 (realtime) seconds, we'd do something like:
133: // plugin.wake();
134: }
135: }
136: }
137: }
|