1 package org.lsst.ccs.plugin.jas3.trending;
2
3 import com.sun.jersey.api.client.WebResource;
4 import java.io.IOException;
5 import java.net.URL;
6 import java.util.Collection;
7 import java.util.logging.Level;
8 import java.util.logging.Logger;
9 import javax.swing.JLabel;
10 import javax.swing.JToolBar;
11 import org.freehep.application.studio.Plugin;
12 import org.freehep.application.studio.Studio;
13 import org.freehep.jas.plugin.tree.FTree;
14 import org.freehep.jas.plugin.tree.FTreeNode;
15 import org.freehep.jas.plugin.tree.FTreeNodeAddedNotification;
16 import org.freehep.jas.plugin.tree.FTreeNodeRemovedNotification;
17 import org.freehep.jas.plugin.tree.FTreePath;
18 import org.freehep.jas.plugin.tree.FTreeProvider;
19 import org.freehep.util.FreeHEPLookup;
20 import org.freehep.xml.menus.XMLMenuBuilder;
21 import org.lsst.ccs.localdb.statusdb.server.DataChannel;
22 import org.lsst.ccs.plugin.jas3.rest.LsstRestPlugin;
23 import org.lsst.ccs.plugin.jas3.trending.timeselection.TimeSelectionComboBox;
24 import org.openide.util.Lookup;
25 import org.openide.util.LookupEvent;
26 import org.openide.util.LookupListener;
27 import org.xml.sax.SAXException;
28
29
30
31
32
33
34
35
36 public class LsstTrendingPlugin extends Plugin {
37
38 private static final Logger logger = Logger.getLogger(LsstRestPlugin.class.getName());
39 private Studio studio;
40 private TimeSelectionComboBox selectedTimeRange;
41
42 @Override
43 protected void init() throws SAXException, IOException {
44 logger.finest("LsstTrendingPlugin created");
45 studio = getApplication();
46 final FreeHEPLookup lookup = studio.getLookup();
47 addDataServerListener(lookup);
48 selectedTimeRange = addTrendingToolbar();
49
50
51 final TrendingService trendingService = new TrendingService() {
52 @Override
53 public void show(String[] path) {
54 FTreeProvider treeProvider = (FTreeProvider) lookup.lookup(FTreeProvider.class);
55 if (treeProvider != null) {
56 final FTree tree = treeProvider.tree();
57 FTreeNode node = tree.findNode(new FTreePath(path));
58 tree.adapterForClass(DataChannel.class).doubleClick(node);
59 }
60 }
61 };
62
63 lookup.add(trendingService);
64 }
65
66
67
68
69
70 private void addDataServerListener(FreeHEPLookup lookup) {
71
72 Lookup.Template template = new Lookup.Template(WebResource.class, "dataserver", null);
73 final Lookup.Result result = lookup.lookup(template);
74 handleWebResource(result.allInstances());
75 LookupListener ll = new LookupListener() {
76 @Override
77 public void resultChanged(LookupEvent le) {
78 handleWebResource(result.allInstances());
79 }
80 };
81 result.addLookupListener(ll);
82 }
83
84
85
86
87
88
89
90 private TimeSelectionComboBox addTrendingToolbar() throws SAXException, IOException {
91 XMLMenuBuilder builder = studio.getXMLMenuBuilder();
92 URL xml = getClass().getResource("Trending.menus");
93 builder.build(xml);
94
95 JToolBar toolbar = builder.getToolBar("trending");
96 TimeSelectionComboBox box = new TimeSelectionComboBox(studio);
97 box.setEnabled(box.getItemCount() > 0);
98
99 JLabel boxLabel = new JLabel("Trending Period: ");
100 toolbar.add(boxLabel, 0);
101 toolbar.add(box, 1);
102 studio.addToolBar(toolbar, toolbar.getName());
103 return box;
104 }
105
106 private void handleWebResource(Collection<WebResource> allInstances) {
107 for (WebResource service : allInstances) {
108 handleDataServer(service);
109 return;
110 }
111 handleDataServer(null);
112 }
113
114 private void handleDataServer(WebResource service) {
115 FreeHEPLookup lookup = studio.getLookup();
116 FTreeProvider treeProvider = (FTreeProvider) lookup.lookup(FTreeProvider.class);
117 if (treeProvider != null) {
118 final FTree tree = treeProvider.tree();
119
120 if (service == null) {
121 logger.log(Level.INFO, "WebResource removed");
122 FTreeNode root = tree.root();
123
124 for (FTreeNode node : (Collection<FTreeNode>) (root.childNodes())) {
125 tree.treeChanged(new FTreeNodeRemovedNotification(studio, node.path()));
126 }
127 } else {
128 logger.log(Level.INFO, "WebResource registered {0}", service);
129
130 DataChannel.DataChannelList channelList = (DataChannel.DataChannelList) lookup.lookup(DataChannel.DataChannelList.class);
131
132 treeProvider.treeNodeAdapterRegistry().registerNodeAdapter(new DataChannelTreeAdapter(service, selectedTimeRange), DataChannel.class);
133 for (DataChannel chan : channelList.list) {
134 tree.treeChanged(new FTreeNodeAddedNotification(studio, chan.getPathAsString(), chan));
135 }
136 }
137 }
138 }
139 }