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.lib.util;
028:
029: import java.util.Date;
030:
031: import org.cougaar.planning.ldm.plan.AspectType;
032: import org.cougaar.planning.ldm.plan.Task;
033: import org.cougaar.util.log.Logger;
034:
035: /**
036: * Helper classes to see if a task is consistent and
037: * reasonable.
038: */
039: public class UTILVerify {
040: public UTILVerify(Logger log) {
041: this .logger = log;
042: prefHelper = new UTILPreference(logger);
043: }
044:
045: /**
046: * See if the time between the START_TIME preference and END_TIME
047: * preference (latest date) is at least as long as the given duration.
048: * @param t task to verify
049: * @param durInMillis duration to use (in millis)
050: * @return true if task has duration of at least as long as the
051: * duration d, false otherwise.
052: */
053: public boolean exceedsTaskDuration(Task t, long durInMillis) {
054: Date start_time = prefHelper.getReadyAt(t);
055: Date late_time = prefHelper.getLateDate(t);
056:
057: if (late_time.before(start_time)) {
058: return false;
059: }
060: long diff = late_time.getTime() - start_time.getTime();
061: return (diff >= durInMillis);
062: }
063:
064: private static final long TWO_YEARS = 2 * 365 * 24 * 60 * 60l;
065:
066: /**
067: * Verify a few things in the task. The things verified are:
068: * END_TIME, verify that the earliest comes before the best and latest,
069: * and that the best comes before the latest.
070: * START_TIME, verify that the start time comes before the END_TIME
071: * earliest time.
072: */
073: public boolean isTaskTimingCorrect(Task t) {
074: Date start_time = prefHelper.getReadyAt(t);
075: Date early_time = prefHelper.getEarlyDate(t);
076: Date best_time = prefHelper.getBestDate(t);
077: Date late_time = prefHelper.getLateDate(t);
078:
079: if (!late_time.before(best_time)
080: && !best_time.before(early_time)
081: && !(early_time.before(start_time) && (start_time
082: .getTime()
083: - early_time.getTime() < TWO_YEARS))) {
084: return true;
085: }
086: return false;
087: }
088:
089: public boolean hasRequiredFields(Task t) {
090: return (hasDirectObject(t) && hasStartPreference(t) && hasEndPreference(t));
091: }
092:
093: public boolean hasDirectObject(Task t) {
094: return (t.getDirectObject() != null);
095: }
096:
097: public boolean hasStartPreference(Task t) {
098: return (prefHelper.hasPrefWithAspectType(t,
099: AspectType.START_TIME));
100: }
101:
102: public boolean hasEndPreference(Task t) {
103: return (prefHelper
104: .hasPrefWithAspectType(t, AspectType.END_TIME));
105: }
106:
107: /**
108: * @return String explaining what's wrong with task
109: */
110: public String reportDurationError(Task t, long durInMillis) {
111: Date start_time = prefHelper.getReadyAt(t);
112: Date late_time = prefHelper.getLateDate(t);
113:
114: if (late_time.before(start_time)) {
115: return "Late arrival (" + late_time + ") is before start ("
116: + start_time + ").";
117: }
118:
119: long td = late_time.getTime() - start_time.getTime();
120: if (durInMillis == -1)
121: return "Task duration, ready at->late arrival (" + td
122: / 3600000 + " hours) is too short.";
123:
124: return "Task duration, ready at->late arrival (" + td / 3600000
125: + " hours) is shorter than (" + durInMillis / 3600000
126: + " hours).";
127: }
128:
129: /**
130: * @return String explaining what's wrong with task
131: */
132: public String reportTimingError(Task t) {
133: Date start_time = prefHelper.getReadyAt(t);
134: Date early_time = prefHelper.getEarlyDate(t);
135: Date best_time = prefHelper.getBestDate(t);
136: Date late_time = prefHelper.getLateDate(t);
137:
138: if (late_time.before(best_time))
139: return "Latest arrival (" + late_time
140: + ") is before best (" + best_time + ").";
141: if (best_time.before(early_time))
142: return "Best arrival (" + best_time
143: + ") is before earliest (" + early_time + ").";
144:
145: return "Earliest arrival (" + early_time
146: + ") is before start (" + start_time + ").";
147: }
148:
149: protected Logger logger;
150: protected UTILPreference prefHelper;
151: }
|