How to use getUri method of com.intuit.karate.resource.FileResource class

Best Karate code snippet using com.intuit.karate.resource.FileResource.getUri

Source:ResourceUtils.java Github

copy

Full Screen

1/*2 * The MIT License3 *4 * Copyright 2020 Intuit Inc.5 *6 * Permission is hereby granted, free of charge, to any person obtaining a copy7 * of this software and associated documentation files (the "Software"), to deal8 * in the Software without restriction, including without limitation the rights9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell10 * copies of the Software, and to permit persons to whom the Software is11 * furnished to do so, subject to the following conditions:12 *13 * The above copyright notice and this permission notice shall be included in14 * all copies or substantial portions of the Software.15 *16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN22 * THE SOFTWARE.23 */24package com.intuit.karate.resource;25import java.io.File;26import java.io.IOException;27import java.io.InputStream;28import java.net.URI;29import java.net.URISyntaxException;30import java.net.URL;31import java.nio.file.Files;32import java.nio.file.Path;33import java.nio.file.Paths;34import java.util.ArrayList;35import java.util.Collection;36import java.util.Collections;37import java.util.HashSet;38import java.util.Iterator;39import java.util.List;40import java.util.Set;41import java.util.stream.Collectors;42import java.util.stream.Stream;43import org.slf4j.Logger;44import org.slf4j.LoggerFactory;45import com.intuit.karate.FileUtils;46import com.intuit.karate.core.Feature;47import karate.io.github.classgraph.ClassGraph;48import karate.io.github.classgraph.ResourceList;49import karate.io.github.classgraph.ScanResult;50/**51 * @author pthomas352 */53public class ResourceUtils {54 private static final Logger logger = LoggerFactory.getLogger(ResourceUtils.class);55 private ResourceUtils() {56 // only static methods57 }58 public static List<Feature> findFeatureFiles(File workingDir, List<String> paths) {59 List<Feature> features = new ArrayList();60 if (paths == null || paths.isEmpty()) {61 return features;62 }63 if (paths.size() == 1) {64 String path = paths.get(0);65 int pos = path.indexOf(".feature:");66 int line;67 if (pos != -1) { // line number has been appended68 line = Integer.valueOf(path.substring(pos + 9));69 path = path.substring(0, pos + 8);70 } else {71 line = -1;72 }73 if (path.endsWith(".feature")) {74 Resource resource = getResource(workingDir, path);75 Feature feature = Feature.read(resource);76 feature.setCallLine(line);77 features.add(feature);78 return features;79 }80 }81 Collection<Resource> resources = findResourcesByExtension(workingDir, "feature", paths);82 for (Resource resource : resources) {83 features.add(Feature.read(resource));84 }85 return features;86 }87 private static final ScanResult SCAN_RESULT = new ClassGraph().acceptPaths("/").scan(1);88 public static Resource getResource(File workingDir, String path) {89 if (path.startsWith(Resource.CLASSPATH_COLON)) {90 path = removePrefix(path);91 File file = classPathToFile(path);92 if (file != null) {93 return new FileResource(file, true, path);94 }95 List<Resource> resources = new ArrayList<>();96 synchronized (SCAN_RESULT) {97 ResourceList rl = SCAN_RESULT.getResourcesWithPath(path);98 if (rl == null) {99 rl = ResourceList.emptyList();100 }101 rl.forEachByteArrayIgnoringIOException((res, bytes) -> {102 URI uri = res.getURI();103 if ("file".equals(uri.getScheme())) {104 File found = Paths.get(uri).toFile();105 resources.add(new FileResource(found, true, res.getPath()));106 } else {107 resources.add(new JarResource(bytes, res.getPath(), uri));108 }109 });110 }111 if (resources.isEmpty()) {112 throw new RuntimeException("not found: " + path);113 }114 return resources.get(0);115 } else {116 File file = new File(removePrefix(path));117 if (!file.exists()) { // todo: modified118 if (workingDir != null) {119 file = new File(workingDir, removePrefix(path));120 }121 if (!file.exists()) {122 throw new RuntimeException("not found: " + path);123 }124 }125 Path relativePath = workingDir.toPath().relativize(file.getAbsoluteFile().toPath());126 return new FileResource(file, false, relativePath.toString());127 }128 }129 public static Collection<Resource> findResourcesByExtension(File workingDir, String extension, String path) {130 return findResourcesByExtension(workingDir, extension, Collections.singletonList(path));131 }132 public static List<Resource> findResourcesByExtension(File workingDir, String extension, List<String> paths) {133 List<Resource> results = new ArrayList();134 List<File> fileRoots = new ArrayList();135 List<String> pathRoots = new ArrayList();136 for (String path : paths) {137 if (path.endsWith("." + extension)) {138 results.add(getResource(workingDir, path));139 } else if (path.startsWith(Resource.CLASSPATH_COLON)) {140 pathRoots.add(removePrefix(path));141 } else {142 fileRoots.add(new File(removePrefix(path)));143 }144 }145 if (!fileRoots.isEmpty()) {146 results.addAll(findFilesByExtension(workingDir, extension, fileRoots));147 } else if (results.isEmpty() && !pathRoots.isEmpty()) {148 String[] searchPaths = pathRoots.toArray(new String[pathRoots.size()]);149 try (ScanResult scanResult = new ClassGraph().acceptPaths(searchPaths).scan(1)) {150 ResourceList rl = scanResult.getResourcesWithExtension(extension);151 rl.forEachByteArrayIgnoringIOException((res, bytes) -> {152 URI uri = res.getURI();153 if ("file".equals(uri.getScheme())) {154 File file = Paths.get(uri).toFile();155 results.add(new FileResource(file, true, res.getPath()));156 } else {157 results.add(new JarResource(bytes, res.getPath(), uri));158 }159 });160 }161 }162 return results;163 }164 private static List<Resource> findFilesByExtension(File workingDir, String extension, List<File> files) {165 List<File> results = new ArrayList();166 for (File base : files) {167 Path searchPath;168 if (base.exists()) {169 searchPath = base.toPath();170 } else {171 searchPath = Paths.get(workingDir.getAbsolutePath(), base.getPath());172 }173 Stream<Path> stream;174 try {175 stream = Files.walk(searchPath);176 for (Iterator<Path> paths = stream.iterator(); paths.hasNext(); ) {177 Path path = paths.next();178 String fileName = path.getFileName().toString();179 if (fileName.endsWith("." + extension)) {180 results.add(path.toFile());181 }182 }183 } catch (IOException e) { // NoSuchFileException184 logger.trace("unable to walk path: {} - {}", searchPath, e.getMessage());185 }186 }187 return results.stream()188 .map(f -> {189 Path relativePath = workingDir.toPath().relativize(f.getAbsoluteFile().toPath());190 return new FileResource(f, false, relativePath.toString());191 })192 .collect(Collectors.toList());193 }194 public static File getFileRelativeTo(Class clazz, String path) {195 Path dirPath = getPathContaining(clazz);196 File file = new File(dirPath + File.separator + path);197 if (file.exists()) {198 return file;199 }200 try {201 URL relativePath = clazz.getClassLoader().getResource(toPathFromClassPathRoot(clazz) + File.separator + path);202 return Paths.get(relativePath.toURI()).toFile();203 } catch (Exception e) {204 throw new RuntimeException("cannot find " + path + " relative to " + clazz + ", " + e.getMessage());205 }206 }207 public static Path getPathContaining(Class clazz) {208 String relative = toPathFromClassPathRoot(clazz);209 URL url = clazz.getClassLoader().getResource(relative);210 try {211 return Paths.get(url.toURI());212 } catch (Exception e) {213 throw new RuntimeException(e);214 }215 }216 public static File getDirContaining(Class clazz) {217 Path path = getPathContaining(clazz);218 return path.toFile();219 }220 public static String toPathFromClassPathRoot(Class clazz) {221 Package p = clazz.getPackage();222 String relative = "";223 if (p != null) {224 relative = p.getName().replace('.', '/');225 }226 return relative;227 }228 protected static String removePrefix(String text) {229 if (text.startsWith(Resource.CLASSPATH_COLON) || text.startsWith(Resource.FILE_COLON)) {230 return text.substring(text.indexOf(':') + 1);231 } else {232 return text;233 }234 }235 public static String getParentPath(String relativePath) {236 int pos = relativePath.lastIndexOf('/');237 return pos == -1 ? relativePath : relativePath.substring(0, pos + 1);238 }239 private static final ClassLoader CLASS_LOADER = ResourceUtils.class.getClassLoader();240 public static InputStream classPathResourceToStream(String path) {241 return CLASS_LOADER.getResourceAsStream(path);242 }243 public static String classPathResourceToString(String path) {244 return FileUtils.toString(classPathResourceToStream(path));245 }246 public static File classPathToFile(String path) {247 URL url = CLASS_LOADER.getResource(path);248 if (url == null || !"file".equals(url.getProtocol())) {249 return null;250 }251 try {252 return Paths.get(url.toURI()).toFile();253 } catch (URISyntaxException e) {254 return null;255 }256 }257 public static File classPathOrFile(String path) {258 File temp = classPathToFile(path);259 if (temp != null) {260 return temp;261 }262 temp = new File(path);263 return temp.exists() ? temp : null;264 }265 public static Set<String> findJsFilesInDirectory(File dir) {266 List<Resource> resources = findFilesByExtension(dir.getAbsoluteFile(), "js", Collections.singletonList(dir));267 Set<String> set = new HashSet(resources.size());268 for (Resource res : resources) {269 set.add(res.getRelativePath());270 }271 return set;272 }273 public static Set<String> findJsFilesInClassPath(String path) {274 String searchPath;275 if (path.startsWith(Resource.CLASSPATH_COLON)) {276 searchPath = path;277 path = removePrefix(path);278 } else {279 searchPath = Resource.CLASSPATH_COLON + path;280 }281 Resource root = getResource(FileUtils.WORKING_DIR, searchPath);282 File rootFile = root.isFile() ? root.getFile() : FileUtils.WORKING_DIR;283 Collection<Resource> resources = findResourcesByExtension(rootFile, "js", searchPath);284 Set<String> set = new HashSet(resources.size());285 int pos = path.length();286 for (Resource res : resources) {287 set.add(res.getRelativePath().substring(pos));288 }289 return set;290 }291}...

Full Screen

Full Screen

Source:MemoryResource.java Github

copy

Full Screen

...53 public File getFile() {54 return file;55 }56 @Override57 public URI getUri() {58 return file.toURI();59 }60 @Override61 public String getRelativePath() {62 return file.getPath().replace('\\', '/');63 }64 @Override65 public Resource resolve(String path) {66 return new FileResource(new File(file.getParent() + File.separator + path));67 }68 @Override69 public InputStream getStream() {70 return new ByteArrayInputStream(bytes);71 }...

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1package com.intuit.karate.resource;2import java.io.File;3import java.net.URI;4import java.net.URISyntaxException;5import java.net.URL;6public class FileResource {7 public static void main(String[] args) throws URISyntaxException {8 File file = new File("src/test/java/com/intuit/karate/resource/4.java");9 URI uri = file.toURI();10 System.out.println(uri);11 URL url = file.toURL();12 System.out.println(url);13 }14}

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.resource.FileResource;2import java.io.File;3public class 4 {4 public static void main(String[] args) {5 FileResource fr = new FileResource(new File("C:\\Users\\user\\Desktop\\sample.txt"));6 System.out.println(fr.getUri());7 }8}9import com.intuit.karate.resource.FileResource;10import java.io.File;11public class 5 {12 public static void main(String[] args) {13 FileResource fr = new FileResource(new File("C:\\Users\\user\\Desktop\\sample.txt"));14 System.out.println(fr.getUri());15 }16}17import com.intuit.karate.resource.FileResource;18import java.io.File;19public class 6 {20 public static void main(String[] args) {21 FileResource fr = new FileResource(new File("C:\\Users\\user\\Desktop\\sample.txt"));22 System.out.println(fr.getUri());23 }24}25import com.intuit.karate.resource.FileResource;26import java.io.File;27public class 7 {28 public static void main(String[] args) {29 FileResource fr = new FileResource(new File("C:\\Users\\user\\Desktop\\sample.txt"));30 System.out.println(fr.getUri());31 }32}33import com.intuit.karate.resource.FileResource;34import java.io.File;35public class 8 {36 public static void main(String[] args) {37 FileResource fr = new FileResource(new File("C:\\Users\\user\\Desktop\\sample.txt"));38 System.out.println(fr.getUri());39 }40}

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.resource.FileResource;2import java.io.File;3import java.net.URI;4public class 4 {5 public static void main(String[] args) {6 FileResource fileResource = new FileResource(new File("C:\\Users\\user\\Desktop\\test.txt"));7 URI fileUri = fileResource.getUri();8 System.out.println(fileUri);9 }10}11import com.intuit.karate.resource.FileResource;12import java.io.File;13import java.net.URI;14public class 5 {15 public static void main(String[] args) {16 FileResource fileResource = new FileResource(new File("C:\\Users\\user\\Desktop\\test.txt"));17 URI fileUri = fileResource.getUri();18 System.out.println(fileUri);19 }20}21import com.intuit.karate.resource.FileResource;22import java.io.File;23import java.net.URI;24public class 6 {25 public static void main(String[] args) {26 FileResource fileResource = new FileResource(new File("C:\\Users\\user\\Desktop\\test.txt"));27 URI fileUri = fileResource.getUri();28 System.out.println(fileUri);29 }30}31import com.intuit.karate.resource.FileResource;32import java.io.File;33import java.net.URI;34public class 7 {35 public static void main(String[] args) {36 FileResource fileResource = new FileResource(new File("C:\\Users\\user\\Desktop\\test.txt"));37 URI fileUri = fileResource.getUri();38 System.out.println(fileUri);39 }40}41import com.intuit.karate.resource.FileResource;42import java.io.File;43import java.net.URI;44public class 8 {45 public static void main(String[]

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.resource.FileResource;2import java.io.File;3public class 4 {4 public static void main(String[] args) {5 FileResource fileResource = new FileResource(new File("src/test/resources/3.java"));6 System.out.println(fileResource.getUri());7 }8}9import com.intuit.karate.resource.FileResource;10import java.io.File;11public class 5 {12 public static void main(String[] args) {13 FileResource fileResource = new FileResource(new File("src/test/resources/3.java"));14 System.out.println(fileResource.getUri());15 }16}17import com.intuit.karate.resource.FileResource;18import java.io.File;19public class 6 {20 public static void main(String[] args) {21 FileResource fileResource = new FileResource(new File("src/test/resources/3.java"));22 System.out.println(fileResource.getUri());23 }24}25import com.intuit.karate.resource.FileResource;26import java.io.File;27public class 7 {28 public static void main(String[] args) {29 FileResource fileResource = new FileResource(new File("src/test/resources/3.java"));30 System.out.println(fileResource.getUri());31 }32}

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1package com.intuit.karate;2import java.util.*;3import java.io.*;4import org.apache.commons.io.FileUtils;5import org.apache.commons.io.IOUtils;6import org.slf4j.Logger;7import org.slf4j.LoggerFactory;8public class FileResource implements Resource {9 private static final Logger logger = LoggerFactory.getLogger(FileResource.class);10 private final File file;11 public FileResource(File file) {12 this.file = file;13 }14 public String getUri() {15 return file.toURI().toString();16 }17 public byte[] getBytes() {18 try {19 return FileUtils.readFileToByteArray(file);20 } catch (IOException e) {21 throw new RuntimeException(e);22 }23 }24 public String getText() {25 try {26 return FileUtils.readFileToString(file, "UTF-8");27 } catch (IOException e) {28 throw new RuntimeException(e);29 }30 }31 public String toString() {32 return file.getAbsolutePath();33 }34}35package com.intuit.karate;36import java.util.*;37import java.io.*;38import org.apache.commons.io.FileUtils;39import org.apache.commons.io.IOUtils;40import org.slf4j.Logger;41import org.slf4j.LoggerFactory;42public class FileResource implements Resource {43 private static final Logger logger = LoggerFactory.getLogger(FileResource.class);44 private final File file;45 public FileResource(File file) {46 this.file = file;47 }48 public String getUri() {49 return file.toURI().toString();50 }51 public byte[] getBytes() {52 try {53 return FileUtils.readFileToByteArray(file);54 } catch (IOException e) {55 throw new RuntimeException(e);56 }57 }58 public String getText() {59 try {60 return FileUtils.readFileToString(file, "UTF-8");61 } catch (IOException e) {62 throw new RuntimeException(e);63 }64 }65 public String toString() {66 return file.getAbsolutePath();67 }68}69package com.intuit.karate;70import java.util.*;71import java.io.*;72import org.apache.commons.io.FileUtils;

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.resource.FileResource;2import com.intuit.karate.resource.Resource;3import java.io.File;4import java.net.URI;5import java.nio.file.Path;6import java.nio.file.Paths;7import org.slf4j.Logger;8import org.slf4j.LoggerFactory;9public class 4 {10 private static final Logger logger = LoggerFactory.getLogger(4.class);11 public static void main(String[] args) {12 String dir = System.getProperty("user.dir");13 Path path = Paths.get(dir, "src", "test", "java", "com", "intuit", "karate", "resource", "4.java");14 File file = path.toFile();15 Resource resource = FileResource.fromFile(file);16 URI uri = resource.getUri();17 logger.debug("uri: {}", uri);18 }19}20import com.intuit.karate.resource.FileResource;21import com.intuit.karate.resource.Resource;22import java.io.File;23import java.net.URI;24import java.nio.file.Path;25import java.nio.file.Paths;26import org.slf4j.Logger;27import org.slf4j.LoggerFactory;28public class 5 {29 private static final Logger logger = LoggerFactory.getLogger(5.class);30 public static void main(String[] args) {31 String dir = System.getProperty("user.dir");32 Path path = Paths.get(dir, "src", "test", "java", "com", "intuit", "karate", "resource", "5.java");33 File file = path.toFile();34 Resource resource = FileResource.fromFile(file);35 URI uri = resource.getUri();36 logger.debug("uri: {}", uri);37 }38}39import com.intuit.karate.resource.FileResource;40import com.intuit.karate.resource.Resource;41import java.io.File;42import java.net.URI;43import java.nio.file.Path;44import java.nio.file.Paths;45import org.slf4j.Logger;46import org.slf4j.LoggerFactory;47public class 6 {48 private static final Logger logger = LoggerFactory.getLogger(6.class);49 public static void main(String[] args

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1package com.intuit.karate.resource;2import com.intuit.karate.FileUtils;3import java.io.File;4import java.net.URI;5import java.net.URISyntaxException;6import org.junit.Test;7import static org.junit.Assert.*;8public class FileResourceTest {9 public void testGetUri() throws URISyntaxException {10 FileResource resource = new FileResource(new File("src/test/java/com/intuit/karate/resource/4.java"));11 URI uri = resource.getUri();12 }13}14package com.intuit.karate.resource;15import com.intuit.karate.FileUtils;16import java.io.File;17import java.net.URI;18import java.net.URISyntaxException;19import org.junit.Test;20import static org.junit.Assert.*;21public class ClasspathResourceTest {22 public void testGetUri() throws URISyntaxException {23 ClasspathResource resource = new ClasspathResource("com/intuit/karate/resource/5.java");24 URI uri = resource.getUri();25 assertEquals(uri, new URI("classpath:/com/intuit/karate/resource/5.java"));26 }27}28package com.intuit.karate.resource;29import com.intuit.karate.FileUtils;30import java.io.File;31import java.net.URI;32import java.net.URISyntaxException;33import org.junit.Test;34import static org.junit.Assert.*;35public class UrlResourceTest {36 public void testGetUri() throws URISyntaxException {37 URI uri = resource.getUri();38 }39}40package com.intuit.karate.resource;41import com.intuit.karate.FileUtils;

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1package com.intuit.karate.resource;2import java.io.File;3import java.net.URI;4import java.net.URISyntaxException;5import java.net.URL;6import java.nio.file.Paths;7import java.util.logging.Level;8import java.util.logging.Logger;9public class FileResource {10 public static void main(String[] args) {11 try {12 File file = new File("C:\\Users\\hp\\Desktop\\karate\\karate-core\\src\\test\\java\\com\\intuit\\karate\\resource\\4.java");13 URI uri = file.toURI();14 System.out.println("URI of the file is "+uri);15 } catch (Exception ex) {16 Logger.getLogger(FileResource.class.getName()).log(Level.SEVERE, null, ex);17 }18 }19}20package com.intuit.karate.resource;21import java.io.File;22import java.net.URI;23import java.net.URISyntaxException;24import java.net.URL;25import java.nio.file.Paths;26import java.util.logging.Level;27import java.util.logging.Logger;28public class FileResource {29 public static void main(String[] args) {30 try {31 File file = new File("C:\\Users\\hp\\Desktop\\karate\\karate-core\\src\\test\\java\\com\\intuit\\karate\\resource\\5.java");32 URI uri = file.toURI();33 System.out.println("URI of the file is "+uri);34 } catch (Exception ex) {35 Logger.getLogger(FileResource.class.getName()).log(Level.SEVERE, null, ex);36 }37 }38}39package com.intuit.karate.resource;40import java.io.File;41import java.net.URI;42import java.net.URISyntaxException;43import java.net.URL

Full Screen

Full Screen

getUri

Using AI Code Generation

copy

Full Screen

1package com.intuit.karate.resource;2import java.io.File;3import java.net.URI;4import java.net.URISyntaxException;5import java.net.URL;6public class FileResource {7public static void main(String[] args) throws URISyntaxException {8File file = new File("C:\\Users\\test\\Desktop\\test.txt");9URI uri = file.toURI();10System.out.println("URI: "+uri);11URL url = file.toURL();12System.out.println("URL: "+url);13}14}15package com.intuit.karate.resource;16import java.io.File;17import java.net.URI;18import java.net.URISyntaxException;19import java.net.URL;20public class FileResource {21public static void main(String[] args) throws URISyntaxException {22File file = new File("C:\\Users\\test\\Desktop\\test.txt");23URI uri = file.toURI();24System.out.println("URI: "+uri);25URL url = file.toURL();26System.out.println("URL: "+url);27}28}29package com.intuit.karate.resource;30import java.io.File;31import java.net.URI;32import java.net.URISyntaxException;33import java.net.URL;34public class FileResource {35public static void main(String[] args) throws URISyntaxException {36File file = new File("C:\\Users\\test\\Desktop\\test.txt");37URI uri = file.toURI();38System.out.println("URI: "+uri);39URL url = file.toURL();40System.out.println("URL: "+url);41}42}43package com.intuit.karate.resource;44import java.io.File;45import java.net.URI;46import java.net.UR

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run Karate automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful