public JavaScriptPageExtension(Class<?> clazz) {
this.target = new JSInterface(clazz);
if (target.getName() == null || target.getName().length() == 0) {
throw new IllegalArgumentException("The JavaScript page extension can be created only for class where @JavaScript annotation defines non empty value(). The given class " + clazz + " is not annotation this way.");
}
Dependency dependency = clazz.getAnnotation(org.jboss.arquillian.graphene.javascript.Dependency.class);
if (dependency != null) {
if (dependency.sources().length == 0 && dependency.interfaces().length != 0) {
throw new IllegalArgumentException("The JavaScript page extension can't have any interface dependencies when it has no source dependencies. Can't create page extension for " + clazz + ".");
}
// load javascript sources
JavaScript dependencyScript = null;
for (String source: dependency.sources()) {
if (dependencyScript == null) {
dependencyScript = JavaScript.fromResource(source);
} else {
dependencyScript = dependencyScript.join(JavaScript.fromResource(source));
}
}
// load install() method
if (target.isInstallable()) {
JSMethod installMethod = target.getJSMethod(InstallableJavaScript.INSTALL_METHOD);
String functionCall = target.getName() + "." + installMethod.getName() + "();";
dependencyScript = dependencyScript.join(JavaScript.fromString(functionCall));
}
this.extensionScript = dependencyScript;
// installation detection
JavaScript jsInstallationDetection = null;
StringBuilder builder = new StringBuilder();
for (String object: target.getName().split("\\.")) {
if (jsInstallationDetection == null) {
jsInstallationDetection = JavaScript.fromString("return (typeof " + object + " != 'undefined')");
} else {
jsInstallationDetection = jsInstallationDetection.append(" && (typeof " + builder.toString() + object + " != 'undefined')");
}
builder.append(object).append(".");
}
installationDetectionScript = jsInstallationDetection;
// load dependencies
Collection<String> dependencies = new ArrayList<String>();
for (Class<?> dependencyInterface: dependency.interfaces()) {
org.jboss.arquillian.graphene.javascript.JavaScript jsDependencyAnnoation = dependencyInterface.getAnnotation(org.jboss.arquillian.graphene.javascript.JavaScript.class);
if (jsDependencyAnnoation == null) {
throw new IllegalArgumentException("There is a dependency " + dependencyInterface + " of " + clazz + " which isn't annotated by @JavaScript annoation. The JavaScript page extension can't be created.");
}
if (jsDependencyAnnoation.value() == null || jsDependencyAnnoation.value().length() == 0) {