Skip to content

Commit d8eff0c

Browse files
committed
Refactoring the process of driver instances creation to use a new DriverProvider interface. DefaultDriverProvider wraps the current logic -- creating instances using reflection. This is a step to implement ability to load additional providers using ServiceLoader that can add new providers or override existing ones.
1 parent a0b26dc commit d8eff0c

File tree

4 files changed

+120
-40
lines changed

4 files changed

+120
-40
lines changed

java/server/src/org/openqa/selenium/remote/server/DefaultDriverFactory.java

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,64 +20,38 @@
2020

2121
import org.openqa.selenium.Capabilities;
2222
import org.openqa.selenium.WebDriver;
23-
import org.openqa.selenium.WebDriverException;
2423

25-
import java.lang.reflect.Constructor;
26-
import java.lang.reflect.InvocationTargetException;
2724
import java.util.Map;
2825
import java.util.concurrent.ConcurrentHashMap;
29-
import java.util.logging.Logger;
3026

3127
public class DefaultDriverFactory implements DriverFactory {
3228

33-
private static final Logger log = Logger.getLogger(DefaultDriverFactory.class.getName());
34-
35-
private Map<Capabilities, Class<? extends WebDriver>> capabilitiesToDriver =
36-
new ConcurrentHashMap<Capabilities, Class<? extends WebDriver>>();
29+
private Map<Capabilities, DriverProvider> capabilitiesToDriverProvider =
30+
new ConcurrentHashMap<Capabilities, DriverProvider>();
3731

3832
public void registerDriver(Capabilities capabilities, Class<? extends WebDriver> implementation) {
39-
capabilitiesToDriver.put(capabilities, implementation);
33+
capabilitiesToDriverProvider.put(capabilities,
34+
new DefaultDriverProvider(capabilities, implementation));
4035
}
4136

4237
protected Class<? extends WebDriver> getBestMatchFor(Capabilities desired) {
38+
return getProviderMatching(desired).getDriverClass();
39+
}
40+
41+
protected DriverProvider getProviderMatching(Capabilities desired) {
4342
// We won't be able to make a match if no drivers have been registered.
44-
checkState(!capabilitiesToDriver.isEmpty(),
45-
"No drivers have been registered, will be unable to match %s", desired);
43+
checkState(!capabilitiesToDriverProvider.isEmpty(),
44+
"No drivers have been registered, will be unable to match %s", desired);
4645
Capabilities bestMatchingCapabilities =
47-
CapabilitiesComparator.getBestMatch(desired, capabilitiesToDriver.keySet());
48-
return capabilitiesToDriver.get(bestMatchingCapabilities);
46+
CapabilitiesComparator.getBestMatch(desired, capabilitiesToDriverProvider.keySet());
47+
return capabilitiesToDriverProvider.get(bestMatchingCapabilities);
4948
}
5049

5150
public WebDriver newInstance(Capabilities capabilities) {
52-
log.info("Creating a new session for " + capabilities);
53-
Class<? extends WebDriver> clazz = getBestMatchFor(capabilities);
54-
55-
// Try and call the single arg constructor that takes a capabilities first
56-
return callConstructor(clazz, capabilities);
57-
}
58-
59-
private WebDriver callConstructor(Class<? extends WebDriver> from, Capabilities capabilities) {
60-
try {
61-
Constructor<? extends WebDriver> constructor = from.getConstructor(Capabilities.class);
62-
return constructor.newInstance(capabilities);
63-
} catch (NoSuchMethodException e) {
64-
try {
65-
return from.newInstance();
66-
} catch (InstantiationException e1) {
67-
throw new WebDriverException(e);
68-
} catch (IllegalAccessException e1) {
69-
throw new WebDriverException(e);
70-
}
71-
} catch (InvocationTargetException e) {
72-
throw new WebDriverException(e);
73-
} catch (InstantiationException e) {
74-
throw new WebDriverException(e);
75-
} catch (IllegalAccessException e) {
76-
throw new WebDriverException(e);
77-
}
51+
return getProviderMatching(capabilities).newInstance(capabilities);
7852
}
7953

8054
public boolean hasMappingFor(Capabilities capabilities) {
81-
return capabilitiesToDriver.containsKey(capabilities);
55+
return capabilitiesToDriverProvider.containsKey(capabilities);
8256
}
8357
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
Copyright 2014 Selenium committers
3+
Copyright 2014 Software Freedom Conservancy
4+
5+
Licensed under the Apache License, Version 2.0 (the "License");
6+
you may not use this file except in compliance with the License.
7+
You may obtain a copy of the License at
8+
9+
http://www.apache.org/licenses/LICENSE-2.0
10+
11+
Unless required by applicable law or agreed to in writing, software
12+
distributed under the License is distributed on an "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
See the License for the specific language governing permissions and
15+
limitations under the License.
16+
*/
17+
package org.openqa.selenium.remote.server;
18+
19+
import org.openqa.selenium.Capabilities;
20+
import org.openqa.selenium.WebDriver;
21+
import org.openqa.selenium.WebDriverException;
22+
23+
import java.lang.reflect.Constructor;
24+
import java.lang.reflect.InvocationTargetException;
25+
import java.util.logging.Logger;
26+
27+
public class DefaultDriverProvider implements DriverProvider {
28+
29+
private static final Logger log = Logger.getLogger(DefaultDriverProvider.class.getName());
30+
31+
private Capabilities capabilities;
32+
private Class<? extends WebDriver> implementation;
33+
34+
public DefaultDriverProvider(Capabilities capabilities, Class<? extends WebDriver> implementation) {
35+
this.capabilities = capabilities;
36+
this.implementation = implementation;
37+
}
38+
39+
@Override
40+
public Capabilities getProvidedCapabilities() {
41+
return capabilities;
42+
}
43+
44+
@Override
45+
public Class<? extends WebDriver> getDriverClass() {
46+
return implementation;
47+
}
48+
49+
@Override
50+
public WebDriver newInstance(Capabilities capabilities) {
51+
log.info("Creating a new session for " + capabilities);
52+
// Try and call the single arg constructor that takes a capabilities first
53+
return callConstructor(implementation, capabilities);
54+
}
55+
56+
private WebDriver callConstructor(Class<? extends WebDriver> from, Capabilities capabilities) {
57+
try {
58+
Constructor<? extends WebDriver> constructor = from.getConstructor(Capabilities.class);
59+
return constructor.newInstance(capabilities);
60+
} catch (NoSuchMethodException e) {
61+
try {
62+
return from.newInstance();
63+
} catch (InstantiationException e1) {
64+
throw new WebDriverException(e);
65+
} catch (IllegalAccessException e1) {
66+
throw new WebDriverException(e);
67+
}
68+
} catch (InvocationTargetException e) {
69+
throw new WebDriverException(e);
70+
} catch (InstantiationException e) {
71+
throw new WebDriverException(e);
72+
} catch (IllegalAccessException e) {
73+
throw new WebDriverException(e);
74+
}
75+
}
76+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
Copyright 2014 Selenium committers
3+
Copyright 2014 Software Freedom Conservancy
4+
5+
Licensed under the Apache License, Version 2.0 (the "License");
6+
you may not use this file except in compliance with the License.
7+
You may obtain a copy of the License at
8+
9+
http://www.apache.org/licenses/LICENSE-2.0
10+
11+
Unless required by applicable law or agreed to in writing, software
12+
distributed under the License is distributed on an "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
See the License for the specific language governing permissions and
15+
limitations under the License.
16+
*/
17+
package org.openqa.selenium.remote.server;
18+
19+
import org.openqa.selenium.Capabilities;
20+
import org.openqa.selenium.WebDriver;
21+
22+
public interface DriverProvider {
23+
Capabilities getProvidedCapabilities();
24+
25+
Class<? extends WebDriver> getDriverClass();
26+
27+
WebDriver newInstance(Capabilities capabilities);
28+
}

java/server/src/org/openqa/selenium/remote/server/build.desc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@ java_library(name = "server_very_core",
6060
srcs = [
6161
"CapabilitiesComparator.java",
6262
"DefaultDriverFactory.java",
63+
"DefaultDriverProvider.java",
6364
"DefaultDriverSessions.java",
6465
"DriverFactory.java",
66+
"DriverProvider.java",
6567
"DriverSessions.java",
6668
"KnownElements.java",
6769
"JsonHttpCommandHandler.java",

0 commit comments

Comments
 (0)