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.logistics.plugin.inventory;
028:
029: import org.cougaar.glm.ldm.asset.Inventory;
030: import org.cougaar.planning.ldm.plan.Task;
031: import org.cougaar.planning.ldm.plan.NewWorkflow;
032:
033: import java.util.ArrayList;
034: import java.util.Iterator;
035:
036: /** The Refill Comparator Module is responsible for deciding whether to
037: * rescind all previous refills and publish all new refills generated
038: * by the total replan refill generator module or whether to
039: * compare and merge the 'old' and 'new' refill tasks. The first
040: * version will simply rescind all old refills and publish all new
041: * refills.
042: * Called by the Refill Generator with the new refills and old refills.
043: * Publishes new Refill tasks and rescinds the old through the InventoryPlugin.
044: * Also applies the new Refill tasks to the Inventory's BG.
045: **/
046:
047: public class RefillComparator extends InventoryModule implements
048: ComparatorModule {
049:
050: /** Need to pass in the IM Plugin for now to get services
051: * and util classes.
052: **/
053: public RefillComparator(InventoryManager imPlugin) {
054: super (imPlugin);
055: }
056:
057: /** Compares the old and new Refill tasks.
058: * Publishes any new Refills and Rescinds any old Refill Tasks.
059: * For now this implementation rescinds ALL old Refills and publishes ALL
060: * new Refill tasks. In the future a smart comparison will be done.
061: * @param newRefills The collection of newly generated Refills from the
062: * RefillGeneratorModule
063: * @param oldRefills The previously generated Refill Tasks
064: * @param inv The Inventory the Refills are refilling.
065: **/
066: public void compareRefills(ArrayList newRefills,
067: ArrayList oldRefills, Inventory inv) {
068: //Rescind all old Refill Tasks
069: Iterator oldIter = oldRefills.iterator();
070: while (oldIter.hasNext()) {
071: Task oldRefill = (Task) oldIter.next();
072: // check for a null in the refills list!
073: if (oldRefill != null) {
074: // clean out the reference in the maintain inventory workflow
075: NewWorkflow nw = (NewWorkflow) oldRefill.getWorkflow();
076: if (nw != null)
077: nw.removeTask(oldRefill);
078: inventoryPlugin.publishRemove(oldRefill);
079: }
080: }
081:
082: //Process all new Refill Tasks
083: LogisticsInventoryPG thePG = (LogisticsInventoryPG) inv
084: .searchForPropertyGroup(LogisticsInventoryPG.class);
085: Iterator newIter = newRefills.iterator();
086: while (newIter.hasNext()) {
087: Task newRefill = (Task) newIter.next();
088: if (inventoryPlugin.publishRefillTask(newRefill, inv)) {
089: thePG.addRefillRequisition(newRefill);
090: } else {
091: if (logger.isDebugEnabled()) {
092: logger
093: .debug("publishRefillTask returned false - not adding Refill task to the BG"
094: + newRefill.getUID());
095: }
096: }
097: }
098: }
099:
100: /** Compares the old and new Refill Projection tasks.
101: * Publishes any new Refill Projections and Rescinds any old Refill Projection Tasks.
102: * For now this implementation rescinds ALL old Refill Projections
103: * and publishes ALL new Refill Projection tasks.
104: * In the future a smart comparison will be done.
105: * Right now this method is almost identical to compareRefills.
106: * @param newRefillProjs The collection of newly generated Refill Projections
107: * from the RefillProjectionsGenerator Module
108: * @param oldRefillProjs The previously generated Refill Projection Tasks
109: * @param inv The Inventory the Refills Projections are refilling.
110: **/
111: public void compareRefillProjections(ArrayList newRefillProjs,
112: ArrayList oldRefillProjs, Inventory inv) {
113: //Rescind all old Refill Projection Tasks
114: Iterator oldIter = oldRefillProjs.iterator();
115: while (oldIter.hasNext()) {
116: Task oldRefillProj = (Task) oldIter.next();
117: // add in a check for a null - nulls and tasks are put in the
118: // refill lists so make sure we don't publish null!
119: if (oldRefillProj != null) {
120: // remove this from the workflow's sub task list first
121: NewWorkflow nw = (NewWorkflow) oldRefillProj
122: .getWorkflow();
123: if (nw != null)
124: nw.removeTask(oldRefillProj);
125: inventoryPlugin.publishRemove(oldRefillProj);
126: }
127: }
128:
129: //Process all new Refill Projection Tasks
130: LogisticsInventoryPG thePG = (LogisticsInventoryPG) inv
131: .searchForPropertyGroup(LogisticsInventoryPG.class);
132: Iterator newIter = newRefillProjs.iterator();
133: while (newIter.hasNext()) {
134: Task newRefillProj = (Task) newIter.next();
135: if (inventoryPlugin.publishRefillTask(newRefillProj, inv)) {
136: thePG.addRefillProjection(newRefillProj);
137: } else {
138: if (logger.isDebugEnabled()) {
139: logger
140: .debug("publishRefillTask returned false - not adding Refill Projection task to the BG"
141: + newRefillProj.getUID());
142: }
143: }
144: }
145: }
146: }
|