/* ************************************************************************
qxwebdriver-java
http://github.com/qooxdoo/qxwebdriver-java
Copyright:
2012-2013 1&1 Internet AG, Germany, http://www.1und1.de
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the license.txt file in the project's top-level directory for details.
Authors:
* Daniel Wagner (danielwagner)
************************************************************************ */
package org.oneandone.qxwebdriver.ui;
import java.lang.reflect.Constructor;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import org.oneandone.qxwebdriver.QxWebDriver;
import org.openqa.selenium.WebElement;
public class DefaultWidgetFactory implements org.oneandone.qxwebdriver.ui.WidgetFactory {
public DefaultWidgetFactory(QxWebDriver qxWebDriver) {
driver = qxWebDriver;
packageName = this.getClass().getPackage().getName();
}
protected QxWebDriver driver;
private String packageName;
private Hashtable<WebElement, Widget> elements = new Hashtable<WebElement, Widget>();
/**
* Returns a list of qooxdoo interfaces implemented by the widget containing
* the given element.
*/
public List<String> getWidgetInterfaces(WebElement element) {
return (List<String>) driver.jsRunner.runScript("getInterfaces", element);
}
/**
* Returns the inheritance hierarchy of the widget containing the given
* element.
*/
public List<String> getWidgetInheritance(WebElement element) {
return (List<String>) driver.jsRunner.runScript("getInheritance", element);
}
/**
* Returns an instance of {@link Widget} or one of its subclasses that
* represents the qooxdoo widget containing the given element.
* @param element A WebElement representing a DOM element that is part of a
* qooxdoo widget
* @return Widget object
*/
public Widget getWidgetForElement(WebElement element) {
if (elements.containsKey(element)) {
return elements.get(element);
}
List<String> interfaces = getWidgetInterfaces(element);
List<String> classes = getWidgetInheritance(element);
classes.addAll(interfaces);
if (classes.remove("qx.ui.core.Widget")) {
classes.add("qx.ui.core.WidgetImpl");
}
if (classes.remove("qx.ui.mobile.core.Widget")) {
classes.add("qx.ui.mobile.core.WidgetImpl");
}
Iterator<String> classIter = classes.iterator();
while(classIter.hasNext()) {
String className = classIter.next();
String widgetClassName = getWidgetClassName(className);
if (widgetClassName != null) {
Constructor<?> constr = getConstructorByClassName(widgetClassName);
if (constr != null) {
try {
Widget widget = (Widget) constr.newInstance(element, driver);
elements.put(element, widget);
return widget;
} catch(Exception e) {
System.err.println("Could not instantiate '" +
widgetClassName + "': " + e.getMessage());
e.printStackTrace();
}
}
}
}
return null;
}
private String getWidgetClassName(String qxClassName) {
if (qxClassName.startsWith("qx.ui.")) {
return packageName + qxClassName.substring(5);
} else {
return null;
}
}
private Constructor<?> getConstructorByClassName(String widgetClassName) {
Constructor<?> cnst[];
try {
Class<?> widgetClass = Class.forName(widgetClassName);
cnst = widgetClass.getConstructors();
if (cnst.length > 0) {
return cnst[0];
}
} catch(ClassNotFoundException e) {
//System.out.println("No class for " + widgetClassName);
}
return null;
}
}