View Javadoc

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   * This plugin is responsible for listening for added or removed WebResources
31   * registered by the Rest plugin. On detecting changes it will add them to the
32   * JAS Tree in the control area.
33   *
34   * @author tonyj
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          // FIXME: Does not work yet
50          //lookup.add(new TimeSelectionPreferencesTopic());
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       * Listens for dataserver restful interfaces to be registered/unregistered.
68       * Calls handleWebResource when a change occurs.
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       * Adds a toolbar for selection of time period for new trending plots
86       *
87       * @throws SAXException
88       * @throws IOException
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                 // Clear old tree data
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 }