From c8c3e223ab4e18739f21a8ce6cd9cb2ccd7b7b7b Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Fri, 10 Nov 2017 15:36:36 +0100 Subject: [PATCH 1/2] Cache session details to avoid making unnecessary queries --- .../DefaultGenericMobileDriver.java | 32 +++++++++++++++++ .../appium/java_client/HasSessionDetails.java | 34 ++++--------------- .../widget/tests/AbstractStubWebDriver.java | 6 ++++ 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java b/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java index 23e188b22..bd7c6072a 100644 --- a/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java +++ b/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java @@ -30,10 +30,16 @@ import java.util.List; import java.util.Map; +import static io.appium.java_client.MobileCommand.GET_SESSION; +import static java.util.stream.Collectors.toMap; +import static org.apache.commons.lang3.StringUtils.isBlank; + @SuppressWarnings({"unchecked", "rawtypes"}) abstract class DefaultGenericMobileDriver extends RemoteWebDriver implements MobileDriver { + private volatile ImmutableMap sessionDetails = null; + public DefaultGenericMobileDriver(CommandExecutor executor, Capabilities desiredCapabilities) { super(executor, desiredCapabilities); } @@ -151,6 +157,32 @@ public List findElementsByXPath(String using) { return super.getMouse(); } + /** + * @return a map with values that hold session details. + * + */ + @SuppressWarnings("unchecked") + @Override + public Map getSessionDetails() { + if (sessionDetails == null) { + Response response = execute(GET_SESSION); + Map resultMap = Map.class.cast(response.getValue()); + + //this filtering was added to clear returned result. + //results of further operations should be simply interpreted by users + sessionDetails = ImmutableMap.builder() + .putAll(resultMap.entrySet() + .stream().filter(entry -> { + String key = entry.getKey(); + Object value = entry.getValue(); + return !isBlank(key) + && value != null + && !isBlank(String.valueOf(value)); + }).collect(toMap(Map.Entry::getKey, Map.Entry::getValue))).build(); + } + return sessionDetails; + } + @Override public String toString() { return String.format("%s: %s", getPlatformName(), diff --git a/src/main/java/io/appium/java_client/HasSessionDetails.java b/src/main/java/io/appium/java_client/HasSessionDetails.java index cefdfdf3d..8042f3139 100644 --- a/src/main/java/io/appium/java_client/HasSessionDetails.java +++ b/src/main/java/io/appium/java_client/HasSessionDetails.java @@ -16,41 +16,21 @@ package io.appium.java_client; -import static io.appium.java_client.MobileCommand.GET_SESSION; import static java.util.Optional.ofNullable; -import static java.util.stream.Collectors.toMap; -import static org.apache.commons.lang3.StringUtils.isBlank; - -import com.google.common.collect.ImmutableMap; - -import org.openqa.selenium.remote.Response; import java.util.Map; import javax.annotation.Nullable; public interface HasSessionDetails extends ExecutesMethod { + + Map getSessionDetails(); + /** - * @return a map with values that hold session details. + * Get the value of the corresponding session detail. * + * @param detail The name of the details to get in the map. + * @return The value of the detail. */ - @SuppressWarnings("unchecked") - default Map getSessionDetails() { - Response response = execute(GET_SESSION); - Map resultMap = Map.class.cast(response.getValue()); - - //this filtering was added to clear returned result. - //results of further operations should be simply interpreted by users - return ImmutableMap.builder() - .putAll(resultMap.entrySet() - .stream().filter(entry -> { - String key = entry.getKey(); - Object value = entry.getValue(); - return !isBlank(key) - && value != null - && !isBlank(String.valueOf(value)); - }).collect(toMap(Map.Entry::getKey, Map.Entry::getValue))).build(); - } - default @Nullable Object getSessionDetail(String detail) { return getSessionDetails().get(detail); } @@ -67,7 +47,7 @@ default Map getSessionDetails() { /** * @return current automation name. */ - default @Nullable String getAutomationName() { + default @Nullable String getAutomationName() { return ofNullable(getSessionDetail("automationName")) .map(String::valueOf).orElse(null); } diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/AbstractStubWebDriver.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/AbstractStubWebDriver.java index d5c5af560..b0096df05 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/AbstractStubWebDriver.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/AbstractStubWebDriver.java @@ -23,6 +23,12 @@ import java.util.concurrent.TimeUnit; public abstract class AbstractStubWebDriver implements WebDriver, HasSessionDetails { + + @Override + public Map getSessionDetails() { + return null; + } + @Override public Response execute(String driverCommand, Map parameters) { return null; From 1ec6379fcd89fc349f279aa25619b3e147473c89 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Fri, 10 Nov 2017 15:46:32 +0100 Subject: [PATCH 2/2] Make the method synchronized --- .../io/appium/java_client/DefaultGenericMobileDriver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java b/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java index bd7c6072a..ad207f449 100644 --- a/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java +++ b/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java @@ -38,7 +38,7 @@ abstract class DefaultGenericMobileDriver extends RemoteWebDriver implements MobileDriver { - private volatile ImmutableMap sessionDetails = null; + private ImmutableMap sessionDetails = null; public DefaultGenericMobileDriver(CommandExecutor executor, Capabilities desiredCapabilities) { super(executor, desiredCapabilities); @@ -163,7 +163,7 @@ public List findElementsByXPath(String using) { */ @SuppressWarnings("unchecked") @Override - public Map getSessionDetails() { + public synchronized Map getSessionDetails() { if (sessionDetails == null) { Response response = execute(GET_SESSION); Map resultMap = Map.class.cast(response.getValue());