![JAR search and dependency download from the Maven repository](/logo.png)
io.appium.java_client.remote.NewAppiumSessionPayload Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of java-client Show documentation
Show all versions of java-client Show documentation
Java client for Appium Mobile Webdriver
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you 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.writeTo
package io.appium.java_client.remote;
import static com.google.common.collect.ImmutableMap.of;
import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static io.appium.java_client.internal.CapabilityHelpers.APPIUM_PREFIX;
import static io.appium.java_client.remote.MobileCapabilityType.FORCE_MJSONWP;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.toList;
import static org.openqa.selenium.json.Json.LIST_OF_MAPS_TYPE;
import static org.openqa.selenium.json.Json.MAP_TYPE;
import static org.openqa.selenium.remote.CapabilityType.PLATFORM;
import static org.openqa.selenium.remote.CapabilityType.PLATFORM_NAME;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.common.io.CharSource;
import com.google.common.io.CharStreams;
import com.google.common.io.FileBackedOutputStream;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.ImmutableCapabilities;
import org.openqa.selenium.json.Json;
import org.openqa.selenium.json.JsonInput;
import org.openqa.selenium.json.JsonOutput;
import org.openqa.selenium.remote.AcceptedW3CCapabilityKeys;
import org.openqa.selenium.remote.Dialect;
import org.openqa.selenium.remote.session.CapabilitiesFilter;
import org.openqa.selenium.remote.session.CapabilityTransform;
import org.openqa.selenium.remote.session.ChromeFilter;
import org.openqa.selenium.remote.session.EdgeFilter;
import org.openqa.selenium.remote.session.FirefoxFilter;
import org.openqa.selenium.remote.session.InternetExplorerFilter;
import org.openqa.selenium.remote.session.OperaFilter;
import org.openqa.selenium.remote.session.ProxyTransform;
import org.openqa.selenium.remote.session.SafariFilter;
import org.openqa.selenium.remote.session.StripAnyPlatform;
import org.openqa.selenium.remote.session.W3CPlatformNameNormaliser;
import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Queue;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nullable;
public class NewAppiumSessionPayload implements Closeable {
private static final List APPIUM_CAPABILITIES = ImmutableList.builder()
.addAll(getAppiumCapabilities(MobileCapabilityType.class))
.addAll(getAppiumCapabilities(AndroidMobileCapabilityType.class))
.addAll(getAppiumCapabilities(IOSMobileCapabilityType.class))
.addAll(getAppiumCapabilities(YouiEngineCapabilityType.class)).build();
private static final String DESIRED_CAPABILITIES = "desiredCapabilities";
private static final String CAPABILITIES = "capabilities";
private static final String REQUIRED_CAPABILITIES = "requiredCapabilities";
private static final String FIRST_MATCH = "firstMatch";
private static final String ALWAYS_MATCH = "alwaysMatch";
private static final Predicate ACCEPTED_W3C_PATTERNS = new AcceptedW3CCapabilityKeys();
private final Set adapters;
private final Set transforms;
private final boolean forceMobileJSONWP;
private final Json json = new Json();
private final FileBackedOutputStream backingStore;
private static List getAppiumCapabilities(Class> capabilityList) {
return Arrays.stream(capabilityList.getDeclaredFields()).map(field -> {
field.setAccessible(true);
try {
return field.get(capabilityList).toString();
} catch (IllegalAccessException e) {
throw new IllegalArgumentException(e);
}
}).filter(s -> !FORCE_MJSONWP.equals(s)).collect(toList());
}
/**
* Creates instance of {@link NewAppiumSessionPayload}.
*
* @param caps capabilities to create a new session
* @return instance of {@link NewAppiumSessionPayload}
* @throws IOException On file system I/O error.
*/
public static NewAppiumSessionPayload create(Capabilities caps) throws IOException {
boolean forceMobileJSONWP =
ofNullable(caps.getCapability(FORCE_MJSONWP))
.map(o -> Boolean.class.isAssignableFrom(o.getClass()) && Boolean.class.cast(o))
.orElse(false);
HashMap capabilityMap = new HashMap<>(caps.asMap());
capabilityMap.remove(FORCE_MJSONWP);
Map source = of(DESIRED_CAPABILITIES, capabilityMap);
String json = new Json().toJson(source);
return new NewAppiumSessionPayload(new StringReader(json), forceMobileJSONWP);
}
private NewAppiumSessionPayload(Reader source, boolean forceMobileJSONWP) throws IOException {
this.forceMobileJSONWP = forceMobileJSONWP;
// Dedicate up to 10% of all RAM or 20% of available RAM (whichever is smaller) to storing this
// payload.
int threshold = (int) Math.min(
Integer.MAX_VALUE,
Math.min(
Runtime.getRuntime().freeMemory() / 5,
Runtime.getRuntime().maxMemory() / 10));
backingStore = new FileBackedOutputStream(threshold);
try (Writer writer = new OutputStreamWriter(backingStore, UTF_8)) {
CharStreams.copy(source, writer);
}
ImmutableSet.Builder adapters = ImmutableSet.builder();
ServiceLoader.load(CapabilitiesFilter.class).forEach(adapters::add);
adapters
.add(new ChromeFilter())
.add(new EdgeFilter())
.add(new FirefoxFilter())
.add(new InternetExplorerFilter())
.add(new OperaFilter())
.add(new SafariFilter());
this.adapters = adapters.build();
ImmutableSet.Builder transforms = ImmutableSet.builder();
ServiceLoader.load(CapabilityTransform.class).forEach(transforms::add);
transforms
.add(new ProxyTransform())
.add(new StripAnyPlatform())
.add(new W3CPlatformNameNormaliser());
this.transforms = transforms.build();
ImmutableSet.Builder dialects = ImmutableSet.builder();
if (getOss() != null) {
dialects.add(Dialect.OSS);
}
if (getAlwaysMatch() != null || getFirstMatch() != null) {
dialects.add(Dialect.W3C);
}
validate();
}
private void validate() throws IOException {
Map alwaysMatch = getAlwaysMatch();
if (alwaysMatch == null) {
alwaysMatch = of();
}
Map always = alwaysMatch;
Collection
© 2015 - 2025 Weber Informatics LLC | Privacy Policy