1/*
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23package org.netbeans.jemmy.drivers;
24
25import org.netbeans.jemmy.JemmyException;
26import org.netbeans.jemmy.JemmyProperties;
27import org.netbeans.jemmy.operators.ComponentOperator;
28
29/**
30 * Manages driver set.
31 */
32public class DriverManager {
33
34    /**
35     * Symbolic constant - prefix for drivers names.
36     */
37    public static final String DRIVER_ID = "drivers.";
38    /**
39     * Symbolic constant for tree drivers.
40     */
41    public static final String TREE_DRIVER_ID = DRIVER_ID + "tree";
42    /**
43     * Symbolic constant for text drivers.
44     */
45    public static final String TEXT_DRIVER_ID = DRIVER_ID + "text";
46    /**
47     * Symbolic constant for key drivers.
48     */
49    public static final String KEY_DRIVER_ID = DRIVER_ID + "key";
50    /**
51     * Symbolic constant for mouse drivers.
52     */
53    public static final String MOUSE_DRIVER_ID = DRIVER_ID + "mouse";
54    /**
55     * Symbolic constant for scroll drivers.
56     */
57    public static final String SCROLL_DRIVER_ID = DRIVER_ID + "scroll";
58    /**
59     * Symbolic constant for button drivers.
60     */
61    public static final String BUTTON_DRIVER_ID = DRIVER_ID + "button";
62    /**
63     * Symbolic constant for list drivers.
64     */
65    public static final String LIST_DRIVER_ID = DRIVER_ID + "list";
66    /**
67     * Symbolic constant for multiselection list drivers.
68     */
69    public static final String MULTISELLIST_DRIVER_ID = DRIVER_ID + "multisellist";
70    /**
71     * Symbolic constant for reorderable list drivers.
72     */
73    public static final String ORDEREDLIST_DRIVER_ID = DRIVER_ID + "orderedlist";
74    /**
75     * Symbolic constant for table drivers.
76     */
77    public static final String TABLE_DRIVER_ID = DRIVER_ID + "table";
78    /**
79     * Symbolic constant for window drivers.
80     */
81    public static final String WINDOW_DRIVER_ID = DRIVER_ID + "window";
82    /**
83     * Symbolic constant for window drivers.
84     */
85    public static final String FRAME_DRIVER_ID = DRIVER_ID + "frame";
86    /**
87     * Symbolic constant for window drivers.
88     */
89    public static final String INTERNAL_FRAME_DRIVER_ID = DRIVER_ID + "internal_frame";
90    /**
91     * Symbolic constant for frame drivers.
92     */
93    public static final String FOCUS_DRIVER_ID = DRIVER_ID + "focus";
94    /**
95     * Symbolic constant for menu drivers.
96     */
97    public static final String MENU_DRIVER_ID = DRIVER_ID + "menu";
98
99    //cannot be instantiated!
100    private DriverManager() {
101    }
102
103    /**
104     * Searches a driver.
105     *
106     * @param id Driver type id.
107     * @param operatorClass Class to get an driver for.
108     * @param props Instance to get driver from.
109     * @return a driver.
110     * @see #setDriver
111     */
112    public static Object getDriver(String id, Class<?> operatorClass, JemmyProperties props) {
113        Object result = getADriver(id, operatorClass, props);
114        if (result == null) {
115            return getDriver(id, operatorClass);
116        } else {
117            return result;
118        }
119    }
120
121    /**
122     * Searches a driver. Uses {@code operator.getProperties()} to receive
123     * JemmyProperties instance.
124     *
125     * @param id Driver type id.
126     * @param operator Operator to get an driver for.
127     * @return a driver.
128     * @see #setDriver
129     */
130    public static Object getDriver(String id, ComponentOperator operator) {
131        return getDriver(id, operator.getClass(), operator.getProperties());
132    }
133
134    /**
135     * Searches a driver. Uses current JemmyProperties.
136     *
137     * @param id Driver type id.
138     * @param operatorClass Class to get an driver for.
139     * @return a driver.
140     * @see #setDriver
141     */
142    public static Object getDriver(String id, Class<?> operatorClass) {
143        Object result = getADriver(id, operatorClass, JemmyProperties.getProperties());
144        if (result == null) {
145            throw (new JemmyException("No \"" + id + "\" driver registered for "
146                    + operatorClass.getName() + " class!"));
147        } else {
148            return result;
149        }
150    }
151
152    /**
153     * Sets driver for an operator class.
154     *
155     * @param id Driver type id.
156     * @param driver A driver to be installed.
157     * @param operatorClass Class to set driver for.
158     * @see #getDriver
159     */
160    public static void setDriver(String id, Object driver, Class<?> operatorClass) {
161        JemmyProperties.
162                setCurrentProperty(makeID(id, operatorClass), driver);
163        if (Boolean.getBoolean(DRIVER_ID + "trace_output")) {
164            JemmyProperties.getCurrentOutput().printLine("Installing "
165                    + driver.getClass().getName()
166                    + " drifer for "
167                    + operatorClass.getName()
168                    + " operators.");
169        }
170    }
171
172    /**
173     * Sets driver for an operator class name.
174     *
175     * @param id Driver type id.
176     * @param driver A driver to be installed.
177     * @param operatorClassName A name of operator class.
178     * @see #getDriver
179     */
180    public static void setDriver(String id, Object driver, String operatorClassName) {
181        JemmyProperties.
182                setCurrentProperty(makeID(id, operatorClassName), driver);
183        if (Boolean.getBoolean(DRIVER_ID + "trace_output")) {
184            JemmyProperties.getCurrentOutput().printLine("Installing "
185                    + driver.getClass().getName()
186                    + " drifer for "
187                    + operatorClassName
188                    + " operators.");
189        }
190    }
191
192    /**
193     * Sets driver for all classes supported by driver.
194     *
195     * @param id Driver type id.
196     * @param driver A driver to be installed.
197     * @see #getDriver
198     */
199    public static void setDriver(String id, Driver driver) {
200        Class<?>[] supported = driver.getSupported();
201        for (Class<?> aSupported : supported) {
202            setDriver(id, driver, aSupported);
203        }
204    }
205
206    /**
207     * Sets driver for all classes supported by driver.
208     *
209     * @param id Driver type id.
210     * @param driver A driver to be installed.
211     * @see #getDriver
212     */
213    public static void setDriver(String id, LightDriver driver) {
214        String[] supported = driver.getSupported();
215        for (String aSupported : supported) {
216            setDriver(id, driver, aSupported);
217        }
218    }
219
220    /**
221     * Removes driver for operator class.
222     *
223     * @param id Driver type to remove.
224     * @param operatorClass Class to remove driver for.
225     */
226    public static void removeDriver(String id, Class<?> operatorClass) {
227        JemmyProperties.
228                removeCurrentProperty(makeID(id, operatorClass));
229        if (Boolean.getBoolean(DRIVER_ID + "trace_output")) {
230            JemmyProperties.getCurrentOutput().printLine("Uninstalling a drifer for "
231                    + operatorClass.getName()
232                    + " operators.");
233        }
234    }
235
236    /**
237     * Removes driver for operator class.
238     *
239     * @param id Driver type to remove.
240     * @param operatorClassName A name of operator class.
241     */
242    public static void removeDriver(String id, String operatorClassName) {
243        JemmyProperties.
244                removeCurrentProperty(makeID(id, operatorClassName));
245        if (Boolean.getBoolean(DRIVER_ID + "trace_output")) {
246            JemmyProperties.getCurrentOutput().printLine("Uninstalling a drifer for "
247                    + operatorClassName
248                    + " operators.");
249        }
250    }
251
252    /**
253     * Removes driver for operator classes.
254     *
255     * @param id Driver type to remove.
256     * @param operatorClasses Classes to remove driver for.
257     */
258    public static void removeDriver(String id, Class<?>[] operatorClasses) {
259        for (Class<?> operatorClass : operatorClasses) {
260            removeDriver(id, operatorClass);
261        }
262    }
263
264    /**
265     * Removes driver for operator classes.
266     *
267     * @param id Driver type to remove.
268     * @param operatorClassNames Names of operator classes.
269     */
270    public static void removeDriver(String id, String[] operatorClassNames) {
271        for (String operatorClassName : operatorClassNames) {
272            removeDriver(id, operatorClassName);
273        }
274    }
275
276    /**
277     * Removes driver for all supported classes.
278     *
279     * @param id Driver type to remove.
280     */
281    public static void removeDrivers(String id) {
282        String[] keys = JemmyProperties.getCurrentKeys();
283        for (String key : keys) {
284            if (key.startsWith(id)) {
285                JemmyProperties.
286                        removeCurrentProperty(key);
287            }
288        }
289    }
290
291    /**
292     * Returns {@code TREE_DRIVER_ID} driver.
293     *
294     * @param operatorClass Class to find driver for.
295     * @return a driver
296     * @see #setTreeDriver
297     */
298    public static TreeDriver getTreeDriver(Class<?> operatorClass) {
299        return (TreeDriver) getDriver(TREE_DRIVER_ID, operatorClass);
300    }
301
302    /**
303     * Returns {@code TREE_DRIVER_ID} driver.
304     *
305     * @param operator Operator to find driver for.
306     * @return a driver
307     * @see #setTreeDriver
308     */
309    public static TreeDriver getTreeDriver(ComponentOperator operator) {
310        return (TreeDriver) getDriver(TREE_DRIVER_ID, operator.getClass());
311    }
312
313    /**
314     * Defines {@code TREE_DRIVER_ID} driver.
315     *
316     * @param driver a driver
317     * @see #getTreeDriver
318     */
319    public static void setTreeDriver(TreeDriver driver) {
320        setDriver(TREE_DRIVER_ID, driver);
321    }
322
323    /**
324     * Returns {@code TEXT_DRIVER_ID} driver.
325     *
326     * @param operatorClass Class to find driver for.
327     * @return a driver
328     * @see #setTextDriver
329     */
330    public static TextDriver getTextDriver(Class<?> operatorClass) {
331        return (TextDriver) getDriver(TEXT_DRIVER_ID, operatorClass);
332    }
333
334    /**
335     * Returns {@code TEXT_DRIVER_ID} driver.
336     *
337     * @param operator Operator to find driver for.
338     * @return a driver
339     * @see #setTextDriver
340     */
341    public static TextDriver getTextDriver(ComponentOperator operator) {
342        return (TextDriver) getDriver(TEXT_DRIVER_ID, operator.getClass());
343    }
344
345    /**
346     * Defines {@code TEXT_DRIVER_ID} driver.
347     *
348     * @param driver a driver
349     * @see #getTextDriver
350     */
351    public static void setTextDriver(TextDriver driver) {
352        setDriver(TEXT_DRIVER_ID, driver);
353    }
354
355    /**
356     * Returns {@code KEY_DRIVER_ID} driver.
357     *
358     * @param operatorClass Class to find driver for.
359     * @return a driver
360     * @see #setKeyDriver
361     */
362    public static KeyDriver getKeyDriver(Class<?> operatorClass) {
363        return (KeyDriver) getDriver(KEY_DRIVER_ID, operatorClass);
364    }
365
366    /**
367     * Returns {@code KEY_DRIVER_ID} driver.
368     *
369     * @param operator Operator to find driver for.
370     * @return a driver
371     * @see #setKeyDriver
372     */
373    public static KeyDriver getKeyDriver(ComponentOperator operator) {
374        return (KeyDriver) getDriver(KEY_DRIVER_ID, operator.getClass());
375    }
376
377    /**
378     * Defines {@code KEY_DRIVER_ID} driver.
379     *
380     * @param driver a driver
381     * @see #getKeyDriver
382     */
383    public static void setKeyDriver(KeyDriver driver) {
384        setDriver(KEY_DRIVER_ID, driver);
385    }
386
387    /**
388     * Returns {@code MOUSE_DRIVER_ID} driver.
389     *
390     * @param operatorClass Class to find driver for.
391     * @return a driver
392     * @see #setMouseDriver
393     */
394    public static MouseDriver getMouseDriver(Class<?> operatorClass) {
395        return (MouseDriver) getDriver(MOUSE_DRIVER_ID, operatorClass);
396    }
397
398    /**
399     * Returns {@code MOUSE_DRIVER_ID} driver.
400     *
401     * @param operator Operator to find driver for.
402     * @return a driver
403     * @see #setMouseDriver
404     */
405    public static MouseDriver getMouseDriver(ComponentOperator operator) {
406        return (MouseDriver) getDriver(MOUSE_DRIVER_ID, operator.getClass());
407    }
408
409    /**
410     * Defines {@code MOUSE_DRIVER_ID} driver.
411     *
412     * @param driver a driver
413     * @see #getMouseDriver
414     */
415    public static void setMouseDriver(MouseDriver driver) {
416        setDriver(MOUSE_DRIVER_ID, driver);
417    }
418
419    /**
420     * Returns {@code SCROLL_DRIVER_ID} driver.
421     *
422     * @param operatorClass Class to find driver for.
423     * @return a driver
424     * @see #setScrollDriver
425     */
426    public static ScrollDriver getScrollDriver(Class<?> operatorClass) {
427        return (ScrollDriver) getDriver(SCROLL_DRIVER_ID, operatorClass);
428    }
429
430    /**
431     * Returns {@code SCROLL_DRIVER_ID} driver.
432     *
433     * @param operator Operator to find driver for.
434     * @return a driver
435     * @see #setScrollDriver
436     */
437    public static ScrollDriver getScrollDriver(ComponentOperator operator) {
438        return (ScrollDriver) getDriver(SCROLL_DRIVER_ID, operator.getClass());
439    }
440
441    /**
442     * Defines {@code SCROLL_DRIVER_ID} driver.
443     *
444     * @param driver a driver
445     * @see #getScrollDriver
446     */
447    public static void setScrollDriver(ScrollDriver driver) {
448        setDriver(SCROLL_DRIVER_ID, driver);
449    }
450
451    /**
452     * Returns {@code BUTTON_DRIVER_ID} driver.
453     *
454     * @param operatorClass Class to find driver for.
455     * @return a driver
456     * @see #setButtonDriver
457     */
458    public static ButtonDriver getButtonDriver(Class<?> operatorClass) {
459        return (ButtonDriver) getDriver(BUTTON_DRIVER_ID, operatorClass);
460    }
461
462    /**
463     * Returns {@code BUTTON_DRIVER_ID} driver.
464     *
465     * @param operator Operator to find driver for.
466     * @return a driver
467     * @see #setButtonDriver
468     */
469    public static ButtonDriver getButtonDriver(ComponentOperator operator) {
470        return (ButtonDriver) getDriver(BUTTON_DRIVER_ID, operator.getClass());
471    }
472
473    /**
474     * Defines {@code BUTTON_DRIVER_ID} driver.
475     *
476     * @param driver a driver
477     * @see #getButtonDriver
478     */
479    public static void setButtonDriver(ButtonDriver driver) {
480        setDriver(BUTTON_DRIVER_ID, driver);
481    }
482
483    /**
484     * Returns {@code LIST_DRIVER_ID} driver.
485     *
486     * @param operatorClass Class to find driver for.
487     * @return a driver
488     * @see #setListDriver
489     */
490    public static ListDriver getListDriver(Class<?> operatorClass) {
491        return (ListDriver) getDriver(LIST_DRIVER_ID, operatorClass);
492    }
493
494    /**
495     * Returns {@code LIST_DRIVER_ID} driver.
496     *
497     * @param operator Operator to find driver for.
498     * @return a driver
499     * @see #setListDriver
500     */
501    public static ListDriver getListDriver(ComponentOperator operator) {
502        return (ListDriver) getDriver(LIST_DRIVER_ID, operator.getClass());
503    }
504
505    /**
506     * Defines {@code LIST_DRIVER_ID} driver.
507     *
508     * @param driver a driver
509     * @see #getListDriver
510     */
511    public static void setListDriver(ListDriver driver) {
512        setDriver(LIST_DRIVER_ID, driver);
513    }
514
515    /**
516     * Returns {@code MULTISELLIST_DRIVER_ID} driver.
517     *
518     * @param operatorClass Class to find driver for.
519     * @return a driver
520     * @see #setMultiSelListDriver
521     */
522    public static MultiSelListDriver getMultiSelListDriver(Class<?> operatorClass) {
523        return (MultiSelListDriver) getDriver(MULTISELLIST_DRIVER_ID, operatorClass);
524    }
525
526    /**
527     * Returns {@code MULTISELLIST_DRIVER_ID} driver.
528     *
529     * @param operator Operator to find driver for.
530     * @return a driver
531     * @see #setMultiSelListDriver
532     */
533    public static MultiSelListDriver getMultiSelListDriver(ComponentOperator operator) {
534        return (MultiSelListDriver) getDriver(MULTISELLIST_DRIVER_ID, operator.getClass());
535    }
536
537    /**
538     * Defines {@code MULTISELLIST_DRIVER_ID} driver.
539     *
540     * @param driver a driver
541     * @see #getMultiSelListDriver
542     */
543    public static void setMultiSelListDriver(MultiSelListDriver driver) {
544        setDriver(MULTISELLIST_DRIVER_ID, driver);
545    }
546
547    /**
548     * Returns {@code ORDEREDLIST_DRIVER_ID} driver.
549     *
550     * @param operatorClass Class to find driver for.
551     * @return a driver
552     * @see #setOrderedListDriver
553     */
554    public static OrderedListDriver getOrderedListDriver(Class<?> operatorClass) {
555        return (OrderedListDriver) getDriver(ORDEREDLIST_DRIVER_ID, operatorClass);
556    }
557
558    /**
559     * Returns {@code ORDEREDLIST_DRIVER_ID} driver.
560     *
561     * @param operator Operator to find driver for.
562     * @return a driver
563     * @see #setOrderedListDriver
564     */
565    public static OrderedListDriver getOrderedListDriver(ComponentOperator operator) {
566        return (OrderedListDriver) getDriver(ORDEREDLIST_DRIVER_ID, operator.getClass());
567    }
568
569    /**
570     * Defines {@code ORDEREDLIST_DRIVER_ID} driver.
571     *
572     * @param driver a driver
573     * @see #getOrderedListDriver
574     */
575    public static void setOrderedListDriver(OrderedListDriver driver) {
576        setDriver(ORDEREDLIST_DRIVER_ID, driver);
577    }
578
579    /**
580     * Returns {@code TABLE_DRIVER_ID} driver.
581     *
582     * @param operatorClass Class to find driver for.
583     * @return a driver
584     * @see #setTableDriver
585     */
586    public static TableDriver getTableDriver(Class<?> operatorClass) {
587        return (TableDriver) getDriver(TABLE_DRIVER_ID, operatorClass);
588    }
589
590    /**
591     * Returns {@code TABLE_DRIVER_ID} driver.
592     *
593     * @param operator Operator to find driver for.
594     * @return a driver
595     * @see #setTableDriver
596     */
597    public static TableDriver getTableDriver(ComponentOperator operator) {
598        return (TableDriver) getDriver(TABLE_DRIVER_ID, operator.getClass());
599    }
600
601    /**
602     * Defines {@code TABLE_DRIVER_ID} driver.
603     *
604     * @param driver a driver
605     * @see #getTableDriver
606     */
607    public static void setTableDriver(TableDriver driver) {
608        setDriver(TABLE_DRIVER_ID, driver);
609    }
610
611    /**
612     * Returns {@code WINDOW_DRIVER_ID} driver.
613     *
614     * @param operatorClass Class to find driver for.
615     * @return a driver
616     * @see #setWindowDriver
617     */
618    public static WindowDriver getWindowDriver(Class<?> operatorClass) {
619        return (WindowDriver) getDriver(WINDOW_DRIVER_ID, operatorClass);
620    }
621
622    /**
623     * Returns {@code WINDOW_DRIVER_ID} driver.
624     *
625     * @param operator Operator to find driver for.
626     * @return a driver
627     * @see #setWindowDriver
628     */
629    public static WindowDriver getWindowDriver(ComponentOperator operator) {
630        return (WindowDriver) getDriver(WINDOW_DRIVER_ID, operator.getClass());
631    }
632
633    /**
634     * Defines {@code WINDOW_DRIVER_ID} driver.
635     *
636     * @param driver a driver
637     * @see #getWindowDriver
638     */
639    public static void setWindowDriver(WindowDriver driver) {
640        setDriver(WINDOW_DRIVER_ID, driver);
641    }
642
643    /**
644     * Returns {@code FRAME_DRIVER_ID} driver.
645     *
646     * @param operatorClass Class to find driver for.
647     * @return a driver
648     * @see #setFrameDriver
649     */
650    public static FrameDriver getFrameDriver(Class<?> operatorClass) {
651        return (FrameDriver) getDriver(FRAME_DRIVER_ID, operatorClass);
652    }
653
654    /**
655     * Returns {@code FRAME_DRIVER_ID} driver.
656     *
657     * @param operator Operator to find driver for.
658     * @return a driver
659     * @see #setFrameDriver
660     */
661    public static FrameDriver getFrameDriver(ComponentOperator operator) {
662        return (FrameDriver) getDriver(FRAME_DRIVER_ID, operator.getClass());
663    }
664
665    /**
666     * Defines {@code FRAME_DRIVER_ID} driver.
667     *
668     * @param driver a driver
669     * @see #getFrameDriver
670     */
671    public static void setFrameDriver(FrameDriver driver) {
672        setDriver(FRAME_DRIVER_ID, driver);
673    }
674
675    /**
676     * Returns {@code INTERNAL_FRAME_DRIVER_ID} driver.
677     *
678     * @param operatorClass Class to find driver for.
679     * @return a driver
680     * @see #setInternalFrameDriver
681     */
682    public static InternalFrameDriver getInternalFrameDriver(Class<?> operatorClass) {
683        return (InternalFrameDriver) getDriver(INTERNAL_FRAME_DRIVER_ID, operatorClass);
684    }
685
686    /**
687     * Returns {@code INTERNAL_FRAME_DRIVER_ID} driver.
688     *
689     * @param operator Operator to find driver for.
690     * @return a driver
691     * @see #setInternalFrameDriver
692     */
693    public static InternalFrameDriver getInternalFrameDriver(ComponentOperator operator) {
694        return (InternalFrameDriver) getDriver(INTERNAL_FRAME_DRIVER_ID, operator.getClass());
695    }
696
697    /**
698     * Defines {@code INTERNAL_FRAME_DRIVER_ID} driver.
699     *
700     * @param driver a driver
701     * @see #getInternalFrameDriver
702     */
703    public static void setInternalFrameDriver(InternalFrameDriver driver) {
704        setDriver(INTERNAL_FRAME_DRIVER_ID, driver);
705    }
706
707    /**
708     * Returns {@code FOCUS_DRIVER_ID} driver.
709     *
710     * @param operatorClass Class to find driver for.
711     * @return a driver
712     * @see #setFocusDriver
713     */
714    public static FocusDriver getFocusDriver(Class<?> operatorClass) {
715        return (FocusDriver) getDriver(FOCUS_DRIVER_ID, operatorClass);
716    }
717
718    /**
719     * Returns {@code FOCUS_DRIVER_ID} driver.
720     *
721     * @param operator Operator to find driver for.
722     * @return a driver
723     * @see #setFocusDriver
724     */
725    public static FocusDriver getFocusDriver(ComponentOperator operator) {
726        return (FocusDriver) getDriver(FOCUS_DRIVER_ID, operator.getClass());
727    }
728
729    /**
730     * Defines {@code FOCUS_DRIVER_ID} driver.
731     *
732     * @param driver a driver
733     * @see #getFocusDriver
734     */
735    public static void setFocusDriver(FocusDriver driver) {
736        setDriver(FOCUS_DRIVER_ID, driver);
737    }
738
739    /**
740     * Returns {@code MENU_DRIVER_ID} driver.
741     *
742     * @param operatorClass Class to find driver for.
743     * @return a driver
744     * @see #setMenuDriver
745     */
746    public static MenuDriver getMenuDriver(Class<?> operatorClass) {
747        return (MenuDriver) getDriver(MENU_DRIVER_ID, operatorClass);
748    }
749
750    /**
751     * Returns {@code MENU_DRIVER_ID} driver.
752     *
753     * @param operator Operator to find driver for.
754     * @return a driver
755     * @see #setMenuDriver
756     */
757    public static MenuDriver getMenuDriver(ComponentOperator operator) {
758        return (MenuDriver) getDriver(MENU_DRIVER_ID, operator.getClass());
759    }
760
761    /**
762     * Defines {@code MENU_DRIVER_ID} driver.
763     *
764     * @param driver a driver
765     * @see #getMenuDriver
766     */
767    public static void setMenuDriver(MenuDriver driver) {
768        setDriver(MENU_DRIVER_ID, driver);
769    }
770
771    static void setDriver(String id, Object driver) {
772        if (driver instanceof Driver) {
773            setDriver(id, (Driver) driver);
774        } else if (driver instanceof LightDriver) {
775            setDriver(id, (LightDriver) driver);
776        } else {
777            throw (new JemmyException("Driver is neither Driver nor LightDriver "
778                    + driver.toString()));
779        }
780    }
781
782    //creates driver id
783    private static String makeID(String id, Class<?> operatorClass) {
784        return makeID(id, operatorClass.getName());
785    }
786
787    private static String makeID(String id, String operatorClassName) {
788        return id + "." + operatorClassName;
789    }
790
791    //returns a driver
792    private static Object getADriver(String id, Class<?> operatorClass, JemmyProperties props) {
793        Class<?> superClass = operatorClass;
794        Object drvr;
795        do {
796            drvr = props.
797                    getProperty(makeID(id, superClass));
798            if (drvr != null) {
799                return drvr;
800            }
801        } while (ComponentOperator.class.
802                isAssignableFrom(superClass = superClass.getSuperclass()));
803        return null;
804    }
805
806    static {
807        new InputDriverInstaller().install();
808        new DefaultDriverInstaller().install();
809    }
810}
811