01: /*
02: * <copyright>
03: *
04: * Copyright 1997-2004 BBNT Solutions, LLC
05: * under sponsorship of the Defense Advanced Research Projects
06: * Agency (DARPA).
07: *
08: * You can redistribute this software and/or modify it under the
09: * terms of the Cougaar Open Source License as published on the
10: * Cougaar Open Source Website (www.cougaar.org).
11: *
12: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
14: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
15: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
16: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
18: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23: *
24: * </copyright>
25: */
26:
27: package org.cougaar.planning.ldm.plan;
28:
29: import java.util.HashMap;
30:
31: import org.cougaar.util.UnaryPredicate;
32:
33: /**
34: * A useful predicate class and generator for selecting
35: * predicates by type. Assumes that it will only be
36: * called on Preferences (or it will get a ClassCastException).
37: **/
38:
39: public final class PreferencePredicate implements UnaryPredicate {
40: private final int aspect;
41:
42: private PreferencePredicate(int a) {
43: aspect = a;
44: }
45:
46: public boolean execute(Object o) {
47: return (aspect == ((Preference) o).getAspectType());
48: }
49:
50: private static final UnaryPredicate predVector[];
51: private static final HashMap predTable = new HashMap(11);
52: static {
53: int l = AspectType._ASPECT_COUNT;
54: predVector = new UnaryPredicate[l];
55: for (int i = 0; i < l; i++) {
56: predVector[i] = new PreferencePredicate(i);
57: }
58: }
59:
60: /** @return a unary predicate which returns true IFF the object
61: * preference's aspect type is the same as the argument.
62: **/
63: public static UnaryPredicate get(int aspectType) {
64: if (aspectType < 0)
65: throw new IllegalArgumentException();
66:
67: if (aspectType <= AspectType._LAST_ASPECT) {
68: // handle the common ones from a pre-initialized vector
69: return predVector[aspectType];
70: } else {
71: // hash on the aspectType for the rest.
72: Integer k = new Integer(aspectType);
73: UnaryPredicate p;
74: if ((p = (UnaryPredicate) predTable.get(k)) != null)
75: return p;
76: synchronized (predTable) {
77: //if ((p = predTable.get(k)) != null) return p;
78: p = new PreferencePredicate(aspectType);
79: predTable.put(k, p);
80: return p;
81: }
82: }
83: }
84: }
|