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
45
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
78 app.getEventSender().addEventListener(this,ClassLoadEvent.class);
79
80 app.getEventSender().addEventListener(this, ScriptEvent.class);
81
82
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
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
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
334
335
336
337
338
339
340
341
342
343 }
344 }