/****************************************************************************
* Copyright 2008-2011 ThoughtWorks, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Initial Contributors:
* Håkan Råberg
* Manish Chakravarty
* Pavan K S
***************************************************************************/
package com.thoughtworks.selenium.internal;
import java.io.File;
import com.thoughtworks.krypton.osgi.EmbeddedEquinoxLauncher;
import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.SeleniumFactory;
public class SeleniumOSGiFactory implements SeleniumFactory {
private EmbeddedEquinoxLauncher launcher;
private SeleniumFactory factory;
public SeleniumOSGiFactory() {
try {
if (isMac()) {
verifyOnFirstThread();
System.setProperty("osgi.ws", "cocoa");
launcher = new EmbeddedEquinoxLauncher(getAndVerifyCocoaClasspath().toURL());
} else {
launcher = new EmbeddedEquinoxLauncher();
}
launcher.startup();
factory = launcher.create(SeleniumFactory.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Selenium create(String browserURL) {
return factory.create(browserURL);
}
private File getAndVerifyCocoaClasspath() {
File cocoaClasspath = new File("/System/Library/Java");
if (!new File(cocoaClasspath, "/com/apple").isDirectory()) {
throw new IllegalStateException("You need to have the cocoa Java bindings installed at /System/Library/Java (comes with XCode).");
}
return cocoaClasspath;
}
private void verifyOnFirstThread() {
if (!isRunningOnFirstThread()) {
throw new IllegalArgumentException(
"You need to start the JVM with -XstartOnFirstThread on Mac.");
}
}
private boolean isRunningOnFirstThread() {
return "Thread-0".equals(Thread.currentThread().getName());
}
private boolean isMac() {
return System.getProperty("os.name").toLowerCase().contains("mac");
}
}