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