001: /*
002: * CoadunationLib: The coaduntion implementation library.
003: * Copyright (C) 2006 Rift IT Contracting
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
018: *
019: * TestMonitor.java
020: *
021: * This file contains the definition of the test monitor. It can be setup to
022: * monitor a test such as the loading of a test jar.
023: */
024:
025: // The package path
026: package com.rift.coad.lib.deployment.test;
027:
028: // java imports
029: import java.util.List;
030: import java.util.ArrayList;
031: import java.util.StringTokenizer;
032: import java.util.Date;
033:
034: // coadunation imports
035: import com.rift.coad.lib.configuration.Configuration;
036: import com.rift.coad.lib.configuration.ConfigurationFactory;
037:
038: /**
039: * This file contains the definition of the test monitor. It can be setup to
040: * monitor a test such as the loading of a test jar.
041: *
042: * @author Brett Chaldecott
043: */
044: public class TestMonitor {
045:
046: // class static singleton object
047: private static TestMonitor singleton = null;
048:
049: // the class member variables
050: private long timeout = 0;
051: private List entries = null;
052:
053: /**
054: * Creates a new instance of TestMonitor
055: *
056: * @exception TestException
057: */
058: private TestMonitor() throws TestException {
059: try {
060: // init the array list
061: entries = new ArrayList();
062:
063: // retrieve the configuration
064: Configuration config = ConfigurationFactory.getInstance()
065: .getConfig(this .getClass());
066:
067: // create the string tokenizer
068: timeout = config.getLong("Timeout");
069: StringTokenizer stringTok = new StringTokenizer(config
070: .getString("Monitor"), ",");
071: while (stringTok.hasMoreTokens()) {
072: entries.add(stringTok.nextToken());
073: }
074:
075: } catch (Exception ex) {
076: throw new TestException("Failed to init the test monitor.",
077: ex);
078: }
079: }
080:
081: /**
082: * This method is responsible for initializing the test monitor singleton.
083: *
084: * @exception TestException
085: */
086: public static synchronized void init() throws TestException {
087: singleton = new TestMonitor();
088: }
089:
090: /**
091: * This method returns an instance of the test monitor object.
092: *
093: * @return The reference to the test object.
094: * @exception TestException
095: */
096: public static synchronized TestMonitor getInstance()
097: throws TestException {
098: if (singleton != null) {
099: return singleton;
100: }
101: throw new TestException(
102: "The test monitor has not been initialized.");
103: }
104:
105: /**
106: * This method alerts the monitoring thread to the fact that it is complete.
107: *
108: * @param element The element to monitor.
109: * @exception TestException
110: */
111: public synchronized void alert(String element) throws TestException {
112: if (entries.contains(element)) {
113: entries.remove(element);
114: notify();
115: }
116: }
117:
118: /**
119: * This method will be called to monitor the test to determine if the test
120: * was successfull.
121: *
122: * @exception TestException
123: */
124: public synchronized void monitor() throws TestException {
125: try {
126: Date startTime = new Date();
127: while (entries.size() > 0) {
128: wait(timeout);
129: Date currentTime = new Date();
130: if ((currentTime.getTime() - timeout) > startTime
131: .getTime()) {
132: break;
133: }
134: }
135: } catch (Exception ex) {
136: throw new TestException("Monitoring failed because : "
137: + ex.getMessage(), ex);
138: }
139:
140: // the entries to monitor
141: if (entries.size() > 0) {
142: String entryString = new String();
143: String sep = "";
144: for (int count = 0; count < entries.size(); count++) {
145: entryString += sep + entries.get(count).toString();
146: sep = ":";
147: }
148: throw new TestException(
149: "Monitor test failed because not all monitored entries "
150: + "reported successfully [" + entryString
151: + "]");
152: }
153: }
154: }
|