001: package org.cougaar.core.qos.profile;
002:
003: import java.lang.reflect.*;
004: import java.io.*;
005: import java.text.*;
006: import java.util.*;
007: import java.util.regex.*;
008: import org.cougaar.core.agent.*;
009: import org.cougaar.core.blackboard.*;
010: import org.cougaar.core.component.*;
011: import org.cougaar.core.mts.*;
012: import org.cougaar.core.node.*;
013: import org.cougaar.core.plugin.*;
014: import org.cougaar.core.qos.metrics.*;
015: import org.cougaar.core.service.*;
016: import org.cougaar.core.service.wp.*;
017: import org.cougaar.core.thread.*;
018: import org.cougaar.core.wp.resolver.*;
019: import org.cougaar.util.*;
020:
021: /**
022: * This component supports the node-level {@link BlackboardSize}
023: * profiler.
024: */
025: public final class BlackboardSizeInAgent extends ComponentPlugin
026: implements BlackboardSizeService.Client {
027:
028: private String name;
029: private BlackboardSizeService bss;
030:
031: private static final String[] CLASSNAMES = new String[] {
032: "java.lang.Object", "org.cougaar.core.util.UniqueObject",
033: "org.cougaar.core.relay.Relay",
034: "org.cougaar.planning.ldm.asset.Asset",
035: "org.cougaar.planning.ldm.plan.Task",
036: "org.cougaar.planning.ldm.plan.Expansion",
037: "org.cougaar.planning.ldm.plan.Aggregation",
038: "org.cougaar.planning.ldm.plan.Allocation",
039: "org.cougaar.planning.ldm.plan.Disposition", };
040: private static final Class[] CLASSES = new Class[CLASSNAMES.length];
041: static {
042: for (int i = 0; i < CLASSNAMES.length; i++) {
043: String s = CLASSNAMES[i];
044: Class cl;
045: try {
046: cl = Class.forName(s);
047: } catch (Exception e) {
048: throw new RuntimeException("classname: " + s, e);
049: }
050: CLASSES[i] = cl;
051: }
052: }
053:
054: private static final int CURRENT = 0;
055: private static final int ADD = 1;
056: private static final int CHANGE = 2;
057: private static final int REMOVE = 3;
058:
059: private final int[] trans = new int[4];
060: private final Map data = new HashMap();
061: private final int[][] values = new int[CLASSES.length][4];
062: private final IncrementalSubscription[] subs = new IncrementalSubscription[CLASSES.length];
063:
064: public void load() {
065: super .load();
066:
067: for (int i = 0; i < CLASSNAMES.length; i++) {
068: String s = CLASSNAMES[i];
069: int j = s.lastIndexOf('.');
070: String s2 = (j < 0 ? s : s.substring(j + 1));
071: int[] ia = new int[4];
072: data.put(s2, ia);
073: values[i] = ia;
074: }
075: data.put("transactions", trans);
076:
077: bss = (BlackboardSizeService) getServiceBroker().getService(
078: this , BlackboardSizeService.class, null);
079: if (bss == null) {
080: throw new RuntimeException("Unable to obtain bss");
081: }
082: }
083:
084: protected void setupSubscriptions() {
085: for (int i = 0; i < CLASSES.length; i++) {
086: final Class cl = CLASSES[i];
087: UnaryPredicate p = new UnaryPredicate() {
088: public boolean execute(Object o) {
089: return cl.isAssignableFrom(o.getClass());
090: }
091: };
092: subs[i] = (IncrementalSubscription) blackboard.subscribe(p);
093: }
094: }
095:
096: protected void execute() {
097: trans[CURRENT]++;
098: trans[ADD]++;
099: for (int i = 0; i < CLASSES.length; i++) {
100: IncrementalSubscription sub = subs[i];
101: if (sub.hasChanged()) {
102: int[] ia = values[i];
103: ia[CURRENT] = sub.size();
104: ia[ADD] += sub.getAddedCollection().size();
105: ia[CHANGE] += sub.getChangedCollection().size();
106: ia[REMOVE] += sub.getRemovedCollection().size();
107: }
108: }
109: }
110:
111: public String getName() {
112: return getAgentIdentifier().getAddress();
113: }
114:
115: // String type => int[] { current, added, changed, removed };
116: public Map getData() {
117: return data;
118: }
119: }
|