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.core.qos.frame;
028:
029: import java.util.HashMap;
030: import java.util.HashSet;
031: import java.util.Iterator;
032: import java.util.Map;
033: import java.util.Set;
034:
035: import org.cougaar.core.component.ServiceBroker;
036: import org.cougaar.core.component.ServiceProvider;
037: import org.cougaar.core.plugin.ParameterizedPlugin;
038: import org.cougaar.core.service.BlackboardService;
039:
040: /**
041: * This plugin provides the {@link FrameSetService}, which is
042: * implemented by an inner class.
043: */
044: public class FrameSetServicePlugin extends ParameterizedPlugin
045: implements ServiceProvider {
046: private FrameSetService impl;
047: private HashMap sets;
048: private HashMap pending;
049:
050: public void load() {
051: super .load();
052:
053: sets = new HashMap();
054: pending = new HashMap();
055:
056: ServiceBroker sb = getServiceBroker();
057:
058: impl = new Impl();
059: sb.addService(FrameSetService.class, this );
060:
061: }
062:
063: // plugin
064: protected void execute() {
065: handleCallbacks();
066: }
067:
068: protected void setupSubscriptions() {
069: }
070:
071: // ServiceProvider Interface
072: public Object getService(ServiceBroker sb, Object requestor,
073: Class serviceClass) {
074: if (serviceClass == FrameSetService.class) {
075: return impl;
076: } else {
077: return null;
078: }
079: }
080:
081: public void releaseService(ServiceBroker sb, Object requestor,
082: Class serviceClass, Object service) {
083: }
084:
085: private FrameSet makeSet(String name, String xml_filename,
086: ServiceBroker sb, BlackboardService bbs)
087:
088: {
089: FrameSet set = null;
090: synchronized (sets) {
091: FrameSetParser parser = new FrameSetParser(sb, bbs);
092: set = parser.parseFrameSetFile(name, xml_filename);
093: sets.put(name, set);
094: }
095:
096: BlackboardService my_bbs = getBlackboardService();
097: my_bbs.signalClientActivity();
098:
099: return set;
100: }
101:
102: private FrameSet makeSet(String name, String[] xml_filenames,
103: ServiceBroker sb, BlackboardService bbs)
104:
105: {
106: FrameSet set = null;
107: synchronized (sets) {
108: FrameSetParser parser = new FrameSetParser(sb, bbs);
109: set = parser.parseFrameSetFiles(name, xml_filenames);
110: sets.put(name, set);
111: }
112:
113: BlackboardService my_bbs = getBlackboardService();
114: my_bbs.signalClientActivity();
115:
116: return set;
117: }
118:
119: private void doCallback(FrameSetService.Callback cb, String name,
120: FrameSet set) {
121: cb.frameSetAvailable(name, set);
122: }
123:
124: private void handleCallbacks() {
125: synchronized (sets) {
126: Iterator itr = pending.entrySet().iterator();
127: while (itr.hasNext()) {
128: Map.Entry entry = (Map.Entry) itr.next();
129: String name = (String) entry.getKey();
130: HashSet callbacks = (HashSet) entry.getValue();
131: FrameSet set = (FrameSet) sets.get(name);
132: if (set == null || callbacks == null)
133: continue;
134:
135: Iterator sub_itr = callbacks.iterator();
136: while (sub_itr.hasNext()) {
137: FrameSetService.Callback cb = (FrameSetService.Callback) sub_itr
138: .next();
139: doCallback(cb, name, set);
140: }
141: itr.remove();
142: }
143: }
144: }
145:
146: private FrameSet doRequest(String name, FrameSetService.Callback cb) {
147: synchronized (sets) {
148: FrameSet set = (FrameSet) sets.get(name);
149: if (set != null) {
150: return set;
151: } else if (cb != null) {
152: HashSet callbacks = (HashSet) pending.get(name);
153: if (callbacks == null) {
154: callbacks = new HashSet();
155: pending.put(name, callbacks);
156: }
157: callbacks.add(cb);
158: return null;
159: } else {
160: return null;
161: }
162: }
163: }
164:
165: private class Impl implements FrameSetService {
166: public FrameSet findFrameSet(String name, Callback cb) {
167: return doRequest(name, cb);
168: }
169:
170: public FrameSet loadFrameSet(String name, String xml_filename,
171: ServiceBroker sb, BlackboardService bbs) {
172: return makeSet(name, xml_filename, sb, bbs);
173: }
174:
175: public FrameSet loadFrameSet(String name,
176: String[] xml_filenames, ServiceBroker sb,
177: BlackboardService bbs) {
178: return makeSet(name, xml_filenames, sb, bbs);
179: }
180:
181: public Set getNames() {
182: synchronized (sets) {
183: return new HashSet(sets.keySet());
184: }
185: }
186: }
187:
188: }
|