Skip to content

Commit 51c1ed3

Browse files
committed
server: Refactoring driver provider registration
1 parent 29d7cff commit 51c1ed3

File tree

2 files changed

+57
-39
lines changed

2 files changed

+57
-39
lines changed

Diff for: java/server/src/org/openqa/selenium/remote/server/DefaultDriverProvider.java

+25-4
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,56 @@
2222

2323
import java.lang.reflect.Constructor;
2424
import java.lang.reflect.InvocationTargetException;
25+
import java.util.logging.Level;
2526
import java.util.logging.Logger;
2627

2728
public class DefaultDriverProvider implements DriverProvider {
2829

29-
private static final Logger log = Logger.getLogger(DefaultDriverProvider.class.getName());
30+
private static final Logger LOG = Logger.getLogger(DefaultDriverProvider.class.getName());
3031

3132
private Capabilities capabilities;
3233
private Class<? extends WebDriver> implementation;
34+
private String driverClass;
3335

3436
public DefaultDriverProvider(Capabilities capabilities, Class<? extends WebDriver> implementation) {
3537
this.capabilities = capabilities;
3638
this.implementation = implementation;
3739
}
3840

41+
public DefaultDriverProvider(Capabilities capabilities, String driverClass) {
42+
this.capabilities = capabilities;
43+
this.driverClass = driverClass;
44+
}
45+
3946
@Override
4047
public Capabilities getProvidedCapabilities() {
4148
return capabilities;
4249
}
4350

4451
@Override
4552
public Class<? extends WebDriver> getDriverClass() {
46-
return implementation;
53+
if (implementation != null) {
54+
return implementation;
55+
}
56+
try {
57+
return Class.forName(driverClass).asSubclass(WebDriver.class);
58+
} catch (ClassNotFoundException e) {
59+
LOG.log(Level.INFO, "Driver class not found: " + driverClass);
60+
throw new WebDriverException("Driver class not found: " + driverClass, e);
61+
} catch (NoClassDefFoundError e) {
62+
LOG.log(Level.INFO, "Driver class not found: " + driverClass);
63+
throw new WebDriverException("Driver class not found: " + driverClass, e);
64+
} catch (UnsupportedClassVersionError e) {
65+
LOG.log(Level.INFO, "Driver class is built for higher Java version: " + driverClass);
66+
throw new WebDriverException("Driver class is built for higher Java version: " + driverClass, e);
67+
}
4768
}
4869

4970
@Override
5071
public WebDriver newInstance(Capabilities capabilities) {
51-
log.info("Creating a new session for " + capabilities);
72+
LOG.info("Creating a new session for " + capabilities);
5273
// Try and call the single arg constructor that takes a capabilities first
53-
return callConstructor(implementation, capabilities);
74+
return callConstructor(getDriverClass(), capabilities);
5475
}
5576

5677
private WebDriver callConstructor(Class<? extends WebDriver> from, Capabilities capabilities) {

Diff for: java/server/src/org/openqa/selenium/remote/server/DefaultDriverSessions.java

+32-35
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.openqa.selenium.remote.server;
1919

20+
import com.google.common.collect.ImmutableList;
21+
2022
import org.openqa.selenium.Capabilities;
2123
import org.openqa.selenium.Platform;
2224
import org.openqa.selenium.WebDriver;
@@ -25,6 +27,7 @@
2527

2628
import java.util.Collections;
2729
import java.util.HashMap;
30+
import java.util.List;
2831
import java.util.Map;
2932
import java.util.ServiceLoader;
3033
import java.util.Set;
@@ -42,15 +45,23 @@ public class DefaultDriverSessions implements DriverSessions {
4245
private final Map<SessionId, Session> sessionIdToDriver =
4346
new ConcurrentHashMap<SessionId, Session>();
4447

45-
private static Map<Capabilities, String> defaultDrivers = new HashMap<Capabilities, String>() {{
46-
put(DesiredCapabilities.chrome(), "org.openqa.selenium.chrome.ChromeDriver");
47-
put(DesiredCapabilities.firefox(), "org.openqa.selenium.firefox.FirefoxDriver");
48-
put(DesiredCapabilities.internetExplorer(), "org.openqa.selenium.ie.InternetExplorerDriver");
49-
put(DesiredCapabilities.opera(), "com.opera.core.systems.OperaDriver");
50-
put(DesiredCapabilities.operaBlink(), "org.openqa.selenium.opera.OperaDriver");
51-
put(DesiredCapabilities.safari(), "org.openqa.selenium.safari.SafariDriver");
52-
put(DesiredCapabilities.phantomjs(), "org.openqa.selenium.phantomjs.PhantomJSDriver");
53-
}};
48+
private static List<DriverProvider> defaultDriverProviders =
49+
new ImmutableList.Builder<DriverProvider>()
50+
.add(new DefaultDriverProvider(DesiredCapabilities.chrome(),
51+
"org.openqa.selenium.chrome.ChromeDriver"))
52+
.add(new DefaultDriverProvider(DesiredCapabilities.firefox(),
53+
"org.openqa.selenium.firefox.FirefoxDriver"))
54+
.add(new DefaultDriverProvider(DesiredCapabilities.internetExplorer(),
55+
"org.openqa.selenium.ie.InternetExplorerDriver"))
56+
.add(new DefaultDriverProvider(DesiredCapabilities.opera(),
57+
"com.opera.core.systems.OperaDriver"))
58+
.add(new DefaultDriverProvider(DesiredCapabilities.operaBlink(),
59+
"org.openqa.selenium.opera.OperaDriver"))
60+
.add(new DefaultDriverProvider(DesiredCapabilities.safari(),
61+
"org.openqa.selenium.safari.SafariDriver"))
62+
.add(new DefaultDriverProvider(DesiredCapabilities.phantomjs(),
63+
"org.openqa.selenium.phantomjs.PhantomJSDriver"))
64+
.build();
5465

5566
public DefaultDriverSessions() {
5667
this(Platform.getCurrent(), new DefaultDriverFactory());
@@ -67,42 +78,28 @@ public DefaultDriverSessions(
6778
protected DefaultDriverSessions(Platform runningOn, DriverFactory factory) {
6879
this.factory = factory;
6980
registerDefaults(runningOn);
70-
registerDriverProviders(runningOn);
81+
registerServiceLoaders(runningOn);
7182
}
7283

7384
private void registerDefaults(Platform current) {
74-
for (Map.Entry<Capabilities, String> entry : defaultDrivers.entrySet()) {
75-
Capabilities caps = entry.getKey();
76-
if (caps.getPlatform() == null || caps.getPlatform() == Platform.ANY || current.is(caps.getPlatform())) {
77-
registerDriver(caps, entry.getValue());
78-
} else {
79-
log.info("Default driver " + entry.getValue() + " registration is skipped: registration capabilities "
80-
+ caps.toString() + " does not match with current platform: " + current.toString());
81-
}
85+
for (DriverProvider provider : defaultDriverProviders) {
86+
registerDriverProvider(current, provider);
8287
}
8388
}
8489

85-
private void registerDriverProviders(Platform current) {
90+
private void registerServiceLoaders(Platform current) {
8691
for (DriverProvider provider : ServiceLoader.load(DriverProvider.class)) {
87-
Capabilities caps = provider.getProvidedCapabilities();
88-
if (caps.getPlatform() == null || caps.getPlatform() == Platform.ANY || current.is(caps.getPlatform())) {
89-
factory.registerDriverProvider(caps, provider);
90-
} else {
91-
log.info("Driver provider " + provider + " registration is skipped: registration capabilities "
92-
+ caps.toString() + " does not match with current platform: " + current.toString());
93-
}
92+
registerDriverProvider(current, provider);
9493
}
9594
}
9695

97-
private void registerDriver(Capabilities caps, String className) {
98-
try {
99-
registerDriver(caps, Class.forName(className).asSubclass(WebDriver.class));
100-
} catch (ClassNotFoundException e) {
101-
log.log(Level.INFO, "Unable to register driver with className " + className + " due to ClassNotFoundException");
102-
} catch (NoClassDefFoundError e) {
103-
log.log(Level.WARNING, "Unable to register driver with className " + className + " due to NoClassDefFoundError");
104-
} catch (UnsupportedClassVersionError e) {
105-
log.log(Level.WARNING, "Unable to register driver with className " + className + " due to UnsupportedClassVersionError");
96+
private void registerDriverProvider(Platform current, DriverProvider provider) {
97+
Capabilities caps = provider.getProvidedCapabilities();
98+
if (caps.getPlatform() == null || caps.getPlatform() == Platform.ANY || current.is(caps.getPlatform())) {
99+
factory.registerDriverProvider(caps, provider);
100+
} else {
101+
log.info("Driver provider " + provider + " registration is skipped: registration capabilities "
102+
+ caps.toString() + " does not match with current platform: " + current.toString());
106103
}
107104
}
108105

0 commit comments

Comments
 (0)