View Javadoc

1   package org.lcsim.plugin;
2   
3   import java.io.IOException;
4   import java.net.URL;
5   import java.util.EventObject;
6   import java.util.List;
7   import java.util.logging.Logger;
8   import javax.swing.JToolBar;
9   import org.freehep.application.mdi.PageContext;
10  import org.freehep.application.mdi.PageEvent;
11  import org.freehep.application.mdi.PageListener;
12  import org.freehep.application.mdi.PageManager;
13  import org.freehep.application.studio.Plugin;
14  import org.freehep.application.studio.Studio;
15  import org.freehep.application.studio.StudioListener;
16  import org.freehep.jas.event.ClassLoadEvent;
17  import org.freehep.jas.event.ClassLoadedEvent;
18  import org.freehep.jas.event.ClassUnloadEvent;
19  import org.freehep.jas.event.ScriptEvent;
20  import org.freehep.jas.plugin.console.ConsoleOutputStream;
21  import org.freehep.jas.plugin.console.ConsoleService;
22  import org.freehep.jas.services.ScriptEngine;
23  import org.freehep.jas.services.WebBrowser;
24  import org.freehep.record.loop.LoopEvent;
25  import org.freehep.record.loop.LoopListener;
26  import org.freehep.record.loop.RecordLoop;
27  import org.freehep.util.FreeHEPLookup;
28  import org.freehep.util.commanddispatcher.CommandProcessor;
29  import org.freehep.util.commanddispatcher.CommandState;
30  import org.freehep.util.template.Template;
31  import org.freehep.xml.menus.XMLMenuBuilder;
32  import org.lcsim.conditions.ConditionsManager;
33  import org.lcsim.event.EventHeader;
34  import org.lcsim.event.util.LCSimEventGenerator;
35  import org.lcsim.plugin.conditions.InteractiveConditionsManagerImplementation;
36  import org.lcsim.plugin.browser.LCSimEventBrowser;
37  import org.lcsim.util.Driver;
38  import org.lcsim.util.DriverAdapter;
39  import org.lcsim.util.loop.EventGeneratorRecordSource;
40  import org.xml.sax.SAXException;
41  
42  /**
43   *
44   * @author tonyj
45   * @version $Id: LCSimPlugin.java,v 1.15 2012/06/15 05:24:20 onoprien Exp $
46   */
47  
48  public class LCSimPlugin extends Plugin implements StudioListener, PageListener
49  {
50      private LCSim lcsim;
51      private final LCSimCommands commands = new LCSimCommands();
52      private JToolBar toolbar;
53      private ConsoleOutputStream out;
54      private ConsoleService cs;
55      private static final Logger logger = Logger.getLogger("org.lcsim.plugin");
56      
57      protected void init() throws SAXException, IOException
58      {        
59          Studio app = getApplication();
60          FreeHEPLookup lookup = app.getLookup();
61          lcsim = new LCSim(lookup);
62          
63          XMLMenuBuilder builder = app.getXMLMenuBuilder();
64          URL xml = getClass().getResource("LCSim.menus");
65          builder.build(xml);
66          
67          toolbar = builder.getToolBar("lcsim");
68          app.addToolBar(toolbar, toolbar.getName());
69                  
70          lookup.add(new LCSimFileHandler(app),"org.lcsim Plugin");
71          lookup.add(new LCSimFileListHandler(app),"org.lcsim Plugin");
72          lookup.add(new LCSimDataSource(app));
73          lookup.add(new StdhepFileHandler(app),"org.lcsim Plugin");
74          lookup.add(new StdhepFileListHandler(app),"org.lcsim Plugin");
75          lookup.add(new StdhepDataSource(app));
76          
77          // Listen for any drivers to be loaded
78          app.getEventSender().addEventListener(this,ClassLoadEvent.class);
79          // Register to receive scriptEvents
80          app.getEventSender().addEventListener(this, ScriptEvent.class);
81          
82          // Register the command processsor
83          app.getCommandTargetManager().add(commands);
84          
85          LCSimEventBrowser.registerTableModels(app.getLookup());
86          
87          Template map = new Template();
88          map.set("title","org.lcsim Examples");
89          map.set("url","classpath:/org/lcsim/plugin/web/examples.html");
90          map.set("description","Examples of using the org.lcsim package");
91          lookup.add(map,"examples");
92          
93          ConditionsManager.setDefaultConditionsManager(new InteractiveConditionsManagerImplementation(app));
94          
95          logger.finest("LCSim plugin created");
96      }
97      public boolean canBeShutDown()
98      {
99          return true;
100     }
101 
102     protected void shutdown()
103     {
104         Studio app = getApplication();
105         FreeHEPLookup lookup = app.getLookup();
106         
107         lookup.remove(lookup.lookup(LCSimFileHandler.class));
108         lookup.remove(lookup.lookup(StdhepFileHandler.class));
109         
110         app.getEventSender().removeEventListener(this,ClassLoadEvent.class);
111         app.getEventSender().removeEventListener(this,ClassLoadEvent.class);   
112         
113         app.getCommandTargetManager().remove(commands);
114         lookup.remove(lookup.lookup(Template.class));
115         
116         app.removeToolBar(toolbar);
117         
118         RecordLoop loop = (RecordLoop) getApplication().getLookup().lookup(RecordLoop.class);
119         loop.removeLoopListener(commands);
120     }
121     protected void postInit()
122     {
123         try
124         {
125             Class converterClass = Class.forName("org.lcsim.util.heprep.LCSimHepRepConverter");
126             Object converter = converterClass.newInstance();
127             getApplication().getLookup().add(converter);
128         }
129         // This block will catch NoClassDefFoundError (which is not an Exception) as well as other reflection errors that may occur.  --JM
130         catch (Throwable t)        
131         {        	
132         	t.printStackTrace(System.err);
133             System.err.println("WARNING: Unable to create LCSimHepRepConverter.  The HepRep plugin is probably not installed.");
134         }
135 
136         RecordLoop loop = (RecordLoop) getApplication().getLookup().lookup(RecordLoop.class);
137         loop.addLoopListener(commands);
138         
139         try
140         {
141            Studio app = getApplication();
142            FreeHEPLookup lookup = app.getLookup();
143            cs = (ConsoleService) lookup.lookup(ConsoleService.class);
144            if (cs != null) out = cs.getConsoleOutputStream("Record Loop", null);
145         }
146         catch (IOException x)
147         {
148            System.err.println("Warning: Unable to create console output stream");
149         }
150     }
151     public void handleEvent(EventObject event)
152     {
153         if (event instanceof ClassLoadedEvent)
154         {
155             Class x = ((ClassLoadedEvent) event).getLoadedClass();
156             try
157             {
158                 if (Driver.class.isAssignableFrom(x))
159                 {
160                    logger.fine("Creating new instance of Driver "+x.getName());
161                    if (cs != null) cs.redirectStandardOutputOnThreadToConsole(Thread.currentThread(),out);
162                    Driver driver = (Driver) x.newInstance();
163                    if (cs != null) cs.redirectStandardOutputOnThreadToConsole(Thread.currentThread(),null);
164                    
165                    logger.fine("Creating Driver adapter for driver "+x.getName());
166                    DriverAdapter listener = new DriverAdapter(driver, cs);
167                    getApplication().getLookup().add(listener);
168                 }
169                 else if (LCSimEventGenerator.class.isAssignableFrom(x))
170                 {
171                     logger.fine("Creating new instance of LCSimEventGenerator "+x.getName());
172                     if (cs != null) cs.redirectStandardOutputOnThreadToConsole(Thread.currentThread(),out);
173                     LCSimEventGenerator gen = (LCSimEventGenerator) x.newInstance();
174                     if (cs != null) cs.redirectStandardOutputOnThreadToConsole(Thread.currentThread(),out);
175 
176                     String name = x.getName();
177                     int pos = name.lastIndexOf('.');
178                     if (pos >= 0) name = name.substring(pos+1);
179                     logger.fine("Creating EventGeneratorRecordSource for generator "+x.getName());
180                     EventGeneratorRecordSource source = new EventGeneratorRecordSource(gen,name);
181                     getApplication().getLookup().add(source);
182                 }
183             }
184             catch (InstantiationException xx)
185             {
186                 getApplication().error("Error instantiating "+x.getName(),xx);
187             }
188             catch (ExceptionInInitializerError xx)
189             {
190                 getApplication().error("Error instantiating "+x.getName(),xx.getException());
191             }
192             catch (IllegalAccessException xx)
193             {
194                 getApplication().error("Could not create class "+x.getName()+", missing public constructor?",xx);
195             }
196             catch (Exception xx)
197             {
198                 getApplication().error("Error instantiating "+x.getName(),xx);
199             }
200         }
201         else if (event instanceof ClassUnloadEvent)
202         {
203             // Record loop takes care of this
204         }
205         else if (event instanceof  ScriptEvent)
206         {
207             ScriptEngine engine = ((ScriptEvent) event).getScriptEngine();
208             engine.registerVariable("lcsim", lcsim);
209         }
210     }
211     public void pageChanged(PageEvent e)
212     {
213         PageContext page = (PageContext) e.getSource();        
214         if (e.getID() == e.PAGESELECTED)
215         {
216             if ( page.getPage() instanceof LCSimEventBrowser )
217             {
218                 getApplication().getCommandTargetManager().add(((LCSimEventBrowser) page.getPage()).getCommands());
219             }
220         }
221         else if (e.getID() == e.PAGEDESELECTED)
222         {
223             if ( page.getPage() instanceof LCSimEventBrowser )
224             {
225                 getApplication().getCommandTargetManager().remove(((LCSimEventBrowser) page.getPage()).getCommands());
226             }
227         }
228     }
229     
230     class LCSimCommands extends CommandProcessor implements LoopListener
231     {
232         public void onLCSimEventBrowser()
233         {
234             createNewEventBrowser();
235             setChanged();
236         }
237         private void createNewEventBrowser()
238         {
239             RecordLoop loop = (RecordLoop) getApplication().getLookup().lookup(RecordLoop.class);
240             LCSimEventBrowser tree  = new LCSimEventBrowser(getApplication(),loop);
241             getApplication().getPageManager().openPage(tree,"LCSim Event",null);           
242         }
243         
244         private void createNewDriverTree()
245         {
246             RecordLoop loop = (RecordLoop) getApplication().getLookup().lookup(RecordLoop.class);
247             LCSimDriverTree tree  = new LCSimDriverTree(getApplication(),loop);
248             getApplication().getPageManager().openPage(tree,"LCSim Drivers",null);           
249         }
250         
251         public void enableLCSimEventBrowserButton(CommandState state)
252         {
253             RecordLoop loop = (RecordLoop) getApplication().getLookup().lookup(RecordLoop.class);
254             try
255             {
256                Object record = loop.getRecordSource().getCurrentRecord();
257                state.setEnabled(record instanceof EventHeader);
258             }
259             catch (Exception x)
260             {
261                state.setEnabled(false);
262             }
263         }
264         
265         public void onLCSimEventBrowserButton()
266         {
267             PageManager manager = getApplication().getPageManager();
268             PageContext selected = manager.getSelectedPage(); 
269             if (selected != null && selected.getPage() instanceof LCSimEventBrowser)
270             {
271                createNewEventBrowser();
272             }
273             else
274             {
275                boolean found = false;
276                List<PageContext> pages = manager.pages();
277                for (PageContext page : pages)
278                {
279                   if (page.getPage() instanceof LCSimEventBrowser)
280                   {
281                      page.requestShow();
282                      found = true;
283                      break;
284                   }
285                }
286                if (!found) createNewEventBrowser();
287             }
288             setChanged();
289         }
290         
291         public void onLCSimDriverTree()
292         {
293             PageManager manager = getApplication().getPageManager();
294             PageContext selected = manager.getSelectedPage(); 
295             if (selected != null && selected.getPage() instanceof LCSimDriverTree)
296             {
297                createNewDriverTree();
298             }
299             else
300             {
301                boolean found = false;
302                List<PageContext> pages = manager.pages();
303                for (PageContext page : pages)
304                {
305                   if (page.getPage() instanceof LCSimDriverTree)
306                   {
307                      page.requestShow();
308                      found = true;
309                      break;
310                   }
311                }
312                if (!found) createNewDriverTree();
313             }
314             setChanged();
315         }
316         
317         public void onLCSimHelp()
318         {
319             URL help = getClass().getResource("web/index.html");
320             WebBrowser wb = (WebBrowser) getApplication().getLookup().lookup(WebBrowser.class);
321             if (wb != null && help != null) wb.showURL(help);
322         }
323 
324       public void process(LoopEvent event) {
325         switch (event.getEventType()) {
326           case SUSPEND:
327           case RESET:
328             setChanged();
329           default:
330         }
331       }
332 
333 //      public void loopEnded(LoopEvent loopEvent)
334 //      {
335 //          setChanged();
336 //      }
337 //
338 //      public void loopReset(LoopEvent loopEvent)
339 //      {
340 //          setChanged();
341 //      }
342 
343     }
344 }