01: package org.cougaar.core.qos.profile;
02:
03: import java.lang.reflect.*;
04: import java.io.*;
05: import java.text.*;
06: import java.util.*;
07: import java.util.regex.*;
08: import org.cougaar.core.component.*;
09: import org.cougaar.core.mts.*;
10: import org.cougaar.core.node.*;
11: import org.cougaar.core.qos.metrics.*;
12: import org.cougaar.core.service.*;
13: import org.cougaar.core.service.wp.*;
14: import org.cougaar.core.thread.*;
15: import org.cougaar.core.wp.resolver.*;
16: import org.cougaar.util.*;
17:
18: /**
19: * A utility class to simplify late-binding service lookup.
20: * <p>
21: * This could move into org.cougaar.core.component.
22: */
23: public class ServiceFinder {
24:
25: private ServiceFinder() {
26: }
27:
28: public interface Callback {
29: void foundService(Service s);
30: }
31:
32: public static boolean findServiceLater(String fieldName,
33: String serviceClassName, ServiceBroker sb, Object requestor) {
34: return findServiceLater(sb, serviceClassName, requestor,
35: requestor, fieldName);
36: }
37:
38: public static boolean findServiceLater(final ServiceBroker sb,
39: final String cname, final Object requestor,
40: final Object settable, final String fname) {
41: Class cl;
42: try {
43: cl = Class.forName(cname);
44: } catch (Exception e) {
45: throw new RuntimeException("reflect", e);
46: }
47: final Field f;
48: try {
49: f = settable.getClass().getField(fname);
50: } catch (Exception e) {
51: throw new RuntimeException("reflect", e);
52: }
53: ServiceFinder.Callback sfc = new ServiceFinder.Callback() {
54: public void foundService(Service s) {
55: try {
56: f.set(settable, s);
57: } catch (Exception e) {
58: }
59: }
60: };
61: return findServiceLater(sb, cl, requestor, sfc);
62: }
63:
64: public static boolean findServiceLater(final ServiceBroker sb,
65: final Class cl, final Object requestor, final Callback cb) {
66: final Object req = (requestor == null ? ServiceFinder.class
67: : requestor);
68: if (sb.hasService(cl)) {
69: Service s = (Service) sb.getService(req, cl, null);
70: cb.foundService(s);
71: return true;
72: }
73: ServiceAvailableListener sal = new ServiceAvailableListener() {
74: public void serviceAvailable(ServiceAvailableEvent ae) {
75: if (cl.isAssignableFrom(ae.getService())) {
76: Service s = (Service) sb.getService(req, cl, null);
77: cb.foundService(s);
78: //sb.removeServiceListener(this);
79: }
80: }
81: };
82: sb.addServiceListener(sal);
83: return false;
84: }
85: }
|