From 58ed7b9963341c075ee043984d4f1c30f27db758 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 8 Jun 2021 12:16:30 -0400 Subject: [PATCH 001/171] updated dependency version per dependabot --- log4j/pom.xml | 3 +-- pageobject-generator/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/log4j/pom.xml b/log4j/pom.xml index b0fba773e..91a8c5d94 100644 --- a/log4j/pom.xml +++ b/log4j/pom.xml @@ -20,7 +20,7 @@ 3.1 3.2.2 1.7.6 - 1.1.1 + 1.2.0 @@ -84,7 +84,6 @@ commons-collections ${org.apache.commons.collections.version} - ch.qos.logback logback-classic diff --git a/pageobject-generator/pom.xml b/pageobject-generator/pom.xml index 17b77eb08..1de54a163 100644 --- a/pageobject-generator/pom.xml +++ b/pageobject-generator/pom.xml @@ -56,7 +56,7 @@ ch.qos.logback logback-classic - 1.1.8 + 1.2.0 test @@ -152,4 +152,4 @@ - \ No newline at end of file + From e599ef91b8671a480326f1589f890cc6a7a7f40f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 22 Mar 2023 18:27:38 -0700 Subject: [PATCH 002/171] intermediate revision - updated "runProcess" to match the "basic-perl-cgi-bin-java" method in accepting piped input for POST request implementation --- basic-cygwin/README.md | 48 ++++++++++++++++++--- basic-cygwin/pom.xml | 2 +- basic-cygwin/src/main/java/example/App.java | 41 +++++++++++++++--- 3 files changed, 77 insertions(+), 14 deletions(-) diff --git a/basic-cygwin/README.md b/basic-cygwin/README.md index 0899dd368..e64c82732 100644 --- a/basic-cygwin/README.md +++ b/basic-cygwin/README.md @@ -10,18 +10,54 @@ mvn package ``` * run via `CLASSPATH`: ``` -java -cp target\example.cygwin.jar;target\lib\* example.App /var/log +java -cp target\example.cygwin.jar;target\lib\* example.App -command ls -arguments /var/log -debug ``` + this outputs -```cmd -Listing the dirs: [/var/log] -Running the command: c:\cygwin\bin\bash.exe -c "/bin/ls -Q $0 $1 $2 $3 $4 $5 $6 $7 $8 $9" /var/log ``` +command: ls +arguments: /var/log +args: [] +All optons: +ls +/var/log +null +Listing the dirs: /var/log +lastlog +setup.log +setup.log.full +sshd.log + +Done: ls /var/log +``` + + ```cmd +java -cp target\example.cygwin.jar;target\lib\* example.App -command ls -arguments /var/log -debug -bash +``` +this outputs +```text +command: ls +arguments: /var/log +args: [] +All optons: +ls +/var/log +null +null +Listing the dirs: /var/log lastlog setup.log setup.log.full -sshd.log +sshd.log + + + + + + + +Done: ls /var/log ``` This matches the output of the @@ -39,7 +75,7 @@ sshd.log * try non existent dir, to trigger error: ```cmd -java -cp target\example.cygwin.jar;target\lib\* example.App /baddir +java -cp target\example.cygwin.jar;target\lib\* example.App -c ls -a /baddir ``` ```cmd diff --git a/basic-cygwin/pom.xml b/basic-cygwin/pom.xml index c5639182f..f38d7ea5c 100644 --- a/basic-cygwin/pom.xml +++ b/basic-cygwin/pom.xml @@ -4,7 +4,7 @@ example cygwin jar - 0.7.0-SNAPSHOT + 0.8.0-SNAPSHOT cygwin http://maven.apache.org diff --git a/basic-cygwin/src/main/java/example/App.java b/basic-cygwin/src/main/java/example/App.java index 2e5821fae..1b78f7b45 100644 --- a/basic-cygwin/src/main/java/example/App.java +++ b/basic-cygwin/src/main/java/example/App.java @@ -1,10 +1,12 @@ package example; /** - * Copyright 2021-2022 Serguei Kouzmine + * Copyright 2021,2022,2023 Serguei Kouzmine */ import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; @@ -91,7 +93,7 @@ public static void main(String args[]) throws ParseException { runProcessls(Arrays.asList(argumentsArray)); } else { // generic command - runProcess(String.format("%s %s", command, arguments)); + runProcess(String.format("%s %s", command, arguments), null); } if (debug) { System.err.println("Done: " + command + " " + arguments); @@ -127,14 +129,37 @@ private static String buildLscommand(List dirs) { public static void runProcessls(List dirs) { final String command = useBash ? buildLsBashcommand(dirs) : buildLscommand(dirs); - runProcess(command); + runProcess(command, null); } // https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2 - public static void runProcess(String command) { + public static void runProcess(String command, String payload) { + try { Runtime runtime = Runtime.getRuntime(); - Process process = runtime.exec(command); + + Process process = null; + + if (payload != null) { + // see also: + // execute the specified string command in a separate process + // with the specified environment + // http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String%5B%5D%29 + String[] envp = { String.format("CONTENT_LENGTH=%d", payload.length()), + "REQUEST_METHOD=POST" }; + System.err.println("Running with environment: " + Arrays.asList(envp)); + process = runtime.exec(command, envp); + BufferedWriter bufferedWriter = new BufferedWriter( + new OutputStreamWriter(process.getOutputStream())); + System.err.println("Passing the payload: " + payload); + // Passing the payload: %7B%22foo%22%3A+%22bar%22%7D= + bufferedWriter.write(payload); + bufferedWriter.newLine(); + bufferedWriter.flush(); + bufferedWriter.close(); + } else { + process = runtime.exec(command); + } // process.redirectErrorStream( true); BufferedReader stdoutBufferedReader = new BufferedReader( @@ -143,7 +168,6 @@ public static void runProcess(String command) { BufferedReader stderrBufferedReader = new BufferedReader( new InputStreamReader(process.getErrorStream())); String line = null; - StringBuffer processOutput = new StringBuffer(); while ((line = stdoutBufferedReader.readLine()) != null) { processOutput.append(line); @@ -156,13 +180,14 @@ public static void runProcess(String command) { } int exitCode = process.waitFor(); // ignore exit code 128 on Windows: the process "" not - // found. + // found if (exitCode != 0 && (exitCode ^ 128) != 0) { System.err.println("Process exit code: " + exitCode); if (processOutput.length() > 0) { System.err.println("" + ((useQuoteArg) ? fixQuotedOutput(processOutput.toString()) : processOutput) + ""); + } if (processError.length() > 0) { System.err.println("" + processError + ""); @@ -173,10 +198,12 @@ public static void runProcess(String command) { ? fixQuotedOutput(processOutput.toString()) : processOutput) + ""); } + } } catch (Exception e) { System.err.println("Exception (ignored): " + e.getMessage()); } + } public static String getOSName() { From 2908f711d330ac71fe154741ba83f85cd63cae82 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Thu, 30 Mar 2023 02:13:26 +0200 Subject: [PATCH 003/171] intermedite reivvision - added custom launcher example useful on Windows --- utils/launch.sh | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 utils/launch.sh diff --git a/utils/launch.sh b/utils/launch.sh new file mode 100755 index 000000000..a8070ec56 --- /dev/null +++ b/utils/launch.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# see also: https://qna.habr.com/q/1267054?e=13641280#clarification_1710040 (in Russian) +start '' "C:\Program Files (x86)\Notepad++\notepad++.exe" "$@" From e5de0b4d675d9e41ad1ddd4fd54c6caf56f917d5 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 9 Apr 2023 14:00:28 -0400 Subject: [PATCH 004/171] intermediate revision - added codesignal exercise --- example-codesignal/README.md | 26 +++ example-codesignal/pom.xml | 150 +++++++++++++++++ .../java/example/SawTest.java.base64.jasypt | 155 ++++++++++++++++++ 3 files changed, 331 insertions(+) create mode 100644 example-codesignal/README.md create mode 100644 example-codesignal/pom.xml create mode 100644 example-codesignal/src/test/java/example/SawTest.java.base64.jasypt diff --git a/example-codesignal/README.md b/example-codesignal/README.md new file mode 100644 index 000000000..3efabcf69 --- /dev/null +++ b/example-codesignal/README.md @@ -0,0 +1,26 @@ +### Info + +* https://app.codesignal.com/pre-screens + +### Usage +* before commit +```sh + +export SECRET=test +cd src/test/java/example/ +base64 SawTest.java > SawTest.java.base64 +perl ../../../../jasypt.pl -value "$(cat SawTest.java.base64)" -operation encrypt -secret $SECRET >SawTest.java.base64.jasypt +base64 -d SawTest.java.base64 > SawTest.java +``` + +* after pull +```sh +export SECRET=test +cd src/test/java/example/ +perl ../../../../jasypt.pl -value "$(cat SawTest.java.base64.jasypt)" -operation decrypt -secret $SECRET > SawTest.java.base64 +base64 -d SawTest.java.base64 > SawTest.java +``` +### Note +use `PBEWithMD5AndDES` alorithm +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/example-codesignal/pom.xml b/example-codesignal/pom.xml new file mode 100644 index 000000000..4aeea593c --- /dev/null +++ b/example-codesignal/pom.xml @@ -0,0 +1,150 @@ + + + 4.0.0 + example + codesignal + jar + 0.1.0-SNAPSHOT + codesignal + testing + http://maven.apache.org + + UTF-8 + 1.13 + 1.3 + 2.7 + 2.6 + 4.13.1 + 20211205 + 1.3 + 3.6.1 + 3.1.1 + 1.8 + 2.8.9 + + + + org.json + json + ${json.version} + + + junit + junit + ${junit.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + + + + + commons-codec + commons-codec + ${commons-codec.version} + + + commons-lang + commons-lang + ${commons-lang.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + com.google.code.gson + gson + ${gson.version} + + + + com.google.guava + guava + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + maven-central + maven central repo + https://mvnrepository.com/repos/central + + + osgeo + osgeo repo + https://download.osgeo.org/webdav/geotools/ + + + seasar + seasar repo + https://www.seasar.org/maven/maven2 + + + jcenter + https://jcenter.bintray.com/ + + + central + https://repo1.maven.org/maven2/ + + + + project.local + project + file:${project.basedir}/repo + + + diff --git a/example-codesignal/src/test/java/example/SawTest.java.base64.jasypt b/example-codesignal/src/test/java/example/SawTest.java.base64.jasypt new file mode 100644 index 000000000..ec5a30486 --- /dev/null +++ b/example-codesignal/src/test/java/example/SawTest.java.base64.jasypt @@ -0,0 +1,155 @@ +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 +HWTmEWxHmqdiDruvqVfSPzZhVq7MD+Y= + From 39c0876166c2a0e98ae764ecb7afb3aa2bf6960f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Thu, 20 Apr 2023 18:55:02 +0200 Subject: [PATCH 005/171] intermediate revision - updated documentation and added common utilities relevant for the project subject, from SWET --- example-codesignal/README.md | 6 + example-codesignal/pom.xml | 150 ++++++++++++++++++ ini_parser/README.md | 3 +- .../src/main/java/example/test/Utils.java | 54 ++++++- 4 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 example-codesignal/README.md create mode 100644 example-codesignal/pom.xml diff --git a/example-codesignal/README.md b/example-codesignal/README.md new file mode 100644 index 000000000..d12e9fe58 --- /dev/null +++ b/example-codesignal/README.md @@ -0,0 +1,6 @@ +### Info + +* https://app.codesignal.com/pre-screens + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/example-codesignal/pom.xml b/example-codesignal/pom.xml new file mode 100644 index 000000000..4aeea593c --- /dev/null +++ b/example-codesignal/pom.xml @@ -0,0 +1,150 @@ + + + 4.0.0 + example + codesignal + jar + 0.1.0-SNAPSHOT + codesignal + testing + http://maven.apache.org + + UTF-8 + 1.13 + 1.3 + 2.7 + 2.6 + 4.13.1 + 20211205 + 1.3 + 3.6.1 + 3.1.1 + 1.8 + 2.8.9 + + + + org.json + json + ${json.version} + + + junit + junit + ${junit.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + + + + + commons-codec + commons-codec + ${commons-codec.version} + + + commons-lang + commons-lang + ${commons-lang.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + com.google.code.gson + gson + ${gson.version} + + + + com.google.guava + guava + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + maven-central + maven central repo + https://mvnrepository.com/repos/central + + + osgeo + osgeo repo + https://download.osgeo.org/webdav/geotools/ + + + seasar + seasar repo + https://www.seasar.org/maven/maven2 + + + jcenter + https://jcenter.bintray.com/ + + + central + https://repo1.maven.org/maven2/ + + + + project.local + project + file:${project.basedir}/repo + + + diff --git a/ini_parser/README.md b/ini_parser/README.md index cfcad5c5b..9c8f8776f 100644 --- a/ini_parser/README.md +++ b/ini_parser/README.md @@ -103,6 +103,7 @@ option3: default value for option3 * [yet another, somewhat bloated c# project containing complex hierarchy of classes just to deal with the ini file](https://github.com/simplesoft-pt/IniParser) * [default Ruby package for ini files](https://github.com/TwP/inifile) * [blog](https://ourcodeworld.com/articles/read/839/how-to-read-parse-from-and-write-to-ini-files-easily-in-java) on how to read and write to INI files easily in Java using `org.ini4j.ini4j` [jar](https://mvnrepository.com/artifact/org.ini4j/ini4j) - + * how to Avoid the Java `FileNotFoundExceptio`n When Loading Resources [document](https://www.baeldung.com/java-classpath-resource-cannot-be-opened) + ### Author [Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/ini_parser/src/main/java/example/test/Utils.java b/ini_parser/src/main/java/example/test/Utils.java index 65febc767..343e64ffa 100644 --- a/ini_parser/src/main/java/example/test/Utils.java +++ b/ini_parser/src/main/java/example/test/Utils.java @@ -8,6 +8,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -39,6 +41,55 @@ public Map getPropertiesMap() { return propertiesMap; } + // NOTE: put inside "WEB-INF/classes" for web hosted app + public String getScriptContent(String resourceFileName) { + try { + if (debug) { + System.err + .println("Script contents: " + getResourceURI(resourceFileName)); + } + final InputStream stream = getResourceStream(resourceFileName); + final byte[] bytes = new byte[stream.available()]; + stream.read(bytes); + return new String(bytes, "UTF-8"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + // NOTE: getResourceURI may not work with standalone or web hosted + // application + public String getResourceURI(String resourceFileName) { + try { + if (debug) { + System.err.println("Getting resource URI for: " + resourceFileName); + } + + URI uri = this.getClass().getClassLoader().getResource(resourceFileName) + .toURI(); + if (debug) { + System.err.println("Resource URI: " + uri.toString()); + } + return uri.toString(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + public InputStream getResourceStream(String resourceFilePath) { + return this.getClass().getClassLoader() + .getResourceAsStream(resourceFilePath); + } + + public String getResourcePath(String resourceFileName) { + final String resourcePath = String.format("%s/src/main/resources/%s", + System.getProperty("user.dir"), resourceFileName); + if (debug) { + System.err.println("Project based resource path: " + resourcePath); + } + return resourcePath; + } + // TODO: fix with absolute path in filename public Map getProperties(final String fileName) { Properties p = new Properties(); @@ -60,8 +111,7 @@ public Map getProperties(final String fileName) { System.err.println(String.format( "Reading properties resource stream: '%s'", resourcefileName)); } - stream = Utils.class.getClassLoader() - .getResourceAsStream(resourcefileName); + stream = getResourceStream(resourcefileName); } if (stream != null) { try { From 310e7e3e9d5ec4b7f4cd81dec28649af7924df45 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Thu, 20 Apr 2023 19:08:04 +0200 Subject: [PATCH 006/171] added comment about broken code if need to switch to Selenium 3.x --- protractor/pom.xml | 707 +++++++++++++++++++++++---------------------- 1 file changed, 358 insertions(+), 349 deletions(-) diff --git a/protractor/pom.xml b/protractor/pom.xml index f7c672106..9e3b8ffba 100644 --- a/protractor/pom.xml +++ b/protractor/pom.xml @@ -1,349 +1,358 @@ - - - 4.0.0 - com.github.sergueik.jprotractor - jprotractor - 2.1-SNAPSHOT - jar - ${project.groupId}:${project.artifactId} - jProtractor is a port of Angular Protractor functionality to Java. - https://github.com/sergueik/jprotractor - - - Carlos Alexandro Becker - caarlos0@gmail.com - - https://github.com/caarlos0 - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - UTF-8 - 1.3 - 2.7 - 3.0.1 - 4.2 - 1.10 - 1.3 - 2.0.4 - 1.8 - 4.13.1 - 1.8 - 1.8 - 3.6.1 - 2.20 - 1.4.2 - - 4.5.3 - ${selenium.version} - ${selenium.version} - ${selenium.version} - ${selenium.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - commons-configuration - commons-configuration - ${commons-configuration.version} - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - org.exparity - hamcrest-date - ${hamcrest-date.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - - - com.jcabi - jcabi-matchers - 1.3 - test - - - junit - junit - ${junit.version} - test - - - org.seleniumhq.selenium - selenium-api - ${selenium.version} - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-devtools-v105 - - - org.seleniumhq.selenium - selenium-devtools-v104 - - - org.seleniumhq.selenium - selenium-devtools-v103 - - - org.seleniumhq.selenium - selenium-devtools-v102 - - - org.seleniumhq.selenium - selenium-devtools-v101 - - - org.seleniumhq.selenium - selenium-devtools-v100 - - - org.seleniumhq.selenium - selenium-devtools-v99 - - - org.seleniumhq.selenium - selenium-devtools-v97 - - - org.seleniumhq.selenium - selenium-devtools-v96 - - - org.seleniumhq.selenium - selenium-devtools-v95 - - - org.seleniumhq.selenium - selenium-devtools-v85 - - - - - org.seleniumhq.selenium - selenium-devtools-v106 - ${selenium-devtools-v106.version} - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - - - org.seleniumhq.selenium - selenium-chrome-driver - ${selenium-chrome-driver.version} - - - org.seleniumhq.selenium - selenium-ie-driver - ${selenium-ie-driver.version} - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - - - com.codeborne - phantomjsdriver - ${phantomjsdriver.version} - - - org.seleniumhq.selenium - selenium-remote-driver - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - utf-8 - -Xlint:all - true - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - true - - false - - - - unit-tests - test - - test - - - - false - - - **/*Test.java - - - - **/*IntegrationTest.java - - - - - integration-tests - integration-test - - test - - - - false - - - **/*IntegrationTest.java - - - - - - - - maven-javadoc-plugin - 2.10.3 - - - https://docs.oracle.com/javase/8/docs/api/ - - - - - - jar - - - - - - maven-source-plugin - 3.0.0 - - - - jar - - - - - - maven-jar-plugin - 2.6 - - - - ${main.class} - - - - - - maven-enforcer-plugin - 1.4.1 - - - enforce-java - - enforce - - - - - [1.8, 1.9) - - - - - - - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - + + + 4.0.0 + com.github.sergueik.jprotractor + jprotractor + 2.1-SNAPSHOT + jar + ${project.groupId}:${project.artifactId} + jProtractor is a port of Angular Protractor functionality to Java. + https://github.com/sergueik/jprotractor + + + Carlos Alexandro Becker + caarlos0@gmail.com + + https://github.com/caarlos0 + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + UTF-8 + UTF-8 + 1.3 + 2.7 + 3.0.1 + 4.2 + 1.10 + 1.3 + 2.0.4 + 1.8 + 4.13.1 + 1.8 + 1.8 + 3.6.1 + 2.20 + 1.4.2 + + 3.13.0 + + 4.5.3 + ${selenium.version} + ${selenium.version} + ${selenium.version} + ${selenium.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + commons-configuration + commons-configuration + ${commons-configuration.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.exparity + hamcrest-date + ${hamcrest-date.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + + + com.jcabi + jcabi-matchers + 1.3 + test + + + junit + junit + ${junit.version} + test + + + org.seleniumhq.selenium + selenium-api + ${selenium.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + org.seleniumhq.selenium + selenium-devtools-v105 + + + org.seleniumhq.selenium + selenium-devtools-v104 + + + org.seleniumhq.selenium + selenium-devtools-v103 + + + org.seleniumhq.selenium + selenium-devtools-v102 + + + org.seleniumhq.selenium + selenium-devtools-v101 + + + org.seleniumhq.selenium + selenium-devtools-v100 + + + org.seleniumhq.selenium + selenium-devtools-v99 + + + org.seleniumhq.selenium + selenium-devtools-v97 + + + org.seleniumhq.selenium + selenium-devtools-v96 + + + org.seleniumhq.selenium + selenium-devtools-v95 + + + org.seleniumhq.selenium + selenium-devtools-v85 + + + + + org.seleniumhq.selenium + selenium-devtools-v106 + ${selenium-devtools-v106.version} + + + org.seleniumhq.selenium + selenium-remote-driver + ${selenium.version} + + + org.seleniumhq.selenium + selenium-firefox-driver + ${selenium-firefox-driver.version} + + + org.seleniumhq.selenium + selenium-chrome-driver + ${selenium-chrome-driver.version} + + + org.seleniumhq.selenium + selenium-ie-driver + ${selenium-ie-driver.version} + + + org.seleniumhq.selenium + selenium-support + ${selenium.version} + + + org.seleniumhq.selenium + selenium-remote-driver + ${selenium.version} + + + com.codeborne + phantomjsdriver + ${phantomjsdriver.version} + + + org.seleniumhq.selenium + selenium-remote-driver + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + true + + false + + + + unit-tests + test + + test + + + + false + + + **/*Test.java + + + + **/*IntegrationTest.java + + + + + integration-tests + integration-test + + test + + + + false + + + **/*IntegrationTest.java + + + + + + + + + maven-source-plugin + 3.0.0 + + + + jar + + + + + + maven-jar-plugin + 2.6 + + + + ${main.class} + + + + + + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + From 848912315513c4a9068f76827f91634c0a94b4b6 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 25 Apr 2023 01:45:25 +0200 Subject: [PATCH 007/171] intermedate revision - added helper for Eclipseproject imprort diaog that expects a windows path --- utils/give_project.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 utils/give_project.sh diff --git a/utils/give_project.sh b/utils/give_project.sh new file mode 100755 index 000000000..89524ba7f --- /dev/null +++ b/utils/give_project.sh @@ -0,0 +1,2 @@ +#!/bin/sh +pwd | sed 's|^/c/|c\\:|;s|/|\\|g;' From c377560b597369044713d8b17bb3d07f6d7b65f0 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 7 May 2023 23:06:36 -0400 Subject: [PATCH 008/171] fixed typo --- utils/give_project.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/give_project.sh b/utils/give_project.sh index 89524ba7f..781d6ba2f 100755 --- a/utils/give_project.sh +++ b/utils/give_project.sh @@ -1,2 +1,2 @@ #!/bin/sh -pwd | sed 's|^/c/|c\\:|;s|/|\\|g;' +pwd | sed 's|^/c/|c:\\|;s|/|\\|g;' From 0a837ebecc2971c922eb36822ad77a62753cf5ff Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 30 May 2023 20:37:57 -0400 Subject: [PATCH 009/171] updated obsolete links to original resources with their new locations --- shadow_root/README.md | 7 ++++++- shadow_root/src/test/resources/button.html | 3 ++- .../src/test/resources/inner_html_example.html | 15 +++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/shadow_root/README.md b/shadow_root/README.md index 7eb502da5..b6a416488 100644 --- a/shadow_root/README.md +++ b/shadow_root/README.md @@ -102,8 +102,13 @@ from file `querySelector.js`. * https://www.webcomponents.org/community/articles/introduction-to-shadow-dom * https://www.grapecity.com/blogs/what-is-shadow-dom-how-to-build-shadow-elements * https://ultimatecourses.com/blog/understanding-shadow-dom-in-web-components - * https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/ + * https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/ - moved to [Shadow DOM 101](https://web.dev/shadowdom/) and [Shadow DOM 201](https://web.dev/shadowdom-201/) + * https://medium.com/@mariusbongarts/the-complete-web-component-guide-shadow-dom-2e40921eb77 + * https://medium.com/@vinaykrmittal/shadow-dom-implementation-in-javascript-1a3cc8c01687 * https://ultimatecourses.com/blog/understanding-shadow-dom-in-web-components * [documentation](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) * Everything you need to know about Shadow DOM [gist](https://gist.github.com/praveenpuglia/0832da687ed5a5d7a0907046c9ef1813) * [post](https://groups.google.com/g/selenium-users/c/nrRS34V8jUo) about ShadowDOM support by [selenide](https://github.com/selenide/selenide) + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/shadow_root/src/test/resources/button.html b/shadow_root/src/test/resources/button.html index 67c8483a8..a278cd940 100644 --- a/shadow_root/src/test/resources/button.html +++ b/shadow_root/src/test/resources/button.html @@ -1,10 +1,11 @@  - + +
+ From 8772f4fbe70b7ec6663fa286f2301927accfd18c Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 4 Jun 2023 15:40:55 -0400 Subject: [PATCH 010/171] intermediate revision - added apw2wav convertor launcher --- utils/ape2wav.cmd | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 utils/ape2wav.cmd diff --git a/utils/ape2wav.cmd b/utils/ape2wav.cmd new file mode 100644 index 000000000..501be375d --- /dev/null +++ b/utils/ape2wav.cmd @@ -0,0 +1,12 @@ +@echo OFF +REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +REM https://askubuntu.com/questions/376684/how-to-use-ffmpeg-to-convert-ape-to-mp3 +REM simplest command, no options +REM for /F "tokens=*" %%. in ('dir /b *.ape') do call ffmpeg.exe -i "%%." "%%~n..wav" +REM NOTE: many programs install the copy of ffmpeg.exe +REM "c:\Progrdam Files (x86)\Ffmpeg For Audacity\ffmpeg.exe" -v +REM "c:\Program Files\CamStudio 2.7\ffmpeg.exe" -h +REM "c:\tools\ffmpeg-20160714-f41e37b-win64-static\bin\ffmpeg.exe" -v +REM "c:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe" + +for /F "tokens=*" %%. in ('dir /b *.ape') do call "c:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe" -i "%%." "%%~n..wav" From 0d4d26b7579d244148b9e507521c6942c9cf028e Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 20 Jun 2023 00:30:08 +0200 Subject: [PATCH 011/171] added argument for audiofile extension --- utils/ape2wav.cmd | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/utils/ape2wav.cmd b/utils/ape2wav.cmd index 501be375d..8c3b55dc4 100644 --- a/utils/ape2wav.cmd +++ b/utils/ape2wav.cmd @@ -1,12 +1,17 @@ -@echo OFF -REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats -REM https://askubuntu.com/questions/376684/how-to-use-ffmpeg-to-convert-ape-to-mp3 -REM simplest command, no options -REM for /F "tokens=*" %%. in ('dir /b *.ape') do call ffmpeg.exe -i "%%." "%%~n..wav" -REM NOTE: many programs install the copy of ffmpeg.exe -REM "c:\Progrdam Files (x86)\Ffmpeg For Audacity\ffmpeg.exe" -v -REM "c:\Program Files\CamStudio 2.7\ffmpeg.exe" -h -REM "c:\tools\ffmpeg-20160714-f41e37b-win64-static\bin\ffmpeg.exe" -v -REM "c:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe" - -for /F "tokens=*" %%. in ('dir /b *.ape') do call "c:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe" -i "%%." "%%~n..wav" +@echo OFF + +REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +REM https://askubuntu.com/questions/376684/how-to-use-ffmpeg-to-convert-ape-to-mp3 +REM simplest command, no options +REM for /F "tokens=*" %%. in ('dir /b *.ape') do call ffmpeg.exe -i "%%." "%%~n..wav" +REM NOTE: many programs install the copy of ffmpeg.exe +REM "c:\Progrdam Files (x86)\Ffmpeg For Audacity\ffmpeg.exe" -v +REM "c:\Program Files\CamStudio 2.7\ffmpeg.exe" -h +REM "c:\tools\ffmpeg-20160714-f41e37b-win64-static\bin\ffmpeg.exe" -v +REM "c:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe" + +set EXTENSION=%1 +if /i "%EXTENSION%" EQU "" set EXTENSION=ape +echo + +for /F "tokens=*" %%. in ('dir /b *.%EXTENSION%') do call "c:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe" -i "%%." "%%~n..wav" From baa93c3bf53e9859a982c1c9f405acca797f99e4 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 25 Jun 2023 14:47:11 -0400 Subject: [PATCH 012/171] intermediate revision - added replica of the resampler.exe multiprocess runner with minor fixes and notes --- utils/resampler.cmd | 83 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 utils/resampler.cmd diff --git a/utils/resampler.cmd b/utils/resampler.cmd new file mode 100644 index 000000000..af27d374e --- /dev/null +++ b/utils/resampler.cmd @@ -0,0 +1,83 @@ +@echo off + +REM origin: https://raw.githubusercontent.com/melk0r64/Resampler-Script/main/ReSampler.bat +REM NOTE: the original code relied on Window title scan by tasklist.exe +REM and does not correctly wait for the processes to terminate +REM see also: flac downsampling +REM see also: https://forums.stevehoffman.tv/threads/high-res-downsampling-for-dummies.1146789/ +REM see also: https://sox.sourceforge.net +REM see also: http://sox.sourceforge.net/SoX/Resampling +REM see also: https://github.com/melk0r64/Resampler-Script +REM see also: https://github.com/jniemann66/ReSampler +REM see also: https://github.com/tchnmf/sox/tree/master/scripts + +setlocal EnableExtensions EnableDelayedExpansion +set "SourcePath=%CD%\" +set "TargetPath=%CD%\..\resampled" +mkdir %TargetPath% +rem If the batch file was started with a string as +rem parameter, interpret this string as source path. +if not "%~1" == "" set "SourcePath=%~1" + +rem If the batch file was started with one more string +rem as parameter, interpret this string as target path. +if not "%~2" == "" set "TargetPath=%~2" + +rem Remove backslash at end of source and target path +rem in case of being specified with a backslash at end. +if "%SourcePath:~-1%" == "\" set "SourcePath=%SourcePath:~0,-1%" +if "%TargetPath:~-1%" == "\" set "TargetPath=%TargetPath:~0,-1%" + +rem Determine length of source path by finding out at which +rem position in source path there is no more character. +set "PathLength=1" +:GetPathLength +if not "!SourcePath:~%PathLength%,1!" == "" ( + set /A PathLength+=1 + goto GetPathLength +) + +rem Process each file not having hidden or system attribute set and +rem decrypt it to the target path relative to source path. The relative +rem path is determined by removing from full path of current file the +rem first PathLength characters and the last character which is the +rem directory separator (backslash). +set PATH=%PATH%;c:\tools\resampler +set "MAX_PROCESSES=2" +set "PROCESS_COUNTER=0" +for /F "tokens=2 delims==" %%. in ('wmic.exe cpu get NumberOfCores /format:list') do set /A "MAX_PROCESSES=%%. * 2" +if not "%3" == "" set "MAX_PROCESSES=%3" +echo Will run !MAX_PROCESSES! in parallel +REM seems to scan subbolders too +for /R "%SourcePath%" %%I in (*.flac) do ( + set "RelativePath=%%~dpI" + set "RelativePath=!RelativePath:~%PathLength%,-1!" + md "%TargetPath%!RelativePath!" 2>nul + + set "COMMAND=ReSampler.exe -i "%%I" -o "%TargetPath%!RelativePath!\%%~nxI" -r 44100 -b 16 --dither 3 --minphase --relaxedLPF --showStages --tempDir %TEMP%" + + rem Launch the resampler tool in a separate process + echo Launch the resampler tool in a separate process: !COMMAND! + START /B CMD /C "!COMMAND!" + + set /A PROCESS_COUNTER+=1 + echo Started !PROCESS_COUNTER! processes + if !PROCESS_COUNTER! geq !MAX_PROCESSES! ( + rem Wait for any of the launched processes to finish before launching more + CALL :WAIT_FOR_PROCESS + ) +) + +:WAIT_FOR_PROCESS +echo Wait for process to finish +rem Wait for one process to finish +timeout.exe /T 2 /NOBREAK +REM PING -n 2 127.0.0.1 >NUL +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq ReSampler.exe" /NH') do ( + if "%%_" == "ReSampler.exe" ( + rem There is still at least one instance of the ReSampler.exe tool running + goto :WAIT_FOR_PROCESS + ) +) +set "PROCESS_COUNTER=0" +exit /B From acc9e66f3ecdc1971c182826f8dbfcceb7116776 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 2 Jul 2023 01:27:31 +0200 Subject: [PATCH 013/171] itermediate revision - simplified script to deal with one directory and use a different filename for generated files --- utils/resampler.cmd | 142 ++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 83 deletions(-) diff --git a/utils/resampler.cmd b/utils/resampler.cmd index af27d374e..53a172aeb 100644 --- a/utils/resampler.cmd +++ b/utils/resampler.cmd @@ -1,83 +1,59 @@ -@echo off - -REM origin: https://raw.githubusercontent.com/melk0r64/Resampler-Script/main/ReSampler.bat -REM NOTE: the original code relied on Window title scan by tasklist.exe -REM and does not correctly wait for the processes to terminate -REM see also: flac downsampling -REM see also: https://forums.stevehoffman.tv/threads/high-res-downsampling-for-dummies.1146789/ -REM see also: https://sox.sourceforge.net -REM see also: http://sox.sourceforge.net/SoX/Resampling -REM see also: https://github.com/melk0r64/Resampler-Script -REM see also: https://github.com/jniemann66/ReSampler -REM see also: https://github.com/tchnmf/sox/tree/master/scripts - -setlocal EnableExtensions EnableDelayedExpansion -set "SourcePath=%CD%\" -set "TargetPath=%CD%\..\resampled" -mkdir %TargetPath% -rem If the batch file was started with a string as -rem parameter, interpret this string as source path. -if not "%~1" == "" set "SourcePath=%~1" - -rem If the batch file was started with one more string -rem as parameter, interpret this string as target path. -if not "%~2" == "" set "TargetPath=%~2" - -rem Remove backslash at end of source and target path -rem in case of being specified with a backslash at end. -if "%SourcePath:~-1%" == "\" set "SourcePath=%SourcePath:~0,-1%" -if "%TargetPath:~-1%" == "\" set "TargetPath=%TargetPath:~0,-1%" - -rem Determine length of source path by finding out at which -rem position in source path there is no more character. -set "PathLength=1" -:GetPathLength -if not "!SourcePath:~%PathLength%,1!" == "" ( - set /A PathLength+=1 - goto GetPathLength -) - -rem Process each file not having hidden or system attribute set and -rem decrypt it to the target path relative to source path. The relative -rem path is determined by removing from full path of current file the -rem first PathLength characters and the last character which is the -rem directory separator (backslash). -set PATH=%PATH%;c:\tools\resampler -set "MAX_PROCESSES=2" -set "PROCESS_COUNTER=0" -for /F "tokens=2 delims==" %%. in ('wmic.exe cpu get NumberOfCores /format:list') do set /A "MAX_PROCESSES=%%. * 2" -if not "%3" == "" set "MAX_PROCESSES=%3" -echo Will run !MAX_PROCESSES! in parallel -REM seems to scan subbolders too -for /R "%SourcePath%" %%I in (*.flac) do ( - set "RelativePath=%%~dpI" - set "RelativePath=!RelativePath:~%PathLength%,-1!" - md "%TargetPath%!RelativePath!" 2>nul - - set "COMMAND=ReSampler.exe -i "%%I" -o "%TargetPath%!RelativePath!\%%~nxI" -r 44100 -b 16 --dither 3 --minphase --relaxedLPF --showStages --tempDir %TEMP%" - - rem Launch the resampler tool in a separate process - echo Launch the resampler tool in a separate process: !COMMAND! - START /B CMD /C "!COMMAND!" - - set /A PROCESS_COUNTER+=1 - echo Started !PROCESS_COUNTER! processes - if !PROCESS_COUNTER! geq !MAX_PROCESSES! ( - rem Wait for any of the launched processes to finish before launching more - CALL :WAIT_FOR_PROCESS - ) -) - -:WAIT_FOR_PROCESS -echo Wait for process to finish -rem Wait for one process to finish -timeout.exe /T 2 /NOBREAK -REM PING -n 2 127.0.0.1 >NUL -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq ReSampler.exe" /NH') do ( - if "%%_" == "ReSampler.exe" ( - rem There is still at least one instance of the ReSampler.exe tool running - goto :WAIT_FOR_PROCESS - ) -) -set "PROCESS_COUNTER=0" -exit /B +@echo off + +REM based on: https://raw.githubusercontent.com/melk0r64/Resampler-Script/main/ReSampler.bat +REM the original code scaned subbolders +REM NOTE: the original code relied on Window title scan by tasklist.exe +REM and failed to discover the processes to wait for +REM see also: flac downsampling +REM see also: https://forums.stevehoffman.tv/threads/high-res-downsampling-for-dummies.1146789/ +REM see also: https://sox.sourceforge.net +REM see also: http://sox.sourceforge.net/SoX/Resampling +REM see also: https://github.com/melk0r64/Resampler-Script +REM see also: https://github.com/jniemann66/ReSampler +REM see also: https://github.com/tchnmf/sox/tree/master/scripts + +SETLOCAL ENABLEDELAYEDEXPANSION + +set "SOURCPATH=%CD%" +if not "%~1" == "" set "SOURCPATH=%~1" +set TIMEOUT=10 +set PATH=%PATH%;c:\tools\resampler +set "MAX_PROCESSES=2" +set "PROCESS_COUNTER=0" +for /F "tokens=2 delims==" %%. in ('wmic.exe cpu get NumberOfCores /format:list') do set /A "MAX_PROCESSES=%%. * 2" +if not "%3" == "" set "MAX_PROCESSES=%3" +echo Will run !MAX_PROCESSES! in parallel +cd /d "%SOURCPATH%" +REM no need for "tokens=*" +REM set OPTIONS=-r 44100 -b 16 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" +set OPTIONS=-r 44100 -b 16 --dither 3 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" +for /R "%SOURCPATH%" %%_ in (*.flac) do ( + set "INPUTFILE=%%_" + set "OUTPUTFILE=%%~dp_%%~n_ - 01%%~x_" + rem NODE dealing with quotes + set "COMMAND=ReSampler.exe -i "!INPUTFILE!" -o "!OUTPUTFILE!" !OPTIONS!" + echo Launch the resampler tool in a separate process: !COMMAND! + start /B CMD /C "!COMMAND!" + + set /A PROCESS_COUNTER+=1 + echo Running !PROCESS_COUNTER! processes + if !PROCESS_COUNTER! geq !MAX_PROCESSES! ( + rem Wait for any of the launched processes to finish before launching more + call :WAIT_FOR_PROCESS + ) +) + +:WAIT_FOR_PROCESS +echo Wait for process to finish +rem Wait for one process to finish +Rem echo timeout.exe /T !TIMEOUT! /NOBREAK +C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak + +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq ReSampler.exe" /NH') do ( + if "%%_" == "ReSampler.exe" ( + rem There is still at least one instance of the ReSampler.exe tool running + goto :WAIT_FOR_PROCESS + ) +) +set "PROCESS_COUNTER=0" +exit /B From 48c4ba9f6dd7ed4b15a5518eec335bb153e10f68 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 2 Jul 2023 05:21:58 +0200 Subject: [PATCH 014/171] intermediate revision - count the processes accurately, added wait and count a standalone scrits for future use --- utils/count_processes.cmd | 9 +++++++++ utils/resampler.cmd | 33 ++++++++++++++++++++++++++------- utils/wait_until_running.cmd | 17 +++++++++++++++++ 3 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 utils/count_processes.cmd create mode 100644 utils/wait_until_running.cmd diff --git a/utils/count_processes.cmd b/utils/count_processes.cmd new file mode 100644 index 000000000..e2610df64 --- /dev/null +++ b/utils/count_processes.cmd @@ -0,0 +1,9 @@ +@echo off +REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 +SETLOCAL ENABLEDELAYEDEXPANSION +set IMAGENAME=vivaldi.exe +if not "%~1" == "" set "IMAGENAME=%~1" +set /A RUNNING_PPOCESS_COUNT=0 +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do set /A RUNNING_PPOCESS_COUNT=%%_ +echo !RUNNING_PPOCESS_COUNT! !IMAGENAME! is running +goto :EOF diff --git a/utils/resampler.cmd b/utils/resampler.cmd index 53a172aeb..a7c760783 100644 --- a/utils/resampler.cmd +++ b/utils/resampler.cmd @@ -25,6 +25,7 @@ if not "%3" == "" set "MAX_PROCESSES=%3" echo Will run !MAX_PROCESSES! in parallel cd /d "%SOURCPATH%" REM no need for "tokens=*" + REM set OPTIONS=-r 44100 -b 16 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" set OPTIONS=-r 44100 -b 16 --dither 3 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" for /R "%SOURCPATH%" %%_ in (*.flac) do ( @@ -39,21 +40,39 @@ for /R "%SOURCPATH%" %%_ in (*.flac) do ( echo Running !PROCESS_COUNTER! processes if !PROCESS_COUNTER! geq !MAX_PROCESSES! ( rem Wait for any of the launched processes to finish before launching more - call :WAIT_FOR_PROCESS + call :COUNT_FOR_PROCESS ) ) :WAIT_FOR_PROCESS -echo Wait for process to finish -rem Wait for one process to finish -Rem echo timeout.exe /T !TIMEOUT! /NOBREAK +echo Wait untill all processes finish +rem Wait untill all processes finish C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak - -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq ReSampler.exe" /NH') do ( - if "%%_" == "ReSampler.exe" ( +set IMAGENAME=ReSampler.exe +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH') do ( + if "%%_" == "!IMAGENAME!" ( rem There is still at least one instance of the ReSampler.exe tool running goto :WAIT_FOR_PROCESS ) ) set "PROCESS_COUNTER=0" exit /B +goto :EOF + +REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 +:COUNT_FOR_PROCESS +echo Wait untill at least one processes finish +rem Wait untill at least one processes finish +C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak +set IMAGENAME=ReSampler.exe +set /A RUNNING_PPOCESS_COUNT=0 +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( + set /A RUNNING_PPOCESS_COUNT=%%_ + echo !RUNNING_PPOCESS_COUNT! !IMAGENAME! is running + if !RUNNING_PPOCESS_COUNT! equ !MAX_PROCESSES! ( + goto :COUNT_FOR_PROCESS + ) +) +set /A "PROCESS_COUNTER=!MAX_PROCESSES! - !RUNNING_PPOCESS_COUNT!" +echo set PROCESS_COUNTER to !PROCESS_COUNTER! +exit /B diff --git a/utils/wait_until_running.cmd b/utils/wait_until_running.cmd new file mode 100644 index 000000000..da6ecb1d7 --- /dev/null +++ b/utils/wait_until_running.cmd @@ -0,0 +1,17 @@ +@echo off +REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 +SETLOCAL ENABLEDELAYEDEXPANSION +set IMAGENAME=vivaldi.exe +if not "%~1" == "" set "IMAGENAME=%~1" + +:WAIT_FOR_PROCESS +echo Wait untill all processes finish +rem Wait untill all processes finish +C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak +set IMAGENAME=ReSampler.exe +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH') do ( + if "%%_" == "!IMAGENAME!" ( + rem There is still at least one instance of the ReSampler.exe tool running + goto :WAIT_FOR_PROCESS + ) +) From e8473082af897d179d0176e611572a454f70170e Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 2 Jul 2023 00:25:42 -0400 Subject: [PATCH 015/171] fixed the math --- utils/resampler.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/resampler.cmd b/utils/resampler.cmd index a7c760783..d78c549ee 100644 --- a/utils/resampler.cmd +++ b/utils/resampler.cmd @@ -73,6 +73,6 @@ for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C: goto :COUNT_FOR_PROCESS ) ) -set /A "PROCESS_COUNTER=!MAX_PROCESSES! - !RUNNING_PPOCESS_COUNT!" +set /A "PROCESS_COUNTER=!RUNNING_PPOCESS_COUNT!" echo set PROCESS_COUNTER to !PROCESS_COUNTER! exit /B From 0e1d717fd8b2912cfbd15277fde79efcae531c02 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 3 Jul 2023 03:30:26 +0200 Subject: [PATCH 016/171] intermediate revision - added alternative counter of running processes with the specified image name, not relying on 'find.exe' working as a poor man's 'wc' --- utils/count_processes.cmd | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/utils/count_processes.cmd b/utils/count_processes.cmd index e2610df64..b2dd11c8a 100644 --- a/utils/count_processes.cmd +++ b/utils/count_processes.cmd @@ -1,9 +1,28 @@ @echo off + REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 SETLOCAL ENABLEDELAYEDEXPANSION set IMAGENAME=vivaldi.exe + if not "%~1" == "" set "IMAGENAME=%~1" +call :COUNT_RUNNING_PROCESSES1 !IMAGENAME! +call :COUNT_RUNNING_PROCESSES2 !IMAGENAME! +goto :EOF + +:COUNT_RUNNING_PROCESSES1 +set IMAGENAME=%1 +set /A RUNNING_PPOCESS_COUNT=0 +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe /i "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do set /A RUNNING_PPOCESS_COUNT=%%_ +echo !RUNNING_PPOCESS_COUNT! !IMAGENAME! is running +goto :EOF + +:COUNT_RUNNING_PROCESSES2 +set IMAGENAME=%1 set /A RUNNING_PPOCESS_COUNT=0 -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do set /A RUNNING_PPOCESS_COUNT=%%_ +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH') do ( + if /I "%%_" == "!IMAGENAME!" ( + set /A RUNNING_PPOCESS_COUNT=!RUNNING_PPOCESS_COUNT! + 1 + ) +) echo !RUNNING_PPOCESS_COUNT! !IMAGENAME! is running goto :EOF From 0c28cbac5c6ad2eb58724eadc3916171e632ea45 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 7 Jul 2023 00:42:06 +0200 Subject: [PATCH 017/171] intermediate revision - added jdk11 support workround --- javafx-markdown/README.md | 514 ++++++++ javafx-markdown/pom-java11.xml | 159 +++ .../src/main/java/example/Example.java | 238 ++-- .../src/main/java/example/MDFXNodeHelper.java | 1104 ++++++++--------- .../src/main/java/example/MarkdownView.java | 124 +- .../src/main/resources/css/mdfx-default.css | 48 +- .../src/main/resources/css/mdfx-sample.css | 66 +- .../src/main/resources/css/mdfx.css | 280 ++--- javafx-markdown/src/main/resources/syntax.md | 123 +- javafx-markdown/src/main/resources/test.md | 104 +- javafx-markdown/test-jdk11.cmd | 23 + javafx-markdown/test-jdk11.sh | 11 + javafx-markdown/test.cmd | 4 + 13 files changed, 1760 insertions(+), 1038 deletions(-) create mode 100644 javafx-markdown/pom-java11.xml create mode 100644 javafx-markdown/test-jdk11.cmd create mode 100755 javafx-markdown/test-jdk11.sh diff --git a/javafx-markdown/README.md b/javafx-markdown/README.md index 9b65b77a9..9af0d1961 100644 --- a/javafx-markdown/README.md +++ b/javafx-markdown/README.md @@ -27,6 +27,520 @@ java -cp target/example.javafx_markdown.jar:target/lib/* example.Example NOTE: on Windows, uses `;` as class path argument separator. For unix do `:` + +### TODO + +* The project does not compile with JDK 11. To reproduce, make the following settings in the vanilla console: +```cmd +set JAVA_HOME=c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64 +call c:\java\init.cmd +``` +then call +```cmd +call test.cmd +``` + +Will get errors: +```text +[ERROR] COMPILATION ERROR : +[INFO] ------------------------------------------------------------- +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[3,26] package javafx.application does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[4,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[5,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[6,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[7,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[8,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[9,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[10,27] package javafx.scene.layout does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[11,20] package javafx.stage does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[21,30] cannot find symbol + symbol: class Application +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[26,27] cannot find symbol + symbol: class Stage + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[11,26] package javafx.application does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[12,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[13,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[14,23] package javafx.geometry does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[15,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[16,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[18,25] package javafx.scene.text does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[19,25] package javafx.scene.text does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[20,19] package javafx.util does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[31,37] cannot find symbol + symbol: class VBox +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[3,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[4,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[5,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[7,26] package javafx.scene.image does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[8,26] package javafx.scene.image does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[9,27] package javafx.scene.layout does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[12,35] cannot find symbol + symbol: class VBox +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,23] cannot find symbol + symbol: class Pair + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,9] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[50,9] cannot find symbol + symbol: class GridPane + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[53,9] cannot find symbol + symbol: class TextFlow + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,17] cannot find symbol + symbol: class SimpleStringProperty + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[33,16] cannot find symbol + symbol: class StringProperty + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[49,29] cannot find symbol + symbol: class Node + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[54,16] cannot find symbol + symbol: class Node + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[17,1] package javafx.scene.layout does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[25,9] method does not override or implement a method from a supertype +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[30,44] cannot find symbol + symbol: method getClass() + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[42,45] cannot find symbol + symbol: class Node +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[51,32] cannot find symbol + symbol: class Node +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,53] cannot find symbol + symbol: class SimpleStringProperty + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[19,17] cannot find symbol + symbol: method getStylesheets() + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[29,17] cannot find symbol + symbol: method getChildren() + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[30,17] cannot find symbol + symbol: method getChildren() + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[56,36] cannot find symbol + symbol: class Group + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,36] cannot find symbol + symbol: class ImageView + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,50] cannot find symbol + symbol: class Image + location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[44,48] cannot find symbol + symbol: variable Cursor +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[53,52] cannot find symbol + symbol: class ColorPicker +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,17] cannot find symbol + symbol: class TextArea + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,41] cannot find symbol + symbol: class TextArea + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[63,29] cannot find symbol + symbol: method getStylesheets() + location: variable markdownView of type example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,17] cannot find symbol + symbol: class ScrollPane + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,42] cannot find symbol + symbol: class ScrollPane + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,17] cannot find symbol + symbol: class HBox + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,33] cannot find symbol + symbol: class HBox + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,17] cannot find symbol + symbol: class Scene + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,35] cannot find symbol + symbol: class Scene + location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[88,42] cannot find symbol + symbol: method getClass() +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,84] cannot find symbol + symbol: class Pair + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,25] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,17] cannot find symbol + symbol: class TextFlow + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,40] cannot find symbol + symbol: class TextFlow + location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[88,21] cannot find symbol + symbol: method getChildren() +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,25] cannot find symbol + symbol: class Label + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,43] cannot find symbol + symbol: class Label + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,25] cannot find symbol + symbol: class Region + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,43] cannot find symbol + symbol: class Region + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[153,25] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[154,36] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,25] cannot find symbol + symbol: class Label + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,43] cannot find symbol + symbol: class Label + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,25] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,41] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[242,25] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,25] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,44] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,25] cannot find symbol + symbol: class Label + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,43] cannot find symbol + symbol: class Label + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,25] cannot find symbol + symbol: class HBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,41] cannot find symbol + symbol: class HBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[259,43] cannot find symbol + symbol: variable Pos + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[292,25] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[293,36] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[305,25] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[306,36] cannot find symbol + symbol: class VBox + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[344,34] cannot find symbol + symbol: class Pair + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[352,25] cannot find symbol + symbol: variable Platform + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,33] cannot find symbol + symbol: class BooleanProperty + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,65] cannot find symbol + symbol: class SimpleBooleanProperty + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[357,57] cannot find symbol + symbol: method isHover() + location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[365,69] cannot find symbol + symbol: method getStyleClass() + location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[367,69] cannot find symbol + symbol: method getStyleClass() + location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[377,45] cannot find symbol + symbol: method hoverProperty() + location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[428,25] cannot find symbol + symbol: class TextFlow + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[429,36] cannot find symbol + symbol: class GridPane + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,33] cannot find symbol + symbol: class ColumnConstraints + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,68] cannot find symbol + symbol: class ColumnConstraints + location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[468,25] cannot find symbol + symbol: class TextFlow + location: class example.MDFXNodeHelper.MDParser +[INFO] 100 errors +[INFO] ------------------------------------------------------------- +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 36.979 s +[INFO] Finished at: 2023-07-06T11:32:35-04:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project javafx_markdown: Compilation failure: Compilation failure: +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[3,26] package javafx.application does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[4,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[5,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[6,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[7,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[8,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[9,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[10,27] package javafx.scene.layout does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[11,20] package javafx.stage does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[21,30] cannot find symbol +[ERROR] symbol: class Application +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[26,27] cannot find symbol +[ERROR] symbol: class Stage +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[11,26] package javafx.application does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[12,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[13,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[14,23] package javafx.geometry does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[15,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[16,28] package javafx.scene.control does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[18,25] package javafx.scene.text does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[19,25] package javafx.scene.text does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[20,19] package javafx.util does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[31,37] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[3,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[4,29] package javafx.beans.property does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[5,20] package javafx.scene does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[7,26] package javafx.scene.image does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[8,26] package javafx.scene.image does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[9,27] package javafx.scene.layout does not exist +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[12,35] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,23] cannot find symbol +[ERROR] symbol: class Pair +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,9] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[50,9] cannot find symbol +[ERROR] symbol: class GridPane +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[53,9] cannot find symbol +[ERROR] symbol: class TextFlow +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,17] cannot find symbol +[ERROR] symbol: class SimpleStringProperty +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[33,16] cannot find symbol +[ERROR] symbol: class StringProperty +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[49,29] cannot find symbol +[ERROR] symbol: class Node +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[54,16] cannot find symbol +[ERROR] symbol: class Node +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[17,1] package javafx.scene.layout does not exist +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[25,9] method does not override or implement a method from a supertype +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[30,44] cannot find symbol +[ERROR] symbol: method getClass() +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[42,45] cannot find symbol +[ERROR] symbol: class Node +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[51,32] cannot find symbol +[ERROR] symbol: class Node +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,53] cannot find symbol +[ERROR] symbol: class SimpleStringProperty +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[19,17] cannot find symbol +[ERROR] symbol: method getStylesheets() +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[29,17] cannot find symbol +[ERROR] symbol: method getChildren() +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[30,17] cannot find symbol +[ERROR] symbol: method getChildren() +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[56,36] cannot find symbol +[ERROR] symbol: class Group +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,36] cannot find symbol +[ERROR] symbol: class ImageView +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,50] cannot find symbol +[ERROR] symbol: class Image +[ERROR] location: class example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[44,48] cannot find symbol +[ERROR] symbol: variable Cursor +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[53,52] cannot find symbol +[ERROR] symbol: class ColorPicker +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,17] cannot find symbol +[ERROR] symbol: class TextArea +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,41] cannot find symbol +[ERROR] symbol: class TextArea +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[63,29] cannot find symbol +[ERROR] symbol: method getStylesheets() +[ERROR] location: variable markdownView of type example.MarkdownView +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,17] cannot find symbol +[ERROR] symbol: class ScrollPane +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,42] cannot find symbol +[ERROR] symbol: class ScrollPane +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,17] cannot find symbol +[ERROR] symbol: class HBox +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,33] cannot find symbol +[ERROR] symbol: class HBox +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,17] cannot find symbol +[ERROR] symbol: class Scene +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,35] cannot find symbol +[ERROR] symbol: class Scene +[ERROR] location: class example.Example +[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[88,42] cannot find symbol +[ERROR] symbol: method getClass() +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,84] cannot find symbol +[ERROR] symbol: class Pair +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,25] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,17] cannot find symbol +[ERROR] symbol: class TextFlow +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,40] cannot find symbol +[ERROR] symbol: class TextFlow +[ERROR] location: class example.MDFXNodeHelper +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[88,21] cannot find symbol +[ERROR] symbol: method getChildren() +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,25] cannot find symbol +[ERROR] symbol: class Label +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,43] cannot find symbol +[ERROR] symbol: class Label +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,25] cannot find symbol +[ERROR] symbol: class Region +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,43] cannot find symbol +[ERROR] symbol: class Region +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[153,25] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[154,36] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,25] cannot find symbol +[ERROR] symbol: class Label +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,43] cannot find symbol +[ERROR] symbol: class Label +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,25] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,41] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[242,25] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,25] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,44] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,25] cannot find symbol +[ERROR] symbol: class Label +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,43] cannot find symbol +[ERROR] symbol: class Label +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,25] cannot find symbol +[ERROR] symbol: class HBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,41] cannot find symbol +[ERROR] symbol: class HBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[259,43] cannot find symbol +[ERROR] symbol: variable Pos +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[292,25] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[293,36] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[305,25] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[306,36] cannot find symbol +[ERROR] symbol: class VBox +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[344,34] cannot find symbol +[ERROR] symbol: class Pair +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[352,25] cannot find symbol +[ERROR] symbol: variable Platform +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,33] cannot find symbol +[ERROR] symbol: class BooleanProperty +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,65] cannot find symbol +[ERROR] symbol: class SimpleBooleanProperty +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[357,57] cannot find symbol +[ERROR] symbol: method isHover() +[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[365,69] cannot find symbol +[ERROR] symbol: method getStyleClass() +[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[367,69] cannot find symbol +[ERROR] symbol: method getStyleClass() +[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[377,45] cannot find symbol +[ERROR] symbol: method hoverProperty() +[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[428,25] cannot find symbol +[ERROR] symbol: class TextFlow +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[429,36] cannot find symbol +[ERROR] symbol: class GridPane +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,33] cannot find symbol +[ERROR] symbol: class ColumnConstraints +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,68] cannot find symbol +[ERROR] symbol: class ColumnConstraints +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[468,25] cannot find symbol +[ERROR] symbol: class TextFlow +[ERROR] location: class example.MDFXNodeHelper.MDParser +[ERROR] -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException +done + +``` ### See Also * javascript and JavaFX powered [Markdown Editor](https://github.com/arildyk/simple-markdown-editor) (need to convert from visual studio code project) diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml new file mode 100644 index 000000000..38657e15f --- /dev/null +++ b/javafx-markdown/pom-java11.xml @@ -0,0 +1,159 @@ + + + 4.0.0 + example + javafx_markdown + 0.3.0-SNAPSHOT + + Example + UTF-8 + 0.64.2 + 1.10 + 4.2 + 1.3 + 2.7 + 3.3.1 + ${project.groupId}.${project.artifactId} + 3.2.0 + 1.2.17 + 19 + + + + org.fxmisc.cssfx + cssfx + 1.1.1 + + + com.vladsch.flexmark + flexmark-all + ${flexmark-java.version} + + + commons-configuration + commons-configuration + ${commons-configuration.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + org.openjfx + javafx-controls + ${javafx-controls.version} + + + + ${finalName} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + true + ${project.groupId}.${mainClass} + + + + + + com.zenjava + javafx-maven-plugin + 1.3 + + ${mainClass} + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + + sandec + https://sandec.jfrog.io/artifactory/repo + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + central + https://repo1.maven.org/maven2/ + + + project.local + project + file:${project.basedir}/repo + + + diff --git a/javafx-markdown/src/main/java/example/Example.java b/javafx-markdown/src/main/java/example/Example.java index e6d259f80..c423bdc82 100644 --- a/javafx-markdown/src/main/java/example/Example.java +++ b/javafx-markdown/src/main/java/example/Example.java @@ -1,120 +1,120 @@ -package example; - -import javafx.application.Application; -import javafx.scene.Cursor; -import javafx.scene.Node; -import javafx.scene.Scene; -import javafx.scene.control.ColorPicker; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextArea; -import javafx.scene.layout.HBox; -import javafx.stage.Stage; - -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; - -import org.apache.commons.io.IOUtils; -import org.fxmisc.cssfx.CSSFX; - -@SuppressWarnings("restriction") -public class Example extends Application { - - private String mdfxTxt = null; - - @Override - public void start(Stage primaryStage) throws Exception { - - CSSFX.start(); - - mdfxTxt = IOUtils.toString(getClass().getResourceAsStream("/syntax.md"), - "UTF-8"); - mdfxTxt = mdfxTxt.replaceAll("local_image.jpg", - getResourcePath("local_image.jpg")); - System.err.println("Sample: " + mdfxTxt); - MarkdownView markdownView = new MarkdownView(mdfxTxt) { - // @Override - // public boolean showChapter(int[] currentChapter) { - // return currentChapter[1] == 1; - // } - - @Override - public void setLink(Node node, String link, String description) { - System.out.println("setLink: " + link); - node.setCursor(Cursor.HAND); - node.setOnMouseClicked(e -> { - System.out.println("link: " + link); - }); - } - - @Override - public Node generateImage(String url) { - if (url.equals("node://colorpicker")) { - return new ColorPicker(); - } else { - return super.generateImage(url); - } - } - }; - - TextArea textArea = new TextArea(mdfxTxt); - - markdownView.mdStringProperty().bind(textArea.textProperty()); - markdownView.getStylesheets().add("/css/mdfx-sample.css"); - - ScrollPane content = new ScrollPane(markdownView); - - content.setFitToWidth(true); - - textArea.setMinWidth(350); - HBox root = new HBox(textArea, content); - - Scene scene = new Scene(root, 700, 700); - - primaryStage.setScene(scene); - - primaryStage.show(); - } - - private static boolean debug = true; - - // NOTE: getResourceURI may not work with standalone or web hosted - // application - public String getResourceURI(String resourceFileName) { - - if (debug) { - System.err.println("Getting resource URI for: " + resourceFileName); - } - Class thisClass = this.getClass(); - System.err.println("Class: " + thisClass.getSimpleName()); - ClassLoader classLoader = thisClass.getClassLoader(); - URL resourceURL = classLoader.getResource(resourceFileName); - if (resourceURL != null) { - try { - System.err.println("Resource URL: " + resourceURL.toString()); - URI uri = resourceURL.toURI(); - if (debug) { - System.err.println("Resource URI: " + uri.toString()); - } - return uri.toString(); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } else { - return null; - } - } - - public static String getResourcePath(String resourceFileName) { - String prefix = "file://"; - final String resourcePath = String - .format("%s/%s/src/main/resources/%s", prefix, - System.getProperty("user.dir"), resourceFileName) - .replaceAll("\\\\", "/"); - if (debug) - System.err.println("Project based resource path: " + resourcePath); - - return resourcePath; - } - +package example; + +import javafx.application.Application; +import javafx.scene.Cursor; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.ColorPicker; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextArea; +import javafx.scene.layout.HBox; +import javafx.stage.Stage; + +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import org.apache.commons.io.IOUtils; +import org.fxmisc.cssfx.CSSFX; + +@SuppressWarnings("restriction") +public class Example extends Application { + + private String mdfxTxt = null; + + @Override + public void start(Stage primaryStage) throws Exception { + + CSSFX.start(); + + mdfxTxt = IOUtils.toString(getClass().getResourceAsStream("/syntax.md"), + "UTF-8"); + mdfxTxt = mdfxTxt.replaceAll("local_image.jpg", + getResourcePath("local_image.jpg")); + System.err.println("Sample: " + mdfxTxt); + MarkdownView markdownView = new MarkdownView(mdfxTxt) { + // @Override + // public boolean showChapter(int[] currentChapter) { + // return currentChapter[1] == 1; + // } + + @Override + public void setLink(Node node, String link, String description) { + System.out.println("setLink: " + link); + node.setCursor(Cursor.HAND); + node.setOnMouseClicked(e -> { + System.out.println("link: " + link); + }); + } + + @Override + public Node generateImage(String url) { + if (url.equals("node://colorpicker")) { + return new ColorPicker(); + } else { + return super.generateImage(url); + } + } + }; + + TextArea textArea = new TextArea(mdfxTxt); + + markdownView.mdStringProperty().bind(textArea.textProperty()); + markdownView.getStylesheets().add("/css/mdfx-sample.css"); + + ScrollPane content = new ScrollPane(markdownView); + + content.setFitToWidth(true); + + textArea.setMinWidth(350); + HBox root = new HBox(textArea, content); + + Scene scene = new Scene(root, 700, 700); + + primaryStage.setScene(scene); + + primaryStage.show(); + } + + private static boolean debug = true; + + // NOTE: getResourceURI may not work with standalone or web hosted + // application + public String getResourceURI(String resourceFileName) { + + if (debug) { + System.err.println("Getting resource URI for: " + resourceFileName); + } + Class thisClass = this.getClass(); + System.err.println("Class: " + thisClass.getSimpleName()); + ClassLoader classLoader = thisClass.getClassLoader(); + URL resourceURL = classLoader.getResource(resourceFileName); + if (resourceURL != null) { + try { + System.err.println("Resource URL: " + resourceURL.toString()); + URI uri = resourceURL.toURI(); + if (debug) { + System.err.println("Resource URI: " + uri.toString()); + } + return uri.toString(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } else { + return null; + } + } + + public static String getResourcePath(String resourceFileName) { + String prefix = "file://"; + final String resourcePath = String + .format("%s/%s/src/main/resources/%s", prefix, + System.getProperty("user.dir"), resourceFileName) + .replaceAll("\\\\", "/"); + if (debug) + System.err.println("Project based resource path: " + resourcePath); + + return resourcePath; + } + } \ No newline at end of file diff --git a/javafx-markdown/src/main/java/example/MDFXNodeHelper.java b/javafx-markdown/src/main/java/example/MDFXNodeHelper.java index 5dedb266b..0d8cdfb77 100644 --- a/javafx-markdown/src/main/java/example/MDFXNodeHelper.java +++ b/javafx-markdown/src/main/java/example/MDFXNodeHelper.java @@ -1,552 +1,552 @@ -package example; - -import com.vladsch.flexmark.ast.*; -import com.vladsch.flexmark.ext.attributes.AttributeNode; -import com.vladsch.flexmark.ext.attributes.AttributesExtension; -import com.vladsch.flexmark.ext.attributes.AttributesNode; -import com.vladsch.flexmark.ext.gfm.strikethrough.Strikethrough; -import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension; -import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension; -import com.vladsch.flexmark.ext.gfm.tasklist.TaskListItem; -import javafx.application.Platform; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.geometry.Pos; -import javafx.scene.Node; -import javafx.scene.control.Label; -import javafx.scene.layout.*; -import javafx.scene.text.Text; -import javafx.scene.text.TextFlow; -import javafx.util.Pair; -import com.vladsch.flexmark.util.ast.*; -import com.vladsch.flexmark.ext.tables.*; -import com.vladsch.flexmark.parser.Parser; -import com.vladsch.flexmark.util.misc.Extension; - -import java.util.LinkedList; -import java.util.List; -import java.util.function.Consumer; - -@SuppressWarnings("restriction") -public class MDFXNodeHelper extends VBox { - String mdString; - - MarkdownView parent; - - final static String ITALICE_CLASS_NAME = "markdown-italic"; - final static String BOLD_CLASS_NAME = "markdown-bold"; - final static String STRIKETHROUGH_CLASS_NAME = "markdown-strikethrough"; - - List elemStyleClass = new LinkedList(); - - List>> elemFunctions = new LinkedList>>(); - - Boolean nodePerWord = false; - - List styles = new LinkedList(); - - VBox root = new VBox(); - - GridPane grid = null; - int gridx = 0; - int gridy = 0; - TextFlow flow = null; - - boolean isListOrdered = false; - int orderedListCounter = 0; - - int[] currentChapter = new int[6]; - - public boolean shouldShowContent() { - return parent.showChapter(currentChapter); - } - - public void newParagraph() { - TextFlow newFlow = new TextFlow(); - newFlow.getStyleClass().add("markdown-normal-flow"); - root.getChildren().add(newFlow); - flow = newFlow; - } - - public MDFXNodeHelper(MarkdownView parent, String mdstring) { - this.parent = parent; - - root.getStyleClass().add("markdown-paragraph-list"); - root.setFillWidth(true); - - LinkedList extensions = new LinkedList<>(); - extensions.add(TablesExtension.create()); - extensions.add(AttributesExtension.create()); - extensions.add(StrikethroughExtension.create()); - extensions.add(TaskListExtension.create()); - Parser parser = Parser.builder().extensions(extensions).build(); - - Document node = parser.parse(mdstring); - - new MDParser(node).visitor.visitChildren(node); - - this.getChildren().add(root); - } - - class MDParser { - - Document document; - - MDParser(Document document) { - this.document = document; - } - - NodeVisitor visitor = new NodeVisitor( - // new VisitHandler<>(com.vladsch.flexmark.ast.Node.class, this::visit), - new VisitHandler<>(Code.class, this::visit), - new VisitHandler<>(BlockQuote.class, this::visit), - // new VisitHandler<>(Quotes.class, this::visit), - new VisitHandler<>(Block.class, this::visit), - new VisitHandler<>(Document.class, this::visit), - new VisitHandler<>(Emphasis.class, this::visit), - new VisitHandler<>(StrongEmphasis.class, this::visit), - new VisitHandler<>(FencedCodeBlock.class, this::visit), - new VisitHandler<>(SoftLineBreak.class, this::visit), - new VisitHandler<>(HardLineBreak.class, this::visit), - new VisitHandler<>(Heading.class, this::visit), - new VisitHandler<>(ListItem.class, this::visit), - new VisitHandler<>(BulletListItem.class, this::visit), - new VisitHandler<>(OrderedListItem.class, this::visit), - new VisitHandler<>(TaskListItem.class, this::visit), - new VisitHandler<>(BulletList.class, this::visit), - new VisitHandler<>(OrderedList.class, this::visit), - new VisitHandler<>(Paragraph.class, this::visit), - new VisitHandler<>(com.vladsch.flexmark.ast.Image.class, this::visit), - new VisitHandler<>(Link.class, this::visit), - new VisitHandler<>(com.vladsch.flexmark.ast.TextBase.class, - this::visit), - new VisitHandler<>(com.vladsch.flexmark.ast.Text.class, this::visit), - new VisitHandler<>( - com.vladsch.flexmark.ext.gfm.strikethrough.Strikethrough.class, - this::visit), - new VisitHandler<>(TableHead.class, this::visit), - new VisitHandler<>(TableBody.class, this::visit), - new VisitHandler<>(TableRow.class, this::visit), - new VisitHandler<>(TableCell.class, this::visit)); - - public void visit(Code code) { - - Label label = new Label(code.getText().normalizeEndWithEOL()); - label.getStyleClass().add("markdown-code"); - - Region bgr1 = new Region(); - bgr1.setManaged(false); - bgr1.getStyleClass().add("markdown-code-background"); - label.boundsInParentProperty().addListener((p, oldV, newV) -> { - bgr1.setTranslateX(newV.getMinX() + 2); - bgr1.setTranslateY(newV.getMinY() - 2); - bgr1.resize(newV.getWidth() - 4, newV.getHeight() + 4); - }); - - flow.getChildren().add(bgr1); - flow.getChildren().add(label); - - // visitor.visitChildren(code); - } - - public void visit(BlockQuote customBlock) { - VBox oldRoot = root; - root = new VBox(); - root.getStyleClass().add("markdown-normal-block-quote"); - oldRoot.getChildren().add(root); - - visitor.visitChildren(customBlock); - - root = oldRoot; - newParagraph(); - } - - public void visit(Block customBlock) { - flow.getChildren().add(new Text("\n\n")); - visitor.visitChildren(customBlock); - } - - public void visit(Document document) { - visitor.visitChildren(document); - } - - public void visit(Emphasis emphasis) { - elemStyleClass.add(ITALICE_CLASS_NAME); - visitor.visitChildren(emphasis); - elemStyleClass.remove(ITALICE_CLASS_NAME); - } - - public void visit(StrongEmphasis strongEmphasis) { - elemStyleClass.add(BOLD_CLASS_NAME); - visitor.visitChildren(strongEmphasis); - elemStyleClass.remove(BOLD_CLASS_NAME); - } - - public void visit(Strikethrough strikethrough) { - elemStyleClass.add(STRIKETHROUGH_CLASS_NAME); - visitor.visitChildren(strikethrough); - elemStyleClass.remove(STRIKETHROUGH_CLASS_NAME); - } - - public void visit(FencedCodeBlock fencedCodeBlock) { - - if (!shouldShowContent()) - return; - - Label label = new Label(fencedCodeBlock.getContentChars().toString()); - label.getStyleClass().add("markdown-codeblock"); - VBox vbox = new VBox(label); - vbox.getStyleClass().add("markdown-codeblock-box"); - - root.getChildren().add(vbox); - // flow.styleClass ::= "markdown-normal-flow" - // flow <++ new Text("\n") - // visitor.visitChildren(fencedCodeBlock); - } - - public void visit(SoftLineBreak softLineBreak) { - // flow <++ new Text("\n") - addText(" ", ""); - visitor.visitChildren(softLineBreak); - } - - public void visit(HardLineBreak hardLineBreak) { - flow.getChildren().add(new Text("\n")); - visitor.visitChildren(hardLineBreak); - } - - public void visit(Heading heading) { - - if (heading.getLevel() == 1 || heading.getLevel() == 2) { - currentChapter[heading.getLevel()] += 1; - - for (int i = heading.getLevel() + 1; i <= currentChapter.length - - 1; i += 1) { - currentChapter[i] = 0; - } - ; - } - - if (shouldShowContent()) { - newParagraph(); - - flow.getStyleClass().add("markdown-heading-" + heading.getLevel()); - flow.getStyleClass().add("markdown-heading"); - - visitor.visitChildren(heading); - } - } - - public void visitListItem(String text, - com.vladsch.flexmark.util.ast.Node node) { - VBox oldRoot = root; - - VBox newRoot = new VBox(); - newRoot.getStyleClass().add("markdown-vbox1"); - newRoot.getStyleClass().add("markdown-paragraph-list"); - newRoot.setFillWidth(true); - - orderedListCounter += 1; - - Label label = new Label(text); - label.getStyleClass().add("markdown-listitem-dot"); - label.getStyleClass().add("markdown-text"); - label.setMinWidth(20); - - HBox hbox = new HBox(); - hbox.getStyleClass().add("markdown-hbox1"); - hbox.getChildren().add(label); - hbox.setAlignment(Pos.TOP_LEFT); - hbox.getChildren().add(newRoot); - - oldRoot.getChildren().add(hbox); - - root = newRoot; - - visitor.visitChildren(node); - root = oldRoot; - } - - public void visit(TaskListItem listItem) { - if (!shouldShowContent()) - return; - String text = listItem.isItemDoneMarker() ? "☑" : "☐"; - visitListItem(text, listItem); - } - - public void visit(ListItem listItem) { - if (!shouldShowContent()) - return; - - String text = isListOrdered ? (" " + (orderedListCounter + 1) + ". ") - : " • "; - - visitListItem(text, listItem); - } - - public void visit(BulletList bulletList) { - - if (!shouldShowContent()) - return; - isListOrdered = false; - VBox oldRoot = root; - root = new VBox(); - oldRoot.getChildren().add(root); - newParagraph(); - flow.getStyleClass().add("markdown-normal-flow"); - visitor.visitChildren(bulletList); - root = oldRoot; - } - - public void visit(OrderedList orderedList) { - int previousCounter = orderedListCounter; - orderedListCounter = 0; - isListOrdered = true; - VBox oldRoot = root; - root = new VBox(); - oldRoot.getChildren().add(root); - newParagraph(); - flow.getStyleClass().add("markdown-normal-flow"); - visitor.visitChildren(orderedList); - orderedListCounter = previousCounter; - root = oldRoot; - } - - @SuppressWarnings("deprecation") - public void visit(Paragraph paragraph) { - if (!shouldShowContent()) - return; - - List atts = AttributesExtension.NODE_ATTRIBUTES - .getFrom(document).get(paragraph); - newParagraph(); - flow.getStyleClass().add("markdown-normal-flow"); - setAttrs(atts, true); - visitor.visitChildren(paragraph); - setAttrs(atts, false); - } - - public void visit(com.vladsch.flexmark.ast.Image image) { - String url = image.getUrl().toString(); - // System.out.println("imgUrl: " + image.getUrl()); - // System.out.println("img.getUrlContent: " + image.getUrlContent()); - // System.out.println("img.nodeName: " + image.getNodeName()); - Node node = parent.generateImage(url); - addFeatures(node, ""); - flow.getChildren().add(node); - // visitor.visitChildren(image); - } - - public void visit(Link link) { - - LinkedList nodes = new LinkedList<>(); - - Consumer> addProp = (pair) -> { - Node node = pair.getKey(); - String txt = pair.getValue(); - nodes.add(node); - - node.getStyleClass().add("markdown-link"); - parent.setLink(node, link.getUrl().normalizeEndWithEOL(), txt); - }; - Platform.runLater(() -> { - BooleanProperty lastValue = new SimpleBooleanProperty(false); - Runnable updateState = () -> { - boolean isHover = false; - for (Node node : nodes) { - if (node.isHover()) { - isHover = true; - } - } - if (isHover != lastValue.get()) { - lastValue.set(isHover); - for (Node node : nodes) { - if (isHover) { - node.getStyleClass().add("markdown-link-hover"); - } else { - node.getStyleClass().remove("markdown-link-hover"); - } - - } - ; - } - - }; - - for (Node node : nodes) { - node.hoverProperty().addListener((p, o, n) -> updateState.run()); - } - ; - updateState.run(); - }); - - boolean oldNodePerWord = nodePerWord; - nodePerWord = true; - elemFunctions.add(addProp); - visitor.visitChildren(link); - nodePerWord = oldNodePerWord; - elemFunctions.remove(addProp); - } - - @SuppressWarnings("deprecation") - public void visit(com.vladsch.flexmark.ast.TextBase text) { - List atts = AttributesExtension.NODE_ATTRIBUTES - .getFrom(document).get(text); - setAttrs(atts, true); - visitor.visitChildren(text); - setAttrs(atts, false); - } - - public void visit(com.vladsch.flexmark.ast.Text text) { - visitor.visitChildren(text); - - String wholeText = text.getChars().normalizeEOL(); - - String[] textsSplitted = null; - if (nodePerWord) { - textsSplitted = text.getChars().normalizeEOL().split(" "); - } else { - textsSplitted = new String[1]; - textsSplitted[0] = text.getChars().normalizeEOL(); - } - final String[] textsSplittedFinal = textsSplitted; - - for (int i = 0; i <= textsSplitted.length - 1; i += 1) { - if (i == 0) { - addText(textsSplittedFinal[i], wholeText); - } else { - addText(" " + textsSplittedFinal[i], wholeText); - } - } - } - - public void visit(TableHead customNode) { - - if (!shouldShowContent()) - return; - - TextFlow oldFlow = flow; - grid = new GridPane(); - grid.getStyleClass().add("markdown-table-table"); - gridx = 0; - gridy = -1; - root.getChildren().add(grid); - - visitor.visitChildren(customNode); - - for (int i = 1; i <= gridx; i += 1) { - ColumnConstraints constraint = new ColumnConstraints(); - if (i == gridx) { - constraint.setPercentWidth(100.0 * (2.0 / (gridx + 1.0))); - } - grid.getColumnConstraints().add(constraint); - } - - flow = oldFlow; - newParagraph(); - // flow.styleClass ::= "markdown-normal-flow" - } - - public void visit(TableBody customNode) { - if (!shouldShowContent()) - return; - visitor.visitChildren(customNode); - // } else if(customNode instanceof TableBlock) { - // super.visit(customNode); - } - - public void visit(TableRow customNode) { - if (customNode.getRowNumber() != 0) { - gridx = 0; - gridy += 1; - visitor.visitChildren(customNode); - } - } - - @SuppressWarnings("unused") - public void visit(TableCell customNode) { - TextFlow oldFlow = flow; - flow = new TextFlow(); - flow.getStyleClass().add("markdown-normal-flow"); - TextFlow container = flow; - // println("grid: " + grid) - // javafx.scene.layout.GridPane.setHgrow(container,Priority.ALWAYS) - flow.setPrefWidth(9999); - flow.getStyleClass().add("markdown-table-cell"); - if (gridy == 0) { - flow.getStyleClass().add("markdown-table-cell-top"); - } - if (gridy % 2 == 0) { - flow.getStyleClass().add("markdown-table-odd"); - } else { - flow.getStyleClass().add("markdown-table-even"); - } - grid.add(container, gridx, gridy); - gridx += 1; - visitor.visitChildren(customNode); - } - - @SuppressWarnings("unchecked") - public void setAttrs(List atts, boolean add) { - if (atts == null) - return; - - List atts2 = new LinkedList<>(); - for (AttributesNode att : atts) { - for (com.vladsch.flexmark.util.ast.Node attChild : att.getChildren()) { - atts2.add(attChild); - } - } - - List atts3 = (List) (Object) atts2; - - atts3.forEach(att -> { - if (att.getName().toLowerCase().equals("style")) { - if (add) - styles.add(att.getValue().toString()); - else - styles.remove(att.getValue().toString()); - } - if (att.isClass()) { - if (add) - elemStyleClass.add(att.getValue().toString()); - else - elemStyleClass.remove(att.getValue().toString()); - } - }); - } - - } - - public void addText(String text, String wholeText) { - if (!text.isEmpty()) { - - Text toAdd = new Text(text); - - toAdd.getStyleClass().add("markdown-text"); - - addFeatures(toAdd, wholeText); - - flow.getChildren().add(toAdd); - } - } - - @SuppressWarnings("unchecked") - public void addFeatures(Node toAdd, String wholeText) { - for (String elemStyleClass : elemStyleClass) { - toAdd.getStyleClass().add(elemStyleClass); - } - ; - for (Consumer> f : elemFunctions) { - f.accept(new Pair(toAdd, wholeText)); - } - ; - if (!styles.isEmpty()) { - String tmp = ""; - for (String style : styles) { - tmp = tmp + style + ";"; - } - toAdd.setStyle(toAdd.getStyle() + tmp); - } - } -} +package example; + +import com.vladsch.flexmark.ast.*; +import com.vladsch.flexmark.ext.attributes.AttributeNode; +import com.vladsch.flexmark.ext.attributes.AttributesExtension; +import com.vladsch.flexmark.ext.attributes.AttributesNode; +import com.vladsch.flexmark.ext.gfm.strikethrough.Strikethrough; +import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension; +import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension; +import com.vladsch.flexmark.ext.gfm.tasklist.TaskListItem; +import javafx.application.Platform; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.layout.*; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; +import javafx.util.Pair; +import com.vladsch.flexmark.util.ast.*; +import com.vladsch.flexmark.ext.tables.*; +import com.vladsch.flexmark.parser.Parser; +import com.vladsch.flexmark.util.misc.Extension; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.Consumer; + +@SuppressWarnings("restriction") +public class MDFXNodeHelper extends VBox { + String mdString; + + MarkdownView parent; + + final static String ITALICE_CLASS_NAME = "markdown-italic"; + final static String BOLD_CLASS_NAME = "markdown-bold"; + final static String STRIKETHROUGH_CLASS_NAME = "markdown-strikethrough"; + + List elemStyleClass = new LinkedList(); + + List>> elemFunctions = new LinkedList>>(); + + Boolean nodePerWord = false; + + List styles = new LinkedList(); + + VBox root = new VBox(); + + GridPane grid = null; + int gridx = 0; + int gridy = 0; + TextFlow flow = null; + + boolean isListOrdered = false; + int orderedListCounter = 0; + + int[] currentChapter = new int[6]; + + public boolean shouldShowContent() { + return parent.showChapter(currentChapter); + } + + public void newParagraph() { + TextFlow newFlow = new TextFlow(); + newFlow.getStyleClass().add("markdown-normal-flow"); + root.getChildren().add(newFlow); + flow = newFlow; + } + + public MDFXNodeHelper(MarkdownView parent, String mdstring) { + this.parent = parent; + + root.getStyleClass().add("markdown-paragraph-list"); + root.setFillWidth(true); + + LinkedList extensions = new LinkedList<>(); + extensions.add(TablesExtension.create()); + extensions.add(AttributesExtension.create()); + extensions.add(StrikethroughExtension.create()); + extensions.add(TaskListExtension.create()); + Parser parser = Parser.builder().extensions(extensions).build(); + + Document node = parser.parse(mdstring); + + new MDParser(node).visitor.visitChildren(node); + + this.getChildren().add(root); + } + + class MDParser { + + Document document; + + MDParser(Document document) { + this.document = document; + } + + NodeVisitor visitor = new NodeVisitor( + // new VisitHandler<>(com.vladsch.flexmark.ast.Node.class, this::visit), + new VisitHandler<>(Code.class, this::visit), + new VisitHandler<>(BlockQuote.class, this::visit), + // new VisitHandler<>(Quotes.class, this::visit), + new VisitHandler<>(Block.class, this::visit), + new VisitHandler<>(Document.class, this::visit), + new VisitHandler<>(Emphasis.class, this::visit), + new VisitHandler<>(StrongEmphasis.class, this::visit), + new VisitHandler<>(FencedCodeBlock.class, this::visit), + new VisitHandler<>(SoftLineBreak.class, this::visit), + new VisitHandler<>(HardLineBreak.class, this::visit), + new VisitHandler<>(Heading.class, this::visit), + new VisitHandler<>(ListItem.class, this::visit), + new VisitHandler<>(BulletListItem.class, this::visit), + new VisitHandler<>(OrderedListItem.class, this::visit), + new VisitHandler<>(TaskListItem.class, this::visit), + new VisitHandler<>(BulletList.class, this::visit), + new VisitHandler<>(OrderedList.class, this::visit), + new VisitHandler<>(Paragraph.class, this::visit), + new VisitHandler<>(com.vladsch.flexmark.ast.Image.class, this::visit), + new VisitHandler<>(Link.class, this::visit), + new VisitHandler<>(com.vladsch.flexmark.ast.TextBase.class, + this::visit), + new VisitHandler<>(com.vladsch.flexmark.ast.Text.class, this::visit), + new VisitHandler<>( + com.vladsch.flexmark.ext.gfm.strikethrough.Strikethrough.class, + this::visit), + new VisitHandler<>(TableHead.class, this::visit), + new VisitHandler<>(TableBody.class, this::visit), + new VisitHandler<>(TableRow.class, this::visit), + new VisitHandler<>(TableCell.class, this::visit)); + + public void visit(Code code) { + + Label label = new Label(code.getText().normalizeEndWithEOL()); + label.getStyleClass().add("markdown-code"); + + Region bgr1 = new Region(); + bgr1.setManaged(false); + bgr1.getStyleClass().add("markdown-code-background"); + label.boundsInParentProperty().addListener((p, oldV, newV) -> { + bgr1.setTranslateX(newV.getMinX() + 2); + bgr1.setTranslateY(newV.getMinY() - 2); + bgr1.resize(newV.getWidth() - 4, newV.getHeight() + 4); + }); + + flow.getChildren().add(bgr1); + flow.getChildren().add(label); + + // visitor.visitChildren(code); + } + + public void visit(BlockQuote customBlock) { + VBox oldRoot = root; + root = new VBox(); + root.getStyleClass().add("markdown-normal-block-quote"); + oldRoot.getChildren().add(root); + + visitor.visitChildren(customBlock); + + root = oldRoot; + newParagraph(); + } + + public void visit(Block customBlock) { + flow.getChildren().add(new Text("\n\n")); + visitor.visitChildren(customBlock); + } + + public void visit(Document document) { + visitor.visitChildren(document); + } + + public void visit(Emphasis emphasis) { + elemStyleClass.add(ITALICE_CLASS_NAME); + visitor.visitChildren(emphasis); + elemStyleClass.remove(ITALICE_CLASS_NAME); + } + + public void visit(StrongEmphasis strongEmphasis) { + elemStyleClass.add(BOLD_CLASS_NAME); + visitor.visitChildren(strongEmphasis); + elemStyleClass.remove(BOLD_CLASS_NAME); + } + + public void visit(Strikethrough strikethrough) { + elemStyleClass.add(STRIKETHROUGH_CLASS_NAME); + visitor.visitChildren(strikethrough); + elemStyleClass.remove(STRIKETHROUGH_CLASS_NAME); + } + + public void visit(FencedCodeBlock fencedCodeBlock) { + + if (!shouldShowContent()) + return; + + Label label = new Label(fencedCodeBlock.getContentChars().toString()); + label.getStyleClass().add("markdown-codeblock"); + VBox vbox = new VBox(label); + vbox.getStyleClass().add("markdown-codeblock-box"); + + root.getChildren().add(vbox); + // flow.styleClass ::= "markdown-normal-flow" + // flow <++ new Text("\n") + // visitor.visitChildren(fencedCodeBlock); + } + + public void visit(SoftLineBreak softLineBreak) { + // flow <++ new Text("\n") + addText(" ", ""); + visitor.visitChildren(softLineBreak); + } + + public void visit(HardLineBreak hardLineBreak) { + flow.getChildren().add(new Text("\n")); + visitor.visitChildren(hardLineBreak); + } + + public void visit(Heading heading) { + + if (heading.getLevel() == 1 || heading.getLevel() == 2) { + currentChapter[heading.getLevel()] += 1; + + for (int i = heading.getLevel() + 1; i <= currentChapter.length + - 1; i += 1) { + currentChapter[i] = 0; + } + ; + } + + if (shouldShowContent()) { + newParagraph(); + + flow.getStyleClass().add("markdown-heading-" + heading.getLevel()); + flow.getStyleClass().add("markdown-heading"); + + visitor.visitChildren(heading); + } + } + + public void visitListItem(String text, + com.vladsch.flexmark.util.ast.Node node) { + VBox oldRoot = root; + + VBox newRoot = new VBox(); + newRoot.getStyleClass().add("markdown-vbox1"); + newRoot.getStyleClass().add("markdown-paragraph-list"); + newRoot.setFillWidth(true); + + orderedListCounter += 1; + + Label label = new Label(text); + label.getStyleClass().add("markdown-listitem-dot"); + label.getStyleClass().add("markdown-text"); + label.setMinWidth(20); + + HBox hbox = new HBox(); + hbox.getStyleClass().add("markdown-hbox1"); + hbox.getChildren().add(label); + hbox.setAlignment(Pos.TOP_LEFT); + hbox.getChildren().add(newRoot); + + oldRoot.getChildren().add(hbox); + + root = newRoot; + + visitor.visitChildren(node); + root = oldRoot; + } + + public void visit(TaskListItem listItem) { + if (!shouldShowContent()) + return; + String text = listItem.isItemDoneMarker() ? "☑" : "☐"; + visitListItem(text, listItem); + } + + public void visit(ListItem listItem) { + if (!shouldShowContent()) + return; + + String text = isListOrdered ? (" " + (orderedListCounter + 1) + ". ") + : " • "; + + visitListItem(text, listItem); + } + + public void visit(BulletList bulletList) { + + if (!shouldShowContent()) + return; + isListOrdered = false; + VBox oldRoot = root; + root = new VBox(); + oldRoot.getChildren().add(root); + newParagraph(); + flow.getStyleClass().add("markdown-normal-flow"); + visitor.visitChildren(bulletList); + root = oldRoot; + } + + public void visit(OrderedList orderedList) { + int previousCounter = orderedListCounter; + orderedListCounter = 0; + isListOrdered = true; + VBox oldRoot = root; + root = new VBox(); + oldRoot.getChildren().add(root); + newParagraph(); + flow.getStyleClass().add("markdown-normal-flow"); + visitor.visitChildren(orderedList); + orderedListCounter = previousCounter; + root = oldRoot; + } + + @SuppressWarnings("deprecation") + public void visit(Paragraph paragraph) { + if (!shouldShowContent()) + return; + + List atts = AttributesExtension.NODE_ATTRIBUTES + .getFrom(document).get(paragraph); + newParagraph(); + flow.getStyleClass().add("markdown-normal-flow"); + setAttrs(atts, true); + visitor.visitChildren(paragraph); + setAttrs(atts, false); + } + + public void visit(com.vladsch.flexmark.ast.Image image) { + String url = image.getUrl().toString(); + // System.out.println("imgUrl: " + image.getUrl()); + // System.out.println("img.getUrlContent: " + image.getUrlContent()); + // System.out.println("img.nodeName: " + image.getNodeName()); + Node node = parent.generateImage(url); + addFeatures(node, ""); + flow.getChildren().add(node); + // visitor.visitChildren(image); + } + + public void visit(Link link) { + + LinkedList nodes = new LinkedList<>(); + + Consumer> addProp = (pair) -> { + Node node = pair.getKey(); + String txt = pair.getValue(); + nodes.add(node); + + node.getStyleClass().add("markdown-link"); + parent.setLink(node, link.getUrl().normalizeEndWithEOL(), txt); + }; + Platform.runLater(() -> { + BooleanProperty lastValue = new SimpleBooleanProperty(false); + Runnable updateState = () -> { + boolean isHover = false; + for (Node node : nodes) { + if (node.isHover()) { + isHover = true; + } + } + if (isHover != lastValue.get()) { + lastValue.set(isHover); + for (Node node : nodes) { + if (isHover) { + node.getStyleClass().add("markdown-link-hover"); + } else { + node.getStyleClass().remove("markdown-link-hover"); + } + + } + ; + } + + }; + + for (Node node : nodes) { + node.hoverProperty().addListener((p, o, n) -> updateState.run()); + } + ; + updateState.run(); + }); + + boolean oldNodePerWord = nodePerWord; + nodePerWord = true; + elemFunctions.add(addProp); + visitor.visitChildren(link); + nodePerWord = oldNodePerWord; + elemFunctions.remove(addProp); + } + + @SuppressWarnings("deprecation") + public void visit(com.vladsch.flexmark.ast.TextBase text) { + List atts = AttributesExtension.NODE_ATTRIBUTES + .getFrom(document).get(text); + setAttrs(atts, true); + visitor.visitChildren(text); + setAttrs(atts, false); + } + + public void visit(com.vladsch.flexmark.ast.Text text) { + visitor.visitChildren(text); + + String wholeText = text.getChars().normalizeEOL(); + + String[] textsSplitted = null; + if (nodePerWord) { + textsSplitted = text.getChars().normalizeEOL().split(" "); + } else { + textsSplitted = new String[1]; + textsSplitted[0] = text.getChars().normalizeEOL(); + } + final String[] textsSplittedFinal = textsSplitted; + + for (int i = 0; i <= textsSplitted.length - 1; i += 1) { + if (i == 0) { + addText(textsSplittedFinal[i], wholeText); + } else { + addText(" " + textsSplittedFinal[i], wholeText); + } + } + } + + public void visit(TableHead customNode) { + + if (!shouldShowContent()) + return; + + TextFlow oldFlow = flow; + grid = new GridPane(); + grid.getStyleClass().add("markdown-table-table"); + gridx = 0; + gridy = -1; + root.getChildren().add(grid); + + visitor.visitChildren(customNode); + + for (int i = 1; i <= gridx; i += 1) { + ColumnConstraints constraint = new ColumnConstraints(); + if (i == gridx) { + constraint.setPercentWidth(100.0 * (2.0 / (gridx + 1.0))); + } + grid.getColumnConstraints().add(constraint); + } + + flow = oldFlow; + newParagraph(); + // flow.styleClass ::= "markdown-normal-flow" + } + + public void visit(TableBody customNode) { + if (!shouldShowContent()) + return; + visitor.visitChildren(customNode); + // } else if(customNode instanceof TableBlock) { + // super.visit(customNode); + } + + public void visit(TableRow customNode) { + if (customNode.getRowNumber() != 0) { + gridx = 0; + gridy += 1; + visitor.visitChildren(customNode); + } + } + + @SuppressWarnings("unused") + public void visit(TableCell customNode) { + TextFlow oldFlow = flow; + flow = new TextFlow(); + flow.getStyleClass().add("markdown-normal-flow"); + TextFlow container = flow; + // println("grid: " + grid) + // javafx.scene.layout.GridPane.setHgrow(container,Priority.ALWAYS) + flow.setPrefWidth(9999); + flow.getStyleClass().add("markdown-table-cell"); + if (gridy == 0) { + flow.getStyleClass().add("markdown-table-cell-top"); + } + if (gridy % 2 == 0) { + flow.getStyleClass().add("markdown-table-odd"); + } else { + flow.getStyleClass().add("markdown-table-even"); + } + grid.add(container, gridx, gridy); + gridx += 1; + visitor.visitChildren(customNode); + } + + @SuppressWarnings("unchecked") + public void setAttrs(List atts, boolean add) { + if (atts == null) + return; + + List atts2 = new LinkedList<>(); + for (AttributesNode att : atts) { + for (com.vladsch.flexmark.util.ast.Node attChild : att.getChildren()) { + atts2.add(attChild); + } + } + + List atts3 = (List) (Object) atts2; + + atts3.forEach(att -> { + if (att.getName().toLowerCase().equals("style")) { + if (add) + styles.add(att.getValue().toString()); + else + styles.remove(att.getValue().toString()); + } + if (att.isClass()) { + if (add) + elemStyleClass.add(att.getValue().toString()); + else + elemStyleClass.remove(att.getValue().toString()); + } + }); + } + + } + + public void addText(String text, String wholeText) { + if (!text.isEmpty()) { + + Text toAdd = new Text(text); + + toAdd.getStyleClass().add("markdown-text"); + + addFeatures(toAdd, wholeText); + + flow.getChildren().add(toAdd); + } + } + + @SuppressWarnings("unchecked") + public void addFeatures(Node toAdd, String wholeText) { + for (String elemStyleClass : elemStyleClass) { + toAdd.getStyleClass().add(elemStyleClass); + } + ; + for (Consumer> f : elemFunctions) { + f.accept(new Pair(toAdd, wholeText)); + } + ; + if (!styles.isEmpty()) { + String tmp = ""; + for (String style : styles) { + tmp = tmp + style + ";"; + } + toAdd.setStyle(toAdd.getStyle() + tmp); + } + } +} diff --git a/javafx-markdown/src/main/java/example/MarkdownView.java b/javafx-markdown/src/main/java/example/MarkdownView.java index bc3f3aadf..f179b7800 100644 --- a/javafx-markdown/src/main/java/example/MarkdownView.java +++ b/javafx-markdown/src/main/java/example/MarkdownView.java @@ -1,62 +1,62 @@ -package example; - -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; -import javafx.scene.Group; -import javafx.scene.Node; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import javafx.scene.layout.VBox; - -@SuppressWarnings("restriction") -public class MarkdownView extends VBox { - - private SimpleStringProperty mdString = new SimpleStringProperty(""); - - public MarkdownView(String mdString) { - this.mdString.set(mdString); - this.mdString.addListener((p, o, n) -> updateContent()); - getStylesheets().add("/css/mdfx.css"); - updateContent(); - } - - public MarkdownView() { - this(""); - } - - private void updateContent() { - MDFXNodeHelper content = new MDFXNodeHelper(this, mdString.getValue()); - getChildren().clear(); - getChildren().add(content); - } - - public StringProperty mdStringProperty() { - return mdString; - } - - public void setMdString(String mdString) { - this.mdString.set(mdString); - } - - public String getMdString() { - return mdString.get(); - } - - public boolean showChapter(int[] currentChapter) { - return true; - } - - public void setLink(Node node, String link, String description) { - // TODO - // com.jpro.web.Util.setLink(node, link, scala.Option.apply(description)); - } - - public Node generateImage(String url) { - if (url.isEmpty()) { - return new Group(); - } else { - return new ImageView(new Image(url, true)); - } - - } -} +package example; + +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.VBox; + +@SuppressWarnings("restriction") +public class MarkdownView extends VBox { + + private SimpleStringProperty mdString = new SimpleStringProperty(""); + + public MarkdownView(String mdString) { + this.mdString.set(mdString); + this.mdString.addListener((p, o, n) -> updateContent()); + getStylesheets().add("/css/mdfx.css"); + updateContent(); + } + + public MarkdownView() { + this(""); + } + + private void updateContent() { + MDFXNodeHelper content = new MDFXNodeHelper(this, mdString.getValue()); + getChildren().clear(); + getChildren().add(content); + } + + public StringProperty mdStringProperty() { + return mdString; + } + + public void setMdString(String mdString) { + this.mdString.set(mdString); + } + + public String getMdString() { + return mdString.get(); + } + + public boolean showChapter(int[] currentChapter) { + return true; + } + + public void setLink(Node node, String link, String description) { + // TODO + // com.jpro.web.Util.setLink(node, link, scala.Option.apply(description)); + } + + public Node generateImage(String url) { + if (url.isEmpty()) { + return new Group(); + } else { + return new ImageView(new Image(url, true)); + } + + } +} diff --git a/javafx-markdown/src/main/resources/css/mdfx-default.css b/javafx-markdown/src/main/resources/css/mdfx-default.css index 3cb0a1eab..e370727d5 100644 --- a/javafx-markdown/src/main/resources/css/mdfx-default.css +++ b/javafx-markdown/src/main/resources/css/mdfx-default.css @@ -1,25 +1,25 @@ -* { - -mdfx-font-color: black; - -mdfx-link-color: blue; - -mdfx-border-color-1: #888; - - -mdfx-bg-color-1: #ccc; - -mdfx-bg-color-2: #ddd; - -mdfx-bg-color-3: #eee; - - -mdfx-bq-color-border: #4488cc; /* the blockquote's border color */ - -mdfx-bq-color-background: #0000ff0c; /* the blockquote's background color */ -} - -.markdown-text { - -fx-font-family: "Montserrat", "Liberation Sans","Arial","Helvetica"; -} -.markdown-italic { - -fx-font-style: italic; -} -.markdown-bold { - -fx-font-weight: bold; -} -.markdown-strikethrough { - -fx-strikethrough: true; +* { + -mdfx-font-color: black; + -mdfx-link-color: blue; + -mdfx-border-color-1: #888; + + -mdfx-bg-color-1: #ccc; + -mdfx-bg-color-2: #ddd; + -mdfx-bg-color-3: #eee; + + -mdfx-bq-color-border: #4488cc; /* the blockquote's border color */ + -mdfx-bq-color-background: #0000ff0c; /* the blockquote's background color */ +} + +.markdown-text { + -fx-font-family: "Montserrat", "Liberation Sans","Arial","Helvetica"; +} +.markdown-italic { + -fx-font-style: italic; +} +.markdown-bold { + -fx-font-weight: bold; +} +.markdown-strikethrough { + -fx-strikethrough: true; } \ No newline at end of file diff --git a/javafx-markdown/src/main/resources/css/mdfx-sample.css b/javafx-markdown/src/main/resources/css/mdfx-sample.css index 7fc80349a..071cb2713 100644 --- a/javafx-markdown/src/main/resources/css/mdfx-sample.css +++ b/javafx-markdown/src/main/resources/css/mdfx-sample.css @@ -1,33 +1,33 @@ -* { - -mdfx-font-color: green; - -mdfx-border-color-1: #888; - - -mdfx-bg-color-1: #ccc; - -mdfx-bg-color-2: #ddd; - -mdfx-bg-color-3: #eee; - - -mdfx-bq-color-border: #4488cc; /* the blockquote's border color */ - -mdfx-bq-color-background: #0000ff0c; /* the blockquote's background color */ -} - -.markdown-text { - -fx-font-family: ARIAL; -} -.markdown-italic { - -fx-font-style: italic; -} -.markdown-bold { - -fx-font-weight: bold; -} -.markdown-strikethrough { - -fx-strikethrough: true; -} - -.classname { - -mdfx-font-color: red; - -fx-font-size: 25; -} - -.markdown-link { - -fx-text-fill: red; -} +* { + -mdfx-font-color: green; + -mdfx-border-color-1: #888; + + -mdfx-bg-color-1: #ccc; + -mdfx-bg-color-2: #ddd; + -mdfx-bg-color-3: #eee; + + -mdfx-bq-color-border: #4488cc; /* the blockquote's border color */ + -mdfx-bq-color-background: #0000ff0c; /* the blockquote's background color */ +} + +.markdown-text { + -fx-font-family: ARIAL; +} +.markdown-italic { + -fx-font-style: italic; +} +.markdown-bold { + -fx-font-weight: bold; +} +.markdown-strikethrough { + -fx-strikethrough: true; +} + +.classname { + -mdfx-font-color: red; + -fx-font-size: 25; +} + +.markdown-link { + -fx-text-fill: red; +} diff --git a/javafx-markdown/src/main/resources/css/mdfx.css b/javafx-markdown/src/main/resources/css/mdfx.css index 43c05173c..06de5e231 100644 --- a/javafx-markdown/src/main/resources/css/mdfx.css +++ b/javafx-markdown/src/main/resources/css/mdfx.css @@ -1,140 +1,140 @@ - - -.markdown-text { - -fx-font-size: 16; - -fx-fill: -mdfx-font-color; -} - -.markdown-normal-flow { - -fx-line-spacing: 5; -} - -.markdown-heading .markdown-text { - /*-fx-line-spacing: 100;*/ - -fx-fill: -mdfx-font-color; -} -.markdown-heading-1 { -fx-padding: 14;} -.markdown-heading-2 { -fx-padding: 10;} -.markdown-heading-3 { -fx-padding: 8; } -.markdown-heading-4 { -fx-padding: 6; } -.markdown-heading-5 { -fx-padding: 4; } - -.markdown-heading-1 .markdown-text { - -fx-font-size: 50; -} - -.markdown-heading-2 .markdown-text { - -fx-font-size: 38; -} - - -.markdown-heading-3 .markdown-text { - -fx-font-size: 28; -} - -.markdown-heading-4 .markdown-text { - -fx-font-size: 24; -} - -.markdown-heading-5 .markdown-text { - -fx-font-size: 20; -} - -.markdown-link { - -fx-fill: -mdfx-link-color; -} -.markdown-link-hover { - -fx-underline: true; -} - - - -.markdown-paragraph-list { - -fx-spacing: 15; -} -.markdown-listitem-dot { - -fx-font-size: 16; - -fx-text-fill: -mdfx-font-color; -} - -.markdown-codeblock-box, -.markdown-code { - -fx-font-family: "Lucida Console","Courier New"; - -fx-padding: 0 8 0 8; -} -.markdown-code { - /*-fx-max-width: 300*/ -} -.markdown-code, -.markdown-codeblock { - -fx-wrap-text: true; - -fx-font-size: 16; -} -.markdown-codeblock-box, -.markdown-code-background { - -fx-padding: 8; - -fx-border-radius: 8; - -fx-border-color: -mdfx-border-color-1; - -fx-border-width: 0.5; - -fx-background-radius: 8; - -fx-background-color: #00000009; /* -mdfx-bg-color-3*/ -} -.markdown-code-background { - -fx-border-width: 0; - -fx-background-color: #0000AA10; /* -mdfx-bg-color-3*/ -} - -.markdown-code-anti-padding { - /*-fx-padding: -8;*/ - -fx-border-color: red; - -fx-border-width: 1; -} - -.markdown-table-table { - -fx-vgap: -1; - -fx-hgap: -1; -} - -.markdown-table-cell { - -fx-padding: 8; - -fx-border-color: -mdfx-border-color-1; - -fx-border-width: 0; -} - -.markdown-table-even { - -fx-background-color: -mdfx-bg-color-1; -} -.markdown-table-odd { - -fx-background-color: -mdfx-bg-color-2; -} -.markdown-table-cell-top { - -fx-background-color: -mdfx-bg-color-3; -} -.markdown-table-cell-top .markdown-normal-flow { - -fx-alignment: center; - -fx-text-alignment: center; -} - -.markdown-hbox1 { - -fx-spacing: 0; - -fx-padding: 8; -} - -.markdown-normal-block-quote { - -fx-background-color: -mdfx-bq-color-background; - -fx-background-insets: 10; - -fx-border-color: -mdfx-bq-color-border; - -fx-border-width: 0 0 0 3; - -fx-border-insets: 10 10 10 10; - -fx-padding: 10 10 10 10; -} - -/* -.markdown-hbox1 { - -fx-background-color: red; -} -.markdown-vbox1 { - -fx-background-color: orange; -} -*/ - + + +.markdown-text { + -fx-font-size: 16; + -fx-fill: -mdfx-font-color; +} + +.markdown-normal-flow { + -fx-line-spacing: 5; +} + +.markdown-heading .markdown-text { + /*-fx-line-spacing: 100;*/ + -fx-fill: -mdfx-font-color; +} +.markdown-heading-1 { -fx-padding: 14;} +.markdown-heading-2 { -fx-padding: 10;} +.markdown-heading-3 { -fx-padding: 8; } +.markdown-heading-4 { -fx-padding: 6; } +.markdown-heading-5 { -fx-padding: 4; } + +.markdown-heading-1 .markdown-text { + -fx-font-size: 50; +} + +.markdown-heading-2 .markdown-text { + -fx-font-size: 38; +} + + +.markdown-heading-3 .markdown-text { + -fx-font-size: 28; +} + +.markdown-heading-4 .markdown-text { + -fx-font-size: 24; +} + +.markdown-heading-5 .markdown-text { + -fx-font-size: 20; +} + +.markdown-link { + -fx-fill: -mdfx-link-color; +} +.markdown-link-hover { + -fx-underline: true; +} + + + +.markdown-paragraph-list { + -fx-spacing: 15; +} +.markdown-listitem-dot { + -fx-font-size: 16; + -fx-text-fill: -mdfx-font-color; +} + +.markdown-codeblock-box, +.markdown-code { + -fx-font-family: "Lucida Console","Courier New"; + -fx-padding: 0 8 0 8; +} +.markdown-code { + /*-fx-max-width: 300*/ +} +.markdown-code, +.markdown-codeblock { + -fx-wrap-text: true; + -fx-font-size: 16; +} +.markdown-codeblock-box, +.markdown-code-background { + -fx-padding: 8; + -fx-border-radius: 8; + -fx-border-color: -mdfx-border-color-1; + -fx-border-width: 0.5; + -fx-background-radius: 8; + -fx-background-color: #00000009; /* -mdfx-bg-color-3*/ +} +.markdown-code-background { + -fx-border-width: 0; + -fx-background-color: #0000AA10; /* -mdfx-bg-color-3*/ +} + +.markdown-code-anti-padding { + /*-fx-padding: -8;*/ + -fx-border-color: red; + -fx-border-width: 1; +} + +.markdown-table-table { + -fx-vgap: -1; + -fx-hgap: -1; +} + +.markdown-table-cell { + -fx-padding: 8; + -fx-border-color: -mdfx-border-color-1; + -fx-border-width: 0; +} + +.markdown-table-even { + -fx-background-color: -mdfx-bg-color-1; +} +.markdown-table-odd { + -fx-background-color: -mdfx-bg-color-2; +} +.markdown-table-cell-top { + -fx-background-color: -mdfx-bg-color-3; +} +.markdown-table-cell-top .markdown-normal-flow { + -fx-alignment: center; + -fx-text-alignment: center; +} + +.markdown-hbox1 { + -fx-spacing: 0; + -fx-padding: 8; +} + +.markdown-normal-block-quote { + -fx-background-color: -mdfx-bq-color-background; + -fx-background-insets: 10; + -fx-border-color: -mdfx-bq-color-border; + -fx-border-width: 0 0 0 3; + -fx-border-insets: 10 10 10 10; + -fx-padding: 10 10 10 10; +} + +/* +.markdown-hbox1 { + -fx-background-color: red; +} +.markdown-vbox1 { + -fx-background-color: orange; +} +*/ + diff --git a/javafx-markdown/src/main/resources/syntax.md b/javafx-markdown/src/main/resources/syntax.md index 294244090..7e7e4c266 100644 --- a/javafx-markdown/src/main/resources/syntax.md +++ b/javafx-markdown/src/main/resources/syntax.md @@ -1,56 +1,67 @@ - -## Style -``` -*cursive* -**Bold** -***Bold and Cursive*** -``` -*cursive* -**Bold** -***Bold and Cursive*** - -## Links: -``` -[link](https://google.com) -``` -[link](https://google.com) - -### Table -``` -property | description | defaultvalue - --- | --- | --- -asdf | asdfsdf | asdf -``` -property | description | defaultvalue - --- | --- | --- -asdf | asdfsdf | asdf - -## Pictures -``` -![Image](local_image.jpg) -``` -![Image](local_image.jpg) - -``` -![Image](https://www.jpro.one/app/default/resourcesencoded/jar:file:/home/ubuntu/jpro/jpro.one-jpro/libs/jpro.one.jar!/one/jpro/img/landing/Java-Logo.png) -``` - -![Image](https://www.jpro.one/app/default/resourcesencoded/jar:file:/home/ubuntu/jpro/jpro.one-jpro/libs/jpro.one.jar!/one/jpro/img/landing/Java-Logo.png) - -## Headline: -``` -# Asdf -## Asdf -``` -# Asdf -## Asdf - -## Bulletpoints: -``` -* Point1 -* Point2 -* Point3 -``` -* Point1 -* Point2 -* Point3 \ No newline at end of file + +## Style +``` +*cursive* +**Bold** +***Bold and Cursive*** +``` +*cursive* +**Bold** +***Bold and Cursive*** + +## Links: +``` +[link](https://google.com) +``` +[link](https://google.com) + +### Table +``` +property | description | defaultvalue + --- | --- | --- +asdf | asdfsdf | asdf +``` +property | description | defaultvalue + --- | --- | --- +asdf | asdfsdf | asdf + +## Pictures +* local image +``` +![Image](local_image.jpg) +``` + +![Image](local_image.jpg) + +* image loaded from the `.jar` + +``` +![Image](https://www.jpro.one/app/default/resourcesencoded/jar:file:/home/ubuntu/jpro/jpro.one-jpro/libs/jpro.one.jar!/one/jpro/img/landing/Java-Logo.png) +``` + +![Image](https://www.jpro.one/app/default/resourcesencoded/jar:file:/home/ubuntu/jpro/jpro.one-jpro/libs/jpro.one.jar!/one/jpro/img/landing/Java-Logo.png) + +* image from earlier deployed `README.md` + +``` +![APM Example](https://github.com/sergueik/springboot_study/blob/master/basic-elk-cluster/screenshots/capture-apm-example.png) +``` +![APM Example](https://github.com/sergueik/springboot_study/blob/master/basic-elk-cluster/screenshots/capture-apm-example.png) + +## Headline: +``` +# Asdf +## Asdf +``` +# Asdf +## Asdf + +## Bulletpoints: +``` +* Point1 +* Point2 +* Point3 +``` +* Point1 +* Point2 +* Point3 diff --git a/javafx-markdown/src/main/resources/test.md b/javafx-markdown/src/main/resources/test.md index 7b5f01d53..c9678d228 100644 --- a/javafx-markdown/src/main/resources/test.md +++ b/javafx-markdown/src/main/resources/test.md @@ -1,53 +1,53 @@ - -# asdf `a` - -*bold*red**bold** -`Inline code` with backticks asdf asdf asdf asdf asdf asdf asdf asdfa sfasdf asdf asdf -`Inline code` with backticks - -asdf asdf asdf -`` -asdf asdf asdf - -``` -# code block -print '3 backticks or' -print 'indent 4 spaces' -``` - -### Table - property | description | defaultvalue - --- | --- | --- - asdf | a`sdf`sdf | asdf - - property adsf asdf asdf asdf asdf asdf asdf | description | defaultvalue - --- | --- | --- - asdf | a`sdf`sdf | asdf - -italic: *italic* bold: **bold** normal -line1 -line1 - -* Item 1 -* Item 2 - * Item 2a - * Item 2b -Ordered - -1. Item 1 -1. Item 2 -1. Item 3 - 1. Item 3a - 1. Item 3b - -line2 -line2 - -line3 -line3 -# Heading1 *bold* -## Heading2 -### Heading3 -[Link](http://a.com) -![Image](https://www.smashingmagazine.com/wp-content/uploads/2016/01/07-responsive-image-example-castle-7-opt.jpg) + +# asdf `a` + +*bold*red**bold** +`Inline code` with backticks asdf asdf asdf asdf asdf asdf asdf asdfa sfasdf asdf asdf +`Inline code` with backticks + +asdf asdf asdf +`` +asdf asdf asdf + +``` +# code block +print '3 backticks or' +print 'indent 4 spaces' +``` + +### Table + property | description | defaultvalue + --- | --- | --- + asdf | a`sdf`sdf | asdf + + property adsf asdf asdf asdf asdf asdf asdf | description | defaultvalue + --- | --- | --- + asdf | a`sdf`sdf | asdf + +italic: *italic* bold: **bold** normal +line1 +line1 + +* Item 1 +* Item 2 + * Item 2a + * Item 2b +Ordered + +1. Item 1 +1. Item 2 +1. Item 3 + 1. Item 3a + 1. Item 3b + +line2 +line2 + +line3 +line3 +# Heading1 *bold* +## Heading2 +### Heading3 +[Link](http://a.com) +![Image](https://www.smashingmagazine.com/wp-content/uploads/2016/01/07-responsive-image-example-castle-7-opt.jpg) \ No newline at end of file diff --git a/javafx-markdown/test-jdk11.cmd b/javafx-markdown/test-jdk11.cmd new file mode 100644 index 000000000..903aa04de --- /dev/null +++ b/javafx-markdown/test-jdk11.cmd @@ -0,0 +1,23 @@ +@echo OFF +REM do not name this script run.cmd +where.exe mvn.cmd 2>NUL 1>NUL +if errorlevel 1 goto :SKIP + +REM the original launcher does not work with JDK 11 due to its module boundaries +REM if JDK 11 is not the default on the host, set it to custom vendor JDK now +set JAVA_HOME=c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64 +call c:\java\init.cmd + +call mvn -f %~dp0pom-java11.xml clean package +echo done +:SKIP + +echo Launching with classpath ^+ modulepath semantics +java -Dprism.order=sw -cp target\example.javafx_markdown.jar;target\lib\* ^ +--module-path target/lib ^ +--add-modules=javafx.base,javafx.graphics,javafx.controls ^ +example.Example + +REM fixing the Error: +REM JavaFX runtime components are missing, and are required to run this application + diff --git a/javafx-markdown/test-jdk11.sh b/javafx-markdown/test-jdk11.sh new file mode 100755 index 000000000..2951ff375 --- /dev/null +++ b/javafx-markdown/test-jdk11.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +mvn -f ./pom-java11.xml clean package +echo 'Launching with classpath + modulepath semantics' +java -Dprism.order=sw -cp target/example.javafx_markdown.jar:target/lib.* \ +--module-path target/lib \ +--add-modules=javafx.controls,javafx.base,javafx.graphics,commons.configuration \ +example.Example +# surprisingly, observed the error +# java.lang.module.FindException: Module org.apache.logging.log4j not found +# when log4j jar was included in pom-java11.xml but unused in application diff --git a/javafx-markdown/test.cmd b/javafx-markdown/test.cmd index 27ad45650..16e651c67 100644 --- a/javafx-markdown/test.cmd +++ b/javafx-markdown/test.cmd @@ -1,4 +1,8 @@ @echo OFF + +REM Does not work with JDK 11 +set JAVA_HOME=c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64 +call c:\java\init.cmd REM do not name this script run.cmd where.exe mvn.cmd 2>NUL 1>NUL if errorlevel 1 goto :SKIP From 95aa63b43cb1f742e8b5ba74b968e855836d7271 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 17 Jul 2023 02:07:30 +0200 Subject: [PATCH 018/171] intermediate revision - added cmd/powershell version of rename script, with some non-working unfinished alternatives left in the code for illustration --- utils/rename.cmd | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 utils/rename.cmd diff --git a/utils/rename.cmd b/utils/rename.cmd new file mode 100644 index 000000000..1dbbc39ce --- /dev/null +++ b/utils/rename.cmd @@ -0,0 +1,28 @@ +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION +:BEGIN +set SEARCH_PATH=%~1 +set REPLACE=%~2 +set SEARCH_PATH=!SEARCH_PATH: =__! +echo SEARCH_PATH=!SEARCH_PATH! +set REPLACE=!REPLACE: =__! +echo REPLACE="!REPLACE!" +echo powershell.exe -executionpolicy bypass "&{ param([String]$search_path,[String]$replace,[switch] $debug) write-output ('search_path={0} replace={1}' -f ($search_path -replace '__' , ' '), ($replace -replace '__', ' ') ) }" -search_path "!SEARCH_PATH!" -replace "!REPLACE!" + +REM passing argument with spaces does not work, need to substitute with e.g. double underscore +call powershell.exe -executionpolicy bypass "&{ param([String]$search_path,[String]$replace,[switch] $debug) write-output ('search_path={0} replace={1}' -f ($search_path -replace '__' , ' '), ($replace -replace '__', ' ') ) }" -search_path "!SEARCH_PATH!" -replace "!REPLACE!" + +REM replace does not work +powershell.exe -executionpolicy bypass "&{ param([String]$p,[String]$r,[switch] $d) $r = $r -replace '__', '' ; cd $p; get-childitem .|select-object -expandproperty name|foreach-object{ $n1 = $_; $n2 = $n1 -replace "$r",''; write-output ('{0} {1}' -f $n1, $n2) } }" -p "!SEARCH_PATH!" -r "!REPLACE!" + +REM write the arguments into the script directly +set SEARCH_PATH=%~1 +set REPLACE=%~2 +powershell.exe -executionpolicy bypass "&{ cd '!SEARCH_PATH!'; get-childitem .|select-object -expandproperty name | foreach-object { $n1 = $_; $n2 = $n1 -replace '!REPLACE!',''; write-output ('{0} {1}' -f $n1, $n2); if ($n2 -ne $n1 ) { rename-item -newname $n2 -LiteralPath $n1 } } }" + +echo. + +goto :EOF + +endlocal From 91fea8998303c0935ad4ff01cd3c9e0485212d58 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 19 Jul 2023 17:21:37 -0700 Subject: [PATCH 019/171] initial snapshot of 'codeborne/xls-test' --- xls-validate/README.md | 6 + xls-validate/pom.xml | 249 ++++++++++++++++++ xls-validate/src/main/java/example/IO.java | 37 +++ xls-validate/src/main/java/example/XLS.java | 65 +++++ .../java/example/matchers/ContainsRow.java | 47 ++++ .../java/example/matchers/ContainsText.java | 37 +++ .../example/matchers/DoesNotContainText.java | 26 ++ .../java/example/matchers/XLSMatcher.java | 64 +++++ .../src/test/java/example/CreateXLSXTest.java | 47 ++++ .../src/test/java/example/CreateXlsTest.java | 50 ++++ .../src/test/java/example/InvalidXlsTest.java | 38 +++ .../java/example/RealWorldExamplesTest.java | 26 ++ .../test/java/example/XLSInformationTest.java | 20 ++ .../numbers/AutomaticAndPlainTextTests.java | 52 ++++ .../example/matchers/ContainsRowTest.java | 61 +++++ .../example/matchers/ContainsTextTest.java | 96 +++++++ xls-validate/src/test/resources/acquiring.xls | Bin 0 -> 14336 bytes xls-validate/src/test/resources/formats.xlsx | Bin 0 -> 4856 bytes xls-validate/src/test/resources/small.xls | Bin 0 -> 6656 bytes xls-validate/src/test/resources/statement.xls | Bin 0 -> 9216 bytes .../src/test/resources/statement.xlsx | Bin 0 -> 9700 bytes xls-validate/xls-test.iml | 36 +++ 22 files changed, 957 insertions(+) create mode 100644 xls-validate/README.md create mode 100644 xls-validate/pom.xml create mode 100644 xls-validate/src/main/java/example/IO.java create mode 100644 xls-validate/src/main/java/example/XLS.java create mode 100644 xls-validate/src/main/java/example/matchers/ContainsRow.java create mode 100644 xls-validate/src/main/java/example/matchers/ContainsText.java create mode 100644 xls-validate/src/main/java/example/matchers/DoesNotContainText.java create mode 100644 xls-validate/src/main/java/example/matchers/XLSMatcher.java create mode 100644 xls-validate/src/test/java/example/CreateXLSXTest.java create mode 100644 xls-validate/src/test/java/example/CreateXlsTest.java create mode 100644 xls-validate/src/test/java/example/InvalidXlsTest.java create mode 100644 xls-validate/src/test/java/example/RealWorldExamplesTest.java create mode 100644 xls-validate/src/test/java/example/XLSInformationTest.java create mode 100644 xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java create mode 100644 xls-validate/src/test/java/example/matchers/ContainsRowTest.java create mode 100644 xls-validate/src/test/java/example/matchers/ContainsTextTest.java create mode 100644 xls-validate/src/test/resources/acquiring.xls create mode 100644 xls-validate/src/test/resources/formats.xlsx create mode 100644 xls-validate/src/test/resources/small.xls create mode 100644 xls-validate/src/test/resources/statement.xls create mode 100644 xls-validate/src/test/resources/statement.xlsx create mode 100644 xls-validate/xls-test.iml diff --git a/xls-validate/README.md b/xls-validate/README.md new file mode 100644 index 000000000..5d9c91e69 --- /dev/null +++ b/xls-validate/README.md @@ -0,0 +1,6 @@ +### Info + + fork of https://github.com/codeborne/xls-test/tree/main, preparing to add PR + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/xls-validate/pom.xml b/xls-validate/pom.xml new file mode 100644 index 000000000..89b67a014 --- /dev/null +++ b/xls-validate/pom.xml @@ -0,0 +1,249 @@ + + + 4.0.0 + example + xls-validate + jar + 0.1-SNAPSHOT + xls-validate + http://maven.apache.org + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + UTF-8 + 1.3 + 2.7 + 3.5 + 1.3 + 4.13.1 + 1.23.0 + 1.23.0 + v4-rev493-1.23.0 + 1.8 + 1.3 + 20080701 + 2.0.6 + 1.0.6 + + 2.1.1 + + + 2.4.0 + 3.6.1 + 1.8 + + 4.1.2 + ${poi.version} + 3.13.0 + + ${selenium.version} + ${selenium.version} + 1.32 + 5.3.2 + EntryPoint + + + + org.jxls + jxls-reader + ${jxls-reader.version} + + + + net.sf.jxls + jxls-core + 1.0.5 + + + + + org.apache.commons + commons-jexl + ${commons-jexl.version} + + + + junit + junit + ${junit.version} + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + io.github.bonigarcia + webdrivermanager + ${webdrivermanager.version} + test + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + org.jopendocument + jOpenDocument + ${jOpenDocument.version} + + + org.apache.poi + poi-ooxml + ${poiooxml.version} + + + org.apache.poi + poi-ooxml-schemas + ${poiooxml.version} + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-excelant + ${poi.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + test + + + org.seleniumhq.selenium + selenium-server + ${selenium.version} + test + + + org.seleniumhq.selenium + selenium-support + ${selenium.version} + test + + + org.seleniumhq.selenium + selenium-firefox-driver + ${selenium-firefox-driver.version} + test + + + org.seleniumhq.selenium + selenium-chrome-driver + ${selenium-chrome-driver.version} + test + + + org.seleniumhq.selenium + selenium-remote-driver + ${selenium.version} + test + + + org.json + json + ${json.version} + + + com.jayway.jsonpath + json-path + ${json-path.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + + + com.google.api-client + google-api-client + ${google-api-client.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${google-oauth-client-jetty.version} + + + com.google.apis + google-api-services-sheets + ${google-api-services-sheets.version} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18 + + + + + + diff --git a/xls-validate/src/main/java/example/IO.java b/xls-validate/src/main/java/example/IO.java new file mode 100644 index 000000000..d3707364d --- /dev/null +++ b/xls-validate/src/main/java/example/IO.java @@ -0,0 +1,37 @@ +package example; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +class IO { + static byte[] readBytes(URL url) throws IOException { + try (InputStream inputStream = url.openStream()) { + return readBytes(inputStream); + } + } + + static byte[] readBytes(InputStream inputStream) throws IOException { + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[2048]; + + int nRead; + while ((nRead = inputStream.read(buffer, 0, buffer.length)) != -1) { + result.write(buffer, 0, nRead); + } + + return result.toByteArray(); + } + + static byte[] readFile(File xlsFile) { + try { + return Files.readAllBytes(Paths.get(xlsFile.getAbsolutePath())); + } catch (IOException e) { + throw new IllegalArgumentException("Failed to read file " + xlsFile, e); + } + } +} diff --git a/xls-validate/src/main/java/example/XLS.java b/xls-validate/src/main/java/example/XLS.java new file mode 100644 index 000000000..225e65ec9 --- /dev/null +++ b/xls-validate/src/main/java/example/XLS.java @@ -0,0 +1,65 @@ +package example; + +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.hamcrest.Matcher; + +import example.matchers.ContainsRow; +import example.matchers.ContainsText; +import example.matchers.DoesNotContainText; + +import static example.IO.readBytes; +import static example.IO.readFile; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; + +public class XLS { + public final String name; + public final Workbook excel; + + private XLS(String name, byte[] content) { + this.name = name; + try (InputStream inputStream = new ByteArrayInputStream(content)) { + excel = WorkbookFactory.create(inputStream); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid XLS " + name, e); + } + } + + public XLS(File xlsFile) { + this(xlsFile.getAbsolutePath(), readFile(xlsFile)); + } + + public XLS(URL url) throws IOException { + this(url.toString(), readBytes(url)); + } + + public XLS(URI uri) throws IOException { + this(uri.toURL()); + } + + public XLS(byte[] content) { + this("", content); + } + + public XLS(InputStream inputStream) throws IOException { + this(readBytes(inputStream)); + } + + public static Matcher containsText(String text) { + return new ContainsText(text); + } + + public static Matcher containsRow(String... cellTexts) { + return new ContainsRow(cellTexts); + } + + public static Matcher doesNotContainText(String text) { + return new DoesNotContainText(text); + } +} diff --git a/xls-validate/src/main/java/example/matchers/ContainsRow.java b/xls-validate/src/main/java/example/matchers/ContainsRow.java new file mode 100644 index 000000000..02ac74f3f --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/ContainsRow.java @@ -0,0 +1,47 @@ +package example.matchers; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.hamcrest.Description; + +import example.XLS; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; + +import static java.util.Arrays.asList; + +public class ContainsRow extends XLSMatcher { + private final String[] cellTexts; + + public ContainsRow(String... cellTexts) { + this.cellTexts = cellTexts; + } + + @Override + protected boolean matchesSafely(XLS item) { + for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { + Sheet sheet = item.excel.getSheetAt(i); + for (Row row : sheet) { + Queue expectedTexts = new LinkedList<>(asList(cellTexts)); + for (Cell cell : row) { + String expectedText = expectedTexts.peek(); + if (getFormattedCellValue(cell).contains(expectedText)) { + expectedTexts.remove(); + } + if (expectedTexts.isEmpty()) + return true; + } + } + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("a XLS containing row ") + .appendValue(Arrays.toString(cellTexts)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/ContainsText.java b/xls-validate/src/main/java/example/matchers/ContainsText.java new file mode 100644 index 000000000..54cfe51b7 --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/ContainsText.java @@ -0,0 +1,37 @@ +package example.matchers; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.hamcrest.Description; + +import example.XLS; + +public class ContainsText extends XLSMatcher { + private final String substring; + + public ContainsText(String substring) { + this.substring = reduceSpaces(substring); + } + + @Override + protected boolean matchesSafely(XLS item) { + for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { + Sheet sheet = item.excel.getSheetAt(i); + for (Row row : sheet) { + for (Cell cell : row) { + String cellValue = reduceSpaces(getFormattedCellValue(cell)); + if (cellValue.contains(substring)) + return true; + } + } + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("a XLS containing text ") + .appendValue(reduceSpaces(substring)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/DoesNotContainText.java b/xls-validate/src/main/java/example/matchers/DoesNotContainText.java new file mode 100644 index 000000000..bd865080c --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/DoesNotContainText.java @@ -0,0 +1,26 @@ +package example.matchers; + +import org.hamcrest.Description; + +import example.XLS; + +public class DoesNotContainText extends XLSMatcher { + + private final String substring; + + public DoesNotContainText(String substring) { + this.substring = reduceSpaces(substring); + } + + @Override + protected boolean matchesSafely(XLS item) { + boolean contains = new ContainsText(substring).matchesSafely(item); + return !contains; + } + + @Override + public void describeTo(Description description) { + description.appendText("a XLS not containing text ") + .appendValue(reduceSpaces(substring)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/XLSMatcher.java b/xls-validate/src/main/java/example/matchers/XLSMatcher.java new file mode 100644 index 000000000..acc090ce4 --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/XLSMatcher.java @@ -0,0 +1,64 @@ +package example.matchers; + +import org.apache.poi.ss.usermodel.BuiltinFormats; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.hamcrest.Description; +import org.hamcrest.SelfDescribing; +import org.hamcrest.TypeSafeMatcher; + +import example.XLS; + +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.List; + +abstract class XLSMatcher extends TypeSafeMatcher + implements SelfDescribing { + private List legalNumericFormats = Arrays.asList( + BuiltinFormats.getBuiltinFormat(1), BuiltinFormats.getBuiltinFormat(2), + BuiltinFormats.getBuiltinFormat(3), BuiltinFormats.getBuiltinFormat(4), + BuiltinFormats.getBuiltinFormat(9), BuiltinFormats.getBuiltinFormat(10)); + + protected String reduceSpaces(String text) { + return text.replaceAll("[\\s\\n\\r\u00a0]+", " ").trim(); + } + + protected String getFormattedCellValue(Cell cell) { + switch (cell.getCellType()) { + case NUMERIC: + DecimalFormat formatter; + if (legalNumericFormats + .contains(cell.getCellStyle().getDataFormatString())) { + formatter = new DecimalFormat( + cell.getCellStyle().getDataFormatString()); + } else { + formatter = new DecimalFormat(); + } + return formatter.format(cell.getNumericCellValue()); + case STRING: + case BLANK: + default: + return cell.toString(); + } + } + + @Override + protected void describeMismatchSafely(XLS item, + Description mismatchDescription) { + mismatchDescription.appendText("was \"").appendText(item.name) + .appendText("\"\n"); + + for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { + Sheet sheet = item.excel.getSheetAt(i); + for (Row row : sheet) { + for (Cell cell : row) { + mismatchDescription.appendText(getFormattedCellValue(cell)) + .appendText("\t"); + } + mismatchDescription.appendText("\n"); + } + } + } +} diff --git a/xls-validate/src/test/java/example/CreateXLSXTest.java b/xls-validate/src/test/java/example/CreateXLSXTest.java new file mode 100644 index 000000000..a75132986 --- /dev/null +++ b/xls-validate/src/test/java/example/CreateXLSXTest.java @@ -0,0 +1,47 @@ +package example; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class CreateXLSXTest { + @Test + public void fromFile() throws Exception { + File file = new File(getClass().getClassLoader().getResource("statement.xlsx").toURI()); + assertThat(new XLS(file), containsText("Выписка")); + } + + @Test + public void fromUrl() throws Exception { + URL url = getClass().getClassLoader().getResource("statement.xlsx"); + assertThat(new XLS(url), containsText("Выписка")); + } + + @Test + public void fromUri() throws Exception { + URI uri = getClass().getClassLoader().getResource("statement.xlsx").toURI(); + assertThat(new XLS(uri), containsText("Выписка")); + } + + @Test + public void fromInputStream() throws Exception { + InputStream inputStream = getClass().getClassLoader().getResourceAsStream("statement.xlsx"); + assertThat(new XLS(inputStream), containsText("Выписка")); + } + + @Test + public void fromBytes() throws Exception { + byte[] bytes = Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("statement.xlsx").toURI())); + assertThat(new XLS(bytes), containsText("Выписка")); + } +} diff --git a/xls-validate/src/test/java/example/CreateXlsTest.java b/xls-validate/src/test/java/example/CreateXlsTest.java new file mode 100644 index 000000000..1ce929092 --- /dev/null +++ b/xls-validate/src/test/java/example/CreateXlsTest.java @@ -0,0 +1,50 @@ +package example; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class CreateXlsTest { + @Test + public void fromFile() throws Exception { + File file = new File( + getClass().getClassLoader().getResource("statement.xls").toURI()); + assertThat(new XLS(file), containsText("Выписка")); + } + + @Test + public void fromUrl() throws Exception { + URL url = getClass().getClassLoader().getResource("statement.xls"); + assertThat(new XLS(url), containsText("Выписка")); + } + + @Test + public void fromUri() throws Exception { + URI uri = getClass().getClassLoader().getResource("statement.xls").toURI(); + assertThat(new XLS(uri), containsText("Выписка")); + } + + @Test + public void fromInputStream() throws Exception { + InputStream inputStream = getClass().getClassLoader() + .getResourceAsStream("statement.xls"); + assertThat(new XLS(inputStream), containsText("Выписка")); + } + + @Test + public void fromBytes() throws Exception { + byte[] bytes = Files.readAllBytes(Paths + .get(getClass().getClassLoader().getResource("statement.xls").toURI())); + assertThat(new XLS(bytes), containsText("Выписка")); + } +} diff --git a/xls-validate/src/test/java/example/InvalidXlsTest.java b/xls-validate/src/test/java/example/InvalidXlsTest.java new file mode 100644 index 000000000..383c174b7 --- /dev/null +++ b/xls-validate/src/test/java/example/InvalidXlsTest.java @@ -0,0 +1,38 @@ +package example; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; + +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +public class InvalidXlsTest { + @Test + public void throws_IllegalArgumentException_ifFailedToParseXlsFromBytes() { + try { + new XLS("This is not Excel file".getBytes()); + fail("expected IllegalArgumentException"); + } + catch (IllegalArgumentException expected) { + assertThat(expected.getMessage(), is("Invalid XLS ")); + assertThat(expected.getCause(), is(notNullValue())); + } + } + + @Test + public void throws_IllegalArgumentException_ifFailedToReadXlsFile() { + try { + new XLS(new File("missing-file.xls")); + fail("expected IllegalArgumentException"); + } + catch (IllegalArgumentException expected) { + assertThat(expected.getMessage(), is("Failed to read file missing-file.xls")); + assertThat(expected.getCause(), is(notNullValue())); + } + } +} diff --git a/xls-validate/src/test/java/example/RealWorldExamplesTest.java b/xls-validate/src/test/java/example/RealWorldExamplesTest.java new file mode 100644 index 000000000..0bf89b002 --- /dev/null +++ b/xls-validate/src/test/java/example/RealWorldExamplesTest.java @@ -0,0 +1,26 @@ +package example; + +import org.junit.Test; + +import example.XLS; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class RealWorldExamplesTest { + @Test + public void bankStatement() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("statement.xls")); + assertThat(xls, containsText("Выписка")); + assertThat(xls, containsText("Период")); + assertThat(xls, containsText("18.06.2015 - 18.06.2015")); + } + + @Test + public void acquiringReport() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, containsText("Отчёт об операциях по пластиковым картам - 27.06.2015")); + assertThat(xls, containsText("с 27.05.2015 по 27.06.2015")); + assertThat(xls, containsText("ООО \"Джапан Мотор Сервис\", ИНН 7830002292, Номер договора 08-1-1-04-2437")); + } +} diff --git a/xls-validate/src/test/java/example/XLSInformationTest.java b/xls-validate/src/test/java/example/XLSInformationTest.java new file mode 100644 index 000000000..e5a970b0a --- /dev/null +++ b/xls-validate/src/test/java/example/XLSInformationTest.java @@ -0,0 +1,20 @@ +package example; + +import org.junit.Test; + +import example.XLS; + +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +public class XLSInformationTest { + @Test + public void canGetInformationFromXls() throws Exception { + XLS XLS = new XLS(getClass().getClassLoader().getResource("statement.xls")); + assertThat(XLS.name, endsWith("statement.xls")); + assertThat(XLS.excel.getNumberOfSheets(), equalTo(3)); + assertThat(XLS.excel.getActiveSheetIndex(), equalTo(0)); + assertThat(XLS.excel.getSheetName(0), equalTo("Sheet1")); + } +} diff --git a/xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java b/xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java new file mode 100644 index 000000000..e85ac1bfa --- /dev/null +++ b/xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java @@ -0,0 +1,52 @@ +package example.formats.numbers; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class AutomaticAndPlainTextTests { + @Test + public void automaticStyle_valueInCell1_displayedValue1_parsedAs1() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("1")); + } + + @Test + public void automaticStyle_valueInCell1comma2_displayedValue1comma2_parsedAs1point2() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("1.2")); + } + + @Test + public void plainText_valueInCell2_displayedValue2_parsedAs2() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("2")); + } + + @Test + public void plainText_valueInCell2point1_displayedValue2point1_parsedAs2point1() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("2.1")); + } + + @Test + public void plainText_valueInCell2comma2_displayedValue2comma2_parsedAs2comma2() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("2,2")); + } +} diff --git a/xls-validate/src/test/java/example/matchers/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/ContainsRowTest.java new file mode 100644 index 000000000..73652b0b5 --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/ContainsRowTest.java @@ -0,0 +1,61 @@ +package example.matchers; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; + +import static example.XLS.containsRow; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +public class ContainsRowTest { + @Test + public void rowContainsCells_all() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, + containsRow("PP028000", + "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", + "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", + "415039******2364", "476956", "281814930")); + } + + @Test + public void rowContainsCells_withGaps() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, containsRow("PP028000")); + assertThat(xls, containsRow("PP028000", "281814930")); + assertThat(xls, containsRow("281814930")); + assertThat(xls, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, not(containsRow("foobar"))); + assertThat(xls, not(containsRow("foobar", "PP028000", "281814930"))); + assertThat(xls, not(containsRow("PP028000", "281814930", "foobar"))); + assertThat(xls, not(containsRow("PP028000", "foobar", "281814930"))); + } + + @Ignore + @Test + public void errorDescription() throws IOException { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsRow("wrong data")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing row \"[wrong data]\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/ContainsTextTest.java new file mode 100644 index 000000000..2076304da --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/ContainsTextTest.java @@ -0,0 +1,96 @@ +package example.matchers; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; + +import static example.XLS.containsText; +import static example.XLS.doesNotContainText; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.fail; + +public class ContainsTextTest { + @Test + public void canAssertThatXlsContainsText() throws IOException { + XLS XLS = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(XLS, containsText("Выписка")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("25.06.2015 23:09:32")); + + assertThat(XLS, containsText("Счёт")); + assertThat(XLS, containsText("40820810590480000591")); + assertThat(XLS, containsText("Период")); + assertThat(XLS, containsText("18.06.2015 - 18.06.2015")); + assertThat(XLS, containsText("Входящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Дата")); + assertThat(XLS, containsText("Счёт\nплательщика/получателя")); + assertThat(XLS, containsText("Плательщик / Получатель")); + assertThat(XLS, containsText("Операция")); + assertThat(XLS, containsText("Сумма (RUB)")); + + assertThat(XLS, containsText("18.06.2015")); + assertThat(XLS, containsText("40820810590550000146")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("сюда. Интернет-банк")); + assertThat(XLS, containsText("-1.00")); + + assertThat(XLS, containsText("туда. Интернет-банк")); + assertThat(XLS, containsText("1.00")); + + assertThat(XLS, containsText("Исходящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Поступление")); + assertThat(XLS, containsText("Списание")); + assertThat(XLS, containsText("Зарезервировано")); + assertThat(XLS, containsText("349,928.00")); + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + XLS xls = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(xls, doesNotContainText("null")); + } + + @Ignore + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, doesNotContainText("Выписка")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS not containing text \"Выписка\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } + + @Ignore + @Test + public void errorDescriptionForContainsTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsText("wrong text")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing text \"wrong text\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} diff --git a/xls-validate/src/test/resources/acquiring.xls b/xls-validate/src/test/resources/acquiring.xls new file mode 100644 index 0000000000000000000000000000000000000000..5baee2df5a36457b5e95f80af1e557c376e02de6 GIT binary patch literal 14336 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 literal 0 HcmV?d00001 diff --git a/xls-validate/src/test/resources/statement.xls b/xls-validate/src/test/resources/statement.xls new file mode 100644 index 0000000000000000000000000000000000000000..516d918e7bcdb25552753bab5577dbf929e6bc1f GIT binary patch literal 9216 zcmeHMU2I&%6+U-&cD?>d>^L!Y9B^(NFb=VuyX$ONC$YV@V@O02yG{_Qij+FeCYU%e za!f-X3QH(&AQh!jc|a;u0SQ$qK}htWsC6EYcmRPaApuXJZ>T&h6{tle*?!-dUGI-~ z9UCm9q@Js}Gjrz5`JZ#=-uuyq>#n}?X7lG#RQ8BpuBR&{m)!ud zd~(@b!CmAZs1M6y%nd{1QxoowRR&dtafdR@;UUxO1o5o#;i>cz?rY@@oq0#^y;2V> zl(@Jt?Kp_aIPgTC*L$np*W&KTpLNY=3JFWIya%lGQ@`PZ3=0Cz0QSJ7jLVc1%>rR1 zXXD_Qe(D_xS%Pm$r7AaTWiB<_Vrt|Pv-kbOhlj@o4z`#z@+vd=){d=Py)MsdF}3m< zQ~JJrI}RP%@l%wmvH{#K$v0^iZMMw0gwrev|9WX~s#6NT9Gp~3;orLOOR%X+^)e-E z=k3-Gbi9@A9Vk8e=nTSb}*;T4O*U3+NAqrDP8$GN^5R(rCLrS)uKQWFY->WE@AHMb>&(tsImik0cVaVM3BT zOd;zkBtpnB9;>pD?&pws9b8wO5UR-0=NNpW4m{O5(7>88IkG68(vU1b{d%-$uY2P%Ff#HxHP8 z6Eg#5xABlm8!k?!4I&+hIBl-OeKH$O3h z2DxUZ7mIkYuovy|cE&uEXipgFeY1(0I7s)Iod(>)v3W9`Zf>xdG7Kxyh&cfC9^*e={BfCz<>ApSARcre6;_V!jpV3X3AaM)RLB` zF>}S-qbs)S{et3dkUM3INZU|b>(R+GiF5AZ#CdmY`po#*j}Z-X%1TE6JNJFnl4{xhAQTGk7+S6~gGCfb1{8gA{;0ND}jF z`TiOxqQ}E+F^tYHhE+n6VpvrPSak^)<5Y_HBAYINSz8tAX6;xAvlc9btt&y#o_-7Q zkcJERUSn24vHQmH(MAqN7H;G=j6_HDP$Oc&j@ULqS72ieH&c^hFMM;7{z0xE!TmK($f7Gdzh+%;;(sKZK-2q_hdKo*g+D@k@lA^I=47?8uK1 zzfRbZ!GVH);D~(h;PWgqaxkLp?VL|q=5-E2mKOcCMOlK7WwX8|5tEUVqk<=39+e8{ zm!ndlROmHQsZc6b_Zrp36<$8&9|Ga*lRu zo|lv{*{FMvbJaTcho3dbmomyknA(q3NP;QaRW}hFQY-$HhcSGq=LqD4l#M$8^NLTZ zbRCGQclvzw@^+B#WAQw!J4mmFIABnN%a~I*NSq?aOhE|oZIz?{`_xS<@uhYNse3`H z&Dv86-0SAM7gk@kd$ER_Pu;65;yFeLe9*IFjURMZ-CO?2yz=h#^4*Ixw`})f%}TmA zFE&=YH>Cx*kF($PnYI}neAW=gtj%_{+`1NU;9;J+s9{}5kI^y*zoXo@3AaO&6EoB2 zrcchg!%s{krre%;JCBYZPfSfEG)x93PoA9rGNP-Nc|-hJrpsKHMZb=d1RtTrg>ilL z+28-`+mT1={`f*jw%`5Mr#$CeMrB-cem^Q>eiW6khf#UToJHl?B#FwC<#VV!Q@)7G z)8r*oa{S_&;Phu{Jn@*TeV(1{hY&aWVMO74Z0-t+#L>!&FQ4W)T>BiO#8H#S-hc1q zo(~-M| zeqZL7kt0Lkd`7Xx%gBS_*>5QzBsm> zrT+M=s3jmr{|~ct+!Fu* literal 0 HcmV?d00001 diff --git a/xls-validate/src/test/resources/statement.xlsx b/xls-validate/src/test/resources/statement.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cf9a04c6fd6b898fd12f3a2897972b184a1cdad9 GIT binary patch literal 9700 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 rLim6B^He50ChVs*M!gAMgGPLT~DE literal 0 HcmV?d00001 diff --git a/xls-validate/xls-test.iml b/xls-validate/xls-test.iml new file mode 100644 index 000000000..a03111a3a --- /dev/null +++ b/xls-validate/xls-test.iml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ab007973c3b72e2900eb00177a56a17d8b772118 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 21 Jul 2023 02:27:30 +0200 Subject: [PATCH 020/171] intermediate revision - added ODS, NOTE: the tests are failing --- xls-validate/pom.xml | 504 +++++++++--------- xls-validate/src/main/java/example/IO.java | 74 +-- xls-validate/src/main/java/example/ODS.java | 96 ++++ xls-validate/src/main/java/example/XLS.java | 130 ++--- .../example/matchers/ODS/ContainsRow.java | 59 ++ .../example/matchers/ODS/ContainsText.java | 49 ++ .../matchers/ODS/DoesNotContainText.java | 26 + .../java/example/matchers/ODS/ODSMatcher.java | 42 ++ .../example/matchers/XLS/ContainsRow.java | 47 ++ .../example/matchers/XLS/ContainsText.java | 37 ++ .../matchers/XLS/DoesNotContainText.java | 26 + .../java/example/matchers/XLS/XLSMatcher.java | 64 +++ .../src/test/java/example/CreateOdsTest.java | 50 ++ .../src/test/java/example/CreateXLSXTest.java | 94 ++-- .../src/test/java/example/CreateXlsTest.java | 100 ++-- .../src/test/java/example/InvalidXlsTest.java | 76 +-- .../java/example/RealWorldExamplesTest.java | 52 +- .../test/java/example/XLSInformationTest.java | 40 +- .../numbers/AutomaticAndPlainTextTests.java | 104 ++-- .../example/matchers/ContainsRowTest.java | 122 ++--- .../example/matchers/ContainsTextTest.java | 192 +++---- xls-validate/src/test/resources/statement.ods | Bin 0 -> 15176 bytes xls-validate/xls-test.iml | 70 +-- 23 files changed, 1278 insertions(+), 776 deletions(-) create mode 100644 xls-validate/src/main/java/example/ODS.java create mode 100644 xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java create mode 100644 xls-validate/src/main/java/example/matchers/ODS/ContainsText.java create mode 100644 xls-validate/src/main/java/example/matchers/ODS/DoesNotContainText.java create mode 100644 xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java create mode 100644 xls-validate/src/main/java/example/matchers/XLS/ContainsRow.java create mode 100644 xls-validate/src/main/java/example/matchers/XLS/ContainsText.java create mode 100644 xls-validate/src/main/java/example/matchers/XLS/DoesNotContainText.java create mode 100644 xls-validate/src/main/java/example/matchers/XLS/XLSMatcher.java create mode 100644 xls-validate/src/test/java/example/CreateOdsTest.java create mode 100644 xls-validate/src/test/resources/statement.ods diff --git a/xls-validate/pom.xml b/xls-validate/pom.xml index 89b67a014..2bd2d61a7 100644 --- a/xls-validate/pom.xml +++ b/xls-validate/pom.xml @@ -1,249 +1,255 @@ - - - 4.0.0 - example - xls-validate - jar - 0.1-SNAPSHOT - xls-validate - http://maven.apache.org - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - 1.3 - 2.7 - 3.5 - 1.3 - 4.13.1 - 1.23.0 - 1.23.0 - v4-rev493-1.23.0 - 1.8 - 1.3 - 20080701 - 2.0.6 - 1.0.6 - - 2.1.1 - - - 2.4.0 - 3.6.1 - 1.8 - - 4.1.2 - ${poi.version} - 3.13.0 - - ${selenium.version} - ${selenium.version} - 1.32 - 5.3.2 - EntryPoint - - - - org.jxls - jxls-reader - ${jxls-reader.version} - - - - net.sf.jxls - jxls-core - 1.0.5 - - - - - org.apache.commons - commons-jexl - ${commons-jexl.version} - - - - junit - junit - ${junit.version} - - - org.yaml - snakeyaml - ${snakeyaml.version} - - - io.github.bonigarcia - webdrivermanager - ${webdrivermanager.version} - test - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - org.jopendocument - jOpenDocument - ${jOpenDocument.version} - - - org.apache.poi - poi-ooxml - ${poiooxml.version} - - - org.apache.poi - poi-ooxml-schemas - ${poiooxml.version} - - - org.apache.poi - poi - ${poi.version} - - - org.apache.poi - poi-excelant - ${poi.version} - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - test - - - org.seleniumhq.selenium - selenium-server - ${selenium.version} - test - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - test - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - test - - - org.seleniumhq.selenium - selenium-chrome-driver - ${selenium-chrome-driver.version} - test - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - test - - - org.json - json - ${json.version} - - - com.jayway.jsonpath - json-path - ${json-path.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - - - com.google.api-client - google-api-client - ${google-api-client.version} - - - com.google.oauth-client - google-oauth-client-jetty - ${google-oauth-client-jetty.version} - - - com.google.apis - google-api-services-sheets - ${google-api-services-sheets.version} - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - utf-8 - -Xlint:all - true - true - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18 - - - - - - + + + 4.0.0 + example + xls-validate + jar + 0.1-SNAPSHOT + xls-validate + http://maven.apache.org + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + UTF-8 + 1.3 + 2.7 + 3.5 + 1.3 + 4.13.1 + 1.23.0 + 1.23.0 + v4-rev493-1.23.0 + 1.8 + 1.3 + 20080701 + 2.0.6 + 1.0.6 + + 2.1.1 + + + 2.4.0 + 3.6.1 + 1.8 + + 1.3 + 4.1.2 + ${poi.version} + 3.13.0 + + ${selenium.version} + ${selenium.version} + 1.32 + 5.3.2 + EntryPoint + + + + org.jxls + jxls-reader + ${jxls-reader.version} + + + + net.sf.jxls + jxls-core + 1.0.5 + + + + + org.apache.commons + commons-jexl + ${commons-jexl.version} + + + org.jopendocument + jOpenDocument + ${jOpenDocument.version} + + + + junit + junit + ${junit.version} + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + io.github.bonigarcia + webdrivermanager + ${webdrivermanager.version} + test + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + org.jopendocument + jOpenDocument + ${jOpenDocument.version} + + + org.apache.poi + poi-ooxml + ${poiooxml.version} + + + org.apache.poi + poi-ooxml-schemas + ${poiooxml.version} + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-excelant + ${poi.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + test + + + org.seleniumhq.selenium + selenium-server + ${selenium.version} + test + + + org.seleniumhq.selenium + selenium-support + ${selenium.version} + test + + + org.seleniumhq.selenium + selenium-firefox-driver + ${selenium-firefox-driver.version} + test + + + org.seleniumhq.selenium + selenium-chrome-driver + ${selenium-chrome-driver.version} + test + + + org.seleniumhq.selenium + selenium-remote-driver + ${selenium.version} + test + + + org.json + json + ${json.version} + + + com.jayway.jsonpath + json-path + ${json-path.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + + + com.google.api-client + google-api-client + ${google-api-client.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${google-oauth-client-jetty.version} + + + com.google.apis + google-api-services-sheets + ${google-api-services-sheets.version} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18 + + + + + + diff --git a/xls-validate/src/main/java/example/IO.java b/xls-validate/src/main/java/example/IO.java index d3707364d..31bd297c8 100644 --- a/xls-validate/src/main/java/example/IO.java +++ b/xls-validate/src/main/java/example/IO.java @@ -1,37 +1,37 @@ -package example; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Paths; - -class IO { - static byte[] readBytes(URL url) throws IOException { - try (InputStream inputStream = url.openStream()) { - return readBytes(inputStream); - } - } - - static byte[] readBytes(InputStream inputStream) throws IOException { - ByteArrayOutputStream result = new ByteArrayOutputStream(); - byte[] buffer = new byte[2048]; - - int nRead; - while ((nRead = inputStream.read(buffer, 0, buffer.length)) != -1) { - result.write(buffer, 0, nRead); - } - - return result.toByteArray(); - } - - static byte[] readFile(File xlsFile) { - try { - return Files.readAllBytes(Paths.get(xlsFile.getAbsolutePath())); - } catch (IOException e) { - throw new IllegalArgumentException("Failed to read file " + xlsFile, e); - } - } -} +package example; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +class IO { + static byte[] readBytes(URL url) throws IOException { + try (InputStream inputStream = url.openStream()) { + return readBytes(inputStream); + } + } + + static byte[] readBytes(InputStream inputStream) throws IOException { + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[2048]; + + int nRead; + while ((nRead = inputStream.read(buffer, 0, buffer.length)) != -1) { + result.write(buffer, 0, nRead); + } + + return result.toByteArray(); + } + + static byte[] readFile(File xlsFile) { + try { + return Files.readAllBytes(Paths.get(xlsFile.getAbsolutePath())); + } catch (IOException e) { + throw new IllegalArgumentException("Failed to read file " + xlsFile, e); + } + } +} diff --git a/xls-validate/src/main/java/example/ODS.java b/xls-validate/src/main/java/example/ODS.java new file mode 100644 index 000000000..6f130d2b1 --- /dev/null +++ b/xls-validate/src/main/java/example/ODS.java @@ -0,0 +1,96 @@ +package example; + +import static example.IO.readBytes; +import static example.IO.readFile; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; + +import org.hamcrest.Matcher; +import org.jopendocument.dom.ODDocument; +import org.jopendocument.dom.ODPackage; +import org.jopendocument.dom.ODValueType; +import org.jopendocument.dom.spreadsheet.SpreadSheet; + +import example.matchers.ODS.ContainsRow; +import example.matchers.ODS.ContainsText; +import example.matchers.ODS.DoesNotContainText; + +public class ODS { + public final String name; + public final SpreadSheet ods; + + private ODS(String name, byte[] content) { + this.name = name; + try (InputStream inputStream = new ByteArrayInputStream(content)) { + ods = SpreadSheet.get(new ODPackage(inputStream)); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid ODS " + name, e); + } + } + + public ODS(File file) { + this(file.getAbsolutePath(), readFile(file)); + } + + public ODS(URL url) throws IOException { + this(url.toString(), readBytes(url)); + } + + public ODS(URI uri) throws IOException { + this(uri.toURL()); + } + + public ODS(byte[] content) { + this("", content); + } + + public ODS(InputStream inputStream) throws IOException { + this(readBytes(inputStream)); + } + + public static Matcher containsText(String text) { + return new ContainsText(text); + } + + public static Matcher containsRow(String... cellTexts) { + return new ContainsRow(cellTexts); + } + + public static Matcher doesNotContainText(String text) { + return new DoesNotContainText(text); + } + + // https://www.jopendocument.org/docs/org/jopendocument/dom/ODValueType.html + public Object safeOOCellValue( + org.jopendocument.dom.spreadsheet.Cell cell) { + if (cell == null) { + return null; + } + Object result; + ODValueType type = cell.getValueType(); + switch (type) { + case FLOAT: + result = Double.valueOf(cell.getValue().toString()); + break; + case STRING: + result = cell.getTextValue(); + break; + case TIME: + result = null; // TODO + break; + case BOOLEAN: + result = Boolean.getBoolean(cell.getValue().toString()); + break; + default: + throw new IllegalStateException("Can't evaluate cell value"); + } + // return (result == null) ? null : result.toString(); + return result; + } + +} diff --git a/xls-validate/src/main/java/example/XLS.java b/xls-validate/src/main/java/example/XLS.java index 225e65ec9..d2175fb42 100644 --- a/xls-validate/src/main/java/example/XLS.java +++ b/xls-validate/src/main/java/example/XLS.java @@ -1,65 +1,65 @@ -package example; - -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.ss.usermodel.WorkbookFactory; -import org.hamcrest.Matcher; - -import example.matchers.ContainsRow; -import example.matchers.ContainsText; -import example.matchers.DoesNotContainText; - -import static example.IO.readBytes; -import static example.IO.readFile; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URL; - -public class XLS { - public final String name; - public final Workbook excel; - - private XLS(String name, byte[] content) { - this.name = name; - try (InputStream inputStream = new ByteArrayInputStream(content)) { - excel = WorkbookFactory.create(inputStream); - } catch (Exception e) { - throw new IllegalArgumentException("Invalid XLS " + name, e); - } - } - - public XLS(File xlsFile) { - this(xlsFile.getAbsolutePath(), readFile(xlsFile)); - } - - public XLS(URL url) throws IOException { - this(url.toString(), readBytes(url)); - } - - public XLS(URI uri) throws IOException { - this(uri.toURL()); - } - - public XLS(byte[] content) { - this("", content); - } - - public XLS(InputStream inputStream) throws IOException { - this(readBytes(inputStream)); - } - - public static Matcher containsText(String text) { - return new ContainsText(text); - } - - public static Matcher containsRow(String... cellTexts) { - return new ContainsRow(cellTexts); - } - - public static Matcher doesNotContainText(String text) { - return new DoesNotContainText(text); - } -} +package example; + +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.hamcrest.Matcher; + +import example.matchers.XLS.ContainsRow; +import example.matchers.XLS.ContainsText; +import example.matchers.XLS.DoesNotContainText; + +import static example.IO.readBytes; +import static example.IO.readFile; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; + +public class XLS { + public final String name; + public final Workbook excel; + + private XLS(String name, byte[] content) { + this.name = name; + try (InputStream inputStream = new ByteArrayInputStream(content)) { + excel = WorkbookFactory.create(inputStream); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid XLS " + name, e); + } + } + + public XLS(File xlsFile) { + this(xlsFile.getAbsolutePath(), readFile(xlsFile)); + } + + public XLS(URL url) throws IOException { + this(url.toString(), readBytes(url)); + } + + public XLS(URI uri) throws IOException { + this(uri.toURL()); + } + + public XLS(byte[] content) { + this("", content); + } + + public XLS(InputStream inputStream) throws IOException { + this(readBytes(inputStream)); + } + + public static Matcher containsText(String text) { + return new ContainsText(text); + } + + public static Matcher containsRow(String... cellTexts) { + return new ContainsRow(cellTexts); + } + + public static Matcher doesNotContainText(String text) { + return new DoesNotContainText(text); + } +} diff --git a/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java new file mode 100644 index 000000000..d1dbbd726 --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java @@ -0,0 +1,59 @@ +package example.matchers.ODS; + +import static java.util.Arrays.asList; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; + +import org.apache.commons.lang3.StringUtils; +import org.hamcrest.Description; +import org.jopendocument.dom.spreadsheet.Cell; +import org.jopendocument.dom.spreadsheet.Sheet; + +import example.ODS; + +public class ContainsRow extends ODSMatcher { + private final String[] cellTexts; + + public ContainsRow(String... cellTexts) { + this.cellTexts = cellTexts; + } + + @Override + protected boolean matchesSafely(ODS item) { + + for (int i = 0; i < item.ods.getSheetCount(); i++) { + // Sheet sheet = item.excel.getSheetAt(i); + Sheet sheet = item.ods.getSheet(i); + int columnCount = sheet.getColumnCount(); + int rowCount = sheet.getRowCount(); + @SuppressWarnings("rawtypes") + Cell cell = null; + for (int rowIndex = 1; rowIndex < rowCount && StringUtils.isNotBlank(sheet + .getImmutableCellAt(0, rowIndex).getValue().toString()); rowIndex++) { + Queue expectedTexts = new LinkedList<>(asList(cellTexts)); + for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { + cell = sheet.getImmutableCellAt(columnIndex, rowIndex); + if (StringUtils.isNotBlank(cell.getValue().toString())) { + Object cellValue = item.safeOOCellValue(cell); + String expectedText = expectedTexts.peek(); + if (cellValue.toString().contains(expectedText)) { + expectedTexts.remove(); + } + } + } + if (expectedTexts.isEmpty()) + return true; + } + + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("a ODS containing row ") + .appendValue(Arrays.toString(cellTexts)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java b/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java new file mode 100644 index 000000000..881a36e17 --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java @@ -0,0 +1,49 @@ +package example.matchers.ODS; + +import org.apache.commons.lang3.StringUtils; + +import org.jopendocument.dom.spreadsheet.Cell; +import org.jopendocument.dom.spreadsheet.Sheet; + +import org.hamcrest.Description; + +import example.ODS; + +public class ContainsText extends ODSMatcher { + private final String substring; + + public ContainsText(String substring) { + this.substring = reduceSpaces(substring); + } + + @Override + protected boolean matchesSafely(ODS item) { + + for (int i = 0; i < item.ods.getSheetCount(); i++) { + // Sheet sheet = item.excel.getSheetAt(i); + Sheet sheet = item.ods.getSheet(i); + int columnCount = sheet.getColumnCount(); + int rowCount = sheet.getRowCount(); + @SuppressWarnings("rawtypes") + Cell cell = null; + for (int rowIndex = 1; rowIndex < rowCount && StringUtils.isNotBlank(sheet + .getImmutableCellAt(0, rowIndex).getValue().toString()); rowIndex++) { + for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { + cell = sheet.getImmutableCellAt(columnIndex, rowIndex); + if (StringUtils.isNotBlank(cell.getValue().toString())) { + Object cellValue = item.safeOOCellValue(cell); + if (cellValue.toString().contains(substring)) + return true; + } + } + } + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("a ODS containing text ") + .appendValue(reduceSpaces(substring)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/ODS/DoesNotContainText.java b/xls-validate/src/main/java/example/matchers/ODS/DoesNotContainText.java new file mode 100644 index 000000000..eedb03301 --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/ODS/DoesNotContainText.java @@ -0,0 +1,26 @@ +package example.matchers.ODS; + +import org.hamcrest.Description; + +import example.ODS; + +public class DoesNotContainText extends ODSMatcher { + + private final String substring; + + public DoesNotContainText(String substring) { + this.substring = reduceSpaces(substring); + } + + @Override + protected boolean matchesSafely(ODS item) { + boolean contains = new ContainsText(substring).matchesSafely(item); + return !contains; + } + + @Override + public void describeTo(Description description) { + description.appendText("a ODS not containing text ") + .appendValue(reduceSpaces(substring)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java b/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java new file mode 100644 index 000000000..252f787ab --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java @@ -0,0 +1,42 @@ +package example.matchers.ODS; + +import org.apache.commons.lang3.StringUtils; +import org.hamcrest.Description; +import org.hamcrest.SelfDescribing; +import org.hamcrest.TypeSafeMatcher; +import org.jopendocument.dom.spreadsheet.Cell; +import org.jopendocument.dom.spreadsheet.Sheet; + +import example.ODS; + +abstract class ODSMatcher extends TypeSafeMatcher + implements SelfDescribing { + + protected String reduceSpaces(String text) { + return text.replaceAll("[\\s\\n\\r\u00a0]+", " ").trim(); + } + + @Override + protected void describeMismatchSafely(ODS item, + Description mismatchDescription) { + + for (int i = 0; i < item.ods.getSheetCount(); i++) { + Sheet sheet = item.ods.getSheet(i); + int columnCount = sheet.getColumnCount(); + int rowCount = sheet.getRowCount(); + @SuppressWarnings("rawtypes") + Cell cell = null; + for (int rowIndex = 1; rowIndex < rowCount && StringUtils.isNotBlank(sheet + .getImmutableCellAt(0, rowIndex).getValue().toString()); rowIndex++) { + for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { + cell = sheet.getImmutableCellAt(columnIndex, rowIndex); + if (StringUtils.isNotBlank(cell.getValue().toString())) { + Object cellValue = item.safeOOCellValue(cell); + mismatchDescription.appendText(cellValue.toString()) + .appendText("\t"); + } + } + } + } + } +} diff --git a/xls-validate/src/main/java/example/matchers/XLS/ContainsRow.java b/xls-validate/src/main/java/example/matchers/XLS/ContainsRow.java new file mode 100644 index 000000000..3c05d5c0a --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/XLS/ContainsRow.java @@ -0,0 +1,47 @@ +package example.matchers.XLS; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.hamcrest.Description; + +import example.XLS; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; + +import static java.util.Arrays.asList; + +public class ContainsRow extends XLSMatcher { + private final String[] cellTexts; + + public ContainsRow(String... cellTexts) { + this.cellTexts = cellTexts; + } + + @Override + protected boolean matchesSafely(XLS item) { + for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { + Sheet sheet = item.excel.getSheetAt(i); + for (Row row : sheet) { + Queue expectedTexts = new LinkedList<>(asList(cellTexts)); + for (Cell cell : row) { + String expectedText = expectedTexts.peek(); + if (getFormattedCellValue(cell).contains(expectedText)) { + expectedTexts.remove(); + } + if (expectedTexts.isEmpty()) + return true; + } + } + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("a XLS containing row ") + .appendValue(Arrays.toString(cellTexts)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/XLS/ContainsText.java b/xls-validate/src/main/java/example/matchers/XLS/ContainsText.java new file mode 100644 index 000000000..e270e79c3 --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/XLS/ContainsText.java @@ -0,0 +1,37 @@ +package example.matchers.XLS; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.hamcrest.Description; + +import example.XLS; + +public class ContainsText extends XLSMatcher { + private final String substring; + + public ContainsText(String substring) { + this.substring = reduceSpaces(substring); + } + + @Override + protected boolean matchesSafely(XLS item) { + for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { + Sheet sheet = item.excel.getSheetAt(i); + for (Row row : sheet) { + for (Cell cell : row) { + String cellValue = reduceSpaces(getFormattedCellValue(cell)); + if (cellValue.contains(substring)) + return true; + } + } + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("a XLS containing text ") + .appendValue(reduceSpaces(substring)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/XLS/DoesNotContainText.java b/xls-validate/src/main/java/example/matchers/XLS/DoesNotContainText.java new file mode 100644 index 000000000..2406fb15c --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/XLS/DoesNotContainText.java @@ -0,0 +1,26 @@ +package example.matchers.XLS; + +import org.hamcrest.Description; + +import example.XLS; + +public class DoesNotContainText extends XLSMatcher { + + private final String substring; + + public DoesNotContainText(String substring) { + this.substring = reduceSpaces(substring); + } + + @Override + protected boolean matchesSafely(XLS item) { + boolean contains = new ContainsText(substring).matchesSafely(item); + return !contains; + } + + @Override + public void describeTo(Description description) { + description.appendText("a XLS not containing text ") + .appendValue(reduceSpaces(substring)); + } +} diff --git a/xls-validate/src/main/java/example/matchers/XLS/XLSMatcher.java b/xls-validate/src/main/java/example/matchers/XLS/XLSMatcher.java new file mode 100644 index 000000000..e766fef26 --- /dev/null +++ b/xls-validate/src/main/java/example/matchers/XLS/XLSMatcher.java @@ -0,0 +1,64 @@ +package example.matchers.XLS; + +import org.apache.poi.ss.usermodel.BuiltinFormats; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.hamcrest.Description; +import org.hamcrest.SelfDescribing; +import org.hamcrest.TypeSafeMatcher; + +import example.XLS; + +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.List; + +abstract class XLSMatcher extends TypeSafeMatcher + implements SelfDescribing { + private List legalNumericFormats = Arrays.asList( + BuiltinFormats.getBuiltinFormat(1), BuiltinFormats.getBuiltinFormat(2), + BuiltinFormats.getBuiltinFormat(3), BuiltinFormats.getBuiltinFormat(4), + BuiltinFormats.getBuiltinFormat(9), BuiltinFormats.getBuiltinFormat(10)); + + protected String reduceSpaces(String text) { + return text.replaceAll("[\\s\\n\\r\u00a0]+", " ").trim(); + } + + protected String getFormattedCellValue(Cell cell) { + switch (cell.getCellType()) { + case NUMERIC: + DecimalFormat formatter; + if (legalNumericFormats + .contains(cell.getCellStyle().getDataFormatString())) { + formatter = new DecimalFormat( + cell.getCellStyle().getDataFormatString()); + } else { + formatter = new DecimalFormat(); + } + return formatter.format(cell.getNumericCellValue()); + case STRING: + case BLANK: + default: + return cell.toString(); + } + } + + @Override + protected void describeMismatchSafely(XLS item, + Description mismatchDescription) { + mismatchDescription.appendText("was \"").appendText(item.name) + .appendText("\"\n"); + + for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { + Sheet sheet = item.excel.getSheetAt(i); + for (Row row : sheet) { + for (Cell cell : row) { + mismatchDescription.appendText(getFormattedCellValue(cell)) + .appendText("\t"); + } + mismatchDescription.appendText("\n"); + } + } + } +} diff --git a/xls-validate/src/test/java/example/CreateOdsTest.java b/xls-validate/src/test/java/example/CreateOdsTest.java new file mode 100644 index 000000000..ec32c91d1 --- /dev/null +++ b/xls-validate/src/test/java/example/CreateOdsTest.java @@ -0,0 +1,50 @@ +package example; + +import org.junit.Test; + +import example.ODS; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static example.ODS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class CreateOdsTest { + @Test + public void fromFile() throws Exception { + File file = new File( + getClass().getClassLoader().getResource("statement.ods").toURI()); + assertThat(new ODS(file), containsText("Выписка")); + } + + @Test + public void fromUrl() throws Exception { + URL url = getClass().getClassLoader().getResource("statement.ods"); + assertThat(new ODS(url), containsText("Выписка")); + } + + @Test + public void fromUri() throws Exception { + URI uri = getClass().getClassLoader().getResource("statement.ods").toURI(); + assertThat(new ODS(uri), containsText("Выписка")); + } + + @Test + public void fromInputStream() throws Exception { + InputStream inputStream = getClass().getClassLoader() + .getResourceAsStream("statement.ods"); + assertThat(new ODS(inputStream), containsText("Выписка")); + } + + @Test + public void fromBytes() throws Exception { + byte[] bytes = Files.readAllBytes(Paths + .get(getClass().getClassLoader().getResource("statement.ods").toURI())); + assertThat(new ODS(bytes), containsText("Выписка")); + } +} diff --git a/xls-validate/src/test/java/example/CreateXLSXTest.java b/xls-validate/src/test/java/example/CreateXLSXTest.java index a75132986..1634be40b 100644 --- a/xls-validate/src/test/java/example/CreateXLSXTest.java +++ b/xls-validate/src/test/java/example/CreateXLSXTest.java @@ -1,47 +1,47 @@ -package example; - -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.InputStream; -import java.net.URI; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static example.XLS.containsText; -import static org.hamcrest.MatcherAssert.assertThat; - -public class CreateXLSXTest { - @Test - public void fromFile() throws Exception { - File file = new File(getClass().getClassLoader().getResource("statement.xlsx").toURI()); - assertThat(new XLS(file), containsText("Выписка")); - } - - @Test - public void fromUrl() throws Exception { - URL url = getClass().getClassLoader().getResource("statement.xlsx"); - assertThat(new XLS(url), containsText("Выписка")); - } - - @Test - public void fromUri() throws Exception { - URI uri = getClass().getClassLoader().getResource("statement.xlsx").toURI(); - assertThat(new XLS(uri), containsText("Выписка")); - } - - @Test - public void fromInputStream() throws Exception { - InputStream inputStream = getClass().getClassLoader().getResourceAsStream("statement.xlsx"); - assertThat(new XLS(inputStream), containsText("Выписка")); - } - - @Test - public void fromBytes() throws Exception { - byte[] bytes = Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("statement.xlsx").toURI())); - assertThat(new XLS(bytes), containsText("Выписка")); - } -} +package example; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class CreateXLSXTest { + @Test + public void fromFile() throws Exception { + File file = new File(getClass().getClassLoader().getResource("statement.xlsx").toURI()); + assertThat(new XLS(file), containsText("Выписка")); + } + + @Test + public void fromUrl() throws Exception { + URL url = getClass().getClassLoader().getResource("statement.xlsx"); + assertThat(new XLS(url), containsText("Выписка")); + } + + @Test + public void fromUri() throws Exception { + URI uri = getClass().getClassLoader().getResource("statement.xlsx").toURI(); + assertThat(new XLS(uri), containsText("Выписка")); + } + + @Test + public void fromInputStream() throws Exception { + InputStream inputStream = getClass().getClassLoader().getResourceAsStream("statement.xlsx"); + assertThat(new XLS(inputStream), containsText("Выписка")); + } + + @Test + public void fromBytes() throws Exception { + byte[] bytes = Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("statement.xlsx").toURI())); + assertThat(new XLS(bytes), containsText("Выписка")); + } +} diff --git a/xls-validate/src/test/java/example/CreateXlsTest.java b/xls-validate/src/test/java/example/CreateXlsTest.java index 1ce929092..5d9c34df4 100644 --- a/xls-validate/src/test/java/example/CreateXlsTest.java +++ b/xls-validate/src/test/java/example/CreateXlsTest.java @@ -1,50 +1,50 @@ -package example; - -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.InputStream; -import java.net.URI; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static example.XLS.containsText; -import static org.hamcrest.MatcherAssert.assertThat; - -public class CreateXlsTest { - @Test - public void fromFile() throws Exception { - File file = new File( - getClass().getClassLoader().getResource("statement.xls").toURI()); - assertThat(new XLS(file), containsText("Выписка")); - } - - @Test - public void fromUrl() throws Exception { - URL url = getClass().getClassLoader().getResource("statement.xls"); - assertThat(new XLS(url), containsText("Выписка")); - } - - @Test - public void fromUri() throws Exception { - URI uri = getClass().getClassLoader().getResource("statement.xls").toURI(); - assertThat(new XLS(uri), containsText("Выписка")); - } - - @Test - public void fromInputStream() throws Exception { - InputStream inputStream = getClass().getClassLoader() - .getResourceAsStream("statement.xls"); - assertThat(new XLS(inputStream), containsText("Выписка")); - } - - @Test - public void fromBytes() throws Exception { - byte[] bytes = Files.readAllBytes(Paths - .get(getClass().getClassLoader().getResource("statement.xls").toURI())); - assertThat(new XLS(bytes), containsText("Выписка")); - } -} +package example; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class CreateXlsTest { + @Test + public void fromFile() throws Exception { + File file = new File( + getClass().getClassLoader().getResource("statement.xls").toURI()); + assertThat(new XLS(file), containsText("Выписка")); + } + + @Test + public void fromUrl() throws Exception { + URL url = getClass().getClassLoader().getResource("statement.xls"); + assertThat(new XLS(url), containsText("Выписка")); + } + + @Test + public void fromUri() throws Exception { + URI uri = getClass().getClassLoader().getResource("statement.xls").toURI(); + assertThat(new XLS(uri), containsText("Выписка")); + } + + @Test + public void fromInputStream() throws Exception { + InputStream inputStream = getClass().getClassLoader() + .getResourceAsStream("statement.xls"); + assertThat(new XLS(inputStream), containsText("Выписка")); + } + + @Test + public void fromBytes() throws Exception { + byte[] bytes = Files.readAllBytes(Paths + .get(getClass().getClassLoader().getResource("statement.xls").toURI())); + assertThat(new XLS(bytes), containsText("Выписка")); + } +} diff --git a/xls-validate/src/test/java/example/InvalidXlsTest.java b/xls-validate/src/test/java/example/InvalidXlsTest.java index 383c174b7..36a03d232 100644 --- a/xls-validate/src/test/java/example/InvalidXlsTest.java +++ b/xls-validate/src/test/java/example/InvalidXlsTest.java @@ -1,38 +1,38 @@ -package example; - -import org.junit.Test; - -import example.XLS; - -import java.io.File; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -public class InvalidXlsTest { - @Test - public void throws_IllegalArgumentException_ifFailedToParseXlsFromBytes() { - try { - new XLS("This is not Excel file".getBytes()); - fail("expected IllegalArgumentException"); - } - catch (IllegalArgumentException expected) { - assertThat(expected.getMessage(), is("Invalid XLS ")); - assertThat(expected.getCause(), is(notNullValue())); - } - } - - @Test - public void throws_IllegalArgumentException_ifFailedToReadXlsFile() { - try { - new XLS(new File("missing-file.xls")); - fail("expected IllegalArgumentException"); - } - catch (IllegalArgumentException expected) { - assertThat(expected.getMessage(), is("Failed to read file missing-file.xls")); - assertThat(expected.getCause(), is(notNullValue())); - } - } -} +package example; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; + +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +public class InvalidXlsTest { + @Test + public void throws_IllegalArgumentException_ifFailedToParseXlsFromBytes() { + try { + new XLS("This is not Excel file".getBytes()); + fail("expected IllegalArgumentException"); + } + catch (IllegalArgumentException expected) { + assertThat(expected.getMessage(), is("Invalid XLS ")); + assertThat(expected.getCause(), is(notNullValue())); + } + } + + @Test + public void throws_IllegalArgumentException_ifFailedToReadXlsFile() { + try { + new XLS(new File("missing-file.xls")); + fail("expected IllegalArgumentException"); + } + catch (IllegalArgumentException expected) { + assertThat(expected.getMessage(), is("Failed to read file missing-file.xls")); + assertThat(expected.getCause(), is(notNullValue())); + } + } +} diff --git a/xls-validate/src/test/java/example/RealWorldExamplesTest.java b/xls-validate/src/test/java/example/RealWorldExamplesTest.java index 0bf89b002..65bb9423d 100644 --- a/xls-validate/src/test/java/example/RealWorldExamplesTest.java +++ b/xls-validate/src/test/java/example/RealWorldExamplesTest.java @@ -1,26 +1,26 @@ -package example; - -import org.junit.Test; - -import example.XLS; - -import static example.XLS.containsText; -import static org.hamcrest.MatcherAssert.assertThat; - -public class RealWorldExamplesTest { - @Test - public void bankStatement() throws Exception { - XLS xls = new XLS(getClass().getClassLoader().getResource("statement.xls")); - assertThat(xls, containsText("Выписка")); - assertThat(xls, containsText("Период")); - assertThat(xls, containsText("18.06.2015 - 18.06.2015")); - } - - @Test - public void acquiringReport() throws Exception { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, containsText("Отчёт об операциях по пластиковым картам - 27.06.2015")); - assertThat(xls, containsText("с 27.05.2015 по 27.06.2015")); - assertThat(xls, containsText("ООО \"Джапан Мотор Сервис\", ИНН 7830002292, Номер договора 08-1-1-04-2437")); - } -} +package example; + +import org.junit.Test; + +import example.XLS; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class RealWorldExamplesTest { + @Test + public void bankStatement() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("statement.xls")); + assertThat(xls, containsText("Выписка")); + assertThat(xls, containsText("Период")); + assertThat(xls, containsText("18.06.2015 - 18.06.2015")); + } + + @Test + public void acquiringReport() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, containsText("Отчёт об операциях по пластиковым картам - 27.06.2015")); + assertThat(xls, containsText("с 27.05.2015 по 27.06.2015")); + assertThat(xls, containsText("ООО \"Джапан Мотор Сервис\", ИНН 7830002292, Номер договора 08-1-1-04-2437")); + } +} diff --git a/xls-validate/src/test/java/example/XLSInformationTest.java b/xls-validate/src/test/java/example/XLSInformationTest.java index e5a970b0a..ca732924e 100644 --- a/xls-validate/src/test/java/example/XLSInformationTest.java +++ b/xls-validate/src/test/java/example/XLSInformationTest.java @@ -1,20 +1,20 @@ -package example; - -import org.junit.Test; - -import example.XLS; - -import static org.hamcrest.CoreMatchers.endsWith; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; - -public class XLSInformationTest { - @Test - public void canGetInformationFromXls() throws Exception { - XLS XLS = new XLS(getClass().getClassLoader().getResource("statement.xls")); - assertThat(XLS.name, endsWith("statement.xls")); - assertThat(XLS.excel.getNumberOfSheets(), equalTo(3)); - assertThat(XLS.excel.getActiveSheetIndex(), equalTo(0)); - assertThat(XLS.excel.getSheetName(0), equalTo("Sheet1")); - } -} +package example; + +import org.junit.Test; + +import example.XLS; + +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +public class XLSInformationTest { + @Test + public void canGetInformationFromXls() throws Exception { + XLS XLS = new XLS(getClass().getClassLoader().getResource("statement.xls")); + assertThat(XLS.name, endsWith("statement.xls")); + assertThat(XLS.excel.getNumberOfSheets(), equalTo(3)); + assertThat(XLS.excel.getActiveSheetIndex(), equalTo(0)); + assertThat(XLS.excel.getSheetName(0), equalTo("Sheet1")); + } +} diff --git a/xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java b/xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java index e85ac1bfa..444b93c20 100644 --- a/xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java +++ b/xls-validate/src/test/java/example/formats/numbers/AutomaticAndPlainTextTests.java @@ -1,52 +1,52 @@ -package example.formats.numbers; - -import org.junit.Test; - -import example.XLS; - -import java.io.File; - -import static example.XLS.containsText; -import static org.hamcrest.MatcherAssert.assertThat; - -public class AutomaticAndPlainTextTests { - @Test - public void automaticStyle_valueInCell1_displayedValue1_parsedAs1() - throws Exception { - File file = new File( - getClass().getClassLoader().getResource("formats.xlsx").toURI()); - assertThat(new XLS(file), containsText("1")); - } - - @Test - public void automaticStyle_valueInCell1comma2_displayedValue1comma2_parsedAs1point2() - throws Exception { - File file = new File( - getClass().getClassLoader().getResource("formats.xlsx").toURI()); - assertThat(new XLS(file), containsText("1.2")); - } - - @Test - public void plainText_valueInCell2_displayedValue2_parsedAs2() - throws Exception { - File file = new File( - getClass().getClassLoader().getResource("formats.xlsx").toURI()); - assertThat(new XLS(file), containsText("2")); - } - - @Test - public void plainText_valueInCell2point1_displayedValue2point1_parsedAs2point1() - throws Exception { - File file = new File( - getClass().getClassLoader().getResource("formats.xlsx").toURI()); - assertThat(new XLS(file), containsText("2.1")); - } - - @Test - public void plainText_valueInCell2comma2_displayedValue2comma2_parsedAs2comma2() - throws Exception { - File file = new File( - getClass().getClassLoader().getResource("formats.xlsx").toURI()); - assertThat(new XLS(file), containsText("2,2")); - } -} +package example.formats.numbers; + +import org.junit.Test; + +import example.XLS; + +import java.io.File; + +import static example.XLS.containsText; +import static org.hamcrest.MatcherAssert.assertThat; + +public class AutomaticAndPlainTextTests { + @Test + public void automaticStyle_valueInCell1_displayedValue1_parsedAs1() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("1")); + } + + @Test + public void automaticStyle_valueInCell1comma2_displayedValue1comma2_parsedAs1point2() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("1.2")); + } + + @Test + public void plainText_valueInCell2_displayedValue2_parsedAs2() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("2")); + } + + @Test + public void plainText_valueInCell2point1_displayedValue2point1_parsedAs2point1() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("2.1")); + } + + @Test + public void plainText_valueInCell2comma2_displayedValue2comma2_parsedAs2comma2() + throws Exception { + File file = new File( + getClass().getClassLoader().getResource("formats.xlsx").toURI()); + assertThat(new XLS(file), containsText("2,2")); + } +} diff --git a/xls-validate/src/test/java/example/matchers/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/ContainsRowTest.java index 73652b0b5..a43002984 100644 --- a/xls-validate/src/test/java/example/matchers/ContainsRowTest.java +++ b/xls-validate/src/test/java/example/matchers/ContainsRowTest.java @@ -1,61 +1,61 @@ -package example.matchers; - -import org.junit.Ignore; -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.IOException; - -import static example.XLS.containsRow; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -public class ContainsRowTest { - @Test - public void rowContainsCells_all() throws IOException { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, - containsRow("PP028000", - "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", - "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", - "415039******2364", "476956", "281814930")); - } - - @Test - public void rowContainsCells_withGaps() throws Exception { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, containsRow("PP028000")); - assertThat(xls, containsRow("PP028000", "281814930")); - assertThat(xls, containsRow("281814930")); - assertThat(xls, containsRow("Итого по терминалу", "48,271.00")); - } - - @Test - public void rowContainsCells_noMatch() throws IOException { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, not(containsRow("foobar"))); - assertThat(xls, not(containsRow("foobar", "PP028000", "281814930"))); - assertThat(xls, not(containsRow("PP028000", "281814930", "foobar"))); - assertThat(xls, not(containsRow("PP028000", "foobar", "281814930"))); - } - - @Ignore - @Test - public void errorDescription() throws IOException { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, containsRow("wrong data")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS containing row \"[wrong data]\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } -} +package example.matchers; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; + +import static example.XLS.containsRow; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +public class ContainsRowTest { + @Test + public void rowContainsCells_all() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, + containsRow("PP028000", + "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", + "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", + "415039******2364", "476956", "281814930")); + } + + @Test + public void rowContainsCells_withGaps() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, containsRow("PP028000")); + assertThat(xls, containsRow("PP028000", "281814930")); + assertThat(xls, containsRow("281814930")); + assertThat(xls, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, not(containsRow("foobar"))); + assertThat(xls, not(containsRow("foobar", "PP028000", "281814930"))); + assertThat(xls, not(containsRow("PP028000", "281814930", "foobar"))); + assertThat(xls, not(containsRow("PP028000", "foobar", "281814930"))); + } + + @Ignore + @Test + public void errorDescription() throws IOException { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsRow("wrong data")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing row \"[wrong data]\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/ContainsTextTest.java index 2076304da..4bd6a5f85 100644 --- a/xls-validate/src/test/java/example/matchers/ContainsTextTest.java +++ b/xls-validate/src/test/java/example/matchers/ContainsTextTest.java @@ -1,96 +1,96 @@ -package example.matchers; - -import org.junit.Ignore; -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.IOException; -import java.util.Objects; - -import static example.XLS.containsText; -import static example.XLS.doesNotContainText; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.fail; - -public class ContainsTextTest { - @Test - public void canAssertThatXlsContainsText() throws IOException { - XLS XLS = new XLS(Objects.requireNonNull( - getClass().getClassLoader().getResource("statement.xls"))); - assertThat(XLS, containsText("Выписка")); - assertThat(XLS, containsText("Solntsev Andrei")); - assertThat(XLS, containsText("25.06.2015 23:09:32")); - - assertThat(XLS, containsText("Счёт")); - assertThat(XLS, containsText("40820810590480000591")); - assertThat(XLS, containsText("Период")); - assertThat(XLS, containsText("18.06.2015 - 18.06.2015")); - assertThat(XLS, containsText("Входящий остаток на 18.06.2015")); - assertThat(XLS, containsText("6.40")); - - assertThat(XLS, containsText("Дата")); - assertThat(XLS, containsText("Счёт\nплательщика/получателя")); - assertThat(XLS, containsText("Плательщик / Получатель")); - assertThat(XLS, containsText("Операция")); - assertThat(XLS, containsText("Сумма (RUB)")); - - assertThat(XLS, containsText("18.06.2015")); - assertThat(XLS, containsText("40820810590550000146")); - assertThat(XLS, containsText("Solntsev Andrei")); - assertThat(XLS, containsText("сюда. Интернет-банк")); - assertThat(XLS, containsText("-1.00")); - - assertThat(XLS, containsText("туда. Интернет-банк")); - assertThat(XLS, containsText("1.00")); - - assertThat(XLS, containsText("Исходящий остаток на 18.06.2015")); - assertThat(XLS, containsText("6.40")); - - assertThat(XLS, containsText("Поступление")); - assertThat(XLS, containsText("Списание")); - assertThat(XLS, containsText("Зарезервировано")); - assertThat(XLS, containsText("349,928.00")); - } - - @Test - public void canAssertXlsDoesNotContainText() throws IOException { - XLS xls = new XLS(Objects.requireNonNull( - getClass().getClassLoader().getResource("statement.xls"))); - assertThat(xls, doesNotContainText("null")); - } - - @Ignore - @Test - public void errorDescriptionForDoesNotContainTextMatcher() { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, doesNotContainText("Выписка")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS not containing text \"Выписка\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } - - @Ignore - @Test - public void errorDescriptionForContainsTextMatcher() { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, containsText("wrong text")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS containing text \"wrong text\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } -} +package example.matchers; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; + +import static example.XLS.containsText; +import static example.XLS.doesNotContainText; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.fail; + +public class ContainsTextTest { + @Test + public void canAssertThatXlsContainsText() throws IOException { + XLS XLS = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(XLS, containsText("Выписка")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("25.06.2015 23:09:32")); + + assertThat(XLS, containsText("Счёт")); + assertThat(XLS, containsText("40820810590480000591")); + assertThat(XLS, containsText("Период")); + assertThat(XLS, containsText("18.06.2015 - 18.06.2015")); + assertThat(XLS, containsText("Входящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Дата")); + assertThat(XLS, containsText("Счёт\nплательщика/получателя")); + assertThat(XLS, containsText("Плательщик / Получатель")); + assertThat(XLS, containsText("Операция")); + assertThat(XLS, containsText("Сумма (RUB)")); + + assertThat(XLS, containsText("18.06.2015")); + assertThat(XLS, containsText("40820810590550000146")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("сюда. Интернет-банк")); + assertThat(XLS, containsText("-1.00")); + + assertThat(XLS, containsText("туда. Интернет-банк")); + assertThat(XLS, containsText("1.00")); + + assertThat(XLS, containsText("Исходящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Поступление")); + assertThat(XLS, containsText("Списание")); + assertThat(XLS, containsText("Зарезервировано")); + assertThat(XLS, containsText("349,928.00")); + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + XLS xls = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(xls, doesNotContainText("null")); + } + + @Ignore + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, doesNotContainText("Выписка")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS not containing text \"Выписка\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } + + @Ignore + @Test + public void errorDescriptionForContainsTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsText("wrong text")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing text \"wrong text\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} diff --git a/xls-validate/src/test/resources/statement.ods b/xls-validate/src/test/resources/statement.ods new file mode 100644 index 0000000000000000000000000000000000000000..40e7e490ad429d58443723cf6ab5c08ceaf590ae GIT binary patch literal 15176 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 literal 0 HcmV?d00001 diff --git a/xls-validate/xls-test.iml b/xls-validate/xls-test.iml index a03111a3a..cf1f4db03 100644 --- a/xls-validate/xls-test.iml +++ b/xls-validate/xls-test.iml @@ -1,36 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 0e657b590950256455d7b64338e33469cfa63eaf Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 21 Jul 2023 04:39:19 +0200 Subject: [PATCH 021/171] intermediate revision - fixed ODS code, "containsText" tests are passing, the "containsRow" not converted yet --- xls-validate/README.md | 12 ++-- xls-validate/src/main/java/example/ODS.java | 5 ++ .../java/example/matchers/ContainsRow.java | 47 ------------- .../java/example/matchers/ContainsText.java | 37 ---------- .../example/matchers/DoesNotContainText.java | 26 ------- .../example/matchers/ODS/ContainsRow.java | 32 ++++----- .../example/matchers/ODS/ContainsText.java | 28 ++++---- .../java/example/matchers/ODS/ODSMatcher.java | 28 ++++---- .../java/example/matchers/XLSMatcher.java | 64 ------------------ .../src/test/java/example/CreateOdsTest.java | 10 +-- xls-validate/src/test/resources/statement.ods | Bin 15176 -> 11050 bytes 11 files changed, 60 insertions(+), 229 deletions(-) delete mode 100644 xls-validate/src/main/java/example/matchers/ContainsRow.java delete mode 100644 xls-validate/src/main/java/example/matchers/ContainsText.java delete mode 100644 xls-validate/src/main/java/example/matchers/DoesNotContainText.java delete mode 100644 xls-validate/src/main/java/example/matchers/XLSMatcher.java diff --git a/xls-validate/README.md b/xls-validate/README.md index 5d9c91e69..1b0a7faa4 100644 --- a/xls-validate/README.md +++ b/xls-validate/README.md @@ -1,6 +1,6 @@ -### Info - - fork of https://github.com/codeborne/xls-test/tree/main, preparing to add PR - -### Author -[Serguei Kouzmine](kouzmine_serguei@yahoo.com) +### Info + + fork of https://github.com/codeborne/xls-test/tree/main, preparing to add PR + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/xls-validate/src/main/java/example/ODS.java b/xls-validate/src/main/java/example/ODS.java index 6f130d2b1..eeae00db8 100644 --- a/xls-validate/src/main/java/example/ODS.java +++ b/xls-validate/src/main/java/example/ODS.java @@ -78,7 +78,12 @@ public Object safeOOCellValue( result = Double.valueOf(cell.getValue().toString()); break; case STRING: + // NOTE: NPE + // try { result = cell.getTextValue(); + // } catch (java.lang.NullPointerException e) { + // result = ""; + // } break; case TIME: result = null; // TODO diff --git a/xls-validate/src/main/java/example/matchers/ContainsRow.java b/xls-validate/src/main/java/example/matchers/ContainsRow.java deleted file mode 100644 index 02ac74f3f..000000000 --- a/xls-validate/src/main/java/example/matchers/ContainsRow.java +++ /dev/null @@ -1,47 +0,0 @@ -package example.matchers; - -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.hamcrest.Description; - -import example.XLS; - -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Queue; - -import static java.util.Arrays.asList; - -public class ContainsRow extends XLSMatcher { - private final String[] cellTexts; - - public ContainsRow(String... cellTexts) { - this.cellTexts = cellTexts; - } - - @Override - protected boolean matchesSafely(XLS item) { - for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { - Sheet sheet = item.excel.getSheetAt(i); - for (Row row : sheet) { - Queue expectedTexts = new LinkedList<>(asList(cellTexts)); - for (Cell cell : row) { - String expectedText = expectedTexts.peek(); - if (getFormattedCellValue(cell).contains(expectedText)) { - expectedTexts.remove(); - } - if (expectedTexts.isEmpty()) - return true; - } - } - } - return false; - } - - @Override - public void describeTo(Description description) { - description.appendText("a XLS containing row ") - .appendValue(Arrays.toString(cellTexts)); - } -} diff --git a/xls-validate/src/main/java/example/matchers/ContainsText.java b/xls-validate/src/main/java/example/matchers/ContainsText.java deleted file mode 100644 index 54cfe51b7..000000000 --- a/xls-validate/src/main/java/example/matchers/ContainsText.java +++ /dev/null @@ -1,37 +0,0 @@ -package example.matchers; - -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.hamcrest.Description; - -import example.XLS; - -public class ContainsText extends XLSMatcher { - private final String substring; - - public ContainsText(String substring) { - this.substring = reduceSpaces(substring); - } - - @Override - protected boolean matchesSafely(XLS item) { - for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { - Sheet sheet = item.excel.getSheetAt(i); - for (Row row : sheet) { - for (Cell cell : row) { - String cellValue = reduceSpaces(getFormattedCellValue(cell)); - if (cellValue.contains(substring)) - return true; - } - } - } - return false; - } - - @Override - public void describeTo(Description description) { - description.appendText("a XLS containing text ") - .appendValue(reduceSpaces(substring)); - } -} diff --git a/xls-validate/src/main/java/example/matchers/DoesNotContainText.java b/xls-validate/src/main/java/example/matchers/DoesNotContainText.java deleted file mode 100644 index bd865080c..000000000 --- a/xls-validate/src/main/java/example/matchers/DoesNotContainText.java +++ /dev/null @@ -1,26 +0,0 @@ -package example.matchers; - -import org.hamcrest.Description; - -import example.XLS; - -public class DoesNotContainText extends XLSMatcher { - - private final String substring; - - public DoesNotContainText(String substring) { - this.substring = reduceSpaces(substring); - } - - @Override - protected boolean matchesSafely(XLS item) { - boolean contains = new ContainsText(substring).matchesSafely(item); - return !contains; - } - - @Override - public void describeTo(Description description) { - description.appendText("a XLS not containing text ") - .appendValue(reduceSpaces(substring)); - } -} diff --git a/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java index d1dbbd726..b75b3b410 100644 --- a/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java +++ b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java @@ -20,33 +20,31 @@ public ContainsRow(String... cellTexts) { this.cellTexts = cellTexts; } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override protected boolean matchesSafely(ODS item) { + for (int sheetIndex = 0; sheetIndex < item.ods + .getSheetCount(); sheetIndex++) { - for (int i = 0; i < item.ods.getSheetCount(); i++) { - // Sheet sheet = item.excel.getSheetAt(i); - Sheet sheet = item.ods.getSheet(i); + Sheet sheet = item.ods.getSheet(sheetIndex); int columnCount = sheet.getColumnCount(); - int rowCount = sheet.getRowCount(); - @SuppressWarnings("rawtypes") - Cell cell = null; - for (int rowIndex = 1; rowIndex < rowCount && StringUtils.isNotBlank(sheet - .getImmutableCellAt(0, rowIndex).getValue().toString()); rowIndex++) { + + for (int rowIndex = 0; rowIndex < sheet.getRowCount(); rowIndex++) { + if (sheet.getImmutableCellAt(0, rowIndex).isEmpty()) + break; Queue expectedTexts = new LinkedList<>(asList(cellTexts)); for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { - cell = sheet.getImmutableCellAt(columnIndex, rowIndex); - if (StringUtils.isNotBlank(cell.getValue().toString())) { - Object cellValue = item.safeOOCellValue(cell); - String expectedText = expectedTexts.peek(); - if (cellValue.toString().contains(expectedText)) { - expectedTexts.remove(); - } - } + + Cell cell = sheet.getImmutableCellAt(columnIndex, rowIndex); + if (cell.isEmpty()) + break; + String expectedText = expectedTexts.peek(); + if (item.safeOOCellValue(cell).toString().contains(expectedText)) + expectedTexts.remove(); } if (expectedTexts.isEmpty()) return true; } - } return false; } diff --git a/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java b/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java index 881a36e17..2973561ee 100644 --- a/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java +++ b/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java @@ -16,25 +16,25 @@ public ContainsText(String substring) { this.substring = reduceSpaces(substring); } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override protected boolean matchesSafely(ODS item) { - for (int i = 0; i < item.ods.getSheetCount(); i++) { - // Sheet sheet = item.excel.getSheetAt(i); - Sheet sheet = item.ods.getSheet(i); + for (int sheetIndex = 0; sheetIndex < item.ods + .getSheetCount(); sheetIndex++) { + + Sheet sheet = item.ods.getSheet(sheetIndex); int columnCount = sheet.getColumnCount(); - int rowCount = sheet.getRowCount(); - @SuppressWarnings("rawtypes") - Cell cell = null; - for (int rowIndex = 1; rowIndex < rowCount && StringUtils.isNotBlank(sheet - .getImmutableCellAt(0, rowIndex).getValue().toString()); rowIndex++) { + + for (int rowIndex = 0; rowIndex < sheet.getRowCount(); rowIndex++) { + if (sheet.getImmutableCellAt(0, rowIndex).isEmpty()) + break; for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { - cell = sheet.getImmutableCellAt(columnIndex, rowIndex); - if (StringUtils.isNotBlank(cell.getValue().toString())) { - Object cellValue = item.safeOOCellValue(cell); - if (cellValue.toString().contains(substring)) - return true; - } + Cell cell = sheet.getImmutableCellAt(columnIndex, rowIndex); + if (cell.isEmpty()) + break; + if (item.safeOOCellValue(cell).toString().contains(substring)) + return true; } } } diff --git a/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java b/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java index 252f787ab..a9600d109 100644 --- a/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java +++ b/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java @@ -16,25 +16,27 @@ protected String reduceSpaces(String text) { return text.replaceAll("[\\s\\n\\r\u00a0]+", " ").trim(); } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override protected void describeMismatchSafely(ODS item, Description mismatchDescription) { - for (int i = 0; i < item.ods.getSheetCount(); i++) { - Sheet sheet = item.ods.getSheet(i); + for (int sheetIndex = 0; sheetIndex < item.ods + .getSheetCount(); sheetIndex++) { + + Sheet sheet = item.ods.getSheet(sheetIndex); int columnCount = sheet.getColumnCount(); - int rowCount = sheet.getRowCount(); - @SuppressWarnings("rawtypes") - Cell cell = null; - for (int rowIndex = 1; rowIndex < rowCount && StringUtils.isNotBlank(sheet - .getImmutableCellAt(0, rowIndex).getValue().toString()); rowIndex++) { + + for (int rowIndex = 0; rowIndex < sheet.getRowCount(); rowIndex++) { + if (sheet.getImmutableCellAt(0, rowIndex).isEmpty()) + break; for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { - cell = sheet.getImmutableCellAt(columnIndex, rowIndex); - if (StringUtils.isNotBlank(cell.getValue().toString())) { - Object cellValue = item.safeOOCellValue(cell); - mismatchDescription.appendText(cellValue.toString()) - .appendText("\t"); - } + + Cell cell = sheet.getImmutableCellAt(columnIndex, rowIndex); + if (cell.isEmpty()) + break; + mismatchDescription.appendText(item.safeOOCellValue(cell).toString()) + .appendText("\t"); } } } diff --git a/xls-validate/src/main/java/example/matchers/XLSMatcher.java b/xls-validate/src/main/java/example/matchers/XLSMatcher.java deleted file mode 100644 index acc090ce4..000000000 --- a/xls-validate/src/main/java/example/matchers/XLSMatcher.java +++ /dev/null @@ -1,64 +0,0 @@ -package example.matchers; - -import org.apache.poi.ss.usermodel.BuiltinFormats; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.hamcrest.Description; -import org.hamcrest.SelfDescribing; -import org.hamcrest.TypeSafeMatcher; - -import example.XLS; - -import java.text.DecimalFormat; -import java.util.Arrays; -import java.util.List; - -abstract class XLSMatcher extends TypeSafeMatcher - implements SelfDescribing { - private List legalNumericFormats = Arrays.asList( - BuiltinFormats.getBuiltinFormat(1), BuiltinFormats.getBuiltinFormat(2), - BuiltinFormats.getBuiltinFormat(3), BuiltinFormats.getBuiltinFormat(4), - BuiltinFormats.getBuiltinFormat(9), BuiltinFormats.getBuiltinFormat(10)); - - protected String reduceSpaces(String text) { - return text.replaceAll("[\\s\\n\\r\u00a0]+", " ").trim(); - } - - protected String getFormattedCellValue(Cell cell) { - switch (cell.getCellType()) { - case NUMERIC: - DecimalFormat formatter; - if (legalNumericFormats - .contains(cell.getCellStyle().getDataFormatString())) { - formatter = new DecimalFormat( - cell.getCellStyle().getDataFormatString()); - } else { - formatter = new DecimalFormat(); - } - return formatter.format(cell.getNumericCellValue()); - case STRING: - case BLANK: - default: - return cell.toString(); - } - } - - @Override - protected void describeMismatchSafely(XLS item, - Description mismatchDescription) { - mismatchDescription.appendText("was \"").appendText(item.name) - .appendText("\"\n"); - - for (int i = 0; i < item.excel.getNumberOfSheets(); i++) { - Sheet sheet = item.excel.getSheetAt(i); - for (Row row : sheet) { - for (Cell cell : row) { - mismatchDescription.appendText(getFormattedCellValue(cell)) - .appendText("\t"); - } - mismatchDescription.appendText("\n"); - } - } - } -} diff --git a/xls-validate/src/test/java/example/CreateOdsTest.java b/xls-validate/src/test/java/example/CreateOdsTest.java index ec32c91d1..c15724b38 100644 --- a/xls-validate/src/test/java/example/CreateOdsTest.java +++ b/xls-validate/src/test/java/example/CreateOdsTest.java @@ -19,32 +19,32 @@ public class CreateOdsTest { public void fromFile() throws Exception { File file = new File( getClass().getClassLoader().getResource("statement.ods").toURI()); - assertThat(new ODS(file), containsText("Выписка")); + assertThat(new ODS(file), containsText("allure")); } @Test public void fromUrl() throws Exception { URL url = getClass().getClassLoader().getResource("statement.ods"); - assertThat(new ODS(url), containsText("Выписка")); + assertThat(new ODS(url), containsText("allure")); } @Test public void fromUri() throws Exception { URI uri = getClass().getClassLoader().getResource("statement.ods").toURI(); - assertThat(new ODS(uri), containsText("Выписка")); + assertThat(new ODS(uri), containsText("allure")); } @Test public void fromInputStream() throws Exception { InputStream inputStream = getClass().getClassLoader() .getResourceAsStream("statement.ods"); - assertThat(new ODS(inputStream), containsText("Выписка")); + assertThat(new ODS(inputStream), containsText("allure")); } @Test public void fromBytes() throws Exception { byte[] bytes = Files.readAllBytes(Paths .get(getClass().getClassLoader().getResource("statement.ods").toURI())); - assertThat(new ODS(bytes), containsText("Выписка")); + assertThat(new ODS(bytes), containsText("allure")); } } diff --git a/xls-validate/src/test/resources/statement.ods b/xls-validate/src/test/resources/statement.ods index 40e7e490ad429d58443723cf6ab5c08ceaf590ae..32c4fa9e17895cf46df4925dfe3060e3cdd7d945 100644 GIT binary patch literal 11050 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 From ec7ca9f82526094838194c58a92dee879040db54 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 21 Jul 2023 13:24:20 -0400 Subject: [PATCH 022/171] intermediate revision - enabled and refactored all tests. NOTE: using a very elementary OCS file test resource, library may fail with real inputs converted from Excel --- xls-validate/README.md | 13 +++ xls-validate/pom.xml | 57 ++++------- .../example/matchers/ODS/ContainsRowTest.java | 70 +++++++++++++ .../matchers/ODS/ContainsTextTest.java | 68 +++++++++++++ .../example/matchers/XLS/ContainsRowTest.java | 61 +++++++++++ .../matchers/XLS/ContainsTextTest.java | 96 ++++++++++++++++++ .../resources/{statement.ods => testdata.ods} | Bin 7 files changed, 326 insertions(+), 39 deletions(-) create mode 100644 xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java create mode 100644 xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java create mode 100644 xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java create mode 100644 xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java rename xls-validate/src/test/resources/{statement.ods => testdata.ods} (100%) diff --git a/xls-validate/README.md b/xls-validate/README.md index 1b0a7faa4..bc2b756c8 100644 --- a/xls-validate/README.md +++ b/xls-validate/README.md @@ -2,5 +2,18 @@ fork of https://github.com/codeborne/xls-test/tree/main, preparing to add PR +### NOTE + +* Under openjdk 11 Linux Ubuntu __18.04__ +cannot build the proeject +```text +java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so +java.lang.NoClassDefFoundError: Could not initialize class org.jopendocument.dom.StyleProperties +``` +solved via +```sh +sudo apt install openjdk-11-jdk +``` + ### Author [Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/xls-validate/pom.xml b/xls-validate/pom.xml index 2bd2d61a7..17e4e4b90 100644 --- a/xls-validate/pom.xml +++ b/xls-validate/pom.xml @@ -4,7 +4,7 @@ example xls-validate jar - 0.1-SNAPSHOT + 0.2-SNAPSHOT xls-validate http://maven.apache.org @@ -28,12 +28,9 @@ 1.8 1.3 20080701 - 2.0.6 - 1.0.6 - + 2.0.6 + 1.0.6 2.1.1 - - 2.4.0 3.6.1 1.8 @@ -50,44 +47,26 @@ EntryPoint - - org.jxls - jxls-reader - ${jxls-reader.version} - - - - net.sf.jxls - jxls-core - 1.0.5 - - - - - org.apache.commons - commons-jexl - ${commons-jexl.version} - + + org.jxls + jxls-reader + ${jxls-reader.version} + + + net.sf.jxls + jxls-core + ${jxls-core.version} + + + org.apache.commons + commons-jexl + ${commons-jexl.version} + org.jopendocument jOpenDocument ${jOpenDocument.version} - junit junit diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java new file mode 100644 index 000000000..be0e7de31 --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java @@ -0,0 +1,70 @@ +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsRow; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import example.ODS; + +public class ContainsRowTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("testdata.ods"))); + } + + @Test + public void rowContainsCells_all() throws IOException { + for (String[] texts : Arrays.asList( + new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, + { "3", "spock", "22" }, { "4", "allure", "50" } })) { + assertThat(sheet, containsRow(texts)); + + } + } + + @Ignore + @Test + public void rowContainsCells_withGaps() throws Exception { + assertThat(sheet, containsRow("PP028000")); + assertThat(sheet, containsRow("PP028000", "281814930")); + assertThat(sheet, containsRow("281814930")); + assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + assertThat(sheet, not(containsRow("foobar"))); + assertThat(sheet, not(containsRow("2", "testng", "51"))); + assertThat(sheet, not(containsRow("1", "testng", "52"))); + } + + @Test + public void errorDescription() throws IOException { + String text = "wrong data"; + String message = String.format("Expected: a ODS containing row \"[%s]\"", + text); + try { + assertThat(sheet, containsRow(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java new file mode 100644 index 000000000..15546b9bf --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java @@ -0,0 +1,68 @@ +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsText; +import static example.ODS.doesNotContainText; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Test; + +import example.ODS; + +public class ContainsTextTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("testdata.ods"))); + } + + @Test + public void canAssertThatXlsContainsText() throws IOException { + for (String text : Arrays + .asList(new String[] { "junit", "testng", "allure" })) { + assertThat(sheet, containsText(text)); + } + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + assertThat(sheet, doesNotContainText("xunit")); + } + + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + String text = "junit"; + try { + assertThat(sheet, doesNotContainText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString( + String.format("Expected: a ODS not containing text \"%s\"", text))); + } + } + + @Test + public void errorDescriptionForContainsTextMatcher() { + String text = "wrong text"; + String message = String.format("Expected: a ODS containing text \"%s\"", + text); + try { + assertThat(sheet, containsText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java new file mode 100644 index 000000000..4fb54ce59 --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java @@ -0,0 +1,61 @@ +package example.matchers.XLS; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; + +import static example.XLS.containsRow; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +public class ContainsRowTest { + @Test + public void rowContainsCells_all() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, + containsRow("PP028000", + "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", + "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", + "415039******2364", "476956", "281814930")); + } + + @Test + public void rowContainsCells_withGaps() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, containsRow("PP028000")); + assertThat(xls, containsRow("PP028000", "281814930")); + assertThat(xls, containsRow("281814930")); + assertThat(xls, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, not(containsRow("foobar"))); + assertThat(xls, not(containsRow("foobar", "PP028000", "281814930"))); + assertThat(xls, not(containsRow("PP028000", "281814930", "foobar"))); + assertThat(xls, not(containsRow("PP028000", "foobar", "281814930"))); + } + + @Ignore + @Test + public void errorDescription() throws IOException { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsRow("wrong data")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing row \"[wrong data]\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java new file mode 100644 index 000000000..99bc57360 --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java @@ -0,0 +1,96 @@ +package example.matchers.XLS; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; + +import static example.XLS.containsText; +import static example.XLS.doesNotContainText; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.fail; + +public class ContainsTextTest { + @Test + public void canAssertThatXlsContainsText() throws IOException { + XLS XLS = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(XLS, containsText("Выписка")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("25.06.2015 23:09:32")); + + assertThat(XLS, containsText("Счёт")); + assertThat(XLS, containsText("40820810590480000591")); + assertThat(XLS, containsText("Период")); + assertThat(XLS, containsText("18.06.2015 - 18.06.2015")); + assertThat(XLS, containsText("Входящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Дата")); + assertThat(XLS, containsText("Счёт\nплательщика/получателя")); + assertThat(XLS, containsText("Плательщик / Получатель")); + assertThat(XLS, containsText("Операция")); + assertThat(XLS, containsText("Сумма (RUB)")); + + assertThat(XLS, containsText("18.06.2015")); + assertThat(XLS, containsText("40820810590550000146")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("сюда. Интернет-банк")); + assertThat(XLS, containsText("-1.00")); + + assertThat(XLS, containsText("туда. Интернет-банк")); + assertThat(XLS, containsText("1.00")); + + assertThat(XLS, containsText("Исходящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Поступление")); + assertThat(XLS, containsText("Списание")); + assertThat(XLS, containsText("Зарезервировано")); + assertThat(XLS, containsText("349,928.00")); + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + XLS xls = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(xls, doesNotContainText("null")); + } + + @Ignore + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, doesNotContainText("Выписка")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS not containing text \"Выписка\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } + + @Ignore + @Test + public void errorDescriptionForContainsTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsText("wrong text")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing text \"wrong text\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} diff --git a/xls-validate/src/test/resources/statement.ods b/xls-validate/src/test/resources/testdata.ods similarity index 100% rename from xls-validate/src/test/resources/statement.ods rename to xls-validate/src/test/resources/testdata.ods From bd178cbdb6b8534648044aaec19faf022613ca7e Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 21 Jul 2023 17:37:06 -0400 Subject: [PATCH 023/171] intermediate revision - added Docker environment to run upstream required Gragle tests and misc. fixes --- chrome-html2pdf.SAVED/README.md | 4 + chrome-html2pdf.SAVED/pom.xml | 295 ++++ .../pdf/DataCollectorPdfApplication.java | 22 + .../pdf/action/TestController.java | 59 + .../datacollector/pdf/config/PdfPoolnit.java | 102 ++ .../pdf/config/RedisConfiguration.java | 30 + .../datacollector/pdf/config/Test.java | 459 ++++++ .../pdf/config/ThreadPoolConfig.java | 35 + .../datacollector/pdf/service/PDFService.java | 14 + .../pdf/service/impl/PDFImpl.java | 94 ++ .../pdf/task/RedisConsumerTask.java | 69 + .../pdf/task/RedisRollbackTask.java | 77 + .../datacollector/pdf/util/HTML2PDF.java | 184 +++ .../pdf/vo/PDFSessionDetail.java | 34 + .../datacollector/pdf/vo/Result.java | 31 + .../main/resources/application-dev.properties | 35 + .../main/resources/application-pro.properties | 1 + .../resources/application-test.properties | 1 + .../src/main/resources/application.properties | 18 + .../src/main/resources/logback-spring.xml | 112 ++ .../EcgManagerApplicationTests.java | 62 + example-codesignal/jasypt.pl | 43 + .../src/main/java/example/ChartEx.java.SAVED | 133 ++ .../java/example/CommandLineParser.java.SAVED | 87 ++ jodl_stw/natives/linux-amd64 | 1 + jodl_stw/pom.xml.BROKEN | 175 +++ jodl_stw/pom.xml.SAVED | 287 ++++ rrd-cachedb/data/web/badlink.rrd | 1 + rrd-cachedb/data/web/link.rrd | 1 + .../src/main/java/example/App.java.SAVED | 472 +++++++ .../swet_javafx/SwetMainFlowPanel.java.SAVE | 421 ++++++ utils/2 | 1246 +++++++++++++++++ utils/a | 1246 +++++++++++++++++ utils/checksums.sh | 11 + utils/generate_convert.sh | 1 + utils/generate_convert.sh.SAVED | 217 +++ utils/pickproject.sh.SAVED | 12 + utils/rename.sh | 0 utils/rename_ir.sh | 19 + utils/restore_image.sh | 2 +- utils/save_image.sh | 2 +- utils/vnvctl.sh | 1 + xls-validate/Dockerfile | 8 + xls-validate/README.md | 88 +- xls-validate/build.gradle | 23 + xls-validate/gradle.properties | 1 + xls-validate/gradle/compilation.gradle | 6 + xls-validate/gradle/dependencies.gradle | 27 + xls-validate/gradle/publish.gradle | 88 ++ xls-validate/gradle/tests.gradle | 19 + xls-validate/pom.xml | 105 +- .../example/matchers/ODS/ContainsRow.java | 1 - .../example/matchers/ODS/ContainsText.java | 2 - .../java/example/matchers/ODS/ODSMatcher.java | 1 - .../src/test/java/example/CreateOdsTest.java | 15 +- 55 files changed, 6381 insertions(+), 119 deletions(-) create mode 100644 chrome-html2pdf.SAVED/README.md create mode 100644 chrome-html2pdf.SAVED/pom.xml create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisRollbackTask.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java create mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java create mode 100644 chrome-html2pdf.SAVED/src/main/resources/application-dev.properties create mode 100644 chrome-html2pdf.SAVED/src/main/resources/application-pro.properties create mode 100644 chrome-html2pdf.SAVED/src/main/resources/application-test.properties create mode 100644 chrome-html2pdf.SAVED/src/main/resources/application.properties create mode 100644 chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml create mode 100644 chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java create mode 100644 example-codesignal/jasypt.pl create mode 100644 javafx_treeview/src/main/java/example/ChartEx.java.SAVED create mode 100644 javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED create mode 120000 jodl_stw/natives/linux-amd64 create mode 100644 jodl_stw/pom.xml.BROKEN create mode 100644 jodl_stw/pom.xml.SAVED create mode 120000 rrd-cachedb/data/web/badlink.rrd create mode 120000 rrd-cachedb/data/web/link.rrd create mode 100644 rrd-cachedb/src/main/java/example/App.java.SAVED create mode 100644 swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE create mode 100644 utils/2 create mode 100644 utils/a create mode 100755 utils/checksums.sh create mode 100755 utils/generate_convert.sh.SAVED create mode 100755 utils/pickproject.sh.SAVED mode change 100644 => 100755 utils/rename.sh create mode 100755 utils/rename_ir.sh mode change 100644 => 100755 utils/restore_image.sh mode change 100644 => 100755 utils/save_image.sh create mode 100644 xls-validate/Dockerfile create mode 100644 xls-validate/build.gradle create mode 100644 xls-validate/gradle.properties create mode 100644 xls-validate/gradle/compilation.gradle create mode 100644 xls-validate/gradle/dependencies.gradle create mode 100644 xls-validate/gradle/publish.gradle create mode 100644 xls-validate/gradle/tests.gradle diff --git a/chrome-html2pdf.SAVED/README.md b/chrome-html2pdf.SAVED/README.md new file mode 100644 index 000000000..e21a962ff --- /dev/null +++ b/chrome-html2pdf.SAVED/README.md @@ -0,0 +1,4 @@ +### Info + +replica of[cdp4j-chrome-html2pdf](https://github.com/itxwnet/cdp4j-chrome-html2pdf), intend to clear the dependency on `io.webfolder.cdp` +[cdp4j](https://github.com/webfolderio/cdp4j) in favor of pure [selenium 4.x]() or [cdp_webdriver](https://github.com/sergueik/cdp_webdriver) diff --git a/chrome-html2pdf.SAVED/pom.xml b/chrome-html2pdf.SAVED/pom.xml new file mode 100644 index 000000000..f2bdf1a27 --- /dev/null +++ b/chrome-html2pdf.SAVED/pom.xml @@ -0,0 +1,295 @@ + + + 4.0.0 + + com.xz.datacenter.datacollector + data-collector-pdf + 0.0.1-SNAPSHOT + data-collector-pdf + data-collector-pdf + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-data-mongodb + 2.1.0.RELEASE + + + org.mongodb + mongodb-driver + + + + + + org.mongodb + mongo-java-driver + 3.8.0 + + + + + + junit + junit + 4.12 + test + + + + + com.alibaba + fastjson + 1.2.73 + + + + io.webfolder + cdp4j + 3.0.15 + + + + com.vimeo.stag + stag-library + 2.6.0 + provided + true + + + + + com.google.code.gson + gson + 2.8.6 + + + + io.webfolder + wf-exec + 1.0.3 + provided + + + com.neovisionaries + nv-websocket-client + 2.9 + + + + org.asynchttpclient + async-http-client + 2.10.1 + provided + + + org.slf4j + slf4j-api + + + + + + + org.jvnet.winp + winp + 1.28 + + + + + org.java-websocket + Java-WebSocket + 1.4.0 + provided + + + org.slf4j + slf4j-api + + + + + + + org.apache.tomcat + tomcat-websocket + 9.0.24 + provided + + + + org.eclipse.jetty.websocket + websocket-client + 9.4.20.v20190813 + provided + + + io.undertow + undertow-core + 2.0.26.Final + provided + + + org.glassfish.tyrus + tyrus-container-grizzly-client + 1.15 + provided + + + org.apache.tomcat + tomcat-websocket + 9.0.24 + provided + + + org.apache.tomcat + tomcat-api + 9.0.24 + provided + + + org.graalvm.nativeimage + svm + 19.3.0.2 + provided + + + org.java-websocket + Java-WebSocket + 1.4.0 + provided + + + org.slf4j + slf4j-api + + + + + + io.github.kostaskougios + cloning + 1.10.1 + test + + + com.squareup + javapoet + 1.11.1 + test + + + + org.jboss.forge.roaster + roaster-jdt + 2.21.0.Final + provided + + + io.vertx + vertx-core + 4.0.0-milestone4 + provided + + + io.netty + netty-codec-http2 + + + io.netty + netty-resolver-dns + + + io.netty + netty-codec-socks + + + + + + + org.jsoup + jsoup + 1.10.1 + + + + + + + + + + + + + org.java-websocket + Java-WebSocket + 1.4.0 + + + + + + UTF-8 + UTF-8 + 1.8 + ${project.groupId}.${project.artifactId} + + diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java new file mode 100644 index 000000000..891c9c2fa --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java @@ -0,0 +1,22 @@ +package com.xz.datacenter.datacollector.pdf; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + + +@SpringBootApplication(scanBasePackages = "com.xz.datacenter.datacollector") +//@EnableEurekaClient +//@EnableFeignClients(basePackages = "com.xz.datacenter.datacollector") +@EnableAsync +//@EnableOAuth2Client +//@EnableResourceServer +@EnableScheduling +public class DataCollectorPdfApplication { + + public static void main(String[] args) { + SpringApplication.run(DataCollectorPdfApplication.class, args); + } + +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java new file mode 100644 index 000000000..78f5d10d0 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java @@ -0,0 +1,59 @@ +package com.xz.datacenter.datacollector.pdf.action; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @Description: + * @Author: houyong + * @Date: 2020/2/6 + */ +@RestController +public class TestController { + + @Value("${spring.redis.pdfKey}") + private String pictureMsgKey; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private MongoTemplate mongoTemplate; + + @RequestMapping("/testInsertMessage") + public void testInsertMessage(){ + JSONObject msgObj=new JSONObject(); + JSONObject contentObj=new JSONObject(); + contentObj.put("createTime",new Date().getTime()); + + List ossUrlList=new ArrayList(); + ossUrlList.add("http://znxunzhi-marking-pic.oss-cn-shenzhen.aliyuncs.com/430000-32ef33ec854742a3b986bcaada73091e/001/dcf2c7ee-9bb3-40ee-9f63-45fc03c45595/Card-A--25-10.jpg?x-oss-process=image/crop,x_813,y_733,w_854,h_418,g_nw"); + ossUrlList.add("http://znxunzhi-marking-pic.oss-cn-shenzhen.aliyuncs.com/430000-32ef33ec854742a3b986bcaada73091e/001/dcf2c7ee-9bb3-40ee-9f63-45fc03c45595/Card-A--25-10.jpg?x-oss-process=image/crop,x_817,y_88,w_812,h_664,g_nw"); + contentObj.put("oss_url",ossUrlList); + + contentObj.put("projectId","projectId"); + contentObj.put("studentId","studentId"); + contentObj.put("subjectCode","subjectCode"); + contentObj.put("questionNo","questionNo"); + + msgObj.put("messageContent",contentObj); + + mongoTemplate.insert(contentObj,"project_quest"); + + + redisTemplate.opsForList().leftPush(pictureMsgKey, JSON.toJSONString(msgObj)); + + + + } +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java new file mode 100644 index 000000000..c190963de --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java @@ -0,0 +1,102 @@ +package com.xz.datacenter.datacollector.pdf.config; + +import com.xz.datacenter.datacollector.pdf.util.HTML2PDF; +import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; +import io.webfolder.cdp.Launcher; +import io.webfolder.cdp.session.Session; +import io.webfolder.cdp.session.SessionFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.PreDestroy; +import java.util.Date; + +/** + * @Description: + * @Author: houyong + * @Date: 2020/2/21 + */ +@Slf4j +@Component +public class PdfPoolnit implements ApplicationRunner { + + @Value("${pdf.pool.launchSize}") + private int launchSize; + + @Value("${pdf.pool.contextSize}") + private int contextSize; + + @Value("${pdf.pool.sessionSize}") + private int sessionSize; + + @Value("${pdf.tempPath}") + private String tempPath; + + + @PreDestroy + public void destory() { + log.warn("销毁程序-销毁连接池"); + if(!CollectionUtils.isEmpty(HTML2PDF.sessionPool)){ + for(PDFSessionDetail pdfSessionDetail:HTML2PDF.sessionPool){ + try { + if(pdfSessionDetail.getSession()!=null) + pdfSessionDetail.getSession().close(); + } catch (Exception e) { + log.warn("销毁连接失败"); + } + try { + if(pdfSessionDetail.getSessionFactory()!=null) + pdfSessionDetail.getSessionFactory().close(); + } catch (Exception e) { + log.warn("销毁连接失败"); + } + try { + if(pdfSessionDetail.getLauncher()!=null) + pdfSessionDetail.getLauncher().kill(); + } catch (Exception e) { + log.warn("销毁连接失败"); + } + } + + log.warn("销毁程序-完成销毁:"+HTML2PDF.sessionPool.size()); + } + + } + + @Override + public void run(ApplicationArguments args) throws Exception { + Test.test(); + log.warn("###初始化pdf连接池###"); + for(int i=1;i<=launchSize;i++){ + Launcher launcher=HTML2PDF.createLauncher(tempPath+"/"+i); + SessionFactory factory=HTML2PDF.createFactory(launcher); + for(int j=1;j<=contextSize;j++){ + String context=HTML2PDF.createBrowserContext(factory); + for(int k=1;k<=sessionSize;k++){ + Session session=HTML2PDF.createSession(factory,context); + + PDFSessionDetail pdfSessionDetail=new PDFSessionDetail(); + pdfSessionDetail.setHold(false); + pdfSessionDetail.setActive(true); + pdfSessionDetail.setLauncher(launcher); + pdfSessionDetail.setSessionFactory(factory); + pdfSessionDetail.setBrowserContext(context); + pdfSessionDetail.setSession(session); + pdfSessionDetail.setLastHoldDate(new Date()); + session.navigate("http://www.baidu.com"); +// session.waitDocumentReady(); +// session.printToPDF(new File("d:/test.pdf").toPath()); + HTML2PDF.sessionPool.add(pdfSessionDetail); + + } + } + } + + log.warn("###完成初始化pdf连接池###"+HTML2PDF.sessionPool.size()); + + } +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java new file mode 100644 index 000000000..5f1fca1a4 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java @@ -0,0 +1,30 @@ +package com.xz.datacenter.datacollector.pdf.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * @Description: redis + * @Author: houyong + * @Date: 2019/12/11 + */ +@Configuration +public class RedisConfiguration { + @Bean + @ConditionalOnMissingBean(name = "redisTemplate") + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ + RedisTemplate template = new RedisTemplate<>(); + RedisSerializer stringSerializer = new StringRedisSerializer(); + template.setKeySerializer(stringSerializer); + template.setValueSerializer(stringSerializer); + template.setHashKeySerializer(stringSerializer); + template.setHashValueSerializer(stringSerializer); + template.setConnectionFactory(redisConnectionFactory); + return template; + } +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java new file mode 100644 index 000000000..6ba1dd4e3 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java @@ -0,0 +1,459 @@ +package com.xz.datacenter.datacollector.pdf.config; + +import io.webfolder.cdp.Browser; +import io.webfolder.cdp.Options; +import io.webfolder.cdp.WfProcessManager; +import io.webfolder.cdp.channel.ChannelFactory; +import io.webfolder.cdp.exception.CdpException; +import io.webfolder.cdp.session.SessionFactory; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.net.ServerSocket; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + + +public class Test { + //浏览器标签Id + static String targetId=""; + //contextId + static String browserContextId; + //页面sessionId + static String sessionId=""; + //数据流 + static String ioHandle=""; + static String ioData=""; + static boolean ioEof=false; + + public static void main(String[] args) { + + } + + public static void test() { + try { + +// Options options = Options.builder() +// .headless(true) +// .build(); + +// Launcher launcher = new Launcher(options); +// launcher.launch(); + + + String cmdID=Long.toHexString(ThreadLocalRandom.current().nextLong()); + + //命令启动浏览器 + List arguments=new ArrayList<>(); + String os = System.getProperty("os.name"); + if(os.toLowerCase().startsWith("windows")){ + arguments.add("C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"); + }else if(os.toLowerCase().startsWith("linux")){ + arguments.add("google-chrome"); + } + arguments.add("--disable-features=TranslateUI"); + arguments.add("--disable-extensions"); + arguments.add("--disable-background-networking"); + arguments.add("--safebrowsing-disable-auto-update"); + arguments.add("--disable-sync"); + arguments.add("--metrics-recording-only"); + arguments.add("--disable-default-apps"); + arguments.add("--mute-audio"); + arguments.add("--no-first-run"); + arguments.add("--no-default-browser-check"); + arguments.add("--disable-plugin-power-saver"); + arguments.add("--disable-popup-blocking"); + arguments.add("--remote-debugging-port=0"); + arguments.add("--user-data-dir=d:\\chromeHome\\2"); + arguments.add("--headless"); + //arguments.add("--cdp4jId="+cmdID); + //arguments.add("--disable-gpu"); + // arguments.add("--enable-automation"); + + Options options = Options.builder() + .headless(true) + .userDataDir(new File("d:/chromeHome/2").toPath()) + .build(); + Launcher launcher = new Launcher(options); + launcher.launch(arguments); + //launchWithProcessBuilder(arguments,options,launcher); + + URI socketUri=null; + + + //Process process=Runtime.getRuntime().exec(String.join(" ",arguments)); + ProcessBuilder builder = new ProcessBuilder(arguments); + builder.environment().put("CDP4J_ID",cmdID); + + Process process=builder.start(); + + + Scanner scanner = new Scanner(process.getErrorStream()); + while (scanner.hasNext()){ + String line = scanner.nextLine().trim(); + if (!line.isEmpty() && line.toLowerCase().startsWith("devtools listening on")) { + int start = line.indexOf("ws://"); + socketUri = new URI(line.substring(start, line.length())); + break; + } + } + scanner.close(); + + + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + + +} + + + + + + + + + class Launcher { + private static final boolean JAVA_8 = System.getProperty("java.version").startsWith("1.8."); + private static final String OS_NAME; + private static final boolean WINDOWS; + private static final boolean OSX; + private final Options options; + private final ChannelFactory channelFactory; + + public Launcher(Options options, ChannelFactory channelFactory) { + this.options = options; + this.channelFactory = channelFactory; + } + + public Launcher(ChannelFactory channelFactory) { + this(Options.builder().build(), channelFactory); + } + + public Launcher(Options options) { + this(options, createChannelFactory()); + } + + public Launcher() { + this(Options.builder().build(), createChannelFactory()); + } + + protected String findChrome() { + String executablePath = this.options.browserExecutablePath(); + if (executablePath != null && !executablePath.trim().isEmpty()) { + return executablePath; + } else if (WINDOWS) { + return this.findChromeWinPath(); + } else { + return OSX ? this.findChromeOsxPath() : "google-chrome"; + } + } + + protected String findChromeWinPath() { + try { + Iterator var1 = this.getChromeWinPaths().iterator(); + + InputStream is; + String var8; + while(true) { + Process process; + int exitCode; + do { + if (!var1.hasNext()) { + return null; + } + + String path = (String)var1.next(); + process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", "echo", path}); + exitCode = process.waitFor(); + } while(exitCode != 0); + + is = process.getInputStream(); + + try { + String location = this.toString(is).trim().replace("\"", ""); + File chrome = new File(location); + if (chrome.exists() && chrome.canExecute()) { + var8 = chrome.toString(); + break; + } + } catch (Throwable var10) { + if (is != null) { + try { + is.close(); + } catch (Throwable var9) { + var10.addSuppressed(var9); + } + } + + throw var10; + } + + if (is != null) { + is.close(); + } + } + + if (is != null) { + is.close(); + } + + return var8; + } catch (Throwable var11) { + return null; + } + } + + public boolean isChromeInstalled() { + return this.findChrome() != null; + } + + protected List getChromeWinPaths() { + Browser browser = this.options.getBrowser(); + List prefixes = Arrays.asList("%localappdata%", "%programfiles%", "%programfiles(x86)%"); + List suffixes = Collections.emptyList(); + switch(browser) { + case Any: + suffixes = Arrays.asList("\\Google\\Chrome Dev\\Application\\chrome.exe", "\\Google\\Chrome SxS\\Application\\chrome.exe", "\\Google\\Chrome\\Application\\chrome.exe", "\\Microsoft\\Edge\\Application\\msedge.exe"); + case Chrome: + default: + suffixes = Arrays.asList("\\Google\\Chrome\\Application\\chrome.exe"); + break; + case ChromeCanary: + suffixes = Arrays.asList("\\Google\\Chrome SxS\\Application\\chrome.exe"); + break; + case ChromeDev: + suffixes = Arrays.asList("\\\\Google\\\\Chrome Dev\\\\Application\\\\chrome.exe"); + break; + case MicrosoftEdge: + suffixes = Arrays.asList("\\Microsoft\\Edge\\Application\\msedge.exe"); + } + + List installations = new ArrayList(prefixes.size() * suffixes.size()); + Iterator var5 = prefixes.iterator(); + + while(var5.hasNext()) { + String prefix = (String)var5.next(); + Iterator var7 = suffixes.iterator(); + + while(var7.hasNext()) { + String suffix = (String)var7.next(); + installations.add(prefix + suffix); + } + } + + return installations; + } + + protected String findChromeOsxPath() { + Iterator var1 = this.getChromeOsxPaths().iterator(); + + File chrome; + do { + if (!var1.hasNext()) { + return null; + } + + String path = (String)var1.next(); + chrome = new File(path); + } while(!chrome.exists() || !chrome.canExecute()); + + return chrome.toString(); + } + + protected List getChromeOsxPaths() { + return Arrays.asList("/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary", "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"); + } + + protected List getCommonParameters(String chromeExecutablePath, List arguments) { + List list = new ArrayList(); + list.add(chromeExecutablePath); + list.add("--disable-features=TranslateUI"); + list.add("--disable-extensions"); + list.add("--disable-background-networking"); + list.add("--safebrowsing-disable-auto-update"); + list.add("--disable-sync"); + list.add("--metrics-recording-only"); + list.add("--disable-default-apps"); + list.add("--mute-audio"); + list.add("--no-first-run"); + list.add("--no-default-browser-check"); + list.add("--disable-plugin-power-saver"); + list.add("--disable-popup-blocking"); + if (!arguments.isEmpty()) { + list.addAll(arguments); + } + + return list; + } + + protected String toString(InputStream is) { + Scanner scanner = new Scanner(is); + + String var3; + try { + scanner.useDelimiter("\\A"); + var3 = scanner.hasNext() ? scanner.next() : ""; + } catch (Throwable var6) { + try { + scanner.close(); + } catch (Throwable var5) { + var6.addSuppressed(var5); + } + + throw var6; + } + + scanner.close(); + return var3; + } + + public SessionFactory launch(List argument) { + //launchWithProcessBuilder(arguments); + List arguments = this.getCommonParameters(this.findChrome(), this.options.arguments()); + if (arguments.contains("--remote-debugging-pipe")) { + arguments.remove("--remote-debugging-port=0"); + } else { + arguments.add("--remote-debugging-port=0"); + } + + Path userDataDir = this.options.userDataDir(); + if (this.options.userDataDir() == null) { + userDataDir = Paths.get(System.getProperty("java.io.tmpdir")).resolve("remote-profile"); + } + + arguments.add(String.format("--user-data-dir=%s", userDataDir.toString())); + boolean inUse = this.isInUse(userDataDir); + if (inUse) { + throw new CdpException("--user-data-dir [" + userDataDir.toString() + "] is used by another process."); + } else { + if (this.options.headless()) { + arguments.add("--headless"); + } + + SessionFactory factory = null; + switch(this.options.processExecutor()) { + case ProcessBuilder: + factory = this.launchWithProcessBuilder(argument); + break; + case WfExec: + if (!WINDOWS) { + throw new CdpException("WfExec supports only Windows."); + } + + if (!(this.options.processManager() instanceof WfProcessManager)) { + throw new CdpException("WfExec supports only WfProcessManager."); + } + + //factory = WfExecLauncher.launchWithWfExec(this.options, this.channelFactory, arguments); + } + + //return factory; + } + return null; + } + + private boolean isInUse(Path userDataDir) { + Path devToolsActivePort = userDataDir.resolve("DevToolsActivePort"); + if (Files.exists(devToolsActivePort, new LinkOption[0])) { + List lines = Collections.emptyList(); + + try { + lines = Files.readAllLines(devToolsActivePort); + } catch (IOException var11) { + throw new CdpException(var11); + } + + if (lines.size() >= 1) { + int port = Integer.parseInt((String)lines.get(0)); + if (port > 0) { + try { + ServerSocket ignored = new ServerSocket(port); + + boolean var6; + try { + var6 = false; + } catch (Throwable var9) { + try { + ignored.close(); + } catch (Throwable var8) { + var9.addSuppressed(var8); + } + + throw var9; + } + + ignored.close(); + return var6; + } catch (IOException var10) { + return true; + } + } + } + } + + return false; + } + + private SessionFactory launchWithProcessBuilder(List arguments) { + ProcessBuilder builder = new ProcessBuilder(arguments); + try { + Process process = builder.start(); + Scanner scanner = new Scanner(process.getErrorStream()); + + while(scanner.hasNext()) { + String line = scanner.nextLine().trim(); + if (!line.isEmpty() && line.toLowerCase(Locale.ENGLISH).startsWith("devtools listening on")) { + break; + } + } + } catch (IOException var11) { + throw new CdpException(var11); + } + + return null; + } + + protected static ChannelFactory createChannelFactory() { + try { + Class klass = null; + if (!JAVA_8) { + klass = io.webfolder.cdp.Launcher.class.getClassLoader().loadClass("io.webfolder.cdp.channel.JreWebSocketFactory"); + } else { + klass = io.webfolder.cdp.Launcher.class.getClassLoader().loadClass("io.webfolder.cdp.channel.NvWebSocketFactory"); + } + + Constructor constructor = klass.getConstructor(); + return (ChannelFactory)constructor.newInstance(); + } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException | ClassNotFoundException var2) { + throw new CdpException(var2); + } + } + + public boolean kill() { + return this.options.processManager().kill(); + } + + public Options getOptions() { + return this.options; + } + + static { + OS_NAME = System.getProperty("os.name").toLowerCase(Locale.ENGLISH); + WINDOWS = OS_NAME.startsWith("windows"); + OSX = OS_NAME.startsWith("mac"); + } +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java new file mode 100644 index 000000000..3c3d400bd --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java @@ -0,0 +1,35 @@ +package com.xz.datacenter.datacollector.pdf.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * @Description: + * @Author: houyong + * @Date: 2019/12/27 + */ +@Configuration +public class ThreadPoolConfig { + + @Value("${spring.task.execution.pool.core-size}") + private Integer corePoolSize; + + @Value("${spring.task.execution.pool.max-size}") + private Integer maxPoolSize; + + @Bean("executorPool") + public Executor executorPool() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(corePoolSize); + //taskExecutor.setMaxPoolSize(maxPoolSize); + //taskExecutor.setQueueCapacity(20000); + taskExecutor.setThreadNamePrefix("donwnTask"); + taskExecutor.initialize(); + + return taskExecutor; + } +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java new file mode 100644 index 000000000..049a3fbeb --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java @@ -0,0 +1,14 @@ +package com.xz.datacenter.datacollector.pdf.service; + +import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; + +/** + * @Description: + * @Author: houyong + * @Date: 2020/2/4 + */ +public interface PDFService { + + void generatePDF(PDFSessionDetail pdfSessionDetail, String value); + +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java new file mode 100644 index 000000000..f65b46f50 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java @@ -0,0 +1,94 @@ +package com.xz.datacenter.datacollector.pdf.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.xz.datacenter.datacollector.pdf.service.PDFService; +import com.xz.datacenter.datacollector.pdf.util.HTML2PDF; +import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; +import com.xz.datacenter.datacollector.pdf.vo.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: + * @Author: houyong + * @Date: 2020/2/4 + */ +@Slf4j +@Service +public class PDFImpl implements PDFService { + + + @Value("${pdf.pdfWrongServer}") + private String pdfWrongServer; + + @Value("${pdf.storagePath}") + private String storagePath; + + @Value("${spring.redis.pdfCallbackKey}") + private String pdfCallbackKey; + + @Value("${spring.redis.pdfRollbackKey}") + private String pdfRollbackKey; + + @Autowired + private RedisTemplate redisTemplate; + + @Override + @Async("executorPool") + public void generatePDF(PDFSessionDetail pdfSessionDetail, String value) { + + JSONObject msgJson= JSON.parseObject(value); + + String projectId=msgJson.getString("projectId"); + String studentId=msgJson.getString("studentId"); + String subjectId=msgJson.getString("subjectId"); + String schoolId=msgJson.getString("schoolId"); + String classId=msgJson.getString("classId"); + String errorBookName=msgJson.getString("errorBookName"); + String schoolName=msgJson.getString("schoolId"); + String className=msgJson.getString("className"); + String studentName=msgJson.getString("studentName"); + String subjectName=msgJson.getString("subjectName"); + + + String url = String.format(pdfWrongServer, projectId, subjectId, studentId); + + + String relationDir=projectId+"/"+schoolId+"/"+classId; + String filePath=storagePath+"/"+relationDir; + File pathFile=new File(filePath); + if(!pathFile.exists())pathFile.mkdirs(); + String fileName=errorBookName+"_"+schoolName+"_"+className+"_"+studentName+"_"+subjectName+".pdf"; + + String fullPath=filePath+"/"+fileName; + String relationPath=relationDir+"/"+fileName; + + Map map=new HashMap<>(); + log.warn("访问pdf服务:"+url); + Result result=HTML2PDF.html2Pdf(pdfSessionDetail.getSession(),url,fullPath); + log.warn("完成pdf:"+fullPath); + HTML2PDF.releaseSession(pdfSessionDetail); + + //完成后回调消息 + msgJson.put("success",result.isSuccess()); + msgJson.put("failure",!result.isSuccess()); + msgJson.put("filePath",result.isSuccess()?relationPath:""); + msgJson.put("code",result.getCode()); + msgJson.put("description",result.getMessage()); + + redisTemplate.opsForList().leftPush(pdfCallbackKey,JSON.toJSONString(msgJson)); + + //生成完成删除回滚中的消息 + redisTemplate.opsForList().remove(pdfRollbackKey,0,value); + } + +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java new file mode 100644 index 000000000..71f0b7a0f --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java @@ -0,0 +1,69 @@ +package com.xz.datacenter.datacollector.pdf.task; + +// import com.xz.ajiaedu.common.lang.StringUtil; +import com.xz.datacenter.datacollector.pdf.service.PDFService; +import com.xz.datacenter.datacollector.pdf.util.HTML2PDF; +import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @Description:下载任务消费定时任务 + * @Author: houyong + * @Date: 2019/12/26 + */ + +@Slf4j +@Component +public class RedisConsumerTask extends Thread { + + @Value("${spring.redis.pdfKey}") + private String pdfKey; + + @Value("${spring.redis.pdfRollbackKey}") + private String pdfRollbackKey; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private PDFService pdfService; + + @Scheduled(fixedDelayString = "${pdf.redis.consumer.interval}") + public void consumerTask(){ + try { + long msgSize=redisTemplate.opsForList().size(pdfKey); + if(msgSize>0){ + for(int i=0;i redisTemplate; + + @Scheduled(fixedDelayString = "${pdf.redis.consumer.rollback.interval}") + public void callbackTask(){ + try { + List list=redisTemplate.opsForList().range(pdfRollbackKey,0,-1); + long currentTime=new Date().getTime(); + log.debug("检查超时队列总数:"+(list!=null?list.size():0)+",时间"+currentTime); + if(!CollectionUtils.isEmpty(list)){ + for(Object obj:list){ + if(obj!=null&& StringUtil.isNotEmpty(obj.toString())){ + JSONObject msgObj= JSON.parseObject(obj.toString()); + long createTime=msgObj.getLong("createTime"); + if(currentTime-createTime>timeoutMillisecond){ + log.debug("检查到超时的消息:"+obj.toString()); + //检查重试次数 超过3次直接丢弃 + int retryTimes=msgObj.getIntValue("retryTimes"); + retryTimes=retryTimes<0?0:retryTimes; + retryTimes++; + if(retryTimes<=3){ + msgObj.put("retryTimes",retryTimes); + redisTemplate.opsForList().leftPush(pdfKey,JSON.toJSONString(msgObj)); + } + redisTemplate.opsForList().remove(pdfRollbackKey,0,obj); + + } + } + } + + } + + + } catch (Exception e) { + log.error(e.getMessage(),e); + } + + + } + + +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java new file mode 100644 index 000000000..6f863b9de --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java @@ -0,0 +1,184 @@ +package com.xz.datacenter.datacollector.pdf.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; +import com.xz.datacenter.datacollector.pdf.vo.Result; +import io.webfolder.cdp.Launcher; +import io.webfolder.cdp.Options; +import io.webfolder.cdp.command.IO; +import io.webfolder.cdp.session.Session; +import io.webfolder.cdp.session.SessionFactory; +import io.webfolder.cdp.type.io.ReadResult; +import io.webfolder.cdp.type.page.PrintToPDFResult; +import lombok.extern.slf4j.Slf4j; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.springframework.util.CollectionUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Date; +import java.util.Vector; + +import static io.webfolder.cdp.type.constant.PdfTransferMode.ReturnAsStream; +import static java.util.Base64.getDecoder; + +/** + * @Description: + * @Author: houyong + * @Date: 2020/2/19 + */ +@Slf4j +public class HTML2PDF { + public static int c=0; + + public static Vector sessionPool=new Vector(); + + public synchronized static PDFSessionDetail useSession(){ + PDFSessionDetail returnSession=null; + if(!CollectionUtils.isEmpty(sessionPool)) + for(PDFSessionDetail pdfSessionDetail:sessionPool){ + if(!pdfSessionDetail.isHold()&&pdfSessionDetail.isActive()){ + pdfSessionDetail.setHold(true); + pdfSessionDetail.setLastHoldDate(new Date()); + pdfSessionDetail.setHoldTimes(pdfSessionDetail.getHoldTimes()+1); + returnSession=pdfSessionDetail; + break; + } + } + return returnSession; + } + + public static void releaseSession(PDFSessionDetail pdfSessionDetail){ + if(pdfSessionDetail!=null){ + if(pdfSessionDetail.getHoldTimes()>100){ + log.warn("切换session"); + Session session=pdfSessionDetail.getSession(); + session.close(); + session=null; + pdfSessionDetail.setSession(null); + + Session newSession=createSession(pdfSessionDetail.getSessionFactory(),pdfSessionDetail.getBrowserContext()); + pdfSessionDetail.setSession(newSession); + pdfSessionDetail.setHoldTimes(0); + } + pdfSessionDetail.setHold(false); + } + } + + public static Session createSession(SessionFactory factory ,String context){ + return factory.create(context); + } + + public static String createBrowserContext(SessionFactory factory){ + return factory.createBrowserContext(); + } + + public static Launcher createLauncher(String tempPath){ + File tempFile =new File(tempPath); + if(tempFile.exists()){ + deleteDirectoryContent(tempFile); + }; + + Options options = Options.builder() + .headless(true) + .userDataDir(tempFile.toPath()) + .build(); + + Launcher launcher = new Launcher(options); + return launcher; + + } + + public static SessionFactory createFactory(Launcher launcher){ + return launcher.launch(); + } + + + public static Result html2Pdf(Session session, String url, String path) { + FileOutputStream out=null; + IO io=null; + String stream=null; + try { + log.warn("开始访问"); + session.navigate(url); + session.waitDocumentReady(); + String html=session.getContent(); + Document doc= Jsoup.parse(html); + String str=doc.body().text(); + + JSONObject errObject=null; + try { + if(str.contains("statusCode")) + errObject= JSON.parseObject(str); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + + + + if(errObject!=null&&errObject.containsKey("statusCode")){ + return Result.failure(errObject.getString("statusCode"),errObject.getString("error")); + }else { + log.warn("完成文档渲染-开始打印PDF"); + PrintToPDFResult result = session.getCommand().getPage().printToPDF(null, null, + true, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, ReturnAsStream); + + io = session.getCommand().getIO(); + stream = result.getStream(); + + out = new FileOutputStream(path); + + boolean eof = false; + while (!eof) { + ReadResult streamResult = io.read(stream); + eof = streamResult.getEof(); + if (streamResult.getBase64Encoded()) { + if (streamResult.getData() != null && + !streamResult.getData().isEmpty()) { + byte[] content = getDecoder().decode(streamResult.getData()); + out.write(content); + } + } else { + return Result.failure("-9","编码错误:Inavlid content encoding: it must be base64"); + } + } + result = null; + return Result.sucess("0",null); + } + } catch (Throwable e) { + log.error(e.getMessage(),e); + return Result.failure("-10","未知错误:"+e.getMessage()); + } finally { + try { + out.flush(); + out.close(); + io.close(stream); + } catch (IOException e) { + log.error(e.getMessage(),e); + } + } + } + + + public static void deleteDirectoryContent(File file){ + File[] list = file.listFiles(); + for (File f:list){ + if (f.isDirectory()){ + deleteDirectoryContent(new File(f.getPath())); + }else{ + f.delete(); + } + } + file.delete(); + }; + +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java new file mode 100644 index 000000000..1e913f040 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java @@ -0,0 +1,34 @@ +package com.xz.datacenter.datacollector.pdf.vo; + +import io.webfolder.cdp.Launcher; +import io.webfolder.cdp.session.Session; +import io.webfolder.cdp.session.SessionFactory; +import lombok.Data; + +import java.util.Date; + +/** + * @Description: + * @Author: houyong + * @Date: 2020/2/21 + */ +@Data +public class PDFSessionDetail { + + boolean isHold; + + boolean isActive; + + SessionFactory sessionFactory; + + Launcher launcher; + + String browserContext; + + Session session; + + Date lastHoldDate; + + int holdTimes=0; + +} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java new file mode 100644 index 000000000..ed4a3224e --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java @@ -0,0 +1,31 @@ +package com.xz.datacenter.datacollector.pdf.vo; + +import lombok.Data; + +/** + * @Description: + * @Author: houyong + * @Date: 2020/3/9 + */ +@Data +public class Result { + boolean success; + String message; + String code; + + public static Result sucess(String code,String msg){ + Result r=new Result(); + r.setSuccess(true); + r.setCode(code); + r.setMessage(msg); + return r; + } + + public static Result failure(String code,String msg){ + Result r=new Result(); + r.setSuccess(false); + r.setCode(code); + r.setMessage(msg); + return r; + } +} diff --git a/chrome-html2pdf.SAVED/src/main/resources/application-dev.properties b/chrome-html2pdf.SAVED/src/main/resources/application-dev.properties new file mode 100644 index 000000000..48cdfc1e2 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/resources/application-dev.properties @@ -0,0 +1,35 @@ +server.port=8802 + +pdf.tempPath=d:/pdfTest +pdf.storagePath=d:/pdfTest + +pdf.pdfWrongServer= + +spring.redis.pdfKey=pdfTask +spring.redis.pdfRollbackKey=pdfRollbackTask +spring.redis.pdfCallbackKey=pdfCallbackKey + +pdf.pool.launchSize=1 +pdf.pool.contextSize=1 +pdf.pool.sessionSize=1 + +pdf.redis.consumer.interval=2000 +pdf.redis.consumer.rollback.interval=10000 +pdf.redis.consumer.rollback.timeout=60000 + +spring.task.execution.pool.core-size=6 +spring.task.execution.pool.max-size=10 + +#redis +spring.redis.host= +spring.redis.port=6379 +spring.redis.password= + + + + + + + + + diff --git a/chrome-html2pdf.SAVED/src/main/resources/application-pro.properties b/chrome-html2pdf.SAVED/src/main/resources/application-pro.properties new file mode 100644 index 000000000..d3f5a12fa --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/resources/application-pro.properties @@ -0,0 +1 @@ + diff --git a/chrome-html2pdf.SAVED/src/main/resources/application-test.properties b/chrome-html2pdf.SAVED/src/main/resources/application-test.properties new file mode 100644 index 000000000..d3f5a12fa --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/resources/application-test.properties @@ -0,0 +1 @@ + diff --git a/chrome-html2pdf.SAVED/src/main/resources/application.properties b/chrome-html2pdf.SAVED/src/main/resources/application.properties new file mode 100644 index 000000000..ed9373e7a --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/resources/application.properties @@ -0,0 +1,18 @@ +spring.profiles.active=dev + +spring.application.name=data-collector-pdf + +#eureka.client.fetch-registry=true +# +#server.tomcat.max-http-post-size=-1 +# +#ribbon.ReadTimeout=60000 +#ribbon.ConnectTimeout=60000 +#ribbon.MaxAutoRetries=0 +#ribbon.MaxAutoRetriesNextServer=1 +# +#spring.main.allow-bean-definition-overriding=true +# +#security.oauth2.client.grant-type=client_credentials +#security.oauth2.client.client-id=cloud_client +#security.oauth2.client.client-secret=znxzDatacenterClient888 \ No newline at end of file diff --git a/chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml b/chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..986911767 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + ${log.pattern} + + + + + + + ${log.path}/downloader-info.log + + + + ${log.path}/downloader-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + INFO + + + + + + + + ${log.path}/downloader-warn.log + + + + ${log.path}/downloader-warn.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + WARN + + ACCEPT + + DENY + + + + + + + ${log.path}/downloader-error.log + + + + ${log.path}/downloader-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java b/chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java new file mode 100644 index 000000000..42186de34 --- /dev/null +++ b/chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java @@ -0,0 +1,62 @@ +package com.xz.datacenter.datacollector.downloader; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.UUID; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +@Slf4j +class EcgManagerApplicationTests { + + @Autowired + private RedisTemplate redisTemplate; + + + @Test + void redisTest(){ + + for(int i=0;i<100000;i++){ + String value= UUID.randomUUID()+"|"+UUID.randomUUID()+"|"+UUID.randomUUID(); + redisTemplate.opsForList().leftPush("pdfTask",value); + + } + + + + +// try { +// while (true){ +// Thread.sleep(100); +// +// for(int i=0;i<100;i++){ +// new Thread(new Runnable() { +// @Override +// public void run() { +// long a=new Date().getTime(); +// Object o=redisTemplate.opsForValue().get("a"); +// redisTemplate.opsForValue().set("a",a+""); +// System.out.println(o); +// long b=new Date().getTime(); +// log.warn("完成:"+(b-a)); +// } +// }).start(); +// } +// +// +// } +// +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + + } + + +} diff --git a/example-codesignal/jasypt.pl b/example-codesignal/jasypt.pl new file mode 100644 index 000000000..681bafd07 --- /dev/null +++ b/example-codesignal/jasypt.pl @@ -0,0 +1,43 @@ +use Crypt::PBE qw(:jce); +use MIME::Base64; +use Getopt::Long; + +my $value = 'password'; +my $secret = 'secret'; +my $debug = undef; +my $operation = 'decrypt'; + +GetOptions( + 'value=s' => \$value, + 'debug' => \$debug, + 'secret=s' => \$secret, + 'operation=s' => \$operation, + +); + +# jasypt_encryptor_password +my $password = $secret; +my $pbe = PBEWithMD5AndDES($password); + +# NOTE: can only use the JCE_PBE_ALGORITHMS that are known to Crypt::PBE.pm +# see +# jasypt.encryptor.algorithm = PBEWithMD5AndDES +if ( $operation =~ /encrypt/ ) { + my $encrypted = $pbe->encrypt( $value, 1000 ); + # NOTE: Base64 encrypted data + + $encoded = encode_base64($encrypted); + print $encoded, $/; + # NOTE: occasionally produce values like '+i8WOMARx/Jmn4uOFn2yEA==' + if ($debug) { + print $pbe->decrypt($encrypted), $/; + } +} else { + # TODO: occasionally see + # input must be 8 bytes long at /usr/local/lib/x86_64-linux-gnu/perl/5.26.1/Crypt/DES.pm line 65 + my $encrypted = decode_base64($value); + if ($debug) { + print $value, $/; + } + print $pbe->decrypt($encrypted), $/; +} diff --git a/javafx_treeview/src/main/java/example/ChartEx.java.SAVED b/javafx_treeview/src/main/java/example/ChartEx.java.SAVED new file mode 100644 index 000000000..975465473 --- /dev/null +++ b/javafx_treeview/src/main/java/example/ChartEx.java.SAVED @@ -0,0 +1,133 @@ +package example; + +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +// import org.apache.commons.cli.CommandLine; +// import org.apache.commons.cli.CommandLineParser; +// import org.apache.commons.cli.DefaultParser; +// import org.apache.commons.cli.Options; +// import org.apache.commons.cli.ParseException; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVRecord; + +import example.TreeViewSample.Employee; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.chart.LineChart; +import javafx.scene.chart.NumberAxis; +import javafx.scene.chart.XYChart; +import javafx.scene.control.TreeItem; +import javafx.stage.Stage; + +import example.CommandLineParser; + +// import org.apache.common.commons-csv.*; +// https://www.baeldung.com/apache-commons-csv +/** + * based on Oracle's example at + * https://docs.oracle.com/javafx/2/charts/line-chart.htm#CIHGBCFI + */ + +@SuppressWarnings("restriction") +public class ChartEx extends Application { + private static String[] HEADERS = { "column1", "column2" }; + // problamatic with JDK 11 + // private static CommandLineParser commandLineparser = new DefaultParser(); + // private static CommandLine commandLine = null; + // private final static Options options = new Options(); + private final static List> data = new ArrayList<>(); + private static CommandLineParser commandLineParser; + private static String resource = "data.csv"; + + public static void main(String[] args) { + // options.addOption("h", "help", false, "Help"); + // options.addOption("d", "debug", false, "Debug"); + // options.addOption("r", "resource", true, "Resource"); + commandLineParser = new CommandLineParser(); + commandLineParser.saveFlagValue("resource"); + + commandLineParser.parse(args); + + try { + // commandLine = commandLineparser.parse(options, args); + resource = commandLineParser.getFlagValue("resource"); + // String resource = commandLine.getOptionValue("resource"); + if (resource == null) { + System.err.println("Missing required argument: resource"); + return; + } + + Reader in; + Iterable records; + in = new FileReader(resource); + records = CSVFormat.DEFAULT.withHeader(HEADERS).parse(in); + for (CSVRecord record : records) { + String columnOne = record.get("column1"); + String columnTwo = record.get("column2"); + List row = new ArrayList<>(); + row.add(Float.parseFloat(columnOne)); + row.add(Float.parseFloat(columnTwo)); + data.add(row); + } + in.close(); + data.clear(); + in = new FileReader("data.csv"); + records = CSVFormat.DEFAULT.parse(in); + for (CSVRecord record : records) { + String columnOne = record.get(0); + String columnTwo = record.get(1); + List row = new ArrayList<>(); + row.add(Float.parseFloat(columnOne)); + row.add(Float.parseFloat(columnTwo)); + data.add(row); + } + System.err.println("data: " + data); + launch(args); + // } catch (ParseException e) { + } catch (IOException e) { + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void start(Stage stage) { + + stage.setTitle("Line Chart Sample"); + // defining the axes + final NumberAxis xAxis = new NumberAxis(); + final NumberAxis yAxis = new NumberAxis(); + xAxis.setLabel("Time"); + // creating the chart + final LineChart lineChart = new LineChart<>(xAxis, yAxis); + + lineChart.setTitle("Chart"); + XYChart.Series series = new XYChart.Series(); + series.setName("Load Average"); + for (int cnt = 0; cnt != data.size(); cnt++) { + List row = data.get(cnt); + series.getData().add(new XYChart.Data(cnt, row.get(0))); + } + + XYChart.Series series1 = new XYChart.Series(); + series1.setName("Status"); + for (int cnt = 0; cnt != data.size(); cnt++) { + List row = data.get(cnt); + series1.getData().add(new XYChart.Data(cnt, row.get(1))); + } + + Scene scene = new Scene(lineChart, 800, 600); + lineChart.getData().add(series); + lineChart.getData().add(series1); + + stage.setScene(scene); + stage.show(); + } + + public static void help() { + System.exit(1); + } +} \ No newline at end of file diff --git a/javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED b/javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED new file mode 100644 index 000000000..8cfcd96fe --- /dev/null +++ b/javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED @@ -0,0 +1,87 @@ +package example; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +// origin: +// 50b3627fa1204747ccd871eac876ecdab80d0da9 +// https://github.com/sergueik/selenium_java/blob/master/xslt-example/src/main/java/example/CommandLineParser.java +// based on: http://www.java2s.com/Code/Java/Development-Class/ArepresentationofthecommandlineargumentspassedtoaJavaclassmainStringmethod.htm +// see also: +// https://github.com/freehep/freehep-argv/blob/master/src/main/java/org/freehep/util/argv/ArgumentParser.java + +public class CommandLineParser { + // non-flag values + private String[] arguments = null; + + public String[] getArguments() { + return arguments; + } + + private Map _flags = new HashMap<>(); + + // + // the flag values that are expected to be followed with a value + // that allows the application to process the flag. + // + private Set _flagsWithValues = new HashSet<>(); + + public Set getFlags() { + Set result = _flags.keySet(); + return result; + } + + public String getFlagValue(String flagName) { + return (String) _flags.get(flagName); + } + + public int getNumberOfArguments() { + return arguments.length; + } + + public int getNumberOfFlags() { + return _flags.size(); + } + + public boolean hasFlag(String flagName) { + return _flags.containsKey(flagName); + } + + // contains no constructor nor logic to discover unknown flags + public void parse(String[] args) { + List regularArgs = new ArrayList<>(); + + for (int n = 0; n < args.length; ++n) { + if (args[n].charAt(0) == '-') { + String name = args[n].replaceFirst("-", ""); + String value = null; + // remove the dash + + System.err.println("Examine: " + name); + if (_flagsWithValues.contains(name) && n < args.length - 1) { + value = args[++n]; + System.err.println("Collect value for: " + name + " = " + value); + } else { + + System.err.println("Ignore the value for " + name); + + } + + _flags.put(name, value); + } + + else + regularArgs.add(args[n]); + } + + arguments = (String[]) regularArgs.toArray(new String[regularArgs.size()]); + } + + public void saveFlagValue(String flagName) { + _flagsWithValues.add(flagName); + } +} diff --git a/jodl_stw/natives/linux-amd64 b/jodl_stw/natives/linux-amd64 new file mode 120000 index 000000000..227a368ae --- /dev/null +++ b/jodl_stw/natives/linux-amd64 @@ -0,0 +1 @@ +/home/sergueik/src/selenium_java/jodl_stw/jogamp-all-platforms/lib/linux-amd64/ \ No newline at end of file diff --git a/jodl_stw/pom.xml.BROKEN b/jodl_stw/pom.xml.BROKEN new file mode 100644 index 000000000..52f55f7fa --- /dev/null +++ b/jodl_stw/pom.xml.BROKEN @@ -0,0 +1,175 @@ + + + 4.0.0 + org.example + test + 1.0.0 + 2008 + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + UTF-8 + 1.8 + 3.6.1 + 1.8 + 2.20 + 3.0.2 + 2.6 + 1.8 + + + + + + + com.github.kotlin-graphics + glm + f63d840cde + compile + + + + + com.github.kotlin-graphics + uno-sdk + v0.7.4 + compile + + + + one.util + streamex + 0.6.5 + compile + + + org.jogamp.gluegen + gluegen-rt-main + 2.3.2 + compile + + + org.jogamp.jogl + jogl-all-main + 2.3.2 + compile + + + + + imagej + http://maven.imagej.net/content/repositories/public + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + maven-central + maven central repo + https://mvnrepository.com/repos/central + + + osgeo + osgeo repo + http://download.osgeo.org/webdav/geotools/ + + + seasar + seasar repo + https://www.seasar.org/maven/maven2 + + + jcenter + https://jcenter.bintray.com/ + + + swt-repo + https://swt-repo.googlecode.com/svn/repo/ + + + central + http://central.maven.org/maven2/ + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + ${project.groupId}.${mainClass} + true + true + + + + + + + diff --git a/jodl_stw/pom.xml.SAVED b/jodl_stw/pom.xml.SAVED new file mode 100644 index 000000000..721c84dc3 --- /dev/null +++ b/jodl_stw/pom.xml.SAVED @@ -0,0 +1,287 @@ + + + 4.0.0 + example + canvasex + 0.0.1-SNAPSHOT + jar + ${project.groupId}:${project.artifactId} + + + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + + + + + CanvasEx + UTF-8 + 1.10 + 1.3 + 2.5 + 3.3.1 + 4.3 + 3.3.0-I20070606-0010 + org.eclipse.swt.win32.win32.x86_64 + 1.3 + 1.8 + 4.5.2 + 4.12 + 1.2.17 + 2.11.1 + 3.6.1 + 1.8 + 2.20 + 3.0.2 + 1.8 + + + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + + + org.apache.logging.log4j + log4j-api + ${log4j-core.version} + + + log4j + log4j + ${log4j.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + test + + + org.eclipse.swt + ${eclipse.swt.artifactId} + ${eclipse.swt.version} + + + org.eclipse + jface + ${jface.version} + + + net.java.dev.jna + jna-platform + ${jna-platform.version} + + + commons-configuration + commons-configuration + ${commons-configuration.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + junit + junit + ${junit.version} + + + + org.jogamp.jogl + jogl-all-main + 2.3.2 + + + + + org.jogamp.gluegen + gluegen-rt + 2.3.2 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + false + ${project.build.sourceEncoding} + -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp + + + + + + + windows32 + + + windows + x86 + + + + win32 + org.eclipse.swt.win32.win32.x86 + + + + windows64 + + + dos + amd64 + + + + org.eclipse.swt.win32.win32.x86_64 + win64 + + + + + windows64_2 + + + windows + amd64 + + + + win64 + org.eclipse.swt.win32.win32.x86_64 + + + + mac64 + + + mac + x86_64 + + + + mac64 + org.eclipse.swt.cocoa.macosx.x86_64 + 2.48.0 + + + + + unix32 + + + unix + i386 + + + + unix32 + 2.53.1 + org.eclipse.swt.gtk.linux.x86 + + + + unix64 + + + unix + amd64 + + + + unix64 + org.eclipse.swt.gtk.linux.x86_64 + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + maven-central + maven central repo + https://mvnrepository.com/repos/central + + + osgeo + osgeo repo + http://download.osgeo.org/webdav/geotools/ + + + seasar + seasar repo + https://www.seasar.org/maven/maven2 + + + jcenter + https://jcenter.bintray.com/ + + + swt-repo + https://swt-repo.googlecode.com/svn/repo/ + + + central + http://central.maven.org/maven2/ + + + diff --git a/rrd-cachedb/data/web/badlink.rrd b/rrd-cachedb/data/web/badlink.rrd new file mode 120000 index 000000000..bc12e221e --- /dev/null +++ b/rrd-cachedb/data/web/badlink.rrd @@ -0,0 +1 @@ +none.rrd \ No newline at end of file diff --git a/rrd-cachedb/data/web/link.rrd b/rrd-cachedb/data/web/link.rrd new file mode 120000 index 000000000..15390691a --- /dev/null +++ b/rrd-cachedb/data/web/link.rrd @@ -0,0 +1 @@ +sample.rrd \ No newline at end of file diff --git a/rrd-cachedb/src/main/java/example/App.java.SAVED b/rrd-cachedb/src/main/java/example/App.java.SAVED new file mode 100644 index 000000000..e6d5b31dc --- /dev/null +++ b/rrd-cachedb/src/main/java/example/App.java.SAVED @@ -0,0 +1,472 @@ +package example; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +import org.rrd4j.ConsolFun; +import org.rrd4j.DsType; +import org.rrd4j.core.RrdDb; +import org.rrd4j.core.RrdMemoryBackendFactory; +import java.lang.IllegalArgumentException; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.ArrayList; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.junit.Assert; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.equalTo; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.RowId; + +// https://bitbucket.org/xerial/sqlite-jdbc +// https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlrowid.html + +public class App { + + private static final Random r = new Random(); + private static Connection connection = null; + private static String osName = getOSName(); + public static final int INVALID_OPTION = 42; + private Map flags = new HashMap<>(); + private static Map> dsMap = new HashMap<>(); + + private static boolean debug = false; + private static boolean save = false; + private static boolean verifylinks = false; + + private static String dbhost = null; + private static String database = null; + private static int dbport = 3306; + private static String database_table = null; + private static String database_user = null; + private static String database_password = null; + + private final static Options options = new Options(); + private static CommandLineParser commandLineparser = new DefaultParser(); + private static CommandLine commandLine = null; + + public static void main(String args[]) throws ParseException { + options.addOption("h", "help", false, "Help"); + options.addOption("d", "debug", false, "Debug"); + options.addOption("s", "save", false, "Save"); + options.addOption("s", "save", false, "Save"); + options.addOption("p", "path", true, "Path to scan"); + options.addOption("v", "verifylinks", false, + "verify file links that are found during scan"); + options.addOption("r", "reject", true, "folder(s) to reject"); + + options.addOption("z", "dbhost", true, "database host"); + options.addOption("y", "dbport", true, "database port"); + options.addOption("w", "database", true, "database"); + options.addOption("u", "user", true, "database user"); + options.addOption("t", "table", true, "database table"); + options.addOption("z", "password", true, "database password"); + + commandLine = commandLineparser.parse(options, args); + if (commandLine.hasOption("h")) { + help(); + } + if (commandLine.hasOption("d")) { + debug = true; + } + if (commandLine.hasOption("verifylinks")) { + verifylinks = true; + } + + if (commandLine.hasOption("save")) { + save = true; + } + + dbhost = commandLine.getOptionValue("dbhost"); + if (dbhost == null) { + System.err.println("Missing argument: dbhost. Using default"); + dbhost = "localhost"; + } + + try { + dbport = Integer.parseInt(commandLine.getOptionValue("dbport")); + } catch (Exception e) { + System.err.println("Missing argument: dbport. Using default"); + dbport = 3306; + } + + database = commandLine.getOptionValue("database"); + if (database == null) { + System.err.println("Missing argument: database. Using default"); + database = "test"; + } + + database_user = commandLine.getOptionValue("user"); + if (database_user == null) { + System.err.println("Missing argument: database_user. Using default"); + database_user = "java"; + } + + database_table = commandLine.getOptionValue("table"); + if (database_table == null) { + System.err.println("Missing argument: database_table. Using default"); + database_table = "cache_table"; + } + + database_password = commandLine.getOptionValue("password"); + if (database_password == null) { + System.err.println("Missing argument: database_password. Using default"); + database_password = "password"; + } + try { + testJDBCConnection(); + } catch (Exception e) { + System.err.println("Excetpion (ignored)" + e.toString()); + } + String path = commandLine.getOptionValue("path"); + if (path == null) { + System.err.println("Missing required argument: path"); + return; + } + String collect = commandLine.getOptionValue("collect"); + String reject = commandLine.getOptionValue("reject"); + + try { + List collectFolders = collect == null ? new ArrayList<>() + : Arrays.asList(collect.split(",")); + List rejectFolders = reject == null ? new ArrayList<>() + : Arrays.asList(reject.split(",")); + if (collectFolders.size() != 0 || rejectFolders.size() != 0) { + dsMap = listFilesDsNames(path, collectFolders, rejectFolders); + } else { + dsMap = listFilesDsNames(path); + } + } catch (IOException e) { + } + + if (save) { + createTable(); + saveData(dsMap); + displayData(); + } + if (debug) { + System.err.println("Done: " + path); + } + + } + + private static void displayData() { + try { + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); + + ResultSet rs = statement.executeQuery( + "SELECT DISTINCT fname, ds FROM cache ORDER BY fname, ds"); + while (rs.next()) { + System.err.println("fname = " + rs.getString("fname") + "\t" + "ds = " + + rs.getString("ds")); + } + statement.close(); + statement = connection.createStatement(); + statement.executeUpdate("delete from cache"); + } catch (SQLException e) { + System.err.println(e.getMessage()); + } finally { + try { + if (connection != null) + connection.close(); + } catch (SQLException e) { + System.err.println(e); + } + } + } + + private static void createTable() { + + try { + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite::memory:"); + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); + String sql = String.format( + "CREATE TABLE IF NOT EXISTS %s " + + "(id INT PRIMARY KEY NOT NULL, ds CHAR(50) NOT NULL, fname CHAR(50) NOT NULL)", + "cache"); + statement.executeUpdate(sql); + statement.close(); + + } catch (ClassNotFoundException | SQLException e) { + System.err.println(e.getMessage()); + return; + } + } + + private static void saveData(Map> dsMap) { + dsMap.entrySet().stream().forEach(o -> { + String fname = o.getKey(); + o.getValue().stream().forEach(ds -> { + try { + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); + + PreparedStatement preparedStatement = connection.prepareStatement( + "INSERT INTO cache (id, fname, ds) VALUES (?, ?, ?)"); + int id = r.nextInt(1_000_000_000); + preparedStatement.setInt(1, id); + preparedStatement.setString(2, fname); + preparedStatement.setString(3, ds); + preparedStatement.execute(); + + } catch (SQLException e) { + System.err.println(e.getMessage()); + } + + }); + }); + + } + + @SuppressWarnings("unused") + private static Map> listFilesDsNames(String path, + List collectFolders, List rejectFolders) + throws IOException { + + final List result = new ArrayList<>(); + final Map> dsMap = new HashMap<>(); + Path basePath = Paths.get(path); + final String basePathUri = new URL( + getDataFileUri(basePath.toAbsolutePath().toString())).getFile() + "/"; + System.err.println("Scanning path: " + basePathUri); + List folders = new ArrayList<>(); + // Probably quite sub-optimal + try (Stream walk = Files.walk(basePath)) { + + folders = walk.filter(Files::isDirectory).filter(o -> { + String key = o.getFileName().toString(); + System.err.println("inspect: " + key); + boolean status = true; + if ((collectFolders.size() > 0 && !collectFolders.contains(key)) + || rejectFolders.size() > 0 && rejectFolders.contains(key)) { + status = false; + } + System.err.println("status: " + status); + return status; + }).collect(Collectors.toList()); + } + + for (Path folder : folders) { + Stream walk = Files.walk(folder); + walk.filter(Files::isRegularFile) + .filter(o -> o.getFileName().toString().matches(".*rrd$")) + .forEach(o -> { + System.err.println("add: " + o.getFileName().toString()); + result.add(o); + }); + } + result.stream().forEach(o -> { + try { + List dsList = new ArrayList<>(); + URL url = new URL(getDataFileUri(o.toAbsolutePath().toString())); + final String key = url.getFile().replaceFirst(basePathUri, "") + .replaceAll("/", ":").replaceFirst(".rrd$", ""); + System.err.println("Reading RRD file: " + key); + RrdDb rrd = RrdDb.getBuilder().setPath("test") + .setRrdToolImporter(url.getFile()) + .setBackendFactory(new RrdMemoryBackendFactory()).build(); + for (int cnt = 0; cnt != rrd.getDsCount(); cnt++) { + String ds = rrd.getDatasource(cnt).getName(); + System.err.println(String.format("ds[%d]= \"%s\"", cnt, ds)); + assertThat(ds, notNullValue()); + dsList.add(ds); + } + dsMap.put(key, dsList); + } catch (IllegalArgumentException | IOException e) { + System.err.println("Exception (ignored): " + e.toString()); + } + }); + assertThat(dsMap, notNullValue()); + return dsMap; + } + + private static Map> listFilesDsNames(String path) + throws IOException { + /* return listFilesDsNames(path, new ArrayList(), + new ArrayList()); + */ + + final Map> dsMap = new HashMap<>(); + Path basePath = Paths.get(path); + // NOTE: do not use File.separator + final String basePathUri = new URL( + getDataFileUri(basePath.toAbsolutePath().toString())).getFile() + "/"; + System.err.println("Scanning path: " + basePathUri); + // origin: + // https://github.com/mkyong/core-java/blob/master/java-io/src/main/java/com/mkyong/io/api/FilesWalkExample.java + // sub-optimal + List result; + List result2; + // + try (Stream walk = Files.walk(basePath)) { + result = walk.filter(Files::isRegularFile) + .filter(o -> o.getFileName().toString().matches(".*rrd$")) + .collect(Collectors.toList()); + } + // NOTE: streams are not meant to be reused + if (verifylinks) { + try (Stream walk = Files.walk(basePath)) { + result2 = walk.filter(Files::isSymbolicLink).filter(o -> { + try { + Path targetPath = Files.readSymbolicLink(o.toAbsolutePath()); + System.err.println("Testing link " + o.getFileName().toString() + + " target path " + targetPath.toString()); + + File target = new File(String.format("%s/%s", + o.getParent().toAbsolutePath(), targetPath.toString())); + if (target.exists() && target.isFile()) + System.err.println("Valid link " + o.getFileName().toString() + + " target path " + target.getCanonicalPath()); + return true; + } catch (IOException e) { + // fall through + } + return false; + }).filter(o -> o.getFileName().toString().matches(".*rrd$")) + .collect(Collectors.toList()); + } + } + // NOTE: streams are not meant to be reused + if (debug) { + System.err.println("RRD File paths: " + + result.stream().map(o -> o.toAbsolutePath().toString()) + .collect(Collectors.toList()).toString()); + return null; + } else { + result.stream().forEach(o -> { + try { + List dsList = new ArrayList<>(); + URL url = new URL(getDataFileUri(o.toAbsolutePath().toString())); + final String key = url.getFile().replaceFirst(basePathUri, "") + .replaceAll("/", ":").replaceFirst(".rrd$", ""); + System.err.println("Reading RRD file: " + key); + RrdDb rrd = RrdDb.getBuilder().setPath("test") + .setRrdToolImporter(url.getFile()) + .setBackendFactory(new RrdMemoryBackendFactory()).build(); + for (int cnt = 0; cnt != rrd.getDsCount(); cnt++) { + String ds = rrd.getDatasource(cnt).getName(); + System.err.println(String.format("ds[%d]= \"%s\"", cnt, ds)); + assertThat(ds, notNullValue()); + dsList.add(ds); + } + dsMap.put(key, dsList); + } catch (IllegalArgumentException | IOException e) { + System.err.println("Exception (ignored): " + e.toString()); + } + }); + assertThat(dsMap, notNullValue()); + return dsMap; + } + + } + + private static String getOSName() { + if (osName == null) { + osName = System.getProperty("os.name").toLowerCase(); + if (osName.startsWith("windows")) { + osName = "windows"; + } + } + return osName; + } + + private static String getDataFileUri(String dataFilePath) { + return osName.equals("windows") + ? "file:///" + dataFilePath.replaceAll("\\\\", "/") + : "file://" + dataFilePath; + } + + public static void testJDBCConnection() throws Exception { + try { + Class driverObject = Class.forName("org.gjt.mm.mysql.Driver"); + System.out.println("driverObject=" + driverObject); + + final String url = "jdbc:mysql://" + dbhost + ":" + dbport + "/" + + database; + Connection connection = DriverManager.getConnection(url, database_user, + database_password); + if (connection != null) { + System.out.println("Connected to product: " + + connection.getMetaData().getDatabaseProductName()); + System.out.println("Connected to catalog: " + connection.getCatalog()); + // System.out.println("Connected to: " + connection.getSchema()); + // java.sql.SQLFeatureNotSupportedException: Not supported + + PreparedStatement preparedStatement = connection.prepareStatement(String + .format("INSERT INTO %s (ins_date, fname, ds) VALUES (now(), ?, ?)", + database_table)); + + preparedStatement.setString(1, "fname"); + preparedStatement.setString(2, "ds0"); + // preparedStatement.setInt(2, 2); + // preparedStatement.setInt(3, 42); + preparedStatement.execute(); + + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); + ResultSet resultSet = statement.executeQuery(String + .format("SELECT id, fname, ds, expose FROM %s", database_table)); + while (resultSet.next()) { + System.out.println("fname = " + resultSet.getString("fname") + "\\t" + + "ds = " + resultSet.getString("ds") + "\\t" + "expose = " + + resultSet.getString("expose") + "\\t" + "id = " + + resultSet.getInt("id")); + } + + } else { + System.out.println("Failed to connect"); + } + } catch (Exception e) { + System.out.println("Exception: " + e.getMessage()); + e.printStackTrace(); + } + } + + public static void help() { + System.exit(1); + } + +} + diff --git a/swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE b/swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE new file mode 100644 index 000000000..f71924265 --- /dev/null +++ b/swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE @@ -0,0 +1,421 @@ +package com.github.sergueik.swet_javafx; + +import org.apache.log4j.Category; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +import com.github.sergueik.swet_javafx.ChoicesDialog; +import com.github.sergueik.swet_javafx.ConfigFormEx; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javafx.application.Application; +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.Group; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.Tooltip; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import javafx.stage.StageStyle; +import name.antonsmirnov.javafx.dialog.Dialog; + +@SuppressWarnings("restriction") +public class SwetMainFlowPanel extends Application { + + @SuppressWarnings("deprecation") + static final Category logger = Category.getInstance(SwetMainFlowPanel.class); + static Stage stage = null; + private Label statusLabel; + String configFilePath = null; + Scene scene = null; + private static String osName = getOsName(); + public static WebDriver driver = null; + + @SuppressWarnings("static-access") + @Override + public void start(Stage stage) { + this.stage = stage; + stage.setTitle("SWET/javaFx"); + stage.setWidth(500); + stage.setHeight(160); + scene = new Scene(new Group()); + + VBox vbox = new VBox(); + + FlowPane flow = new FlowPane(); + flow.setVgap(8); + flow.setHgap(4); + flow.setPrefWrapLength(300); + + Button launchButton = new Button(); + Image launchImage = new Image(getClass().getClassLoader().getResourceAsStream("browsers_32.png")); + launchButton.setGraphic(new ImageView(launchImage)); + launchButton.setTooltip(new Tooltip("Launch browser")); + // https://examples.javacodegeeks.com/desktop-java/javafx/javafx-concurrency-example/ + launchButton.setOnAction(new EventHandler() { + public void handle(ActionEvent event) { + startAsyncTask(); + } + }); + + Button injectButton = new Button(); + Image injectImage = new Image(getClass().getClassLoader().getResourceAsStream("find_32.png")); + injectButton.setGraphic(new ImageView(injectImage)); + injectButton.setTooltip(new Tooltip("Inject script")); + injectButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + System.out.println("generate step!"); + for (int i = 0; i < 20; i++) { + Button stepButton = new Button(String.format("Step %d", i)); + stepButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + // ComplexFormEx + Map inputData = new HashMap<>(); + Button button = (Button) event.getTarget(); + + inputData.put("dummy", "42"); + inputData.put("title", String.format("%s element Locators", button.getText())); + Map inputs = new HashMap<>(); + inputs.put("inputs", inputData); // TODO: JSON + // see also + // https://github.com/MrChebik/ControllerRelationship + scene.setUserData(inputs); + logger.info("launching complexFormEx for " + inputData.get("title")); + + ComplexFormEx complexFormEx = new ComplexFormEx(); + complexFormEx.setScene(scene); + try { + complexFormEx.start(new Stage()); + } catch (Exception e) { + } + } + }); + + flow.getChildren().add(stepButton); + + } + } + }); + Button generateButton = new Button(); + Image generateImage = new Image(getClass().getClassLoader().getResourceAsStream("codegen_32.png")); + generateButton.setGraphic(new ImageView(generateImage)); + generateButton.setTooltip(new Tooltip("Generate program")); + + generateButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + + // Stage stage = new Stage(); + Map inputData = new HashMap<>(); + inputData.put("dummy", "42"); + inputData.put("title", "Step detail"); + Map inputs = new HashMap<>(); + inputs.put("inputs", inputData); // TODO: JSON + scene.setUserData(inputs); + + // See also: + // http://java-buddy.blogspot.com/2016/06/read-csv-run-in-background-thread-and.html + DataFormEx dataFormEx = new DataFormEx(); + // dataFormEx.setScene(scene); + try { + dataFormEx.start(new Stage()); + // TODO: block in a SWT fashion? + // https://docs.oracle.com/javafx/2/swt_interoperability/jfxpub-swt_interoperability.htm + /* + * while (!shell.isDisposed()) { if + * (!display.readAndDispatch()) display.sleep(); } + */ + Map data = dataFormEx.getInputData(); + logger.info("Get data from dataFormEx " + data.toString()); + + } catch (Exception e) { + } + } + }); + + Button loadButton = new Button(); + Image loadImage = new Image(getClass().getClassLoader().getResourceAsStream("open_32.png")); + loadButton.setGraphic(new ImageView(loadImage)); + loadButton.setTooltip(new Tooltip("Load session")); + loadButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + // https://docs.oracle.com/javafx/2/ui_controls/file-chooser.htm + FileChooser fileChooser = new FileChooser(); + if (configFilePath != null) { + logger.info("Loading recording from: " + configFilePath); + try { + fileChooser.setInitialDirectory(new File(configFilePath)); + } catch (IllegalArgumentException e) { + logger.info("Exception (ignored): " + e.toString()); + } + } + // Set extension filter + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("YAML file", "*.yaml")); + fileChooser.setTitle("Open Recording"); + File file = fileChooser.showOpenDialog(stage); + if (file != null) { + logger.info("Load recording: " + file.getPath()); + configFilePath = file.getParent(); + openRecordingFile(file); + } + } + }); + + Button testsuiteButton = new Button(); + Image testsuiteImage = new Image(getClass().getClassLoader().getResourceAsStream("excel_gen_32.png")); + testsuiteButton.setGraphic(new ImageView(testsuiteImage)); + testsuiteButton.setTooltip(new Tooltip("Generate Excel TestSuite")); + testsuiteButton.setOnAction(new EventHandler() { + @SuppressWarnings("rawtypes") + @Override + public void handle(ActionEvent event) { + + // Stage stage = new Stage(); + Map inputData = new HashMap<>(); + inputData.put("dummy", "42"); + inputData.put("title", "Step detail"); + Map inputs = new HashMap<>(); + inputs.put("inputs", inputData); // TODO: JSON + scene.setUserData(inputs); + + // See also: + // http://java-buddy.blogspot.com/2016/06/read-csv-run-in-background-thread-and.html + TableEditorEx tableEditorEx = new TableEditorEx(); + tableEditorEx.setScene(scene); + try { + tableEditorEx.start(new Stage()); + } catch (Exception e) { + } + } + }); + + Button saveButton = new Button(); + Image saveImage = new Image(getClass().getClassLoader().getResourceAsStream("save_32.png")); + saveButton.setGraphic(new ImageView(saveImage)); + saveButton.setTooltip(new Tooltip("Save session")); + saveButton.setOnAction(new EventHandler() { + @SuppressWarnings("unused") + @Override + public void handle(ActionEvent event) { + try { + System.err.println("Exercise exception"); + testException(); + } catch (Exception e) { + Dialog.showThrowable("Exception", "Exception thrown", + (Exception) e /* e.getCause() */, stage); + } + + // save + + // https://docs.oracle.com/javafx/2/ui_controls/file-chooser.htm + FileChooser fileChooser = new FileChooser(); + if (configFilePath != null) { + logger.info("Saving recording to: " + configFilePath); + try { + fileChooser.setInitialDirectory(new File(configFilePath)); + } catch (IllegalArgumentException e) { + logger.info("Exception (ignored): " + e.toString()); + } + } + // Set extension filter + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("YAML file", "*.yaml")); + fileChooser.setTitle("Save Recording"); + File file = fileChooser.showSaveDialog(stage); + } + }); + + Button configButton = new Button(); + Image configImage = new Image(getClass().getClassLoader().getResourceAsStream("preferences_32.png")); + configButton.setGraphic(new ImageView(configImage)); + configButton.setTooltip(new Tooltip("Configure")); + configButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + Stage stage = new Stage(); + ConfigFormEx s = new ConfigFormEx(); + s.start(stage); + } + }); + + Button quitButton = new Button(); + Image quitImage = new Image(getClass().getClassLoader().getResourceAsStream("quit_32.png")); + quitButton.setGraphic(new ImageView(quitImage)); + quitButton.setTooltip(new Tooltip("Exit")); + + stage.setOnCloseRequest(e -> { + e.consume(); + confirmClose(); + }); + + quitButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + confirmClose(); + // TODO: refactor + // does not return + } + }); + + HBox toolbarHbox = new HBox(); + toolbarHbox.getChildren().addAll(launchButton, injectButton, generateButton, loadButton, testsuiteButton, + saveButton, configButton, quitButton); + + statusLabel = new Label(); + statusLabel.setText("Status"); + HBox statusbarHbox = new HBox(); + statusbarHbox.getChildren().addAll(statusLabel); + HBox.setHgrow(statusLabel, Priority.ALWAYS); + + vbox.getChildren().add(toolbarHbox); + vbox.getChildren().add(flow); + vbox.getChildren().add(statusbarHbox); + VBox.setVgrow(flow, Priority.ALWAYS); + + scene.setRoot(vbox); + stage.setScene(scene); + stage.show(); + } + + public void runTask() { + updateStatus("Launching"); + // sleep(10000); + setUpSeleniumDriver(); + updateStatus("Launched"); + return; // TODO: JavaFX concurrency framework + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name").toLowerCase(); + if (osName.startsWith("windows")) { + osName = "windows"; + } + } + return osName; + } + + private void updateStatus(String status) { + // NOTE: there is no `HORIZONTAL ELLIPSIS` in default console code page + // 437 + logger.info(String.format("%s%s", status, osName == "windows" ? "..." : "\u2026")); + // Update the Label on the JavaFx Application Thread + Platform.runLater(new Runnable() { + @Override + public void run() { + statusLabel.setText(status); + } + }); + } + + public void startAsyncTask() { + // Create instance of Runnable + Runnable task = new Runnable() { + public void run() { + runTask(); + } + }; + + // Create background thread + Thread backgroundThread = new Thread(task); + // Terminate the running thread if the application exits + backgroundThread.setDaemon(true); + // Launch the thread + backgroundThread.start(); + } + + public static void main(String[] args) { + launch(args); + } + + public void confirmClose() { + + Map inputData = new HashMap<>(); + inputData.put("Exit and save my project", 2); + inputData.put("Exit and don't save", 1); + inputData.put("Don't exit", 10); + Map> inputs = new HashMap<>(); + inputs.put("inputs", inputData); // TODO: JSON + scene.setUserData(inputs); + + ChoicesDialog choicesDialog = new ChoicesDialog(new Stage(), scene); + // choicesDialog.initStyle(StageStyle.UNDECORATED); + choicesDialog.sizeToScene(); + // optionally hide self + // ((Node)(event.getSource())).getScene().getWindow().hide(); + /* + * choicesDialog.show(); while (choicesDialog.isShowing()) { + * + * } + */ + choicesDialog.showAndWait(); + @SuppressWarnings("unchecked") + Map data = (Map) choicesDialog.getScene().getUserData(); + int code = Integer.parseInt(data.get("result")); + logger.info("Exit app with code: " + code); + // code = Integer.parseInt(choicesDialog.getResult()); + // logger.info("Exit app with code: " + code); + if (code == 1 || code == 2) { + if (driver != null) { + tearDownSeleniumBrowswer(); + } + stage.close(); + } + } + + public void tearDownSeleniumBrowswer() { + // Close the browser + driver.quit(); + } + + private static void openRecordingFile(File file) { + } + + private static void testException() throws Exception { + throw new Exception("This is a test exception."); + } + + @SuppressWarnings("deprecation") + public void setUpSeleniumDriver() { + // Create a new instance of a driver + System.setProperty("webdriver.chrome.driver", (new File( + osName == "windows" ? "c:/java/selenium/chromedriver.exe" : "/home/sergueik/Downloads/chromedriver")) + .getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + + driver = new ChromeDriver(capabilities); + // Navigate to the right place + driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); + driver.get("https://www.google.com/"); + } +} diff --git a/utils/2 b/utils/2 new file mode 100644 index 000000000..ae05bcfd8 --- /dev/null +++ b/utils/2 @@ -0,0 +1,1246 @@ +Simple multimedia streams analyzer +usage: ffprobe [OPTIONS] [INPUT_FILE] + +Main options: +-L show license +-h topic show help +-? topic show help +-help topic show help +--help topic show help +-version show version +-buildconf show build configuration +-formats show available formats +-devices show available devices +-codecs show available codecs +-decoders show available decoders +-encoders show available encoders +-bsfs show available bit stream filters +-protocols show available protocols +-filters show available filters +-pix_fmts show available pixel formats +-layouts show standard channel layouts +-sample_fmts show available audio sample formats +-colors show available color names +-loglevel loglevel set logging level +-v loglevel set logging level +-report generate a report +-max_alloc bytes set maximum size of a single allocated block +-cpuflags flags force specific cpu flags +-hide_banner hide_banner do not show program banner +-sources device list sources of the input device +-sinks device list sinks of the output device +-f format force format +-unit show unit of the displayed values +-prefix use SI prefixes for the displayed values +-byte_binary_prefix use binary prefixes for byte units +-sexagesimal use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units +-pretty prettify the format of displayed values, make it more human readable +-print_format format set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml) +-of format alias for -print_format +-select_streams stream_specifier select the specified streams +-sections print sections structure and section information, and exit +-show_data show packets data +-show_data_hash show packets data hash +-show_error show probing error +-show_format show format/container info +-show_frames show frames info +-show_format_entry entry show a particular entry from the format/container info +-show_entries entry_list show a set of specified entries +-show_packets show packets info +-show_programs show programs info +-show_streams show streams info +-show_chapters show chapters info +-count_frames count the number of frames per stream +-count_packets count the number of packets per stream +-show_program_version show ffprobe version +-show_library_versions show library versions +-show_versions show program and library versions +-show_pixel_formats show pixel format descriptions +-show_private_data show private data +-private same as show_private_data +-bitexact force bitexact output +-read_intervals read_intervals set read intervals +-default generic catch all option +-i input_file read specified file + + +AVFormatContext AVOptions: + -avioflags ED...... (default 0) + direct ED...... reduce buffering + -probesize .D...... set probing size (from 32 to I64_MAX) (default 5e+06) + -formatprobesize .D...... number of bytes to probe file format (from 0 to 2.14748e+09) (default 1.04858e+06) + -fflags ED...... (default 200) + ignidx .D...... ignore index + genpts .D...... generate pts + nofillin .D...... do not fill in missing values that can be exactly calculated + noparse .D...... disable AVParsers, this needs nofillin too + igndts .D...... ignore dts + discardcorrupt .D...... discard corrupted frames + sortdts .D...... try to interleave outputted packets by dts + keepside .D...... don't merge side data + fastseek .D...... fast but inaccurate seeks + nobuffer .D...... reduce the latency introduced by optional buffering + -seek2any .D...... allow seeking to non-keyframes on demuxer level when supported (from 0 to 1) (default 0) + -analyzeduration .D...... specify how many microseconds are analyzed to probe the input (from 0 to I64_MAX) (default 0) + -cryptokey .D...... decryption key + -indexmem .D...... max memory used for timestamp index (per stream) (from 0 to INT_MAX) (default 1.04858e+06) + -rtbufsize .D...... max memory used for buffering real-time frames (from 0 to INT_MAX) (default 3.04128e+06) + -fdebug ED...... print specific debug info (default 0) + ts ED...... + -max_delay ED...... maximum muxing or demuxing delay in microseconds (from -1 to INT_MAX) (default -1) + -fpsprobesize .D...... number of frames used to probe fps (from -1 to 2.14748e+09) (default -1) + -f_err_detect .D...... set error detection flags (deprecated; use err_detect, save via avconv) (default 1) + crccheck .D...... verify embedded CRCs + bitstream .D...... detect bitstream specification deviations + buffer .D...... detect improper bitstream length + explode .D...... abort decoding on minor error detection + ignore_err .D...... ignore errors + careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors + compliant .D...... consider all spec non compliancies as errors + aggressive .D...... consider things that a sane encoder shouldn't do as an error + -err_detect .D...... set error detection flags (default 1) + crccheck .D...... verify embedded CRCs + bitstream .D...... detect bitstream specification deviations + buffer .D...... detect improper bitstream length + explode .D...... abort decoding on minor error detection + ignore_err .D...... ignore errors + careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors + compliant .D...... consider all spec non compliancies as errors + aggressive .D...... consider things that a sane encoder shouldn't do as an error + -use_wallclock_as_timestamps .D...... use wallclock as timestamps (from 0 to 2.14748e+09) (default 0) + -skip_initial_bytes .D...... set number of bytes to skip before reading header and frames (from 0 to I64_MAX) (default 0) + -correct_ts_overflow .D...... correct single timestamp overflows (from 0 to 1) (default 1) + -f_strict ED...... how strictly to follow the standards (deprecated; use strict, save via avconv) (from INT_MIN to INT_MAX) (default 0) + very ED...... strictly conform to a older more strict version of the spec or reference software + strict ED...... strictly conform to all the things in the spec no matter what the consequences + normal ED...... + unofficial ED...... allow unofficial extensions + experimental ED...... allow non-standardized experimental variants + -strict ED...... how strictly to follow the standards (from INT_MIN to INT_MAX) (default 0) + very ED...... strictly conform to a older more strict version of the spec or reference software + strict ED...... strictly conform to all the things in the spec no matter what the consequences + normal ED...... + unofficial ED...... allow unofficial extensions + experimental ED...... allow non-standardized experimental variants + -max_ts_probe .D...... maximum number of packets to read while waiting for the first timestamp (from 0 to INT_MAX) (default 50) + -dump_separator ED...... set information dump field separator (default ", ") + -codec_whitelist .D...... List of decoders that are allowed to be used + -format_whitelist .D...... List of demuxers that are allowed to be used + -max_streams .D...... maximum number of streams (from 0 to INT_MAX) (default 1000) + +AVIOContext AVOptions: + +URLContext AVOptions: + +Async AVOptions: + +bluray AVOptions: + -playlist .D...... (from -1 to 99999) (default -1) + -angle .D...... (from 0 to 254) (default 0) + -chapter .D...... (from 1 to 65534) (default 1) + +Cache AVOptions: + -read_ahead_limit .D...... Amount in bytes that may be read ahead when seeking isn't supported, -1 for unlimited (from -1 to INT_MAX) (default 65536) + +crypto AVOptions: + -key ED...... AES encryption/decryption key + -iv ED...... AES encryption/decryption initialization vector + -decryption_key .D...... AES decryption key + -decryption_iv .D...... AES decryption initialization vector + +file AVOptions: + +ftp AVOptions: + -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) + -ftp-anonymous-password ED...... password for anonymous login. E-mail address should be used. + +http AVOptions: + -seekable .D...... control seekability of connection (from -1 to 1) (default -1) + -headers ED...... set custom HTTP headers, can override built in default headers + -content_type ED...... set a specific content type for the POST messages + -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") + -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") + -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) + -post_data ED...... set custom HTTP post data + -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax + -icy .D...... request ICY metadata (from 0 to 1) (default 1) + -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) + none ED...... No auth method set, autodetect + basic ED...... HTTP basic authentication + -location ED...... The actual location of the data received + -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) + -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) + -method ED...... Override the HTTP method or set the expected HTTP method from a client + -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) + -listen ED...... listen on HTTP (from 0 to 2) (default 0) + +https AVOptions: + -seekable .D...... control seekability of connection (from -1 to 1) (default -1) + -headers ED...... set custom HTTP headers, can override built in default headers + -content_type ED...... set a specific content type for the POST messages + -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") + -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") + -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) + -post_data ED...... set custom HTTP post data + -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax + -icy .D...... request ICY metadata (from 0 to 1) (default 1) + -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) + none ED...... No auth method set, autodetect + basic ED...... HTTP basic authentication + -location ED...... The actual location of the data received + -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) + -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) + -method ED...... Override the HTTP method or set the expected HTTP method from a client + -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) + -listen ED...... listen on HTTP (from 0 to 2) (default 0) + +icecast AVOptions: + +pipe AVOptions: + +rtp AVOptions: + -ttl ED...... Time to live (in milliseconds, multicast only) (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Send/Receive buffer size (in bytes) (from -1 to INT_MAX) (default -1) + -rtcp_port ED...... Custom rtcp port (from -1 to INT_MAX) (default -1) + -local_rtpport ED...... Local rtp port (from -1 to INT_MAX) (default -1) + -local_rtcpport ED...... Local rtcp port (from -1 to INT_MAX) (default -1) + -connect ED...... Connect socket (from 0 to 1) (default 0) + -write_to_source ED...... Send packets to the source address of the latest received packet (from 0 to 1) (default 0) + -pkt_size ED...... Maximum packet size (from -1 to INT_MAX) (default -1) + -dscp ED...... DSCP class (from -1 to INT_MAX) (default -1) + -sources ED...... Source list + -block ED...... Block list + +sctp AVOptions: + -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) + -timeout ED...... Connection timeout (in milliseconds) (from INT_MIN to INT_MAX) (default 10000) + -listen_timeout ED...... Bind timeout (in milliseconds) (from INT_MIN to INT_MAX) (default -1) + -max_streams ED...... Max stream to allocate (from 0 to 32767) (default 0) + +srtp AVOptions: + -srtp_in_suite .D...... + -srtp_in_params .D...... + +subfile AVOptions: + -start .D...... start offset (from 0 to I64_MAX) (default 0) + -end .D...... end offset (from 0 to I64_MAX) (default 0) + +tcp AVOptions: + -listen ED...... Listen for incoming connections (from 0 to 2) (default 0) + -timeout ED...... set timeout (in microseconds) of socket I/O operations (from -1 to INT_MAX) (default -1) + -listen_timeout ED...... Connection awaiting timeout (in milliseconds) (from -1 to INT_MAX) (default -1) + +tls AVOptions: + -ca_file ED...... Certificate Authority database file + -cafile ED...... Certificate Authority database file + -tls_verify ED...... Verify the peer certificate (from 0 to 1) (default 0) + -cert_file ED...... Certificate file + -key_file ED...... Private key file + -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) + -verifyhost ED...... Verify against a specific hostname + +udp AVOptions: + -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) + -localport ED...... Local port (from -1 to INT_MAX) (default -1) + -local_port ED...... Local port (from -1 to INT_MAX) (default -1) + -localaddr ED...... Local address + -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) + -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) + -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) + -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) + -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) + -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) + -sources ED...... Source list + -block ED...... Block list + +udplite AVOptions: + -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) + -localport ED...... Local port (from -1 to INT_MAX) (default -1) + -local_port ED...... Local port (from -1 to INT_MAX) (default -1) + -localaddr ED...... Local address + -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) + -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) + -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) + -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) + -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) + -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) + -sources ED...... Source list + -block ED...... Block list + +unix AVOptions: + -listen ED...... Open socket for listening (from 0 to 1) (default 0) + -timeout ED...... Timeout in ms (from -1 to INT_MAX) (default -1) + -type ED...... Socket type (from INT_MIN to INT_MAX) (default 1) + stream ED...... Stream (reliable stream-oriented) + datagram ED...... Datagram (unreliable packet-oriented) + seqpacket ED...... Seqpacket (reliable packet-oriented + +librtmp protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmpe protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmps protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmpt protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmpte protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +libssh AVOptions: + -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) + -private_key ED...... set path to private key + +aa AVOptions: + -aa_fixed_key .D...... Fixed key used for handling Audible AA files + +Artworx Data Format demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +APNG demuxer AVOptions: + -ignore_loop .D...... ignore loop setting (from 0 to 1) (default 1) + -max_fps .D...... maximum framerate (0 is no limit) (from 0 to INT_MAX) (default 15) + -default_fps .D...... default framerate (0 is as fast as possible) (from 0 to INT_MAX) (default 15) + +aqtdec AVOptions: + -subfps .D...S.. set the movie frame rate (from 0 to INT_MAX) (default 25/1) + +asf demuxer AVOptions: + -no_resync_search .D...... Don't try to resynchronize by looking for a certain optional start code (from 0 to 1) (default 0) + -export_xmp .D...... Export full XMP metadata (from 0 to 1) (default 0) + +avi AVOptions: + -use_odml .D...... use odml index (from -1 to 1) (default 1) + +Binary text demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +cavsvideo demuxer AVOptions: + -framerate .D...... (default "25") + +CDXL demuxer AVOptions: + -sample_rate .D...... (from 1 to INT_MAX) (default 11025) + -framerate .D...... + +concat demuxer AVOptions: + -safe .D...... enable safe mode (from -1 to 1) (default 1) + -auto_convert .D...... automatically convert bitstream format (from 0 to 1) (default 1) + +dirac demuxer AVOptions: + -framerate .D...... (default "25") + +dnxhd demuxer AVOptions: + -framerate .D...... (default "25") + +dvbsub demuxer AVOptions: + -framerate .D...... (default "25") + +flvdec AVOptions: + -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) + +live_flvdec AVOptions: + -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) + +g729 demuxer AVOptions: + -bit_rate .D...... (from 0 to INT_MAX) (default 0) + +GIF demuxer AVOptions: + -min_delay .D...... minimum valid delay between frames (in hundredths of second) (from 0 to 6000) (default 2) + -max_gif_delay .D...... maximum valid delay between frames (in hundredths of seconds) (from 0 to 65535) (default 65535) + -default_delay .D...... default delay between frames (in hundredths of second) (from 0 to 6000) (default 10) + -ignore_loop .D...... ignore loop setting (netscape extension) (from 0 to 1) (default 1) + +gsm demuxer AVOptions: + -sample_rate .D...... (from 1 to 6.50753e+07) (default 8000) + +h261 demuxer AVOptions: + -framerate .D...... (default "25") + +h263 demuxer AVOptions: + -framerate .D...... (default "25") + +h264 demuxer AVOptions: + -framerate .D...... (default "25") + +hevc demuxer AVOptions: + -framerate .D...... (default "25") + +hls,applehttp AVOptions: + -live_start_index .D...... segment index to start live streams at (negative values are from the end) (from INT_MIN to INT_MAX) (default -3) + -allowed_extensions .D...... List of file extensions that hls is allowed to access (default "3gp,aac,avi,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav") + -max_reload .D...... Maximum number of times a insufficient list is attempted to be reloaded (from 0 to INT_MAX) (default 1000) + +iCE Draw File demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +image2 demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +image2pipe demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +alias_pix demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +brender_pix demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +ingenient demuxer AVOptions: + -framerate .D...... (default "25") + +m4v demuxer AVOptions: + -framerate .D...... (default "25") + +microdvddec AVOptions: + -subfps .D...S.. set the movie frame rate fallback (from 0 to INT_MAX) (default 0/1) + +mjpeg demuxer AVOptions: + -framerate .D...... (default "25") + +mov,mp4,m4a,3gp,3g2,mj2 AVOptions: + -use_absolute_path .D.V.... allow using absolute path when opening alias, this is a possible security issue (from 0 to 1) (default 0) + -seek_streams_individually .D.V.... Seek each stream individually to the to the closest point (from 0 to 1) (default 1) + -ignore_editlist .D.V.... (from 0 to 1) (default 0) + -use_mfra_for .D.V.... use mfra for fragment timestamps (from -1 to 2) (default -1) + auto .D.V.... auto + dts .D.V.... dts + pts .D.V.... pts + -export_all .D.V.... Export unrecognized metadata entries (from 0 to 1) (default 0) + -export_xmp .D.V.... Export full XMP metadata (from 0 to 1) (default 0) + -activation_bytes .D...... Secret bytes for Audible AAX files + -audible_fixed_key .D...... Fixed key used for handling Audible AAX files + -enable_drefs .D.V.... Enable external track support. (from 0 to 1) (default 0) + +mp3 AVOptions: + -usetoc .D...... use table of contents (from -1 to 2) (default -1) + +mpegts demuxer AVOptions: + -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) + -fix_teletext_pts .D...... try to fix pts values of dvb teletext streams (from 0 to 1) (default 1) + -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) + -scan_all_pmts .D...... scan and combine all PMTs (from -1 to 1) (default -1) + +mpegtsraw demuxer AVOptions: + -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) + -compute_pcr .D...... compute exact PCR for each transport stream packet (from 0 to 1) (default 0) + -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) + +mpegvideo demuxer AVOptions: + -framerate .D...... (default "25") + +alaw demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +mulaw demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f64be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f64le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f32be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f32le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s32be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s32le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s24be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s24le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s16be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s16le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s8 demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u32be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u32le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u24be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u24le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u16be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u16le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u8 demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +rawvideo demuxer AVOptions: + -video_size .D...... set frame size + -pixel_format .D...... set pixel format (default "yuv420p") + -framerate .D...... set frame rate (default "25") + +RTP demuxer AVOptions: + -rtp_flags .D...... set RTP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + +RTSP demuxer AVOptions: + -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) + -rtsp_transport ED...... set RTSP transport protocols (default 0) + udp ED...... UDP + tcp ED...... TCP + udp_multicast .D...... UDP multicast + http .D...... HTTP tunneling + -rtsp_flags .D...... set RTSP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + listen .D...... wait for incoming connections + prefer_tcp ED...... try RTP via TCP first, if available + -allowed_media_types .D...... set media types to accept from the server (default F) + video .D...... Video + audio .D...... Audio + data .D...... Data + subtitle .D...... Subtitle + -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) + -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) + -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) + -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + -user-agent .D...... override User-Agent header (default "Lavf56.40.101") + +sbg_demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 0) + -frame_size .D...... (from 0 to INT_MAX) (default 0) + -max_file_size .D...... (from 0 to INT_MAX) (default 5e+06) + +SDP demuxer AVOptions: + -sdp_flags .D...... SDP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + custom_io .D...... use custom I/O + rtcp_to_source .D...... send RTCP packets to the source address of received packets + -allowed_media_types .D...... set media types to accept from the server (default F) + video .D...... Video + audio .D...... Audio + data .D...... Data + subtitle .D...... Subtitle + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + +sln demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 8000) + -channels .D...... (from 0 to INT_MAX) (default 1) + +tedcaptions_demuxer AVOptions: + -start_time .D...S.. set the start time (offset) of the subtitles, in ms (from I64_MIN to I64_MAX) (default 15000) + +TTY demuxer AVOptions: + -chars_per_frame .D...... (from 1 to INT_MAX) (default 6000) + -video_size .D...... A string describing frame size, such as 640x480 or hd720. + -framerate .D...... (default "25") + +vc1 demuxer AVOptions: + -framerate .D...... (default "25") + +vobsub AVOptions: + -sub_name .D...... URI for .sub file + +WAV demuxer AVOptions: + -ignore_length .D...... Ignore length (from 0 to 1) (default 0) + +WebM DASH Manifest demuxer AVOptions: + -live .D...... flag indicating that the input is a live file that only has the headers. (from 0 to 1) (default 0) + +WebVTT demuxer AVOptions: + +eXtended BINary text (XBIN) demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +bmp demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +dds demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +dpx demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +exr demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +j2k demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +jpeg demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +jpegls demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +pictor demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +png demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +qdraw demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +sgi demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +sunrast demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +tiff demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +webp demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +Game Music Emu demuxer AVOptions: + -track_index .D..A... set track that should be played (from 0 to INT_MAX) (default 0) + -sample_rate .D..A... set sample rate (from 1000 to 999999) (default 44100) + -max_size .D..A... set max file size supported (in bytes) (from 0 to 1.84467e+19) (default 5.24288e+07) + +ModPlug demuxer AVOptions: + -noise_reduction .D...... Enable noise reduction 0(off)-1(on) (from 0 to 1) (default 0) + -reverb_depth .D...... Reverb level 0(quiet)-100(loud) (from 0 to 100) (default 0) + -reverb_delay .D...... Reverb delay in ms, usually 40-200ms (from 0 to INT_MAX) (default 0) + -bass_amount .D...... XBass level 0(quiet)-100(loud) (from 0 to 100) (default 0) + -bass_range .D...... XBass cutoff in Hz 10-100 (from 0 to 100) (default 0) + -surround_depth .D...... Surround level 0(quiet)-100(heavy) (from 0 to 100) (default 0) + -surround_delay .D...... Surround delay in ms, usually 5-40ms (from 0 to INT_MAX) (default 0) + -max_size .D...... Max file size supported (in bytes). Default is 5MB. Set to 0 for no limit (not recommended) (from 0 to 1.04858e+08) (default 5.24288e+06) + -video_stream_expr .D...... Color formula + -video_stream .D...... Make demuxer output a video stream (from 0 to 1) (default 0) + -video_stream_w .D...... Video stream width in char (one char = 8x8px) (from 20 to 512) (default 30) + -video_stream_h .D...... Video stream height in char (one char = 8x8px) (from 20 to 512) (default 30) + -video_stream_ptxt .D...... Print speed, tempo, order, ... in video stream (from 0 to 1) (default 1) + +ALSA demuxer AVOptions: + -sample_rate .D...... (from 1 to INT_MAX) (default 48000) + -channels .D...... (from 1 to INT_MAX) (default 2) + +DV1394 indev AVOptions: + -standard .D...... (from 0 to 1) (default 0) + PAL .D...... + NTSC .D...... + -channel .D...... (from 0 to INT_MAX) (default 63) + +fbdev indev AVOptions: + -framerate .D...... (default "25") + +iec61883 indev AVOptions: + -dvtype .D...... override autodetection of DV/HDV (from 0 to 2) (default 0) + auto .D...... auto detect DV/HDV + dv .D...... force device being treated as DV device + hdv .D...... force device being treated as HDV device + -dvbuffer .D...... set queue buffer size (in packets) (from 0 to INT_MAX) (default 0) + -dvguid .D...... select one of multiple DV devices by its GUID + +JACK indev AVOptions: + -channels .D...... Number of audio channels. (from 1 to INT_MAX) (default 2) + +lavfi indev AVOptions: + -graph .D...... set libavfilter graph + -graph_file .D...... set libavfilter graph filename + -dumpgraph .D...... dump graph to stderr + +openal AVOptions: + -channels .D...... set number of channels (from 1 to 2) (default 2) + -sample_rate .D...... set sample rate (from 1 to 192000) (default 44100) + -sample_size .D...... set sample size (from 8 to 16) (default 16) + -list_devices .D...... list available devices (from 0 to 1) (default 0) + true .D...... + false .D...... + +OSS demuxer AVOptions: + -sample_rate .D...... (from 1 to INT_MAX) (default 48000) + -channels .D...... (from 1 to INT_MAX) (default 2) + +Pulse demuxer AVOptions: + -server .D...... set PulseAudio server + -name .D...... set application name (default "Lavf56.40.101") + -stream_name .D...... set stream description (default "record") + -sample_rate .D...... set sample rate in Hz (from 1 to INT_MAX) (default 48000) + -channels .D...... set number of audio channels (from 1 to INT_MAX) (default 2) + -frame_size .D...... set number of bytes per frame (from 1 to INT_MAX) (default 1024) + -fragment_size .D...... set buffering size, affects latency and cpu usage (from -1 to INT_MAX) (default -1) + -wallclock .D...... set the initial pts using the current time (from -1 to 1) (default 1) + +V4L2 indev AVOptions: + -standard .D...... set TV standard, used only by analog frame grabber + -channel .D...... set TV channel, used only by frame grabber (from -1 to INT_MAX) (default -1) + -video_size .D...... set frame size + -pixel_format .D...... set preferred pixel format + -input_format .D...... set preferred pixel format (for raw video) or codec name + -framerate .D...... set frame rate + -list_formats .D...... list available formats and exit (from 0 to INT_MAX) (default 0) + all .D...... show all available formats + raw .D...... show only non-compressed formats + compressed .D...... show only compressed formats + -list_standards .D...... list supported standards and exit (from 0 to 1) (default 0) + all .D...... show all supported standards + -timestamps .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) + default .D...... use timestamps from the kernel + abs .D...... use absolute timestamps (wall clock) + mono2abs .D...... force conversion from monotonic to absolute timestamps + -ts .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) + default .D...... use timestamps from the kernel + abs .D...... use absolute timestamps (wall clock) + mono2abs .D...... force conversion from monotonic to absolute timestamps + -use_libv4l2 .D...... use libv4l2 (v4l-utils) conversion functions (from 0 to 1) (default 0) + +xcbgrab indev AVOptions: + -x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) + -y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) + -grab_x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) + -grab_y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) + -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "vga") + -framerate .D...... (default "ntsc") + -draw_mouse .D...... Draw the mouse pointer. (from 0 to 1) (default 1) + -follow_mouse .D...... Move the grabbing region when the mouse pointer reaches within specified amount of pixels to the edge of region. (from -1 to INT_MAX) (default 0) + centered .D...... Keep the mouse pointer at the center of grabbing region when following. + -show_region .D...... Show the grabbing region. (from 0 to 1) (default 0) + -region_border .D...... Set the region border thickness. (from 1 to 128) (default 3) + +libcdio indev AVOptions: + -speed .D...... set drive reading speed (from 0 to INT_MAX) (default 0) + -paranoia_mode .D...... set error recovery mode (default 0) + disable .D...... apply no fixups + verify .D...... verify data integrity in overlap area + overlap .D...... perform overlapped reads + neverskip .D...... do not skip failed reads + full .D...... apply all recovery modes + +libdc1394 indev AVOptions: + -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "qvga") + -pixel_format .D...... (default "uyvy422") + -framerate .D...... (default "ntsc") + +ADTS muxer AVOptions: + +AIFF muxer AVOptions: + +APNG muxer AVOptions: + +ass muxer AVOptions: + +AST muxer AVOptions: + +dash muxer AVOptions: + +f4v muxer AVOptions: + +flac muxer AVOptions: + +frame hash encoder class AVOptions: + +GIF muxer AVOptions: + +HDS muxer AVOptions: + +hls muxer AVOptions: + +image2 muxer AVOptions: + +ipod muxer AVOptions: + +ismv muxer AVOptions: + +LATM/LOAS muxer AVOptions: + +hash encoder class AVOptions: + +matroska muxer AVOptions: + +matroska audio muxer AVOptions: + +mov muxer AVOptions: + +MP3 muxer AVOptions: + +mp4 muxer AVOptions: + +mpeg muxer AVOptions: + +vcd muxer AVOptions: + +dvd muxer AVOptions: + +svcd muxer AVOptions: + +vob muxer AVOptions: + +MPEGTS muxer AVOptions: + +mpjpeg_muxer AVOptions: + +MXF muxer AVOptions: + +MXF-D10 muxer AVOptions: + +MXF-OPAtom muxer AVOptions: + +nutenc AVOptions: + +Ogg audio muxer AVOptions: + +Ogg muxer AVOptions: + +Ogg Opus muxer AVOptions: + +psp muxer AVOptions: + +RTP muxer AVOptions: + +RTSP muxer AVOptions: + -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) + -rtsp_transport ED...... set RTSP transport protocols (default 0) + udp ED...... UDP + tcp ED...... TCP + udp_multicast .D...... UDP multicast + http .D...... HTTP tunneling + -rtsp_flags .D...... set RTSP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + listen .D...... wait for incoming connections + prefer_tcp ED...... try RTP via TCP first, if available + -allowed_media_types .D...... set media types to accept from the server (default F) + video .D...... Video + audio .D...... Audio + data .D...... Data + subtitle .D...... Subtitle + -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) + -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) + -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) + -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + -user-agent .D...... override User-Agent header (default "Lavf56.40.101") + +segment muxer AVOptions: + +stream_segment muxer AVOptions: + +smooth streaming muxer AVOptions: + +Ogg Speex muxer AVOptions: + +spdif AVOptions: + +tg2 muxer AVOptions: + +tgp muxer AVOptions: + +WAV muxer AVOptions: + +webm muxer AVOptions: + +WebM DASH Manifest muxer AVOptions: + +WebM Chunk Muxer AVOptions: + +WebP muxer AVOptions: + +caca_outdev AVOptions: + +fbdev outdev AVOptions: + +opengl outdev AVOptions: + +PulseAudio muxer AVOptions: + +sdl outdev AVOptions: + +xvideo outdev AVOptions: + diff --git a/utils/a b/utils/a new file mode 100644 index 000000000..ae05bcfd8 --- /dev/null +++ b/utils/a @@ -0,0 +1,1246 @@ +Simple multimedia streams analyzer +usage: ffprobe [OPTIONS] [INPUT_FILE] + +Main options: +-L show license +-h topic show help +-? topic show help +-help topic show help +--help topic show help +-version show version +-buildconf show build configuration +-formats show available formats +-devices show available devices +-codecs show available codecs +-decoders show available decoders +-encoders show available encoders +-bsfs show available bit stream filters +-protocols show available protocols +-filters show available filters +-pix_fmts show available pixel formats +-layouts show standard channel layouts +-sample_fmts show available audio sample formats +-colors show available color names +-loglevel loglevel set logging level +-v loglevel set logging level +-report generate a report +-max_alloc bytes set maximum size of a single allocated block +-cpuflags flags force specific cpu flags +-hide_banner hide_banner do not show program banner +-sources device list sources of the input device +-sinks device list sinks of the output device +-f format force format +-unit show unit of the displayed values +-prefix use SI prefixes for the displayed values +-byte_binary_prefix use binary prefixes for byte units +-sexagesimal use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units +-pretty prettify the format of displayed values, make it more human readable +-print_format format set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml) +-of format alias for -print_format +-select_streams stream_specifier select the specified streams +-sections print sections structure and section information, and exit +-show_data show packets data +-show_data_hash show packets data hash +-show_error show probing error +-show_format show format/container info +-show_frames show frames info +-show_format_entry entry show a particular entry from the format/container info +-show_entries entry_list show a set of specified entries +-show_packets show packets info +-show_programs show programs info +-show_streams show streams info +-show_chapters show chapters info +-count_frames count the number of frames per stream +-count_packets count the number of packets per stream +-show_program_version show ffprobe version +-show_library_versions show library versions +-show_versions show program and library versions +-show_pixel_formats show pixel format descriptions +-show_private_data show private data +-private same as show_private_data +-bitexact force bitexact output +-read_intervals read_intervals set read intervals +-default generic catch all option +-i input_file read specified file + + +AVFormatContext AVOptions: + -avioflags ED...... (default 0) + direct ED...... reduce buffering + -probesize .D...... set probing size (from 32 to I64_MAX) (default 5e+06) + -formatprobesize .D...... number of bytes to probe file format (from 0 to 2.14748e+09) (default 1.04858e+06) + -fflags ED...... (default 200) + ignidx .D...... ignore index + genpts .D...... generate pts + nofillin .D...... do not fill in missing values that can be exactly calculated + noparse .D...... disable AVParsers, this needs nofillin too + igndts .D...... ignore dts + discardcorrupt .D...... discard corrupted frames + sortdts .D...... try to interleave outputted packets by dts + keepside .D...... don't merge side data + fastseek .D...... fast but inaccurate seeks + nobuffer .D...... reduce the latency introduced by optional buffering + -seek2any .D...... allow seeking to non-keyframes on demuxer level when supported (from 0 to 1) (default 0) + -analyzeduration .D...... specify how many microseconds are analyzed to probe the input (from 0 to I64_MAX) (default 0) + -cryptokey .D...... decryption key + -indexmem .D...... max memory used for timestamp index (per stream) (from 0 to INT_MAX) (default 1.04858e+06) + -rtbufsize .D...... max memory used for buffering real-time frames (from 0 to INT_MAX) (default 3.04128e+06) + -fdebug ED...... print specific debug info (default 0) + ts ED...... + -max_delay ED...... maximum muxing or demuxing delay in microseconds (from -1 to INT_MAX) (default -1) + -fpsprobesize .D...... number of frames used to probe fps (from -1 to 2.14748e+09) (default -1) + -f_err_detect .D...... set error detection flags (deprecated; use err_detect, save via avconv) (default 1) + crccheck .D...... verify embedded CRCs + bitstream .D...... detect bitstream specification deviations + buffer .D...... detect improper bitstream length + explode .D...... abort decoding on minor error detection + ignore_err .D...... ignore errors + careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors + compliant .D...... consider all spec non compliancies as errors + aggressive .D...... consider things that a sane encoder shouldn't do as an error + -err_detect .D...... set error detection flags (default 1) + crccheck .D...... verify embedded CRCs + bitstream .D...... detect bitstream specification deviations + buffer .D...... detect improper bitstream length + explode .D...... abort decoding on minor error detection + ignore_err .D...... ignore errors + careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors + compliant .D...... consider all spec non compliancies as errors + aggressive .D...... consider things that a sane encoder shouldn't do as an error + -use_wallclock_as_timestamps .D...... use wallclock as timestamps (from 0 to 2.14748e+09) (default 0) + -skip_initial_bytes .D...... set number of bytes to skip before reading header and frames (from 0 to I64_MAX) (default 0) + -correct_ts_overflow .D...... correct single timestamp overflows (from 0 to 1) (default 1) + -f_strict ED...... how strictly to follow the standards (deprecated; use strict, save via avconv) (from INT_MIN to INT_MAX) (default 0) + very ED...... strictly conform to a older more strict version of the spec or reference software + strict ED...... strictly conform to all the things in the spec no matter what the consequences + normal ED...... + unofficial ED...... allow unofficial extensions + experimental ED...... allow non-standardized experimental variants + -strict ED...... how strictly to follow the standards (from INT_MIN to INT_MAX) (default 0) + very ED...... strictly conform to a older more strict version of the spec or reference software + strict ED...... strictly conform to all the things in the spec no matter what the consequences + normal ED...... + unofficial ED...... allow unofficial extensions + experimental ED...... allow non-standardized experimental variants + -max_ts_probe .D...... maximum number of packets to read while waiting for the first timestamp (from 0 to INT_MAX) (default 50) + -dump_separator ED...... set information dump field separator (default ", ") + -codec_whitelist .D...... List of decoders that are allowed to be used + -format_whitelist .D...... List of demuxers that are allowed to be used + -max_streams .D...... maximum number of streams (from 0 to INT_MAX) (default 1000) + +AVIOContext AVOptions: + +URLContext AVOptions: + +Async AVOptions: + +bluray AVOptions: + -playlist .D...... (from -1 to 99999) (default -1) + -angle .D...... (from 0 to 254) (default 0) + -chapter .D...... (from 1 to 65534) (default 1) + +Cache AVOptions: + -read_ahead_limit .D...... Amount in bytes that may be read ahead when seeking isn't supported, -1 for unlimited (from -1 to INT_MAX) (default 65536) + +crypto AVOptions: + -key ED...... AES encryption/decryption key + -iv ED...... AES encryption/decryption initialization vector + -decryption_key .D...... AES decryption key + -decryption_iv .D...... AES decryption initialization vector + +file AVOptions: + +ftp AVOptions: + -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) + -ftp-anonymous-password ED...... password for anonymous login. E-mail address should be used. + +http AVOptions: + -seekable .D...... control seekability of connection (from -1 to 1) (default -1) + -headers ED...... set custom HTTP headers, can override built in default headers + -content_type ED...... set a specific content type for the POST messages + -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") + -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") + -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) + -post_data ED...... set custom HTTP post data + -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax + -icy .D...... request ICY metadata (from 0 to 1) (default 1) + -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) + none ED...... No auth method set, autodetect + basic ED...... HTTP basic authentication + -location ED...... The actual location of the data received + -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) + -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) + -method ED...... Override the HTTP method or set the expected HTTP method from a client + -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) + -listen ED...... listen on HTTP (from 0 to 2) (default 0) + +https AVOptions: + -seekable .D...... control seekability of connection (from -1 to 1) (default -1) + -headers ED...... set custom HTTP headers, can override built in default headers + -content_type ED...... set a specific content type for the POST messages + -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") + -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") + -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) + -post_data ED...... set custom HTTP post data + -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax + -icy .D...... request ICY metadata (from 0 to 1) (default 1) + -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) + none ED...... No auth method set, autodetect + basic ED...... HTTP basic authentication + -location ED...... The actual location of the data received + -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) + -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) + -method ED...... Override the HTTP method or set the expected HTTP method from a client + -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) + -listen ED...... listen on HTTP (from 0 to 2) (default 0) + +icecast AVOptions: + +pipe AVOptions: + +rtp AVOptions: + -ttl ED...... Time to live (in milliseconds, multicast only) (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Send/Receive buffer size (in bytes) (from -1 to INT_MAX) (default -1) + -rtcp_port ED...... Custom rtcp port (from -1 to INT_MAX) (default -1) + -local_rtpport ED...... Local rtp port (from -1 to INT_MAX) (default -1) + -local_rtcpport ED...... Local rtcp port (from -1 to INT_MAX) (default -1) + -connect ED...... Connect socket (from 0 to 1) (default 0) + -write_to_source ED...... Send packets to the source address of the latest received packet (from 0 to 1) (default 0) + -pkt_size ED...... Maximum packet size (from -1 to INT_MAX) (default -1) + -dscp ED...... DSCP class (from -1 to INT_MAX) (default -1) + -sources ED...... Source list + -block ED...... Block list + +sctp AVOptions: + -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) + -timeout ED...... Connection timeout (in milliseconds) (from INT_MIN to INT_MAX) (default 10000) + -listen_timeout ED...... Bind timeout (in milliseconds) (from INT_MIN to INT_MAX) (default -1) + -max_streams ED...... Max stream to allocate (from 0 to 32767) (default 0) + +srtp AVOptions: + -srtp_in_suite .D...... + -srtp_in_params .D...... + +subfile AVOptions: + -start .D...... start offset (from 0 to I64_MAX) (default 0) + -end .D...... end offset (from 0 to I64_MAX) (default 0) + +tcp AVOptions: + -listen ED...... Listen for incoming connections (from 0 to 2) (default 0) + -timeout ED...... set timeout (in microseconds) of socket I/O operations (from -1 to INT_MAX) (default -1) + -listen_timeout ED...... Connection awaiting timeout (in milliseconds) (from -1 to INT_MAX) (default -1) + +tls AVOptions: + -ca_file ED...... Certificate Authority database file + -cafile ED...... Certificate Authority database file + -tls_verify ED...... Verify the peer certificate (from 0 to 1) (default 0) + -cert_file ED...... Certificate file + -key_file ED...... Private key file + -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) + -verifyhost ED...... Verify against a specific hostname + +udp AVOptions: + -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) + -localport ED...... Local port (from -1 to INT_MAX) (default -1) + -local_port ED...... Local port (from -1 to INT_MAX) (default -1) + -localaddr ED...... Local address + -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) + -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) + -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) + -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) + -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) + -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) + -sources ED...... Source list + -block ED...... Block list + +udplite AVOptions: + -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) + -localport ED...... Local port (from -1 to INT_MAX) (default -1) + -local_port ED...... Local port (from -1 to INT_MAX) (default -1) + -localaddr ED...... Local address + -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) + -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) + -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) + -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) + -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) + -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) + -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) + -sources ED...... Source list + -block ED...... Block list + +unix AVOptions: + -listen ED...... Open socket for listening (from 0 to 1) (default 0) + -timeout ED...... Timeout in ms (from -1 to INT_MAX) (default -1) + -type ED...... Socket type (from INT_MIN to INT_MAX) (default 1) + stream ED...... Stream (reliable stream-oriented) + datagram ED...... Datagram (unreliable packet-oriented) + seqpacket ED...... Seqpacket (reliable packet-oriented + +librtmp protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmpe protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmps protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmpt protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +librtmpte protocol AVOptions: + -rtmp_app ED...... Name of application to connect to on the RTMP server + -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") + -rtmp_conn ED...... Append arbitrary AMF data to the Connect message + -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. + -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) + any .D...... both + live .D...... live stream + recorded .D...... recorded stream + -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. + -rtmp_playpath ED...... Stream identifier to play or to publish + -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. + -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent + -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) + -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. + -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) + +libssh AVOptions: + -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) + -private_key ED...... set path to private key + +aa AVOptions: + -aa_fixed_key .D...... Fixed key used for handling Audible AA files + +Artworx Data Format demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +APNG demuxer AVOptions: + -ignore_loop .D...... ignore loop setting (from 0 to 1) (default 1) + -max_fps .D...... maximum framerate (0 is no limit) (from 0 to INT_MAX) (default 15) + -default_fps .D...... default framerate (0 is as fast as possible) (from 0 to INT_MAX) (default 15) + +aqtdec AVOptions: + -subfps .D...S.. set the movie frame rate (from 0 to INT_MAX) (default 25/1) + +asf demuxer AVOptions: + -no_resync_search .D...... Don't try to resynchronize by looking for a certain optional start code (from 0 to 1) (default 0) + -export_xmp .D...... Export full XMP metadata (from 0 to 1) (default 0) + +avi AVOptions: + -use_odml .D...... use odml index (from -1 to 1) (default 1) + +Binary text demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +cavsvideo demuxer AVOptions: + -framerate .D...... (default "25") + +CDXL demuxer AVOptions: + -sample_rate .D...... (from 1 to INT_MAX) (default 11025) + -framerate .D...... + +concat demuxer AVOptions: + -safe .D...... enable safe mode (from -1 to 1) (default 1) + -auto_convert .D...... automatically convert bitstream format (from 0 to 1) (default 1) + +dirac demuxer AVOptions: + -framerate .D...... (default "25") + +dnxhd demuxer AVOptions: + -framerate .D...... (default "25") + +dvbsub demuxer AVOptions: + -framerate .D...... (default "25") + +flvdec AVOptions: + -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) + +live_flvdec AVOptions: + -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) + +g729 demuxer AVOptions: + -bit_rate .D...... (from 0 to INT_MAX) (default 0) + +GIF demuxer AVOptions: + -min_delay .D...... minimum valid delay between frames (in hundredths of second) (from 0 to 6000) (default 2) + -max_gif_delay .D...... maximum valid delay between frames (in hundredths of seconds) (from 0 to 65535) (default 65535) + -default_delay .D...... default delay between frames (in hundredths of second) (from 0 to 6000) (default 10) + -ignore_loop .D...... ignore loop setting (netscape extension) (from 0 to 1) (default 1) + +gsm demuxer AVOptions: + -sample_rate .D...... (from 1 to 6.50753e+07) (default 8000) + +h261 demuxer AVOptions: + -framerate .D...... (default "25") + +h263 demuxer AVOptions: + -framerate .D...... (default "25") + +h264 demuxer AVOptions: + -framerate .D...... (default "25") + +hevc demuxer AVOptions: + -framerate .D...... (default "25") + +hls,applehttp AVOptions: + -live_start_index .D...... segment index to start live streams at (negative values are from the end) (from INT_MIN to INT_MAX) (default -3) + -allowed_extensions .D...... List of file extensions that hls is allowed to access (default "3gp,aac,avi,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav") + -max_reload .D...... Maximum number of times a insufficient list is attempted to be reloaded (from 0 to INT_MAX) (default 1000) + +iCE Draw File demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +image2 demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +image2pipe demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +alias_pix demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +brender_pix demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +ingenient demuxer AVOptions: + -framerate .D...... (default "25") + +m4v demuxer AVOptions: + -framerate .D...... (default "25") + +microdvddec AVOptions: + -subfps .D...S.. set the movie frame rate fallback (from 0 to INT_MAX) (default 0/1) + +mjpeg demuxer AVOptions: + -framerate .D...... (default "25") + +mov,mp4,m4a,3gp,3g2,mj2 AVOptions: + -use_absolute_path .D.V.... allow using absolute path when opening alias, this is a possible security issue (from 0 to 1) (default 0) + -seek_streams_individually .D.V.... Seek each stream individually to the to the closest point (from 0 to 1) (default 1) + -ignore_editlist .D.V.... (from 0 to 1) (default 0) + -use_mfra_for .D.V.... use mfra for fragment timestamps (from -1 to 2) (default -1) + auto .D.V.... auto + dts .D.V.... dts + pts .D.V.... pts + -export_all .D.V.... Export unrecognized metadata entries (from 0 to 1) (default 0) + -export_xmp .D.V.... Export full XMP metadata (from 0 to 1) (default 0) + -activation_bytes .D...... Secret bytes for Audible AAX files + -audible_fixed_key .D...... Fixed key used for handling Audible AAX files + -enable_drefs .D.V.... Enable external track support. (from 0 to 1) (default 0) + +mp3 AVOptions: + -usetoc .D...... use table of contents (from -1 to 2) (default -1) + +mpegts demuxer AVOptions: + -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) + -fix_teletext_pts .D...... try to fix pts values of dvb teletext streams (from 0 to 1) (default 1) + -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) + -scan_all_pmts .D...... scan and combine all PMTs (from -1 to 1) (default -1) + +mpegtsraw demuxer AVOptions: + -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) + -compute_pcr .D...... compute exact PCR for each transport stream packet (from 0 to 1) (default 0) + -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) + +mpegvideo demuxer AVOptions: + -framerate .D...... (default "25") + +alaw demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +mulaw demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f64be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f64le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f32be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +f32le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s32be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s32le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s24be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s24le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s16be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s16le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +s8 demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u32be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u32le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u24be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u24le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u16be demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u16le demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +u8 demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 44100) + -channels .D...... (from 0 to INT_MAX) (default 1) + +rawvideo demuxer AVOptions: + -video_size .D...... set frame size + -pixel_format .D...... set pixel format (default "yuv420p") + -framerate .D...... set frame rate (default "25") + +RTP demuxer AVOptions: + -rtp_flags .D...... set RTP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + +RTSP demuxer AVOptions: + -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) + -rtsp_transport ED...... set RTSP transport protocols (default 0) + udp ED...... UDP + tcp ED...... TCP + udp_multicast .D...... UDP multicast + http .D...... HTTP tunneling + -rtsp_flags .D...... set RTSP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + listen .D...... wait for incoming connections + prefer_tcp ED...... try RTP via TCP first, if available + -allowed_media_types .D...... set media types to accept from the server (default F) + video .D...... Video + audio .D...... Audio + data .D...... Data + subtitle .D...... Subtitle + -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) + -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) + -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) + -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + -user-agent .D...... override User-Agent header (default "Lavf56.40.101") + +sbg_demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 0) + -frame_size .D...... (from 0 to INT_MAX) (default 0) + -max_file_size .D...... (from 0 to INT_MAX) (default 5e+06) + +SDP demuxer AVOptions: + -sdp_flags .D...... SDP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + custom_io .D...... use custom I/O + rtcp_to_source .D...... send RTCP packets to the source address of received packets + -allowed_media_types .D...... set media types to accept from the server (default F) + video .D...... Video + audio .D...... Audio + data .D...... Data + subtitle .D...... Subtitle + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + +sln demuxer AVOptions: + -sample_rate .D...... (from 0 to INT_MAX) (default 8000) + -channels .D...... (from 0 to INT_MAX) (default 1) + +tedcaptions_demuxer AVOptions: + -start_time .D...S.. set the start time (offset) of the subtitles, in ms (from I64_MIN to I64_MAX) (default 15000) + +TTY demuxer AVOptions: + -chars_per_frame .D...... (from 1 to INT_MAX) (default 6000) + -video_size .D...... A string describing frame size, such as 640x480 or hd720. + -framerate .D...... (default "25") + +vc1 demuxer AVOptions: + -framerate .D...... (default "25") + +vobsub AVOptions: + -sub_name .D...... URI for .sub file + +WAV demuxer AVOptions: + -ignore_length .D...... Ignore length (from 0 to 1) (default 0) + +WebM DASH Manifest demuxer AVOptions: + -live .D...... flag indicating that the input is a live file that only has the headers. (from 0 to 1) (default 0) + +WebVTT demuxer AVOptions: + +eXtended BINary text (XBIN) demuxer AVOptions: + -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) + -video_size .D...... set video size, such as 640x480 or hd720. + -framerate .D...... set framerate (frames per second) (default "25") + +bmp demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +dds demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +dpx demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +exr demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +j2k demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +jpeg demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +jpegls demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +pictor demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +png demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +qdraw demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +sgi demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +sunrast demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +tiff demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +webp demuxer AVOptions: + -framerate .D...... set the video framerate (default "25") + -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) + -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) + glob_sequence .D...... select glob/sequence pattern type + glob .D...... select glob pattern type + sequence .D...... select sequence pattern type + none .D...... disable pattern matching + -pixel_format .D...... set video pixel format + -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) + -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) + -video_size .D...... set video size + -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) + -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) + none .D...... none + sec .D...... second precision + ns .D...... nano second precision + +Game Music Emu demuxer AVOptions: + -track_index .D..A... set track that should be played (from 0 to INT_MAX) (default 0) + -sample_rate .D..A... set sample rate (from 1000 to 999999) (default 44100) + -max_size .D..A... set max file size supported (in bytes) (from 0 to 1.84467e+19) (default 5.24288e+07) + +ModPlug demuxer AVOptions: + -noise_reduction .D...... Enable noise reduction 0(off)-1(on) (from 0 to 1) (default 0) + -reverb_depth .D...... Reverb level 0(quiet)-100(loud) (from 0 to 100) (default 0) + -reverb_delay .D...... Reverb delay in ms, usually 40-200ms (from 0 to INT_MAX) (default 0) + -bass_amount .D...... XBass level 0(quiet)-100(loud) (from 0 to 100) (default 0) + -bass_range .D...... XBass cutoff in Hz 10-100 (from 0 to 100) (default 0) + -surround_depth .D...... Surround level 0(quiet)-100(heavy) (from 0 to 100) (default 0) + -surround_delay .D...... Surround delay in ms, usually 5-40ms (from 0 to INT_MAX) (default 0) + -max_size .D...... Max file size supported (in bytes). Default is 5MB. Set to 0 for no limit (not recommended) (from 0 to 1.04858e+08) (default 5.24288e+06) + -video_stream_expr .D...... Color formula + -video_stream .D...... Make demuxer output a video stream (from 0 to 1) (default 0) + -video_stream_w .D...... Video stream width in char (one char = 8x8px) (from 20 to 512) (default 30) + -video_stream_h .D...... Video stream height in char (one char = 8x8px) (from 20 to 512) (default 30) + -video_stream_ptxt .D...... Print speed, tempo, order, ... in video stream (from 0 to 1) (default 1) + +ALSA demuxer AVOptions: + -sample_rate .D...... (from 1 to INT_MAX) (default 48000) + -channels .D...... (from 1 to INT_MAX) (default 2) + +DV1394 indev AVOptions: + -standard .D...... (from 0 to 1) (default 0) + PAL .D...... + NTSC .D...... + -channel .D...... (from 0 to INT_MAX) (default 63) + +fbdev indev AVOptions: + -framerate .D...... (default "25") + +iec61883 indev AVOptions: + -dvtype .D...... override autodetection of DV/HDV (from 0 to 2) (default 0) + auto .D...... auto detect DV/HDV + dv .D...... force device being treated as DV device + hdv .D...... force device being treated as HDV device + -dvbuffer .D...... set queue buffer size (in packets) (from 0 to INT_MAX) (default 0) + -dvguid .D...... select one of multiple DV devices by its GUID + +JACK indev AVOptions: + -channels .D...... Number of audio channels. (from 1 to INT_MAX) (default 2) + +lavfi indev AVOptions: + -graph .D...... set libavfilter graph + -graph_file .D...... set libavfilter graph filename + -dumpgraph .D...... dump graph to stderr + +openal AVOptions: + -channels .D...... set number of channels (from 1 to 2) (default 2) + -sample_rate .D...... set sample rate (from 1 to 192000) (default 44100) + -sample_size .D...... set sample size (from 8 to 16) (default 16) + -list_devices .D...... list available devices (from 0 to 1) (default 0) + true .D...... + false .D...... + +OSS demuxer AVOptions: + -sample_rate .D...... (from 1 to INT_MAX) (default 48000) + -channels .D...... (from 1 to INT_MAX) (default 2) + +Pulse demuxer AVOptions: + -server .D...... set PulseAudio server + -name .D...... set application name (default "Lavf56.40.101") + -stream_name .D...... set stream description (default "record") + -sample_rate .D...... set sample rate in Hz (from 1 to INT_MAX) (default 48000) + -channels .D...... set number of audio channels (from 1 to INT_MAX) (default 2) + -frame_size .D...... set number of bytes per frame (from 1 to INT_MAX) (default 1024) + -fragment_size .D...... set buffering size, affects latency and cpu usage (from -1 to INT_MAX) (default -1) + -wallclock .D...... set the initial pts using the current time (from -1 to 1) (default 1) + +V4L2 indev AVOptions: + -standard .D...... set TV standard, used only by analog frame grabber + -channel .D...... set TV channel, used only by frame grabber (from -1 to INT_MAX) (default -1) + -video_size .D...... set frame size + -pixel_format .D...... set preferred pixel format + -input_format .D...... set preferred pixel format (for raw video) or codec name + -framerate .D...... set frame rate + -list_formats .D...... list available formats and exit (from 0 to INT_MAX) (default 0) + all .D...... show all available formats + raw .D...... show only non-compressed formats + compressed .D...... show only compressed formats + -list_standards .D...... list supported standards and exit (from 0 to 1) (default 0) + all .D...... show all supported standards + -timestamps .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) + default .D...... use timestamps from the kernel + abs .D...... use absolute timestamps (wall clock) + mono2abs .D...... force conversion from monotonic to absolute timestamps + -ts .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) + default .D...... use timestamps from the kernel + abs .D...... use absolute timestamps (wall clock) + mono2abs .D...... force conversion from monotonic to absolute timestamps + -use_libv4l2 .D...... use libv4l2 (v4l-utils) conversion functions (from 0 to 1) (default 0) + +xcbgrab indev AVOptions: + -x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) + -y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) + -grab_x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) + -grab_y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) + -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "vga") + -framerate .D...... (default "ntsc") + -draw_mouse .D...... Draw the mouse pointer. (from 0 to 1) (default 1) + -follow_mouse .D...... Move the grabbing region when the mouse pointer reaches within specified amount of pixels to the edge of region. (from -1 to INT_MAX) (default 0) + centered .D...... Keep the mouse pointer at the center of grabbing region when following. + -show_region .D...... Show the grabbing region. (from 0 to 1) (default 0) + -region_border .D...... Set the region border thickness. (from 1 to 128) (default 3) + +libcdio indev AVOptions: + -speed .D...... set drive reading speed (from 0 to INT_MAX) (default 0) + -paranoia_mode .D...... set error recovery mode (default 0) + disable .D...... apply no fixups + verify .D...... verify data integrity in overlap area + overlap .D...... perform overlapped reads + neverskip .D...... do not skip failed reads + full .D...... apply all recovery modes + +libdc1394 indev AVOptions: + -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "qvga") + -pixel_format .D...... (default "uyvy422") + -framerate .D...... (default "ntsc") + +ADTS muxer AVOptions: + +AIFF muxer AVOptions: + +APNG muxer AVOptions: + +ass muxer AVOptions: + +AST muxer AVOptions: + +dash muxer AVOptions: + +f4v muxer AVOptions: + +flac muxer AVOptions: + +frame hash encoder class AVOptions: + +GIF muxer AVOptions: + +HDS muxer AVOptions: + +hls muxer AVOptions: + +image2 muxer AVOptions: + +ipod muxer AVOptions: + +ismv muxer AVOptions: + +LATM/LOAS muxer AVOptions: + +hash encoder class AVOptions: + +matroska muxer AVOptions: + +matroska audio muxer AVOptions: + +mov muxer AVOptions: + +MP3 muxer AVOptions: + +mp4 muxer AVOptions: + +mpeg muxer AVOptions: + +vcd muxer AVOptions: + +dvd muxer AVOptions: + +svcd muxer AVOptions: + +vob muxer AVOptions: + +MPEGTS muxer AVOptions: + +mpjpeg_muxer AVOptions: + +MXF muxer AVOptions: + +MXF-D10 muxer AVOptions: + +MXF-OPAtom muxer AVOptions: + +nutenc AVOptions: + +Ogg audio muxer AVOptions: + +Ogg muxer AVOptions: + +Ogg Opus muxer AVOptions: + +psp muxer AVOptions: + +RTP muxer AVOptions: + +RTSP muxer AVOptions: + -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) + -rtsp_transport ED...... set RTSP transport protocols (default 0) + udp ED...... UDP + tcp ED...... TCP + udp_multicast .D...... UDP multicast + http .D...... HTTP tunneling + -rtsp_flags .D...... set RTSP flags (default 0) + filter_src .D...... only receive packets from the negotiated peer IP + listen .D...... wait for incoming connections + prefer_tcp ED...... try RTP via TCP first, if available + -allowed_media_types .D...... set media types to accept from the server (default F) + video .D...... Video + audio .D...... Audio + data .D...... Data + subtitle .D...... Subtitle + -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) + -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) + -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) + -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) + -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) + -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) + -user-agent .D...... override User-Agent header (default "Lavf56.40.101") + +segment muxer AVOptions: + +stream_segment muxer AVOptions: + +smooth streaming muxer AVOptions: + +Ogg Speex muxer AVOptions: + +spdif AVOptions: + +tg2 muxer AVOptions: + +tgp muxer AVOptions: + +WAV muxer AVOptions: + +webm muxer AVOptions: + +WebM DASH Manifest muxer AVOptions: + +WebM Chunk Muxer AVOptions: + +WebP muxer AVOptions: + +caca_outdev AVOptions: + +fbdev outdev AVOptions: + +opengl outdev AVOptions: + +PulseAudio muxer AVOptions: + +sdl outdev AVOptions: + +xvideo outdev AVOptions: + diff --git a/utils/checksums.sh b/utils/checksums.sh new file mode 100755 index 000000000..e6bce9b90 --- /dev/null +++ b/utils/checksums.sh @@ -0,0 +1,11 @@ +#!/bin/sh +for F in \ +'Lubuntu 16.04 x86.vdi' \ +'w7.vdi' \ +'w7-x64-ru.vdi' \ +'Windows10-x64-lite-ru-dynamic.vdi' \ +'Windows 7 Visual Studio 2015 removed.vdi' \ +'Windows 7 Visual Studio 2015.vdi' \ +'XPSP3.vdi' \ +; do echo "$F"; md5sum "$F" |tee -a "$F.sum" ; done + diff --git a/utils/generate_convert.sh b/utils/generate_convert.sh index 95fe009aa..b8d85c782 100755 --- a/utils/generate_convert.sh +++ b/utils/generate_convert.sh @@ -161,6 +161,7 @@ if [[ "${INSPECT}" = 'true' ]]; then fi SIZES=( '1024x768:svga' + # 667x500 '1024x576:hd480' '1920x1080:qhd' '800x600:spal' diff --git a/utils/generate_convert.sh.SAVED b/utils/generate_convert.sh.SAVED new file mode 100755 index 000000000..de91d7bc4 --- /dev/null +++ b/utils/generate_convert.sh.SAVED @@ -0,0 +1,217 @@ +#!/bin/bash + +# Convert high-res mp4 to low res mkv +# ffmpeg options taken from: +# https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +# https://ffmpeg.org/ffmpeg-utils.html#Video-size +# e.g. svga, qhd, hd480, hd720 +# default is qhd which is scaled down hd720 with same aspect raio. +# videos converted from hs720 to svga is best viewed with aspect ratio of 16:9 +# lynx -dump https://ffmpeg.org/ffmpeg-utils.html#Video-size 2>&1 |sed -n '/Video size/,/Video rate/p' +# see also: https://www.maketecheasier.com/manipulate-html-and-xml-files-from-commnad-line/ +# to calculate the new video size based on the current use +# use https://www.commandlinefu.com/commands/view/2207/get-video-information-with-ffmpeg +# e.g. ffmpeg -i or ffprobe -show_streams + +# following is the complete list of abbreviations recognized by ffmpeg: + +# ‘sqcif’ 128x96 +# ‘qqvga’ 160x120 +# ‘qcif’ 176x144 +# ‘hqvga’ 240x160 +# ‘cga’ 320x200 +# ‘qvga’ 320x240 +# ‘cif’ 352x288 +# ‘film’ 352x240 +# ‘ntsc-film’ 352x240 +# ‘qntsc’ 352x240 +# ‘qpal’ 352x288 +# ‘wqvga’ 400x240 +# ‘fwqvga’ 432x240 +# ‘hvga’ 480x320 +# ‘ega’ 640x350 +# ‘nhd’ 640x360 +# ‘sntsc’ 640x480 +# ‘vga’ 640x480 +# ‘4cif’ 704x576 +# ‘ntsc’ 720x480 +# ‘pal’ 720x576 +# ‘spal’ 768x576 +# ‘svga’ 800x600 +# ‘hd480’ 852x480 +# ‘wvga’ 852x480 +# ‘qhd’ 960x540 +# ‘xga’ 1024x768 +# ‘hd720’ 1280x720 +# ‘sxga’ 1280x1024 +# ‘wxga’ 1366x768 +# ‘16cif’ 1408x1152 +# ‘uxga’ 1600x1200 +# ‘wsxga’ 1600x1024 +# ‘hd1080’ 1920x1080 +# ‘wuxga’ 1920x1200 +# ‘2kflat’ 1998x1080 +# ‘2k’ 2048x1080 +# ‘2kdci’ 2048x1080 +# ‘2kscope’ 2048x858 +# ‘qxga’ 2048x1536 +# ‘qsxga’ 2560x2048 +# ‘woxga’ 2560x1600 +# ‘wqsxga’ 3200x2048 +# ‘uhd2160’ 3840x2160 +# ‘wquxga’ 3840x2400 +# ‘4kflat’ 3996x2160 +# ‘4k’ 4096x2160 +# ‘4kdci’ 4096x2160 +# ‘4kscope’ 4096x1716 +# ‘hsxga’ 5120x4096 +# ‘whsxga’ 6400x4096 +# ‘uhd4320’ 7680x4320 +# ‘whuxga’ 7680x4800 + +# origin: https://gist.github.com/cosimo/3760587 +OPTS=`getopt -o vnhisbe: --long verbose,dry-run,help,inspect,size,batterycheck,extension: -n 'parse-options' -- "$@"` +if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi + +VERBOSE=false +HELP=false +DRY_RUN=false +BATTERY_CHECK=false +SIZE='qhd' +EXTENSION='mp4' + +while true; do + case "$1" in + -v | --verbose ) VERBOSE=true; shift ;; + -i | --inspect ) INSPECT=true; shift ;; + -h | --help ) HELP=true; shift ;; + -n | --dry-run ) DRY_RUN=true; shift ;; + -b | --battery-check ) BATTERY_CHECK=true; shift ;; + -s | --size ) SIZE="$2"; shift; shift ;; + -e | --extension ) EXTENSION="$2"; shift; shift ;; + -- ) shift; break ;; + * ) break ;; + esac +done + +if [[ "${VERBOSE}" = "true" ]]; then + echo VERBOSE=$VERBOSE + echo INSPECT=$INSPECT + echo HELP=$HELP + echo DRY_RUN=$DRY_RUN + echo SIZE=$SIZE + echo EXTENSION=$EXTENSION + echo BATTERY_CHECK=$BATTERY_CHECK +fi + +SCRIPT="/tmp/convert.$$.sh" +cat <>$SCRIPT +check_remaining_battery () { +STATE=\$(upower -i \$(upower -e | grep -i battery | head -1)| grep -E 'state: *' | awk '{print \$2}') +MINUTES=\$(upower -i \$(upower -e | grep -i battery | head -1)| grep 'time to empty' | grep minutes | awk '{print \$4}' | sed 's|\.[0-9][0-9]*||') +if [[ "\${STATE}" -ne 'charging' ]] +# when the battery is charging the time to empty is meaningless +then + if [[ ! -z \$MINUTES ]] + then + if [ \$MINUTES -lt 5 ] + then + echo 'Too little battery left - aborting' + exit 0 + fi + fi +fi +} +EOF +# NOTE: to set DEBUG need to export it from the calling shell +if [[ -z "${DEBUG}" ]] ; then + echo 'DEBUG was not set explicitly, default is false' + DEBUG='false' +fi +echo "DEBUG=${DEBUG}" +if [[ "${DEBUG}" = 'true' ]] ; then + echo "Finding files \"*${EXTENSION}\"" +fi +if [[ "${INSPECT}" = 'true' ]]; then + if [[ "${DEBUG}" = 'true' ]]; then + echo "Inspecting first file \"*${EXTENSION}\"" + fi + # ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_height=\(.*\)$|\1|p' + S=$(find . -iname "*${EXTENSION}" | head -1) + H=$(ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_height=\(.*\)$|\1|p') + W=$(ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_width=\(.*\)$|\1|p') + + CODED="${W}x${H}" + if [[ "${DEBUG}" = 'true' ]]; then + echo "height=$H" + echo "width=$W" + echo "coded dimensions=$CODED" + fi + + SIZES=( '1024x768:svga' + '1024x576:hd480' + '1920x1080:qhd' + '800x600:spal' + '1278x718:qhd' + '1280x720:qhd' + '1920x1080:qhd' + '1920x1088:qhd' ) + + SIZE='?' + + for ENTRY in "${SIZES[@]}" ; do + KEY="${ENTRY%%:*}" + VALUE="${ENTRY##*:}" + if [[ "${CODED}" = "${KEY}" ]] ; then + SIZE=$VALUE + fi + done + echo $CODED + echo $SIZE + exit 0 +fi +# technically able to descend, seldom used +find . -iname "*${EXTENSION}" | sort | while read filename ; do + D=$(dirname "$filename") + S=$(basename "$filename") + T="${S/.${EXTENSION}/.mkv}" + if [[ "$D" != '.' ]] + then + echo ">/dev/null pushd '$D'" + fi + echo "if [[ ! -f \"$T\" ]];" + echo ' then' + if [[ "${BATTERY_CHECK}" = 'true' ]] ; then + echo 'check_remaining_battery' + fi + echo "echo \"Converting \\\"$S\\\"\"" + echo " ffmpeg -i \"$S\" -c:v vp9 -s ${SIZE} -v 0 \"$T\"" + # TODO: + # echo " ffprobe -show_format -v quiet \"$T\" | grep -i duration| sed 's/duration=//'" + echo 'fi' + if [[ "$D" != '.' ]] + then + echo '>/dev/null popd' + fi +done | tee -a $SCRIPT +chmod +x $SCRIPT +if [[ "${DEBUG}" = 'true' ]] +then + echo "Generated ${SCRIPT}" +else + if [[ "${DRY_RUN}" = "true" ]]; then + echo "Generated ${SCRIPT}" + else + echo "Running ${SCRIPT}" + $SCRIPT + rm -f $SCRIPT + fi +fi +# TODO: +# find . -iname '*mp3' | xargs -IX ffprobe -show_format -v quiet X | grep 'track=' |sort +# NOTE; may be empty +# NOTE: xargs: unmatched single quote; by default quotes are special to xargs unless you use the +# find . -iname '*mp3' -exec ffprobe -show_format -v quiet {} 2>&1 \; | grep 'track *' +# find . -iname '*mp3' -exec ffprobe -show_format {} 2>&1 \; | grep -E '(track|title) *:' + + diff --git a/utils/pickproject.sh.SAVED b/utils/pickproject.sh.SAVED new file mode 100755 index 000000000..b59ae3e7c --- /dev/null +++ b/utils/pickproject.sh.SAVED @@ -0,0 +1,12 @@ +#!/bin/bash +PROJECT=$1 +if [ -z $PROJECT ] ; then + PROJECT=$(pwd | sed 's|^.*/||') # current directory +else + mkdir $PROJECT + cd $PROJECT +fi +tar xzvf ~/$PROJECT.tar.gz +find . -type f -exec touch {} \; +git add --all . +git reset HEAD */bin */obj diff --git a/utils/rename.sh b/utils/rename.sh old mode 100644 new mode 100755 diff --git a/utils/rename_ir.sh b/utils/rename_ir.sh new file mode 100755 index 000000000..4e6948ba2 --- /dev/null +++ b/utils/rename_ir.sh @@ -0,0 +1,19 @@ +#!/bin/sh +REMOVE_TITLE_FRAGMENT=${2:--git.ir} +EXTENSION=${1:-mp4} +# after copying rename the files - undo URL-encoded names +for F in $(ls -1 *.$EXTENSION) +do + T=$(echo $F| sed 's|0x20| |g'| sed 's|%20| |g') + if [ "$F" != "$T" ]; then + mv "$F" "$T" + fi +done + + + ls -1 *.$EXTENSION| while read F ; do +G=$(echo $F|sed "s|$REMOVE_TITLE_FRAGMENT||") ; + if [ "$F" != "$G" ]; then +mv "$F" "$G" ; + fi +done diff --git a/utils/restore_image.sh b/utils/restore_image.sh old mode 100644 new mode 100755 index fe7e081df..a24076dca --- a/utils/restore_image.sh +++ b/utils/restore_image.sh @@ -1,5 +1,5 @@ #!/bin/bash -IMAGE=${1:-lenovo120s} +IMAGE=${1:-lenovo40withminikube} DISK=${2:-/dev/sdc} STAGING='/media/sergueik/Windows8_OS/Users/Serguei/Desktop/Private/z/' if [ ! -d $STAGING ] ;then diff --git a/utils/save_image.sh b/utils/save_image.sh old mode 100644 new mode 100755 index 50c23ca1a..5637b1f4a --- a/utils/save_image.sh +++ b/utils/save_image.sh @@ -1,5 +1,5 @@ #!/bin/bash -IMAGE=${1:-lenovo120s} +IMAGE=${1:-lenovo40withminikube} DISK=${2:-/dev/sdc} # When copying larger ssd to a later useful is to provide count e.g. # count=64 bs=500M diff --git a/utils/vnvctl.sh b/utils/vnvctl.sh index a6fc5816e..478165312 100755 --- a/utils/vnvctl.sh +++ b/utils/vnvctl.sh @@ -1,4 +1,5 @@ #!/bin/bash +# https://www.ubuntu18.com/install-vnc-server-ubuntu-18/ # TODO: check the DIPLAY_PORT part COMMAND=${1:-stop} if [ "$COMMAND" = "stop" ]; then diff --git a/xls-validate/Dockerfile b/xls-validate/Dockerfile new file mode 100644 index 000000000..48eeecb61 --- /dev/null +++ b/xls-validate/Dockerfile @@ -0,0 +1,8 @@ +ARG BASE=gradle:7.3.1-jdk11-alpine +# gradle:8.1-jdk11-alpine is problematic +FROM $BASE +WORKDIR /work +COPY build.gradle gradle.properties ./ +ADD gradle ./gradle/ +ADD src ./src/ +CMD ["gradle", "test"] diff --git a/xls-validate/README.md b/xls-validate/README.md index bc2b756c8..fef0445ba 100644 --- a/xls-validate/README.md +++ b/xls-validate/README.md @@ -1,6 +1,6 @@ ### Info - fork of https://github.com/codeborne/xls-test/tree/main, preparing to add PR +fork of https://github.com/codeborne/xls-test/tree/main, preparing to add PR ### NOTE @@ -13,6 +13,92 @@ java.lang.NoClassDefFoundError: Could not initialize class org.jopendocument.dom solved via ```sh sudo apt install openjdk-11-jdk +``` +### Gradle Testing + + +```sh +docker pull gradle:7.3.1-jdk11-alpine +``` + +```sh +IMAGE=basic-xls-test +docker build -t $IMAGE -f Dockerfile . +``` +* basic test + +```sh +mkdir build +docker container run --rm -v $(pwd)/build:/work/build:rw $IMAGE +ls -l build +``` +```sh +docker container run -v $(pwd)/build:/work/build:rw -it $IMAGE +``` +```text +Welcome to Gradle 7.3.1! + +Here are the highlights of this release: + - Easily declare new test suites in Java projects + - Support for Java 17 + - Support for Scala 3 + +For more details see https://docs.gradle.org/7.3.1/release-notes.html + +Starting a Gradle Daemon (subsequent builds will be faster) +> Task :libsProd +> Task :libsTest +> Task :compileJava +> Task :processResources NO-SOURCE +> Task :classes +> Task :compileTestJava +> Task :processTestResources +> Task :testClasses + +> Task :test + +com.codeborne.xlstest.CreateXLSXTest > fromFile STANDARD_ERROR + ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console... + +Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. + +You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. + +See https://docs.gradle.org/7.3.1/userguide/command_line_interface.html#sec:command_line_warnings + +BUILD SUCCESSFUL in 51s +6 actionable tasks: 6 executed +``` +### NOTE: + +does not work with gradle __8.x__: + +```sh +docker pull gradle:8.1-jdk11-alpine +``` + +```sh +IMAGE=basic-xls-test-broken +docker image rm $IMAGE +docker build --build-arg "BASE=gradle:8.1-jdk11-alpine" -t $IMAGE -f Dockerfile . +``` + +```sh +docker container run --rm -v $(pwd)/build:/work/build:rw $IMAGE +``` + +```text +Starting a Gradle Daemon (subsequent builds will be faster) + +FAILURE: Build failed with an exception. + +* Where: +Script '/work/gradle/publish.gradle' line: 11 + +* What went wrong: +A problem occurred evaluating script. +> Could not set unknown property 'classifier' for task ':sourcesJar' of type org.gradle.api.tasks.bundling.Jar. + ``` ### Author diff --git a/xls-validate/build.gradle b/xls-validate/build.gradle new file mode 100644 index 000000000..31037341b --- /dev/null +++ b/xls-validate/build.gradle @@ -0,0 +1,23 @@ +buildscript { + repositories { + mavenCentral() + maven { url 'https://plugins.gradle.org/m2' } + } +} + +plugins { + id 'java' + id 'jacoco' + id 'com.github.kt3k.coveralls' version '2.12.2' +} + +group='com.codeborne' +archivesBaseName = 'xls-test' +version='1.7.0' + +defaultTasks 'test', 'publishToMavenLocal' + +apply from: file('gradle/compilation.gradle') +apply from: file('gradle/dependencies.gradle') +apply from: file('gradle/tests.gradle') +apply from: file('gradle/publish.gradle') diff --git a/xls-validate/gradle.properties b/xls-validate/gradle.properties new file mode 100644 index 000000000..005e033e2 --- /dev/null +++ b/xls-validate/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Dfile.encoding=UTF-8 diff --git a/xls-validate/gradle/compilation.gradle b/xls-validate/gradle/compilation.gradle new file mode 100644 index 000000000..50b807fd4 --- /dev/null +++ b/xls-validate/gradle/compilation.gradle @@ -0,0 +1,6 @@ +[compileJava, compileTestJava]*.options.collect {options -> options.encoding = 'UTF-8'} +[compileJava, compileTestJava]*.options.collect {options -> options.debug = true} +compileJava.options.debugOptions.debugLevel = "source,lines,vars" + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 diff --git a/xls-validate/gradle/dependencies.gradle b/xls-validate/gradle/dependencies.gradle new file mode 100644 index 000000000..7bc3dba51 --- /dev/null +++ b/xls-validate/gradle/dependencies.gradle @@ -0,0 +1,27 @@ +dependencies { + implementation group: 'net.sf.jxls', name: 'jxls-core', version: '1.0.6', transitive: true + implementation group: 'net.sf.jxls', name: 'jxls-reader', version: '1.0.6', transitive: true + implementation group: 'org.apache.commons', name: 'commons-jexl', version: '2.1.1', transitive: true + implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3', transitive: true + implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '5.2.3', transitive: true + implementation group: 'org.jopendocument', name: 'jOpenDocument', version: '1.3', transitive: true + + implementation group: 'org.hamcrest', name: 'hamcrest', version: '2.2', transitive: false + testImplementation group: 'junit', name: 'junit', version: '4.13.2', transitive: false +} + +repositories{ + mavenCentral() +} + +task libsProd(type: Sync) { + from configurations.compileClasspath + into "$buildDir/lib/prod" +} + +task libsTest(type: Sync) { + from configurations.testRuntimeClasspath - configurations.compileClasspath + into "$buildDir/lib/test" +} + +compileJava.dependsOn libsProd, libsTest diff --git a/xls-validate/gradle/publish.gradle b/xls-validate/gradle/publish.gradle new file mode 100644 index 000000000..a85390966 --- /dev/null +++ b/xls-validate/gradle/publish.gradle @@ -0,0 +1,88 @@ +jar { + manifest { + attributes( + "Implementation-Title": project.group + '.' + project.name, + "Implementation-Version": version, + "Implementation-Vendor": "Codeborne") + } +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from sourceSets.main.allJava +} + +javadoc { + options.encoding = 'UTF-8' + failOnError = false +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +if (project.hasProperty("signing.keyId")) { + apply plugin: 'signing' + apply plugin: 'maven-publish' + + signing { + afterEvaluate { + sign publishing.publications.mavenJava + } + } + + artifacts { + archives jar + archives sourcesJar + archives javadocJar + } + + publishing { + repositories { + maven { + name 'Maven' + url project.version.endsWith("-SNAPSHOT") ? + 'https://oss.sonatype.org/content/repositories/snapshots/' : + 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + credentials { + username "$sonatypeUsername" + password "$sonatypePassword" + } + } + } + publications { + mavenJava(MavenPublication) { + groupId "${project.group}" + artifactId "${project.name}" + + from components.java + artifact(sourcesJar) + artifact(javadocJar) + + pom { + name = archivesBaseName + description = 'XLS Test: Excel testing library' + url = 'https://github.com/codeborne/xls-test' + licenses { + license { + name = 'MIT' + url = 'https://opensource.org/licenses/MIT' + } + } + developers { + developer { + id = 'asolntsev' + name = 'Andrei Solntsev' + } + } + scm { + connection = 'scm:git@github.com:codeborne/xls-test.git' + developerConnection = 'scm:git@github.com:codeborne/xls-test.git' + url = 'https://github.com/codeborne/xls-test' + } + } + } + } + } +} diff --git a/xls-validate/gradle/tests.gradle b/xls-validate/gradle/tests.gradle new file mode 100644 index 000000000..57e749425 --- /dev/null +++ b/xls-validate/gradle/tests.gradle @@ -0,0 +1,19 @@ +test { + include 'example/**/*' + systemProperties['file.encoding'] = 'UTF-8' + testLogging.showStandardStreams = true + jacoco { + enabled = true + } +} + +//jacocoTestReport { +// reports { + // xml.enabled true + // html.enabled true + // } +//} + +tasks.coveralls { + onlyIf { System.env.'CI' } +} diff --git a/xls-validate/pom.xml b/xls-validate/pom.xml index 17e4e4b90..57a06d86b 100644 --- a/xls-validate/pom.xml +++ b/xls-validate/pom.xml @@ -17,33 +17,18 @@ UTF-8 - 1.3 - 2.7 - 3.5 1.3 4.13.1 - 1.23.0 - 1.23.0 - v4-rev493-1.23.0 1.8 1.3 - 20080701 2.0.6 1.0.6 2.1.1 - 2.4.0 3.6.1 1.8 - 1.3 4.1.2 ${poi.version} - 3.13.0 - - ${selenium.version} - ${selenium.version} - 1.32 - 5.3.2 EntryPoint @@ -72,32 +57,6 @@ junit ${junit.version} - - org.yaml - snakeyaml - ${snakeyaml.version} - - - io.github.bonigarcia - webdrivermanager - ${webdrivermanager.version} - test - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - org.jopendocument jOpenDocument @@ -123,73 +82,11 @@ poi-excelant ${poi.version} - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - test - - - org.seleniumhq.selenium - selenium-server - ${selenium.version} - test - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - test - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - test - - - org.seleniumhq.selenium - selenium-chrome-driver - ${selenium-chrome-driver.version} - test - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - test - - - org.json - json - ${json.version} - - - com.jayway.jsonpath - json-path - ${json-path.version} - org.hamcrest hamcrest-all ${hamcrest-all.version} - - - com.google.api-client - google-api-client - ${google-api-client.version} - - - com.google.oauth-client - google-oauth-client-jetty - ${google-oauth-client-jetty.version} - - - com.google.apis - google-api-services-sheets - ${google-api-services-sheets.version} - - + diff --git a/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java index b75b3b410..9bc53c7a5 100644 --- a/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java +++ b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java @@ -6,7 +6,6 @@ import java.util.LinkedList; import java.util.Queue; -import org.apache.commons.lang3.StringUtils; import org.hamcrest.Description; import org.jopendocument.dom.spreadsheet.Cell; import org.jopendocument.dom.spreadsheet.Sheet; diff --git a/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java b/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java index 2973561ee..294d4ddbb 100644 --- a/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java +++ b/xls-validate/src/main/java/example/matchers/ODS/ContainsText.java @@ -1,7 +1,5 @@ package example.matchers.ODS; -import org.apache.commons.lang3.StringUtils; - import org.jopendocument.dom.spreadsheet.Cell; import org.jopendocument.dom.spreadsheet.Sheet; diff --git a/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java b/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java index a9600d109..4c1edcd91 100644 --- a/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java +++ b/xls-validate/src/main/java/example/matchers/ODS/ODSMatcher.java @@ -1,6 +1,5 @@ package example.matchers.ODS; -import org.apache.commons.lang3.StringUtils; import org.hamcrest.Description; import org.hamcrest.SelfDescribing; import org.hamcrest.TypeSafeMatcher; diff --git a/xls-validate/src/test/java/example/CreateOdsTest.java b/xls-validate/src/test/java/example/CreateOdsTest.java index c15724b38..d32a12300 100644 --- a/xls-validate/src/test/java/example/CreateOdsTest.java +++ b/xls-validate/src/test/java/example/CreateOdsTest.java @@ -17,34 +17,33 @@ public class CreateOdsTest { @Test public void fromFile() throws Exception { - File file = new File( - getClass().getClassLoader().getResource("statement.ods").toURI()); + File file = new File(getClass().getClassLoader().getResource("testdata.ods").toURI()); assertThat(new ODS(file), containsText("allure")); } @Test public void fromUrl() throws Exception { - URL url = getClass().getClassLoader().getResource("statement.ods"); + URL url = getClass().getClassLoader().getResource("testdata.ods"); assertThat(new ODS(url), containsText("allure")); } @Test public void fromUri() throws Exception { - URI uri = getClass().getClassLoader().getResource("statement.ods").toURI(); + URI uri = getClass().getClassLoader().getResource("testdata.ods").toURI(); assertThat(new ODS(uri), containsText("allure")); } @Test public void fromInputStream() throws Exception { - InputStream inputStream = getClass().getClassLoader() - .getResourceAsStream("statement.ods"); + InputStream inputStream = getClass().getClassLoader().getResourceAsStream("testdata.ods"); assertThat(new ODS(inputStream), containsText("allure")); } + // TODO: file + @Test public void fromBytes() throws Exception { - byte[] bytes = Files.readAllBytes(Paths - .get(getClass().getClassLoader().getResource("statement.ods").toURI())); + byte[] bytes = Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("testdata.ods").toURI())); assertThat(new ODS(bytes), containsText("allure")); } } From b976b5d3b02e5925a090b6a0defc399b1b2d6acf Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 22 Jul 2023 02:34:40 +0200 Subject: [PATCH 024/171] aded notes to the utiity script occasionally misbehaving --- utils/vnvctl.sh | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/utils/vnvctl.sh b/utils/vnvctl.sh index 478165312..11407e627 100755 --- a/utils/vnvctl.sh +++ b/utils/vnvctl.sh @@ -1,18 +1,20 @@ #!/bin/bash -# https://www.ubuntu18.com/install-vnc-server-ubuntu-18/ # TODO: check the DIPLAY_PORT part +# NOTE: unable to connecting to DISPLAY :0 +# https://www.ubuntu18.com/install-vnc-server-ubuntu-18 +# see also: https://a-katyrev.blogspot.com/2019/11/vnc-lubuntu-1804.html COMMAND=${1:-stop} -if [ "$COMMAND" = "stop" ]; then +if [ "$COMMAND" = 'stop' ]; then # NOTE: not double [ DISPLAY_PORT=${2:-1} tightvncserver -kill :$DISPLAY_PORT - echo "Detect already running tigntvnc ${DISPLAY_PORT}" + echo "Detect already running tigntvnc ${DISPLAY_PORT}" RUNNING_PID2=$(netstat -npl 2>/dev/null| grep STREAM |grep $DISPLAY_PORT| awk '{print $9}'|head -1 | sed 's/\/.*$//') RUNNING_PID=$(netstat -npl 2>/dev/null| grep STREAM |grep 'vnc'| awk '{print $9}'|head -1 | sed 's/\/.*$//') if [ ! -z "${RUNNING_PID}" ] ; then - echo "Stop running tigntvnc ${RUNNING_PID}" + echo "Stop running tigntvnc ${RUNNING_PID}" kill -HUP $RUNNING_PID sleep 3 kill -KILL $RUNNING_PID @@ -20,10 +22,16 @@ if [ "$COMMAND" = "stop" ]; then rm "/tmp/.X${DISPLAY_PORT}-lock" fi else - GEOMETRY=${2-1300x975} - DISPLAY=${3-1} - echo "Launch tigntvnc" - tightvncserver -geometry $GEOMETRY ":${DISPLAY}" + GEOMETRY=${2:-1366x768} + DISPLAY_PORT=${3:-1} + echo "Launching tigntvnc on $DISPLAY_PORT" + tightvncserver -geometry $GEOMETRY ":${DISPLAY_PORT}" + # NOTE: after the launch of the script observed two displays being created: + # netstat -npl 2>/dev/null| grep STREAM | grep X11 + # unix 2 [ ACC ] STREAM LISTENING 27294 - /tmp/.X11-unix/X0 + # unix 2 [ ACC ] STREAM LISTENING 27293 - @/tmp/.X11-unix/X0 + # unix 2 [ ACC ] STREAM LISTENING 34367 2353/Xtightvnc /tmp/.X11-unix/X1 + # and vnc client can connect to either $HOST:0 or $HOST:1 fi From 0c6154404f31513dc2f91b46d432e705d14e9887 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 22 Jul 2023 15:31:42 -0400 Subject: [PATCH 025/171] intermediate revision - solved issue with localized ODS documents --- xls-validate/pom.xml | 2 +- xls-validate/src/main/java/example/ODS.java | 30 ++++-- .../example/matchers/ContainsRowTest.java | 61 ----------- .../example/matchers/ContainsTextTest.java | 96 ------------------ .../ODS/ContainsLocalizedRowTest.java | 70 +++++++++++++ .../ODS/ContainsLocalizedTextTest.java | 70 +++++++++++++ xls-validate/src/test/resources/localized.ods | Bin 0 -> 14755 bytes 7 files changed, 163 insertions(+), 166 deletions(-) delete mode 100644 xls-validate/src/test/java/example/matchers/ContainsRowTest.java delete mode 100644 xls-validate/src/test/java/example/matchers/ContainsTextTest.java create mode 100644 xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java create mode 100644 xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java create mode 100644 xls-validate/src/test/resources/localized.ods diff --git a/xls-validate/pom.xml b/xls-validate/pom.xml index 57a06d86b..8080f8b5d 100644 --- a/xls-validate/pom.xml +++ b/xls-validate/pom.xml @@ -4,7 +4,7 @@ example xls-validate jar - 0.2-SNAPSHOT + 0.3-SNAPSHOT xls-validate http://maven.apache.org diff --git a/xls-validate/src/main/java/example/ODS.java b/xls-validate/src/main/java/example/ODS.java index eeae00db8..8b6ef01b9 100644 --- a/xls-validate/src/main/java/example/ODS.java +++ b/xls-validate/src/main/java/example/ODS.java @@ -7,11 +7,14 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URL; +import java.nio.charset.StandardCharsets; import org.hamcrest.Matcher; import org.jopendocument.dom.ODDocument; +import org.jopendocument.dom.spreadsheet.Cell; import org.jopendocument.dom.ODPackage; import org.jopendocument.dom.ODValueType; import org.jopendocument.dom.spreadsheet.SpreadSheet; @@ -65,9 +68,10 @@ public static Matcher doesNotContainText(String text) { return new DoesNotContainText(text); } + // see also: + // // https://www.jopendocument.org/docs/org/jopendocument/dom/ODValueType.html - public Object safeOOCellValue( - org.jopendocument.dom.spreadsheet.Cell cell) { + public Object safeOOCellValue(Cell cell) { if (cell == null) { return null; } @@ -78,12 +82,22 @@ public Object safeOOCellValue( result = Double.valueOf(cell.getValue().toString()); break; case STRING: - // NOTE: NPE - // try { - result = cell.getTextValue(); - // } catch (java.lang.NullPointerException e) { - // result = ""; - // } + try { + result = cell.getElement().getValue(); + System.err.println("got result (1): " + result); + } catch (NullPointerException e) { + System.err.println("Exception (ignored)" + e.toString()); + } + + try { + result = cell.getTextValue(); + System.err.println("got result (2): " + result); + } catch (NullPointerException e) { + System.err.println("in exception handler"); + result = cell.getElement().getValue(); + System.err.println("got result (3): " + result); + } + break; case TIME: result = null; // TODO diff --git a/xls-validate/src/test/java/example/matchers/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/ContainsRowTest.java deleted file mode 100644 index a43002984..000000000 --- a/xls-validate/src/test/java/example/matchers/ContainsRowTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package example.matchers; - -import org.junit.Ignore; -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.IOException; - -import static example.XLS.containsRow; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -public class ContainsRowTest { - @Test - public void rowContainsCells_all() throws IOException { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, - containsRow("PP028000", - "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", - "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", - "415039******2364", "476956", "281814930")); - } - - @Test - public void rowContainsCells_withGaps() throws Exception { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, containsRow("PP028000")); - assertThat(xls, containsRow("PP028000", "281814930")); - assertThat(xls, containsRow("281814930")); - assertThat(xls, containsRow("Итого по терминалу", "48,271.00")); - } - - @Test - public void rowContainsCells_noMatch() throws IOException { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, not(containsRow("foobar"))); - assertThat(xls, not(containsRow("foobar", "PP028000", "281814930"))); - assertThat(xls, not(containsRow("PP028000", "281814930", "foobar"))); - assertThat(xls, not(containsRow("PP028000", "foobar", "281814930"))); - } - - @Ignore - @Test - public void errorDescription() throws IOException { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, containsRow("wrong data")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS containing row \"[wrong data]\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } -} diff --git a/xls-validate/src/test/java/example/matchers/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/ContainsTextTest.java deleted file mode 100644 index 4bd6a5f85..000000000 --- a/xls-validate/src/test/java/example/matchers/ContainsTextTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package example.matchers; - -import org.junit.Ignore; -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.IOException; -import java.util.Objects; - -import static example.XLS.containsText; -import static example.XLS.doesNotContainText; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.fail; - -public class ContainsTextTest { - @Test - public void canAssertThatXlsContainsText() throws IOException { - XLS XLS = new XLS(Objects.requireNonNull( - getClass().getClassLoader().getResource("statement.xls"))); - assertThat(XLS, containsText("Выписка")); - assertThat(XLS, containsText("Solntsev Andrei")); - assertThat(XLS, containsText("25.06.2015 23:09:32")); - - assertThat(XLS, containsText("Счёт")); - assertThat(XLS, containsText("40820810590480000591")); - assertThat(XLS, containsText("Период")); - assertThat(XLS, containsText("18.06.2015 - 18.06.2015")); - assertThat(XLS, containsText("Входящий остаток на 18.06.2015")); - assertThat(XLS, containsText("6.40")); - - assertThat(XLS, containsText("Дата")); - assertThat(XLS, containsText("Счёт\nплательщика/получателя")); - assertThat(XLS, containsText("Плательщик / Получатель")); - assertThat(XLS, containsText("Операция")); - assertThat(XLS, containsText("Сумма (RUB)")); - - assertThat(XLS, containsText("18.06.2015")); - assertThat(XLS, containsText("40820810590550000146")); - assertThat(XLS, containsText("Solntsev Andrei")); - assertThat(XLS, containsText("сюда. Интернет-банк")); - assertThat(XLS, containsText("-1.00")); - - assertThat(XLS, containsText("туда. Интернет-банк")); - assertThat(XLS, containsText("1.00")); - - assertThat(XLS, containsText("Исходящий остаток на 18.06.2015")); - assertThat(XLS, containsText("6.40")); - - assertThat(XLS, containsText("Поступление")); - assertThat(XLS, containsText("Списание")); - assertThat(XLS, containsText("Зарезервировано")); - assertThat(XLS, containsText("349,928.00")); - } - - @Test - public void canAssertXlsDoesNotContainText() throws IOException { - XLS xls = new XLS(Objects.requireNonNull( - getClass().getClassLoader().getResource("statement.xls"))); - assertThat(xls, doesNotContainText("null")); - } - - @Ignore - @Test - public void errorDescriptionForDoesNotContainTextMatcher() { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, doesNotContainText("Выписка")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS not containing text \"Выписка\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } - - @Ignore - @Test - public void errorDescriptionForContainsTextMatcher() { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, containsText("wrong text")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS containing text \"wrong text\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } -} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java new file mode 100644 index 000000000..97432beb2 --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java @@ -0,0 +1,70 @@ +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsRow; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import example.ODS; + +public class ContainsLocalizedRowTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("testdata.ods"))); + } + + @Test + public void rowContainsCells_all() throws IOException { + for (String[] texts : Arrays.asList( + new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, + { "3", "spock", "22" }, { "4", "allure", "50" } })) { + assertThat(sheet, containsRow(texts)); + + } + } + + @Ignore + @Test + public void rowContainsCells_withGaps() throws Exception { + assertThat(sheet, containsRow("PP028000")); + assertThat(sheet, containsRow("PP028000", "281814930")); + assertThat(sheet, containsRow("281814930")); + assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + assertThat(sheet, not(containsRow("foobar"))); + assertThat(sheet, not(containsRow("2", "testng", "51"))); + assertThat(sheet, not(containsRow("1", "testng", "52"))); + } + + @Test + public void errorDescription() throws IOException { + String text = "wrong data"; + String message = String.format("Expected: a ODS containing row \"[%s]\"", + text); + try { + assertThat(sheet, containsRow(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java new file mode 100644 index 000000000..c518bcfd8 --- /dev/null +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java @@ -0,0 +1,70 @@ +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsText; +import static example.ODS.doesNotContainText; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Test; + +import example.ODS; + +public class ContainsLocalizedTextTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("localized.ods"))); + } + + @Test + public void canAssertThatXlsContainsText() throws IOException { + for (String text : Arrays.asList(new String[] { "junit", "testng", "allure", + "хабр", "разработка", "фриланс", "расчёт" })) { + assertThat(sheet, containsText(text)); + } + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + for (String text : Arrays.asList(new String[] { "xunit", "яндекс" })) { + assertThat(sheet, doesNotContainText(text)); + } + } + + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + String text = "хабр"; + try { + assertThat(sheet, doesNotContainText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString( + String.format("Expected: a ODS not containing text \"%s\"", text))); + } + } + + @Test + public void errorDescriptionForContainsTextMatcher() { + String text = "яндекс"; + String message = String.format("Expected: a ODS containing text \"%s\"", + text); + try { + assertThat(sheet, containsText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/resources/localized.ods b/xls-validate/src/test/resources/localized.ods new file mode 100644 index 0000000000000000000000000000000000000000..d108092a042b17fd62580885a504673aff5ea83e GIT binary patch literal 14755 zcmd6O1ytP0(l3M{2@nYG1cC)8!8N$M26y+tZGyYITOde);BG;K1_&^?ySvQ{5BA=@ z*}dQHJ@>tL-Z`)44AV3GtGc_YPjyvy{S>6(o?^kkAi==kCts=sT62Xl!oa{hz8`*q zv9Yi*adNjeF|fC{wlFeqvaqvdaB+rjGS#uY@HYZ_Kqe7#sG5@ z6DNf~$$Sv=FCuto3ESD4T9`RI{w59ZmdW1E-r4>^gfr9M^AY_OpQD|bqX__DXyEuC zIPw01^Rcu4%=K5}1UMNuIsYH@=45AQ{i`=5B&6Ro{V$a~G^qb#j0Q$VCe|hoO0sig zGIDlwd{nWUjWryMf;8fzWni8>{&}FkR~qTVfB#+C7B&WECIBWO3nv=`d%*vu-b}6S z44h2qT0gjd+vI9X%cYkT$iRVOJzAYdDE8jxiImziD zfzn$Oh4hRhQpn2 zez){rsqguN`T$Pu)+T_*HF7|7WH-ltc?ZD`^5n24#rp0t->n;O;5uguH)W`yMRcg# zDUmRgPVpRzm>RNo6q`r$9mhmdZU2+`^BT6LwL1t2DSo`2kDJ8m7@sLu?#{5A<4UAB z=Y_@l@oiJ^Nf*<|#dYvpduy(NgjWknQM;V|KxT$OFDGf|I;$Q|NBT)xfpnN-9Fuaw zve$PA<*>b`oaR(za$F)o?zw5pDz8>kd5VI*wgOJ0@@TVD_$Z}|gbf$pdL^b(-)G4n z&c<*;8B)VIXu*svdwTe=OjQOw4zjwC^v{lIx0$pa47y_-BBM@vS880$`fgcf@w(Gz z^Gy=tMRoC%j^6BjX!9;r9c7~?_(#Vb^Cq165muheHI*9__GC%BLr>U|_dk#N1%)2I zwt`y_N0`2&>;5838B6FQ=6b0c*MBjy!`;|5r0Lx~7L`w?!=8ClWe{MbCVa&+=8bhX z%j(X*X7k}>MP9vw=p`37$ih7PJg2k9;M?IBy#@@)LHM_7C&T1Ap+Ze^ol**|SU_-$ zf!I@|9>>`#!Cd?h^NBY--2nI~Mtr)g?#(!|97;S9|afqH{G zY}Ok`B}_B(;a$3FSy@snSDys=ABk=-R=x`Y7(8Rd739gf;DR?ZS(-KECR|FQGm|iw zM2U^ggt>F@xhs^g;^U>|M~>oHBgGd)ms04I3JBJH+X0S_cEmu8^CG8IzH(a$dXG zlkq80v>T&=M}EMfzaj=_Il~L#xO=dHD4eWtn#PYTV*r*k33258dh}7>oH22c1dUC% zVBjmHWF+{TCmN142HEPAB9*kT_a60w3as)hKIRw2#zikRKUi*uS-+diSz44-ufION zlpT9h98|ml`ZjRXa)L81;VmUWJ6(me2~R=Ji};csNEE$jz8Mw3)SKVscvx( zUu0)v9^$%nWFNy*l6W41?>kop5Y97ypBN+x!OHla7@V9rC++DL!X~R^ z3<8#>k@Y(H64iI=6L0Gf2-8nR5je@aPy6S z#NzAc3!A>4J8BEPzT)6MR!Hg@n3a3Ye03KlTspn`d8g*NehhH9Q*bwbHma93vW~CD z`br@x@Hy3!!zg;3)!`aQhh=dzr;GWnf_c?94QqcPtgTui?J>5&g8=WSS>3E&{KEIy z`!DCU!>K3SDLoD`wPsq6%%5q~`8K!DHc|M1q7Uo~9^A+Ly0V>7RaKm$2kn1&P zQQ;Palq<4+^u-g5!3IN+I-~FofB`vq+Cs0wb)_VD&YbQxN|RNDi+i3s?xbEVycbY4 z@2Z7?Rz-y6;JUwx>U?E&epxw7HnlTD?2US^8A3w3eRhU;t9+3xkGFlcrC2C$&`2G& zc=KxP?)JAw!|5iNIDhDA!F#-NaY1m^xj@2Pst}Q{JxdHxpNEf^!)si%en6{8HrGkrVrPOW+wEC($W*8B=Ym=6 z`;>h*HvRUw1&7SD^ITgvt*(rU0={_R|dXWbE2!yH|BeBd6JtARJlnReI3hHZ`U zS7Pk)WMPuqAc`pBlMTsrz>sBSHM|?Ys&T_Hg0S3(X@9b6N%Y&(^A<6e7h!lG+GR@4 zdF7mQRO~ZO`C_fr^)G)WOFJ*x3ewk+u~)vXtJwd}T*R?CJ5<-_n=H(p*n8H>^qJ(6 z#|fSeO&t@l`gD*!sg;jeyOU@Nu2;(PmRnhz;Q*lNb*kyXX3Wq^@Fhw2psXNM`qb;x zny^2)R^W+nTQ|ZfQTpfn2(Lqg)1SzrBP8xcFI*P4a9@5dZ>r)&RdqHAd!giPLPRpz zIU;{bnZ)$@)zw~h$AF#+qUVU^!W`UaoxgWo0r(ilWASQEhnivYj4b@d>#HF@2kx2S zV)-zTmXUu4S#8tPYVyY+JgZpvV9|@PjbxB=nqemWlZjxE(pR1VF4-3iA{xLs45|u!g%AH$C?lghwc!>oE;x>}3tx=8XE2?^b}LaTBspw*7}U4=Jcw(* z?ohH#?TR9tg=NiDhV#d1=?W^KIXENM9g~Z3qu>o2 zf@i3>x=eh93m!7TWBGFi6T1Z4hqXV|^qm7$K9*fTVH}APUzDd_@(egI%_-cx z9=tPDuN0IDuDt4CN;q}GlTHm(I!(8H&zC~sjBP2_5XBy7kZl(IO6P>)2WAPKPiSPV zC?$D7sBwh!LV+174IxGdF87Z#Ww>4(YAeW+aH!^%e4@jBA?voNR_G-4mY3dUhODLA z;@9I4AJ7_qX(j;FS4%w7pH zglF=w3oG@v-UgiZ{cxL*WEC3#2@j_Nde+nsMN!X8&Q(c{?hVDtyb+`#Dg5FrP0R|Zw<2LSK7JY^O2HE{ zhelFVmJOU$mj2zG>y9m4L(eOJy6HT9Q#Z@(;PbgvM5Fv;&&tBE29ZmQQ<>-Ky!bMb zTu;3CqQHRS$s#!`mYfjW39;*@3M-{>&TEp`A@N<7Auo|5Xs|clbp*ci`gg;Fu{vz) zrqZQWwq7BSbEkmpQpm*0__M_xCzkBm+0P5yRIfe5_XbzT=%(otF}8@}N@!+YR=LW- z_8|ye)A&zO>Te09iIc%&j2am)7@f|H9(V-74!N|nh9m1H|Kd@sQao8+^P#rBp9OAj zs`54S;N{XZp2Upmi;Yc=rL&ew2Zt*UwNB)kOjZxl@sI#ma|7Dqbnk1YYroUua5 zQ_>R+6A>VS%@{sCT865tHSIxH+vL!(oQuraJEx)Nri?kb$XXLa9BJ4_mn+q^xIri8 zDIxtes8P=(Pil0x)hREI=mb!NSt+s#nipQ&?fR*$4(QyfxtCzzVMVxe%e)T5b;;NQ zisQ{(z{qN;?y6DX3UroJ*Aul$;PD4_@;oZHav|@CQ= z!Z%qrHH-5j8c0qH&c8(pZ zZAlrAs#NF`$r;ItS;MaKE2@LZAk?{c-F7v? zQhAi(jww_uVe`h%MqS<7&ZLzVplfF-E}JRH-{SmjfuE-jmb;DkCBOL}?tFJ0X}G&S zF7?KF+TEp`?fxMGbH|N7_IT-qIkjP$G+GnBd?Cs+^1^3fl_^qo14gu^Z}N9+K_i+v_j&c39{)z0v2zkv(`yg<#8A zE@}^$kk>|iiw_r8db*jLDgrx*frKGb;YZIe&q6H~P^6YVkB&!W2I1*Ml?}>RuMHl+a0NZ(M@GR!n2U2W-uI%OTbCgeh<%8OuG>g|7qf2B;$Ar_1BGEW6W{ z-)v|Up-XxX&28kC#3NQ9d2KW??~^3C`t#a+V?&0Wf0+T}4mzn6?^*HT?;moczSmOZ z+~!|-DtOf~#0blhi(7h8QWD2WCim)y8Px5EH0I1Sse` zjl^p)D0})9oL!)eY-PF%-3uFOIRA5zNnC7e`!?Ms{ACeoO6m zAx#K#?{R zfr6!!oXeLgF!0#bA#m?el872nn zSfhHac61WDpRDls7_I7&iY!`b`n5Fnuat_XX^4vORi*@Sw*rqkowXf9CU+b}i;X+i z44GtwMEcc7%jx!)#iAPvHP-ZO>uEGidyAIxlBYl2eiDj{Fv&wO0uZV&h}cMA(jXrC z&{%MT)j6@7F_OiZagzk;P3-a~ohHWU;pO!vuO?L0`v;cQ*4;Ct-m_`a&F-?vpSVwy zDNL}PihUC!h;<$iJI@QPiLIMpkD;^Zbs)%XL9f7K=u246$t{!_pVRyXvn*ji#2vm9 z?Rb1QnYvP^OZvPs;s&?WidXwCmWe!K<6%82Oipm+yB{IbPZBYhl?5*cd{p=QxWldI z?8c~#k0PIZH4Fj&7SDn<-G4_B3`ba6W?;?s{7wZHJH`*|b*T3wxBuwd=hOZO;kyG>VlOV=qDhLp)0S}}LBBoPJ zDvqSht?me?{jhm2eW|r^ZA)HP0OC_hl?}DO-CZ}usTeICNo`K5X&yFwj~};?_Ed)B zF2g8t5K@M4olH-5I)y{HKzxp%_5$uO*BCUuQf8|0?ItGRDty{n8$ zr{!{%4%`)ql%Kc@)F-N0b_vrq{cgi9nUqO@ zVQGOnd$W09lKODVelhj|#IH^NBrLfegt9 zF7S5vn|Qrk5oi+_abSIECfC$f#U;L0qRbd=oAbg$vlkiFN_ zO^X-LM0<4sfmL7fa^;~Is zNn?ZW;U0I%Z?Y2-2M91QN^gD-n0`Nj$Ddt@QpbjYd3-;fU8|To+Zfs!SXcv?oPKXI z+S{6iD#(eWJ|}oQ`9qbI5K)4Gfo*?06h?a3cVQ?Si%PS}-C@n3mtgNi9t!->a4Ik`SYISX1XbK- z4>Cht){Ck{VRPNH#Fy{yPcd?2nw$1o=Ull4%W6grYX>Y;YZ)xU1<{`leRK_4!Ra8q zR)-7^6uGA+s{(KOhGpM1R-B)0K4b}f`_KVMm^D*s{W3=R;nPTd1k3rsBkEBDb@R_N-}^ZMhOs zf9d{A`U-e@$*}L8QIF3REu2Kt#C&yJJD-vfdCnp)>$2#3-VB}rC^1;Iop+^m=!QO5 z&IdbRZ^cm-Uzt@*TF2G|yO|19kk>=QI8Lv2TFlgDcRf zSj${IJ&saP;FME)LnTsx=n zv~;h#1Pus{oy_Ab#b@Xe7w~#nS3$M(FqSi24ap-k-!cuE7*KS2(FiUg!%VvZbpGxR zSBngL&L@0%?F_=_QFHciR5UdDr4ESXaT7V&+}aL&Fn7-yWP$j??xJl~yKOpKH-QUh zE>xo(x|URTxIpPX1=t@d`jFWrWBLKSJi+Bt*E)GUbJijdnLShLNwff-ybd3)hT;I1 zBYg#~;f@iP(V#G3-};OC10c{K%^{lUh^Z7Z-2lD|f#(@YSvZ~ARbrOxnpf_Bk~W?C zy0?1G5$ZIudw)f$@|^*KotG`mo*Ib@7&fi0wkDxjUe$!E;lqD!_j$`VnS5Y*=`t9v zncg}EAY#1@f^sG{a&nj$Ynw~H*72^<8(NxAKR!=RpvsFjWX41rh{L}0QYA&=SoP$1 zv5}q-k|*wA(2S^({MMNTm^2DCe=dC9+vEH5TP={IOdvGMMyzfm9nBs|ZywjJxcyrB zCV$KN6>zr~s+m@Z*7UiZFCwAQ<;L^2dTZ`X>u!SUvxT**G=iLLq=fFmOSi`Mf%^H8 zrH&(QV2MQ2jUY#{mME61qTU(gNEwn!;gkib*kEcaXlGT~qWjuP-12Tv-T$sF9~>zY zluP9E21pzpeYd0KjTCxN@$*vJmPDGoZtsQ%_hqa=HG8WrT0V``ss?zvtua?%Ls&v$ znq>l269Vha2aLYdoI>zoVmjwwXWsP zp8Jl9Kgz}iJ@|m}`uo~-b5QRbWkjTpp{b-FEodOUjx0dUb*X6|m2D2V$+S+=Y%jJR zO~9wl9&j0~YK&iyY4AsCsf~<+x+(>Hqwl8KtzRd;W3gB;txBYrk2klj+xe_y>{#Fd zTUW2Q8h_eEnUt-WXJ8b|;>ZH9Qqwl#P4m)?%4P9ng*%ecZwTFbMVx&m&XA*kB|p?N zRQET-tutrSi@s_i=6_)n9rQTx-@*wStuIxen;Ky_lir$Er?zwpY(IF3tv}bE)aMX) zJWvx+(CTuKUHDX!M{6#IK*WawnAViVkJiy0zSk-c!OOGvbg$wiqeBRGT|%7X!60d^ zx3x2@)79Blj=REKN(-;-z%&Gvl-dM>I&Z>N9n7)oFubdL1Gw07Y`%S0Rq+BV%q*<> zwZ|JE&*&TZygkFoahllifIIzf>p3EXvp!ze6K(g796-L(tyvdXgt-^9JkFI+>4W?y z^T^jl0m49+AI#bi)D9%V{_4ch`n|6O zV&}Tc0~z+KTqey_Cte)SDh#9>bC|pieKkQFxqNj0X{Gvui7C$143Bf|b*R5?zlC#~ zN#y=rBfAy%bFol4mEI3hs^Sb9HJm{2rlny$LBNrX{lax<85$T%DQ48aXy2bII2I!_ zV1={C_br>Y#XX!djh&!Rxk0NTScCv6Sype%65@VBhCw%crAQQSuH#~rX(P*d zoGzAsvGrw!a*cZXT)R4hC3fzVZ9>z#3z1{VcHB#Vqq&F+`GVnMa%+6&#P0;NoL@lQ z_C=%3wRLm?e|VcqYueE5oE*@<=m-QW+v8;E<(>v%x=WXca=f`$t$4E$s%su*XBHk^ z5L4^YEQl3ub$?jjtt>izHN%K6VDRbSlL%wTm44z>V9kMENfbqmte(sE`0enzsh$t} zE|BUf9ZGlIFf{1cE3a(}xr=@4(}s2K0~}7B;ZQ3b8uEoKCh;XUAR(XD1D&HsuS)qK zFBDdZSE*~}GK@?uc}l-;5ZQuo=!I`zgF{dD@W~kM4$%S+G9j>!PVm829UGA1_Vwf= z>1wKmdbHlAVnPBT?X=5=y!HUdZiUoPfFFbcWsTFq{F*zig5=)2$HumMVri4y8MvIl3+2lRfD8 zDVM%jV^xAR=|;2=pY{zM_*B;Dl;_ZRvcHG^EsN+TSa$kUT#|CL8eGhsRI`0qu~AXz z(d96TBqaRdiAt<)B{)!5=71kjwcRH{pz3zTE<>-n2YgoxWaZ+n%+C#WZJvdyCaAWW zOso*>1`54Ns|Gh}*1iIw^0{JlzGLJ#7uPaO(Vi6tT^g2@_8c{l6jcbI%`P*pPkw-I z&uR7p;8Nr2&qza-+~IJNem?6#qskkYu@?mHHI|K{Gjr7>?$B2M;HQU`?wc#5}(EjgXyKUExlG)h@-{lm8OV4I~ac}1u9kULd;z)NaDhoxrEhFD}i*39&a z^fXEK|XvWESP(! zW+bNHw-*zX@H4wj4a3JAeAs{%7cn&sS~^%t>2anB9@PW0eKM>L`|on*!!qkB6Wfz$ z#~7J;yk(iTz3DM@&+MIUo19zo~0^-Y8!CYQ`p>Lw` zUIT5no?BRYTM^v;69DHlYi8WtRJr1ceEGC^~V@daj zA&sZ?@Z|@3;#UEq)2CaPYanpV=}7Z9PDeymQ<&93TF+PJ$RB3cYs7;~RE`Hrg)|eO z$yGg>fkCNj4|2JP7gEY$KIIKIhqQ|$_)9kTl$lLDy>bnw$;VCQ=~FcLKeQHiKJuQu1b|3I94=i_G?%2(tqp&XaWK29Zh0N`wb$?97fld7`S zdadl4XxqD3P*M*)9gu;w!KUyLf#2PXrt$WFGrH~1+N1%QsXYG?xwJx7-U45OZ${w2 zaVNpO)4xvp!qv^G)&}41@ZRwrdhTj}<+NM7EYPL5f2hDGphRSn98P+U88<%sf- zP1Mj-2)T1Ku~ya!W^~sCzWT~Ul#|L&g01Lg_$Jj3jSisPO+HxVgE+2}NN1^DTHC&z z%UhwVx9IUbRIH&y9Bbnyc$w0Ac8vQH-#UpeJvkF&?U3gg8O(0dt?6ctZO6LMXn}J+ zy2}LJOwqYsg7@#JLm8h3vAg~-*tz6UdduQ2Nywg>_5?BP*j*z$Zgt91RyO;^nb}Ra z41QXIwb}kwLVH-9?AI~~8T9?rjp?I_ZvX9lMyg9$YK&k>cUAbeHEck&&>>bCwbX-P z{ugs{PMXri+ebD_PWL~7ig`8~isGkcpWZWhgIf+v<_3!N9f+t;CQq|d^Q}fwN*c@; zB>YR_tQW0KxIamj9o%!Q8#G96ewwbzRu&>0mnh^>Yg*~+GWYPIwc`8vCPWwJLv zXDe^O>|9p9dF1~Ie6WHraRiJwIu1S#{0YXZ&7 z?u|+RYjZz8@*yctmF8EW3nV+1Qo(sUioE9YcWBmh0Lt0-&G6-XsB30B@Q}pu>C|_~ z1^VO|N&@~=<{mC<#Y^)kES~uE5%5b8#?qRiclU5}1KOdT9uusBmZXNns?%rne6;Xs z&%-`gsr=yer|Q>R1&{ICXr^`R`eKyH+u1^fSqVw+*AL32NWzEsR^CKkT!697WP<1N z^C=ljRuRjn3%|50j%yz-gBwE&y{n)&?2G_1Z*cdCe>`g$xrNdSH=_<6WAc5^wzwP$ zM>hZXP-Eg1Qd$u?@lem_)B5fR2f2-CB$>;JD`ST@$s~6OL(_Bj-s@&7GsWOWR;D@` zHnSfh*ptO?vNtMJ$ZIq4ZWMvHHoiXgHvmCC%n757!!a*5;N&}sC?R)bZovqa2kiTMD=h( zPUw8rxr}G2od1rtNH=pTLv*Foh0w$S$o zWC|-t0!GLd6!g%w9qzRj$E2GHNoP&@ngcLQZPPlpoNQ)?p*=#WIu;qj6+JUL^gWIh z#AMpg^-IS)`N6PFoQy9iCJ~hpLge&h8(Aidje=rp6B!4lFE8(YV);y5L)D=3e(ML0 zXFw}-v2W1=)bzZUA5nuN65_1cP^B*h8V8DIUjgGHxs4Y1(IOr;t}*WUcdlKDVC=jv ze&^@Y$}pmGohFfA%?KLT&j*s~r*7s_KE2rvFk}d5#HSnF)NSMZcnp7oY#nGHvUr!i z^Gw<%JIKMdJ=V;Ig++IU8*s&fsZxD-b!Ju=BZ{f@5P-O*l6z@r3r!l2R>gkrVShMJ zwis~d(T-{!ztu{~U>Ib85SMz+GqK;d#Z?DJF6zkuoyrcnXi5a6)d(Oo0U5+;XTvB7 zBKJWTTivetYlA&UQ}huUK6OBCDV*KJN(m&oOC$}NnHxt5NOIIkisIKp;=R#;J|PnI zGqb79SRlE9QDQ=!U&@5B#*XL_U|_INk?~AqWy+D2V?N5HC|I58(A@_5gdP95>|u-Y zJ{R31c0G^$S6KMFO<^9a+xeR__(xd(n5{j!h2OTd-_z*dW657kj}QFrLH?2A{gDaS z0RP9Yzop{;yE6XC^tkT+=NSLtx_)*1+Y;KYX$4XGR7%j~9OsPSahZ9T~Nl`hGav^=ce^k@{RgL9ii7LRv$;raj z>>pK@nu>rt33Q)!J%bx3b@dOSRJJu36$tQ@gpoNpCpI5nhIS|ny-L#q!kIJf2~DYf zUr;q6c^{lr;hA=rl|^EEuh}eT5%|Q==&0Q5CXg;U#!P?W@=J3SHx85S0I=4lx#z6W zCZ{ko@`or%>#GnYF(E1I2Jy6=wPr^=H(8WW*)$TTmljI-q2B8UL2OG(9GIqaBoRjg z$Wjo~0t_^XH*L!uB`REpC2`Ot#R}p%t+sJ-#dFFM%9`XzvHUpRg;)Ym`rK5mU%}5} zeJ!%3qCz#>gY&QHK6@@a6sRr zmdnBBV5ha};5zX^hQqqk*ZoYe0y$g^2=0dIPO90bmczIG~hsF z2=d&!F@n^)FA52es5q7(UB6+nC;1X@uRc+*>LV!F_H5eUNXPZ&csfRrDff>)T_E&B zVsL&Hh?t_!gM#!TC6crP`Lo_=V%q38J%{+dW_Zm;L2-})Ihe^D%)|V`sX^jWIP+Xk>yl^% z=`()K&&iqDQ{!B#H?=naq1fV^AU{&jpF;PUJ%E1(dVDp zI1PDb1XKz`IG@>by*y`&BmNvt@?sx%UvWDk0){8*h5x+h-f5xQUCoZN4Yz4W^`s{k zib4yR*Z>gxH8mH8`ZWHGMqlRYNu!UdD#t0EHbyKNqx@2=foT4$k{AFK7D%x=<+M@VufW zkGkLKpC}%${z$cwrM^xP5hFS8)9?+*^G@eR^v6mWej|I0yq5Fon>C$4ZJ7_>ThKw5 z*=GIcZ_z>vHR|kK08=QOTitPAn%r}=DRz7tjkg&3qdwp3$M0PWs~0p)G0{cPDu_Q3 z8^9P@-6oPhu?MvT)9dA3Y1j#mzL$e-y7V^7$H1bP8#wC<#;VUX`id?K@b5f1K7dEb z>5Qm~)Dd`3QFl{qX6;w{8WWw+gMOyQo3^UE`eP!!0p@6z;NB{JYq+&?_b6<25!pbKxAb z+KTNt!oIxRjBvo-xM(p4Js%bI%Tap0hLY(93@xCIh*UcodZhhV@EQeFcsu_+%GW`9 zhIuBEEQhSrk1EI)ehCf}}=&+z)%R@-yD_>!=xo`Q=7Z$yQ&Z zhA1Oz7?NfJGc`iOh7W$g{5R!pl(k$|6i=+QGaK#S+P{jI-0h!)B7co2sq@7=2#l43 zLGR#@UPMj&$f-QzU0hubEjTR_mAvP8#p_F*+Wy1_hQwGOw)06u%z|CV(5lW49ly^Z zuJ3XEQ-=U73osvPx6cIy3imG7pt3T3hfG>NylA%z1k3OpsOmV(*BV((8x^xUR3A}- za)?i?S?@h?^RU{fKf498tz>6AmZWJcUMq!aC9nnIitW}?eaNK#5zB+JLV&h+&Fs@l z2Q|C1zK2kOGblc*u7z{rnLk-1cm71aI%w`loT^-aO0E8W!tKKtMGj+aCHa@T_dkU= zTU}A)cA{YgB8=(}-ym1-eQ^p;?n}NZX~H^U>xed;=#)CLAj)7Bdc~R-u=xSTQa!?S z;*KTb_67P>9u;k#<%$1{$VoQq#_V><`&O0f6Qz~O0+e-2|Lxj4UtLuqc9X;JYwz+U z@;*3>slwAeq^aN)%2$9$U)qq}1ZCF5lk||t&J<-4vQ>D%K>UnTtiAyMUE1NeLPhF| z+09-x_yWi4sk(U!lFov^3#@Yrp00Gen)~_e3o22NoI@WLe0CX@yNu#>=ic$gf|&g|5?@H?--1IXfx1f_E%kv#u_HBbGb z*3HUZrPQLUb6NXug)_=ON)}}vt^`vb&>(-m3q9Nl!pMrM2r@{@i81{PG4W7PRhA%Y z+w}@P@QN$2r|#{!nQ|`ZgUar+aX1BDP6_5$K6&exJ!%;ZB^W(6t`YdaqhYwpMWQdo zm*{yepcv{~3EKBN+>zeG{B=hcbTc)jwb(`2-QAx>RiRyOjD&G;j?{TkM1g_*@#`aS zE^?;GDc4s%{Ir>+slK?5LWGFHp@bg%z6pb%P?aWmA^T(W^RJXBu2L4yyu|PlXH}i? z1ufv5EztVHVG|>ZTP2!dni)kxK;FWk85IN~;o&xYzm-3+4Hv?A2!mlD z{iTIVrD@dQQ=b{tr>AfQPQKrXzQHi%>pEO=l=1XM;v*unTG4I=n5<545O6yO+wXYb zZR&n{IWhLWC03obK9HeTQ(|=~mvX@A&K}sea99Nq$(1#>&{T?sV865xMY9I!C9!@| zS&a6q)~zP3kiLU|yqZ1lRL>H9C}2u?`e+B(Cs;6l5083`9DdR7V5xuS`t<}1%p*YN z7d>2={ttxCAK_4c?)?`Z49p`S>K8>kH2)pxWB(_3)Za^byk!1Gy${WQm-GuR_4iW# zJTLHHNckgt>hIcL&_gxwcjyOkASLQWce3T{svz4pG@}%r}{;m ze$8>|5w`j9enj?ef<$x^cdUzBI^e^|8gx4V65Mj z^1G)0Snc^(fAEV+ABqot;gJ5F?~kQ{zd_jk#i;n=p~rt#hW>vCOG27#}{{^|wF|z;w literal 0 HcmV?d00001 From 3b33b1c05b7058f4c89fa138478deeb90ea93f82 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 23 Jul 2023 00:21:28 +0200 Subject: [PATCH 026/171] intermediate revision - removed debugging code, keep working safeOOCellValue --- xls-validate/build.gradle | 46 ++--- xls-validate/gradle.properties | 2 +- xls-validate/gradle/compilation.gradle | 12 +- xls-validate/gradle/dependencies.gradle | 54 ++--- xls-validate/gradle/publish.gradle | 176 ++++++++-------- xls-validate/gradle/tests.gradle | 38 ++-- xls-validate/pom.xml | 3 +- xls-validate/src/main/java/example/ODS.java | 25 +-- .../ODS/ContainsLocalizedRowTest.java | 140 ++++++------- .../ODS/ContainsLocalizedTextTest.java | 140 ++++++------- .../example/matchers/ODS/ContainsRowTest.java | 140 ++++++------- .../matchers/ODS/ContainsTextTest.java | 136 ++++++------- .../example/matchers/XLS/ContainsRowTest.java | 122 +++++------ .../matchers/XLS/ContainsTextTest.java | 192 +++++++++--------- 14 files changed, 606 insertions(+), 620 deletions(-) diff --git a/xls-validate/build.gradle b/xls-validate/build.gradle index 31037341b..e63509b3e 100644 --- a/xls-validate/build.gradle +++ b/xls-validate/build.gradle @@ -1,23 +1,23 @@ -buildscript { - repositories { - mavenCentral() - maven { url 'https://plugins.gradle.org/m2' } - } -} - -plugins { - id 'java' - id 'jacoco' - id 'com.github.kt3k.coveralls' version '2.12.2' -} - -group='com.codeborne' -archivesBaseName = 'xls-test' -version='1.7.0' - -defaultTasks 'test', 'publishToMavenLocal' - -apply from: file('gradle/compilation.gradle') -apply from: file('gradle/dependencies.gradle') -apply from: file('gradle/tests.gradle') -apply from: file('gradle/publish.gradle') +buildscript { + repositories { + mavenCentral() + maven { url 'https://plugins.gradle.org/m2' } + } +} + +plugins { + id 'java' + id 'jacoco' + id 'com.github.kt3k.coveralls' version '2.12.2' +} + +group='com.codeborne' +archivesBaseName = 'xls-test' +version='1.7.0' + +defaultTasks 'test', 'publishToMavenLocal' + +apply from: file('gradle/compilation.gradle') +apply from: file('gradle/dependencies.gradle') +apply from: file('gradle/tests.gradle') +apply from: file('gradle/publish.gradle') diff --git a/xls-validate/gradle.properties b/xls-validate/gradle.properties index 005e033e2..f42fe2b8e 100644 --- a/xls-validate/gradle.properties +++ b/xls-validate/gradle.properties @@ -1 +1 @@ -org.gradle.jvmargs=-Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Dfile.encoding=UTF-8 diff --git a/xls-validate/gradle/compilation.gradle b/xls-validate/gradle/compilation.gradle index 50b807fd4..28dd6ff1f 100644 --- a/xls-validate/gradle/compilation.gradle +++ b/xls-validate/gradle/compilation.gradle @@ -1,6 +1,6 @@ -[compileJava, compileTestJava]*.options.collect {options -> options.encoding = 'UTF-8'} -[compileJava, compileTestJava]*.options.collect {options -> options.debug = true} -compileJava.options.debugOptions.debugLevel = "source,lines,vars" - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +[compileJava, compileTestJava]*.options.collect {options -> options.encoding = 'UTF-8'} +[compileJava, compileTestJava]*.options.collect {options -> options.debug = true} +compileJava.options.debugOptions.debugLevel = "source,lines,vars" + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 diff --git a/xls-validate/gradle/dependencies.gradle b/xls-validate/gradle/dependencies.gradle index 7bc3dba51..9cefb1e7b 100644 --- a/xls-validate/gradle/dependencies.gradle +++ b/xls-validate/gradle/dependencies.gradle @@ -1,27 +1,27 @@ -dependencies { - implementation group: 'net.sf.jxls', name: 'jxls-core', version: '1.0.6', transitive: true - implementation group: 'net.sf.jxls', name: 'jxls-reader', version: '1.0.6', transitive: true - implementation group: 'org.apache.commons', name: 'commons-jexl', version: '2.1.1', transitive: true - implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3', transitive: true - implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '5.2.3', transitive: true - implementation group: 'org.jopendocument', name: 'jOpenDocument', version: '1.3', transitive: true - - implementation group: 'org.hamcrest', name: 'hamcrest', version: '2.2', transitive: false - testImplementation group: 'junit', name: 'junit', version: '4.13.2', transitive: false -} - -repositories{ - mavenCentral() -} - -task libsProd(type: Sync) { - from configurations.compileClasspath - into "$buildDir/lib/prod" -} - -task libsTest(type: Sync) { - from configurations.testRuntimeClasspath - configurations.compileClasspath - into "$buildDir/lib/test" -} - -compileJava.dependsOn libsProd, libsTest +dependencies { + implementation group: 'net.sf.jxls', name: 'jxls-core', version: '1.0.6', transitive: true + implementation group: 'net.sf.jxls', name: 'jxls-reader', version: '1.0.6', transitive: true + implementation group: 'org.apache.commons', name: 'commons-jexl', version: '2.1.1', transitive: true + implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3', transitive: true + implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '5.2.3', transitive: true + implementation group: 'org.jopendocument', name: 'jOpenDocument', version: '1.3', transitive: true + + implementation group: 'org.hamcrest', name: 'hamcrest', version: '2.2', transitive: false + testImplementation group: 'junit', name: 'junit', version: '4.13.2', transitive: false +} + +repositories{ + mavenCentral() +} + +task libsProd(type: Sync) { + from configurations.compileClasspath + into "$buildDir/lib/prod" +} + +task libsTest(type: Sync) { + from configurations.testRuntimeClasspath - configurations.compileClasspath + into "$buildDir/lib/test" +} + +compileJava.dependsOn libsProd, libsTest diff --git a/xls-validate/gradle/publish.gradle b/xls-validate/gradle/publish.gradle index a85390966..90a5f64b5 100644 --- a/xls-validate/gradle/publish.gradle +++ b/xls-validate/gradle/publish.gradle @@ -1,88 +1,88 @@ -jar { - manifest { - attributes( - "Implementation-Title": project.group + '.' + project.name, - "Implementation-Version": version, - "Implementation-Vendor": "Codeborne") - } -} - -task sourcesJar(type: Jar) { - classifier = 'sources' - from sourceSets.main.allJava -} - -javadoc { - options.encoding = 'UTF-8' - failOnError = false -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -if (project.hasProperty("signing.keyId")) { - apply plugin: 'signing' - apply plugin: 'maven-publish' - - signing { - afterEvaluate { - sign publishing.publications.mavenJava - } - } - - artifacts { - archives jar - archives sourcesJar - archives javadocJar - } - - publishing { - repositories { - maven { - name 'Maven' - url project.version.endsWith("-SNAPSHOT") ? - 'https://oss.sonatype.org/content/repositories/snapshots/' : - 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' - credentials { - username "$sonatypeUsername" - password "$sonatypePassword" - } - } - } - publications { - mavenJava(MavenPublication) { - groupId "${project.group}" - artifactId "${project.name}" - - from components.java - artifact(sourcesJar) - artifact(javadocJar) - - pom { - name = archivesBaseName - description = 'XLS Test: Excel testing library' - url = 'https://github.com/codeborne/xls-test' - licenses { - license { - name = 'MIT' - url = 'https://opensource.org/licenses/MIT' - } - } - developers { - developer { - id = 'asolntsev' - name = 'Andrei Solntsev' - } - } - scm { - connection = 'scm:git@github.com:codeborne/xls-test.git' - developerConnection = 'scm:git@github.com:codeborne/xls-test.git' - url = 'https://github.com/codeborne/xls-test' - } - } - } - } - } -} +jar { + manifest { + attributes( + "Implementation-Title": project.group + '.' + project.name, + "Implementation-Version": version, + "Implementation-Vendor": "Codeborne") + } +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from sourceSets.main.allJava +} + +javadoc { + options.encoding = 'UTF-8' + failOnError = false +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +if (project.hasProperty("signing.keyId")) { + apply plugin: 'signing' + apply plugin: 'maven-publish' + + signing { + afterEvaluate { + sign publishing.publications.mavenJava + } + } + + artifacts { + archives jar + archives sourcesJar + archives javadocJar + } + + publishing { + repositories { + maven { + name 'Maven' + url project.version.endsWith("-SNAPSHOT") ? + 'https://oss.sonatype.org/content/repositories/snapshots/' : + 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + credentials { + username "$sonatypeUsername" + password "$sonatypePassword" + } + } + } + publications { + mavenJava(MavenPublication) { + groupId "${project.group}" + artifactId "${project.name}" + + from components.java + artifact(sourcesJar) + artifact(javadocJar) + + pom { + name = archivesBaseName + description = 'XLS Test: Excel testing library' + url = 'https://github.com/codeborne/xls-test' + licenses { + license { + name = 'MIT' + url = 'https://opensource.org/licenses/MIT' + } + } + developers { + developer { + id = 'asolntsev' + name = 'Andrei Solntsev' + } + } + scm { + connection = 'scm:git@github.com:codeborne/xls-test.git' + developerConnection = 'scm:git@github.com:codeborne/xls-test.git' + url = 'https://github.com/codeborne/xls-test' + } + } + } + } + } +} diff --git a/xls-validate/gradle/tests.gradle b/xls-validate/gradle/tests.gradle index 57e749425..7559e56dc 100644 --- a/xls-validate/gradle/tests.gradle +++ b/xls-validate/gradle/tests.gradle @@ -1,19 +1,19 @@ -test { - include 'example/**/*' - systemProperties['file.encoding'] = 'UTF-8' - testLogging.showStandardStreams = true - jacoco { - enabled = true - } -} - -//jacocoTestReport { -// reports { - // xml.enabled true - // html.enabled true - // } -//} - -tasks.coveralls { - onlyIf { System.env.'CI' } -} +test { + include 'example/**/*' + systemProperties['file.encoding'] = 'UTF-8' + testLogging.showStandardStreams = true + jacoco { + enabled = true + } +} + +//jacocoTestReport { +// reports { + // xml.enabled true + // html.enabled true + // } +//} + +tasks.coveralls { + onlyIf { System.env.'CI' } +} diff --git a/xls-validate/pom.xml b/xls-validate/pom.xml index 8080f8b5d..de8a33d78 100644 --- a/xls-validate/pom.xml +++ b/xls-validate/pom.xml @@ -4,7 +4,7 @@ example xls-validate jar - 0.3-SNAPSHOT + 0.4-SNAPSHOT xls-validate http://maven.apache.org @@ -21,6 +21,7 @@ 4.13.1 1.8 1.3 + 2.0.6 1.0.6 2.1.1 diff --git a/xls-validate/src/main/java/example/ODS.java b/xls-validate/src/main/java/example/ODS.java index 8b6ef01b9..f33f6200a 100644 --- a/xls-validate/src/main/java/example/ODS.java +++ b/xls-validate/src/main/java/example/ODS.java @@ -69,46 +69,31 @@ public static Matcher doesNotContainText(String text) { } // see also: - // + // https://stackoverflow.com/questions/64423111/javajopendocument-nullpointerexception-when-using-getcellat0-0 // https://www.jopendocument.org/docs/org/jopendocument/dom/ODValueType.html public Object safeOOCellValue(Cell cell) { if (cell == null) { return null; } Object result; + String data = cell.getElement().getValue(); ODValueType type = cell.getValueType(); switch (type) { case FLOAT: - result = Double.valueOf(cell.getValue().toString()); + result = Double.valueOf(data); break; case STRING: - try { - result = cell.getElement().getValue(); - System.err.println("got result (1): " + result); - } catch (NullPointerException e) { - System.err.println("Exception (ignored)" + e.toString()); - } - - try { - result = cell.getTextValue(); - System.err.println("got result (2): " + result); - } catch (NullPointerException e) { - System.err.println("in exception handler"); - result = cell.getElement().getValue(); - System.err.println("got result (3): " + result); - } - + result = data; break; case TIME: result = null; // TODO break; case BOOLEAN: - result = Boolean.getBoolean(cell.getValue().toString()); + result = Boolean.getBoolean(data); break; default: throw new IllegalStateException("Can't evaluate cell value"); } - // return (result == null) ? null : result.toString(); return result; } diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java index 97432beb2..c12fefafb 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java @@ -1,70 +1,70 @@ -package example.matchers.ODS; - -/** - * Copyright 2023 Serguei Kouzmine - */ - -import static example.ODS.containsRow; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Objects; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import example.ODS; - -public class ContainsLocalizedRowTest { - private ODS sheet; - - @Before - public void before() throws Exception { - sheet = new ODS(Objects.requireNonNull( - getClass().getClassLoader().getResource("testdata.ods"))); - } - - @Test - public void rowContainsCells_all() throws IOException { - for (String[] texts : Arrays.asList( - new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, - { "3", "spock", "22" }, { "4", "allure", "50" } })) { - assertThat(sheet, containsRow(texts)); - - } - } - - @Ignore - @Test - public void rowContainsCells_withGaps() throws Exception { - assertThat(sheet, containsRow("PP028000")); - assertThat(sheet, containsRow("PP028000", "281814930")); - assertThat(sheet, containsRow("281814930")); - assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); - } - - @Test - public void rowContainsCells_noMatch() throws IOException { - assertThat(sheet, not(containsRow("foobar"))); - assertThat(sheet, not(containsRow("2", "testng", "51"))); - assertThat(sheet, not(containsRow("1", "testng", "52"))); - } - - @Test - public void errorDescription() throws IOException { - String text = "wrong data"; - String message = String.format("Expected: a ODS containing row \"[%s]\"", - text); - try { - assertThat(sheet, containsRow(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString(message)); - } - } -} +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsRow; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import example.ODS; + +public class ContainsLocalizedRowTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("testdata.ods"))); + } + + @Test + public void rowContainsCells_all() throws IOException { + for (String[] texts : Arrays.asList( + new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, + { "3", "spock", "22" }, { "4", "allure", "50" } })) { + assertThat(sheet, containsRow(texts)); + + } + } + + @Ignore + @Test + public void rowContainsCells_withGaps() throws Exception { + assertThat(sheet, containsRow("PP028000")); + assertThat(sheet, containsRow("PP028000", "281814930")); + assertThat(sheet, containsRow("281814930")); + assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + assertThat(sheet, not(containsRow("foobar"))); + assertThat(sheet, not(containsRow("2", "testng", "51"))); + assertThat(sheet, not(containsRow("1", "testng", "52"))); + } + + @Test + public void errorDescription() throws IOException { + String text = "wrong data"; + String message = String.format("Expected: a ODS containing row \"[%s]\"", + text); + try { + assertThat(sheet, containsRow(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java index c518bcfd8..9660c70da 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java @@ -1,70 +1,70 @@ -package example.matchers.ODS; - -/** - * Copyright 2023 Serguei Kouzmine - */ - -import static example.ODS.containsText; -import static example.ODS.doesNotContainText; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Objects; - -import org.junit.Before; -import org.junit.Test; - -import example.ODS; - -public class ContainsLocalizedTextTest { - private ODS sheet; - - @Before - public void before() throws Exception { - sheet = new ODS(Objects.requireNonNull( - getClass().getClassLoader().getResource("localized.ods"))); - } - - @Test - public void canAssertThatXlsContainsText() throws IOException { - for (String text : Arrays.asList(new String[] { "junit", "testng", "allure", - "хабр", "разработка", "фриланс", "расчёт" })) { - assertThat(sheet, containsText(text)); - } - } - - @Test - public void canAssertXlsDoesNotContainText() throws IOException { - for (String text : Arrays.asList(new String[] { "xunit", "яндекс" })) { - assertThat(sheet, doesNotContainText(text)); - } - } - - @Test - public void errorDescriptionForDoesNotContainTextMatcher() { - String text = "хабр"; - try { - assertThat(sheet, doesNotContainText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString( - String.format("Expected: a ODS not containing text \"%s\"", text))); - } - } - - @Test - public void errorDescriptionForContainsTextMatcher() { - String text = "яндекс"; - String message = String.format("Expected: a ODS containing text \"%s\"", - text); - try { - assertThat(sheet, containsText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString(message)); - } - } -} +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsText; +import static example.ODS.doesNotContainText; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Test; + +import example.ODS; + +public class ContainsLocalizedTextTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("localized.ods"))); + } + + @Test + public void canAssertThatXlsContainsText() throws IOException { + for (String text : Arrays.asList(new String[] { "junit", "testng", "allure", + "хабр", "разработка", "фриланс", "расчёт" })) { + assertThat(sheet, containsText(text)); + } + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + for (String text : Arrays.asList(new String[] { "xunit", "яндекс" })) { + assertThat(sheet, doesNotContainText(text)); + } + } + + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + String text = "хабр"; + try { + assertThat(sheet, doesNotContainText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString( + String.format("Expected: a ODS not containing text \"%s\"", text))); + } + } + + @Test + public void errorDescriptionForContainsTextMatcher() { + String text = "яндекс"; + String message = String.format("Expected: a ODS containing text \"%s\"", + text); + try { + assertThat(sheet, containsText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java index be0e7de31..ff7f2a05f 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java @@ -1,70 +1,70 @@ -package example.matchers.ODS; - -/** - * Copyright 2023 Serguei Kouzmine - */ - -import static example.ODS.containsRow; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Objects; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import example.ODS; - -public class ContainsRowTest { - private ODS sheet; - - @Before - public void before() throws Exception { - sheet = new ODS(Objects.requireNonNull( - getClass().getClassLoader().getResource("testdata.ods"))); - } - - @Test - public void rowContainsCells_all() throws IOException { - for (String[] texts : Arrays.asList( - new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, - { "3", "spock", "22" }, { "4", "allure", "50" } })) { - assertThat(sheet, containsRow(texts)); - - } - } - - @Ignore - @Test - public void rowContainsCells_withGaps() throws Exception { - assertThat(sheet, containsRow("PP028000")); - assertThat(sheet, containsRow("PP028000", "281814930")); - assertThat(sheet, containsRow("281814930")); - assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); - } - - @Test - public void rowContainsCells_noMatch() throws IOException { - assertThat(sheet, not(containsRow("foobar"))); - assertThat(sheet, not(containsRow("2", "testng", "51"))); - assertThat(sheet, not(containsRow("1", "testng", "52"))); - } - - @Test - public void errorDescription() throws IOException { - String text = "wrong data"; - String message = String.format("Expected: a ODS containing row \"[%s]\"", - text); - try { - assertThat(sheet, containsRow(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString(message)); - } - } -} +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsRow; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import example.ODS; + +public class ContainsRowTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("testdata.ods"))); + } + + @Test + public void rowContainsCells_all() throws IOException { + for (String[] texts : Arrays.asList( + new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, + { "3", "spock", "22" }, { "4", "allure", "50" } })) { + assertThat(sheet, containsRow(texts)); + + } + } + + @Ignore + @Test + public void rowContainsCells_withGaps() throws Exception { + assertThat(sheet, containsRow("PP028000")); + assertThat(sheet, containsRow("PP028000", "281814930")); + assertThat(sheet, containsRow("281814930")); + assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + assertThat(sheet, not(containsRow("foobar"))); + assertThat(sheet, not(containsRow("2", "testng", "51"))); + assertThat(sheet, not(containsRow("1", "testng", "52"))); + } + + @Test + public void errorDescription() throws IOException { + String text = "wrong data"; + String message = String.format("Expected: a ODS containing row \"[%s]\"", + text); + try { + assertThat(sheet, containsRow(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java index 15546b9bf..5d3385ca8 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java @@ -1,68 +1,68 @@ -package example.matchers.ODS; - -/** - * Copyright 2023 Serguei Kouzmine - */ - -import static example.ODS.containsText; -import static example.ODS.doesNotContainText; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Objects; - -import org.junit.Before; -import org.junit.Test; - -import example.ODS; - -public class ContainsTextTest { - private ODS sheet; - - @Before - public void before() throws Exception { - sheet = new ODS(Objects.requireNonNull( - getClass().getClassLoader().getResource("testdata.ods"))); - } - - @Test - public void canAssertThatXlsContainsText() throws IOException { - for (String text : Arrays - .asList(new String[] { "junit", "testng", "allure" })) { - assertThat(sheet, containsText(text)); - } - } - - @Test - public void canAssertXlsDoesNotContainText() throws IOException { - assertThat(sheet, doesNotContainText("xunit")); - } - - @Test - public void errorDescriptionForDoesNotContainTextMatcher() { - String text = "junit"; - try { - assertThat(sheet, doesNotContainText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString( - String.format("Expected: a ODS not containing text \"%s\"", text))); - } - } - - @Test - public void errorDescriptionForContainsTextMatcher() { - String text = "wrong text"; - String message = String.format("Expected: a ODS containing text \"%s\"", - text); - try { - assertThat(sheet, containsText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString(message)); - } - } -} +package example.matchers.ODS; + +/** + * Copyright 2023 Serguei Kouzmine + */ + +import static example.ODS.containsText; +import static example.ODS.doesNotContainText; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; + +import org.junit.Before; +import org.junit.Test; + +import example.ODS; + +public class ContainsTextTest { + private ODS sheet; + + @Before + public void before() throws Exception { + sheet = new ODS(Objects.requireNonNull( + getClass().getClassLoader().getResource("testdata.ods"))); + } + + @Test + public void canAssertThatXlsContainsText() throws IOException { + for (String text : Arrays + .asList(new String[] { "junit", "testng", "allure" })) { + assertThat(sheet, containsText(text)); + } + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + assertThat(sheet, doesNotContainText("xunit")); + } + + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + String text = "junit"; + try { + assertThat(sheet, doesNotContainText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString( + String.format("Expected: a ODS not containing text \"%s\"", text))); + } + } + + @Test + public void errorDescriptionForContainsTextMatcher() { + String text = "wrong text"; + String message = String.format("Expected: a ODS containing text \"%s\"", + text); + try { + assertThat(sheet, containsText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java index 4fb54ce59..50c2be1a0 100644 --- a/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java +++ b/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java @@ -1,61 +1,61 @@ -package example.matchers.XLS; - -import org.junit.Ignore; -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.IOException; - -import static example.XLS.containsRow; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -public class ContainsRowTest { - @Test - public void rowContainsCells_all() throws IOException { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, - containsRow("PP028000", - "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", - "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", - "415039******2364", "476956", "281814930")); - } - - @Test - public void rowContainsCells_withGaps() throws Exception { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, containsRow("PP028000")); - assertThat(xls, containsRow("PP028000", "281814930")); - assertThat(xls, containsRow("281814930")); - assertThat(xls, containsRow("Итого по терминалу", "48,271.00")); - } - - @Test - public void rowContainsCells_noMatch() throws IOException { - XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, not(containsRow("foobar"))); - assertThat(xls, not(containsRow("foobar", "PP028000", "281814930"))); - assertThat(xls, not(containsRow("PP028000", "281814930", "foobar"))); - assertThat(xls, not(containsRow("PP028000", "foobar", "281814930"))); - } - - @Ignore - @Test - public void errorDescription() throws IOException { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, containsRow("wrong data")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS containing row \"[wrong data]\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } -} +package example.matchers.XLS; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; + +import static example.XLS.containsRow; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.fail; + +public class ContainsRowTest { + @Test + public void rowContainsCells_all() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, + containsRow("PP028000", + "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", + "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", + "415039******2364", "476956", "281814930")); + } + + @Test + public void rowContainsCells_withGaps() throws Exception { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, containsRow("PP028000")); + assertThat(xls, containsRow("PP028000", "281814930")); + assertThat(xls, containsRow("281814930")); + assertThat(xls, containsRow("Итого по терминалу", "48,271.00")); + } + + @Test + public void rowContainsCells_noMatch() throws IOException { + XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); + assertThat(xls, not(containsRow("foobar"))); + assertThat(xls, not(containsRow("foobar", "PP028000", "281814930"))); + assertThat(xls, not(containsRow("PP028000", "281814930", "foobar"))); + assertThat(xls, not(containsRow("PP028000", "foobar", "281814930"))); + } + + @Ignore + @Test + public void errorDescription() throws IOException { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsRow("wrong data")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing row \"[wrong data]\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} diff --git a/xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java index 99bc57360..c8a552657 100644 --- a/xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java +++ b/xls-validate/src/test/java/example/matchers/XLS/ContainsTextTest.java @@ -1,96 +1,96 @@ -package example.matchers.XLS; - -import org.junit.Ignore; -import org.junit.Test; - -import example.XLS; - -import java.io.File; -import java.io.IOException; -import java.util.Objects; - -import static example.XLS.containsText; -import static example.XLS.doesNotContainText; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.fail; - -public class ContainsTextTest { - @Test - public void canAssertThatXlsContainsText() throws IOException { - XLS XLS = new XLS(Objects.requireNonNull( - getClass().getClassLoader().getResource("statement.xls"))); - assertThat(XLS, containsText("Выписка")); - assertThat(XLS, containsText("Solntsev Andrei")); - assertThat(XLS, containsText("25.06.2015 23:09:32")); - - assertThat(XLS, containsText("Счёт")); - assertThat(XLS, containsText("40820810590480000591")); - assertThat(XLS, containsText("Период")); - assertThat(XLS, containsText("18.06.2015 - 18.06.2015")); - assertThat(XLS, containsText("Входящий остаток на 18.06.2015")); - assertThat(XLS, containsText("6.40")); - - assertThat(XLS, containsText("Дата")); - assertThat(XLS, containsText("Счёт\nплательщика/получателя")); - assertThat(XLS, containsText("Плательщик / Получатель")); - assertThat(XLS, containsText("Операция")); - assertThat(XLS, containsText("Сумма (RUB)")); - - assertThat(XLS, containsText("18.06.2015")); - assertThat(XLS, containsText("40820810590550000146")); - assertThat(XLS, containsText("Solntsev Andrei")); - assertThat(XLS, containsText("сюда. Интернет-банк")); - assertThat(XLS, containsText("-1.00")); - - assertThat(XLS, containsText("туда. Интернет-банк")); - assertThat(XLS, containsText("1.00")); - - assertThat(XLS, containsText("Исходящий остаток на 18.06.2015")); - assertThat(XLS, containsText("6.40")); - - assertThat(XLS, containsText("Поступление")); - assertThat(XLS, containsText("Списание")); - assertThat(XLS, containsText("Зарезервировано")); - assertThat(XLS, containsText("349,928.00")); - } - - @Test - public void canAssertXlsDoesNotContainText() throws IOException { - XLS xls = new XLS(Objects.requireNonNull( - getClass().getClassLoader().getResource("statement.xls"))); - assertThat(xls, doesNotContainText("null")); - } - - @Ignore - @Test - public void errorDescriptionForDoesNotContainTextMatcher() { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, doesNotContainText("Выписка")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS not containing text \"Выписка\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } - - @Ignore - @Test - public void errorDescriptionForContainsTextMatcher() { - XLS xls = new XLS(new File("src/test/resources/small.xls")); - try { - assertThat(xls, containsText("wrong text")); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), - is("\nExpected: a XLS containing text \"wrong text\"" - + "\n but: was \"" + System.getProperty("user.dir") - + "/src/test/resources/small.xls\"" - + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); - } - } -} +package example.matchers.XLS; + +import org.junit.Ignore; +import org.junit.Test; + +import example.XLS; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; + +import static example.XLS.containsText; +import static example.XLS.doesNotContainText; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.fail; + +public class ContainsTextTest { + @Test + public void canAssertThatXlsContainsText() throws IOException { + XLS XLS = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(XLS, containsText("Выписка")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("25.06.2015 23:09:32")); + + assertThat(XLS, containsText("Счёт")); + assertThat(XLS, containsText("40820810590480000591")); + assertThat(XLS, containsText("Период")); + assertThat(XLS, containsText("18.06.2015 - 18.06.2015")); + assertThat(XLS, containsText("Входящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Дата")); + assertThat(XLS, containsText("Счёт\nплательщика/получателя")); + assertThat(XLS, containsText("Плательщик / Получатель")); + assertThat(XLS, containsText("Операция")); + assertThat(XLS, containsText("Сумма (RUB)")); + + assertThat(XLS, containsText("18.06.2015")); + assertThat(XLS, containsText("40820810590550000146")); + assertThat(XLS, containsText("Solntsev Andrei")); + assertThat(XLS, containsText("сюда. Интернет-банк")); + assertThat(XLS, containsText("-1.00")); + + assertThat(XLS, containsText("туда. Интернет-банк")); + assertThat(XLS, containsText("1.00")); + + assertThat(XLS, containsText("Исходящий остаток на 18.06.2015")); + assertThat(XLS, containsText("6.40")); + + assertThat(XLS, containsText("Поступление")); + assertThat(XLS, containsText("Списание")); + assertThat(XLS, containsText("Зарезервировано")); + assertThat(XLS, containsText("349,928.00")); + } + + @Test + public void canAssertXlsDoesNotContainText() throws IOException { + XLS xls = new XLS(Objects.requireNonNull( + getClass().getClassLoader().getResource("statement.xls"))); + assertThat(xls, doesNotContainText("null")); + } + + @Ignore + @Test + public void errorDescriptionForDoesNotContainTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, doesNotContainText("Выписка")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS not containing text \"Выписка\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } + + @Ignore + @Test + public void errorDescriptionForContainsTextMatcher() { + XLS xls = new XLS(new File("src/test/resources/small.xls")); + try { + assertThat(xls, containsText("wrong text")); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), + is("\nExpected: a XLS containing text \"wrong text\"" + + "\n but: was \"" + System.getProperty("user.dir") + + "/src/test/resources/small.xls\"" + + "\nВыписка\t\t\nСчёт\t40820810590480000591\t\n")); + } + } +} From 1692dc2947fa1b2653983c7e84cd41e4078401c0 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 23 Jul 2023 14:52:34 -0400 Subject: [PATCH 027/171] intermediate revision - aadded basic parsing of dates and workaround for partial row match --- utils/vnvctl.sh | 6 ++++ xls-validate/pom.xml | 11 ++---- xls-validate/src/main/java/example/ODS.java | 20 ++++++++--- .../example/matchers/ODS/ContainsRow.java | 5 ++- .../ODS/ContainsLocalizedRowTest.java | 32 ++++++++++++++++-- .../example/matchers/ODS/ContainsRowTest.java | 12 +++++++ xls-validate/src/test/resources/localized.ods | Bin 14755 -> 16506 bytes xls-validate/src/test/resources/testdata.ods | Bin 11050 -> 13557 bytes 8 files changed, 70 insertions(+), 16 deletions(-) diff --git a/utils/vnvctl.sh b/utils/vnvctl.sh index 11407e627..f2404cba4 100755 --- a/utils/vnvctl.sh +++ b/utils/vnvctl.sh @@ -1,6 +1,12 @@ #!/bin/bash +# https://serverok.in/install-xfce-vnc-remote-desktop-on-ubuntu # TODO: check the DIPLAY_PORT part # NOTE: unable to connecting to DISPLAY :0 +# NOTE: the original article suggests having in ~/.vnc/xstartup +# /usr/bin/vncconfig -nowin -display :1 & +# +# startxfce4 & +# this is not stable: no window manager # https://www.ubuntu18.com/install-vnc-server-ubuntu-18 # see also: https://a-katyrev.blogspot.com/2019/11/vnc-lubuntu-1804.html COMMAND=${1:-stop} diff --git a/xls-validate/pom.xml b/xls-validate/pom.xml index de8a33d78..43235b854 100644 --- a/xls-validate/pom.xml +++ b/xls-validate/pom.xml @@ -4,7 +4,7 @@ example xls-validate jar - 0.4-SNAPSHOT + 0.5.0-SNAPSHOT xls-validate http://maven.apache.org @@ -30,7 +30,6 @@ 4.1.2 ${poi.version} - EntryPoint @@ -58,11 +57,6 @@ junit ${junit.version} - - org.jopendocument - jOpenDocument - ${jOpenDocument.version} - org.apache.poi poi-ooxml @@ -87,7 +81,8 @@ org.hamcrest hamcrest-all ${hamcrest-all.version} - + + diff --git a/xls-validate/src/main/java/example/ODS.java b/xls-validate/src/main/java/example/ODS.java index f33f6200a..9df211dd6 100644 --- a/xls-validate/src/main/java/example/ODS.java +++ b/xls-validate/src/main/java/example/ODS.java @@ -7,16 +7,17 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URL; -import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import org.hamcrest.Matcher; import org.jopendocument.dom.ODDocument; -import org.jopendocument.dom.spreadsheet.Cell; import org.jopendocument.dom.ODPackage; import org.jopendocument.dom.ODValueType; +import org.jopendocument.dom.spreadsheet.Cell; import org.jopendocument.dom.spreadsheet.SpreadSheet; import example.matchers.ODS.ContainsRow; @@ -71,6 +72,7 @@ public static Matcher doesNotContainText(String text) { // see also: // https://stackoverflow.com/questions/64423111/javajopendocument-nullpointerexception-when-using-getcellat0-0 // https://www.jopendocument.org/docs/org/jopendocument/dom/ODValueType.html + @SuppressWarnings("deprecation") public Object safeOOCellValue(Cell cell) { if (cell == null) { return null; @@ -85,6 +87,15 @@ public Object safeOOCellValue(Cell cell) { case STRING: result = data; break; + case DATE: + Date date; + try { + date = new SimpleDateFormat("MM/dd/yy").parse(data); + } catch (ParseException e) { + date = new Date("01/01/1970"); + } + result = date; + break; case TIME: result = null; // TODO break; @@ -92,7 +103,8 @@ public Object safeOOCellValue(Cell cell) { result = Boolean.getBoolean(data); break; default: - throw new IllegalStateException("Can't evaluate cell value"); + throw new IllegalStateException( + "Can't evaluate cell value of " + type.getName()); } return result; } diff --git a/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java index 9bc53c7a5..8d7abf721 100644 --- a/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java +++ b/xls-validate/src/main/java/example/matchers/ODS/ContainsRow.java @@ -38,7 +38,10 @@ protected boolean matchesSafely(ODS item) { if (cell.isEmpty()) break; String expectedText = expectedTexts.peek(); - if (item.safeOOCellValue(cell).toString().contains(expectedText)) + if (expectedText == null) + break; + Object data = item.safeOOCellValue(cell); + if (data != null && data.toString().contains(expectedText)) expectedTexts.remove(); } if (expectedTexts.isEmpty()) diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java index c12fefafb..962800456 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java @@ -4,7 +4,10 @@ * Copyright 2023 Serguei Kouzmine */ -import static example.ODS.containsRow; +// import java.util.Date; +// import java.text.DateFormat; +// import java.text.SimpleDateFormat; + import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,6 +22,7 @@ import org.junit.Test; import example.ODS; +import static example.ODS.containsRow; public class ContainsLocalizedRowTest { private ODS sheet; @@ -26,11 +30,11 @@ public class ContainsLocalizedRowTest { @Before public void before() throws Exception { sheet = new ODS(Objects.requireNonNull( - getClass().getClassLoader().getResource("testdata.ods"))); + getClass().getClassLoader().getResource("localized.ods"))); } @Test - public void rowContainsCells_all() throws IOException { + public void rowContainsCells_partial() throws IOException { for (String[] texts : Arrays.asList( new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, { "3", "spock", "22" }, { "4", "allure", "50" } })) { @@ -39,6 +43,28 @@ public void rowContainsCells_all() throws IOException { } } + @Test + public void rowContainsCells_all() throws IOException { + /* + @SuppressWarnings("deprecation") + Date date = new Date("07/23/2023"); + String dateString = DateFormat.getDateInstance(DateFormat.DEFAULT) + .format(date); + */ + String dateString = "Sun Jul 23 00:00:00 EDT 2023"; + for (String[] texts : Arrays.asList(new String[][] { + { "1", "junit", "202", dateString }, + { "2", "testng", "52", dateString }, { "3", "spock", "22", dateString }, + { "4", "allure", "50", dateString }, { "5", "хабр", "123", dateString }, + { "6", "разработка", "192", dateString }, + { "7", "фриланс", "83", dateString }, + { "4", "allure", "50", dateString }, + { "8", "расчёт", "9", dateString } })) { + assertThat(sheet, containsRow(texts)); + + } + } + @Ignore @Test public void rowContainsCells_withGaps() throws Exception { diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java index ff7f2a05f..80bc81463 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java @@ -31,6 +31,18 @@ public void before() throws Exception { @Test public void rowContainsCells_all() throws IOException { + for (String[] texts : Arrays.asList(new String[][] { + { "1", "junit", "202", "Sun Jul 23 00:00:00 EDT 2023" }, + { "2", "testng", "52", "Sun Jul 23 00:00:00 EDT 2023" }, + { "3", "spock", "22", "Sun Jul 23 00:00:00 EDT 2023" }, + { "4", "allure", "50", "Sun Jul 23 00:00:00 EDT 2023" } })) { + assertThat(sheet, containsRow(texts)); + + } + } + + @Test + public void rowContainsCells_partial() throws IOException { for (String[] texts : Arrays.asList( new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, { "3", "spock", "22" }, { "4", "allure", "50" } })) { diff --git a/xls-validate/src/test/resources/localized.ods b/xls-validate/src/test/resources/localized.ods index d108092a042b17fd62580885a504673aff5ea83e..a4cb3433729fcb9690f5f51c479f7ef28d5b3df1 100644 GIT binary patch delta 14340 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 Y>++MpIS3@xauO!R@?#-h3jP89FV5)xssI20 delta 12628 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 W_@^1*>9F?cW%uNNY+wKU^gjS(eCOPC ze|>A+T5D#ytGar6dTOSguIg*6QcZMaIT%=M000pHa1CHpibGe1{c{B)Ly^S=VE?Ne zm&WxE4;7j$?h5O#ob!K}U=yf+b3LHc{^5>6@%|OF|5YFZn?V25Be)5M5Ts}4u*8G) z;@8pTc!ta5SVPr8RnP6@_+zD;xta;r_uerZSu)RjRW?sp#c9$IBqm#MZLjTa!e>dq ziOEZZp6$s)#9m~7N&*8q|Dr8#>A_bgHS73AEVP;G%0ASvs8#pnB&1UFS0_sH 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 Date: Mon, 24 Jul 2023 03:17:32 +0200 Subject: [PATCH 028/171] removed backup directory which also contains vulnerable dependency triggering dependabot activities --- chrome-html2pdf.SAVED/README.md | 4 - chrome-html2pdf.SAVED/pom.xml | 295 ----------- .../pdf/DataCollectorPdfApplication.java | 22 - .../pdf/action/TestController.java | 59 --- .../datacollector/pdf/config/PdfPoolnit.java | 102 ---- .../pdf/config/RedisConfiguration.java | 30 -- .../datacollector/pdf/config/Test.java | 459 ------------------ .../pdf/config/ThreadPoolConfig.java | 35 -- .../datacollector/pdf/service/PDFService.java | 14 - .../pdf/service/impl/PDFImpl.java | 94 ---- .../pdf/task/RedisConsumerTask.java | 69 --- .../pdf/task/RedisRollbackTask.java | 77 --- .../datacollector/pdf/util/HTML2PDF.java | 184 ------- .../pdf/vo/PDFSessionDetail.java | 34 -- .../datacollector/pdf/vo/Result.java | 31 -- .../main/resources/application-dev.properties | 35 -- .../main/resources/application-pro.properties | 1 - .../resources/application-test.properties | 1 - .../src/main/resources/application.properties | 18 - .../src/main/resources/logback-spring.xml | 112 ----- .../EcgManagerApplicationTests.java | 62 --- 21 files changed, 1738 deletions(-) delete mode 100644 chrome-html2pdf.SAVED/README.md delete mode 100644 chrome-html2pdf.SAVED/pom.xml delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisRollbackTask.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java delete mode 100644 chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java delete mode 100644 chrome-html2pdf.SAVED/src/main/resources/application-dev.properties delete mode 100644 chrome-html2pdf.SAVED/src/main/resources/application-pro.properties delete mode 100644 chrome-html2pdf.SAVED/src/main/resources/application-test.properties delete mode 100644 chrome-html2pdf.SAVED/src/main/resources/application.properties delete mode 100644 chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml delete mode 100644 chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java diff --git a/chrome-html2pdf.SAVED/README.md b/chrome-html2pdf.SAVED/README.md deleted file mode 100644 index e21a962ff..000000000 --- a/chrome-html2pdf.SAVED/README.md +++ /dev/null @@ -1,4 +0,0 @@ -### Info - -replica of[cdp4j-chrome-html2pdf](https://github.com/itxwnet/cdp4j-chrome-html2pdf), intend to clear the dependency on `io.webfolder.cdp` -[cdp4j](https://github.com/webfolderio/cdp4j) in favor of pure [selenium 4.x]() or [cdp_webdriver](https://github.com/sergueik/cdp_webdriver) diff --git a/chrome-html2pdf.SAVED/pom.xml b/chrome-html2pdf.SAVED/pom.xml deleted file mode 100644 index f2bdf1a27..000000000 --- a/chrome-html2pdf.SAVED/pom.xml +++ /dev/null @@ -1,295 +0,0 @@ - - - 4.0.0 - - com.xz.datacenter.datacollector - data-collector-pdf - 0.0.1-SNAPSHOT - data-collector-pdf - data-collector-pdf - - - org.springframework.boot - spring-boot-starter-parent - 1.5.4.RELEASE - - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - - - - - - - - - - - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.springframework.boot - spring-boot-starter-data-mongodb - 2.1.0.RELEASE - - - org.mongodb - mongodb-driver - - - - - - org.mongodb - mongo-java-driver - 3.8.0 - - - - - - junit - junit - 4.12 - test - - - - - com.alibaba - fastjson - 1.2.73 - - - - io.webfolder - cdp4j - 3.0.15 - - - - com.vimeo.stag - stag-library - 2.6.0 - provided - true - - - - - com.google.code.gson - gson - 2.8.6 - - - - io.webfolder - wf-exec - 1.0.3 - provided - - - com.neovisionaries - nv-websocket-client - 2.9 - - - - org.asynchttpclient - async-http-client - 2.10.1 - provided - - - org.slf4j - slf4j-api - - - - - - - org.jvnet.winp - winp - 1.28 - - - - - org.java-websocket - Java-WebSocket - 1.4.0 - provided - - - org.slf4j - slf4j-api - - - - - - - org.apache.tomcat - tomcat-websocket - 9.0.24 - provided - - - - org.eclipse.jetty.websocket - websocket-client - 9.4.20.v20190813 - provided - - - io.undertow - undertow-core - 2.0.26.Final - provided - - - org.glassfish.tyrus - tyrus-container-grizzly-client - 1.15 - provided - - - org.apache.tomcat - tomcat-websocket - 9.0.24 - provided - - - org.apache.tomcat - tomcat-api - 9.0.24 - provided - - - org.graalvm.nativeimage - svm - 19.3.0.2 - provided - - - org.java-websocket - Java-WebSocket - 1.4.0 - provided - - - org.slf4j - slf4j-api - - - - - - io.github.kostaskougios - cloning - 1.10.1 - test - - - com.squareup - javapoet - 1.11.1 - test - - - - org.jboss.forge.roaster - roaster-jdt - 2.21.0.Final - provided - - - io.vertx - vertx-core - 4.0.0-milestone4 - provided - - - io.netty - netty-codec-http2 - - - io.netty - netty-resolver-dns - - - io.netty - netty-codec-socks - - - - - - - org.jsoup - jsoup - 1.10.1 - - - - - - - - - - - - - org.java-websocket - Java-WebSocket - 1.4.0 - - - - - - UTF-8 - UTF-8 - 1.8 - ${project.groupId}.${project.artifactId} - - diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java deleted file mode 100644 index 891c9c2fa..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/DataCollectorPdfApplication.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.xz.datacenter.datacollector.pdf; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.annotation.EnableScheduling; - - -@SpringBootApplication(scanBasePackages = "com.xz.datacenter.datacollector") -//@EnableEurekaClient -//@EnableFeignClients(basePackages = "com.xz.datacenter.datacollector") -@EnableAsync -//@EnableOAuth2Client -//@EnableResourceServer -@EnableScheduling -public class DataCollectorPdfApplication { - - public static void main(String[] args) { - SpringApplication.run(DataCollectorPdfApplication.class, args); - } - -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java deleted file mode 100644 index 78f5d10d0..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/action/TestController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.action; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -/** - * @Description: - * @Author: houyong - * @Date: 2020/2/6 - */ -@RestController -public class TestController { - - @Value("${spring.redis.pdfKey}") - private String pictureMsgKey; - - @Autowired - private RedisTemplate redisTemplate; - - @Autowired - private MongoTemplate mongoTemplate; - - @RequestMapping("/testInsertMessage") - public void testInsertMessage(){ - JSONObject msgObj=new JSONObject(); - JSONObject contentObj=new JSONObject(); - contentObj.put("createTime",new Date().getTime()); - - List ossUrlList=new ArrayList(); - ossUrlList.add("http://znxunzhi-marking-pic.oss-cn-shenzhen.aliyuncs.com/430000-32ef33ec854742a3b986bcaada73091e/001/dcf2c7ee-9bb3-40ee-9f63-45fc03c45595/Card-A--25-10.jpg?x-oss-process=image/crop,x_813,y_733,w_854,h_418,g_nw"); - ossUrlList.add("http://znxunzhi-marking-pic.oss-cn-shenzhen.aliyuncs.com/430000-32ef33ec854742a3b986bcaada73091e/001/dcf2c7ee-9bb3-40ee-9f63-45fc03c45595/Card-A--25-10.jpg?x-oss-process=image/crop,x_817,y_88,w_812,h_664,g_nw"); - contentObj.put("oss_url",ossUrlList); - - contentObj.put("projectId","projectId"); - contentObj.put("studentId","studentId"); - contentObj.put("subjectCode","subjectCode"); - contentObj.put("questionNo","questionNo"); - - msgObj.put("messageContent",contentObj); - - mongoTemplate.insert(contentObj,"project_quest"); - - - redisTemplate.opsForList().leftPush(pictureMsgKey, JSON.toJSONString(msgObj)); - - - - } -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java deleted file mode 100644 index c190963de..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/PdfPoolnit.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.config; - -import com.xz.datacenter.datacollector.pdf.util.HTML2PDF; -import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; -import io.webfolder.cdp.Launcher; -import io.webfolder.cdp.session.Session; -import io.webfolder.cdp.session.SessionFactory; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -import javax.annotation.PreDestroy; -import java.util.Date; - -/** - * @Description: - * @Author: houyong - * @Date: 2020/2/21 - */ -@Slf4j -@Component -public class PdfPoolnit implements ApplicationRunner { - - @Value("${pdf.pool.launchSize}") - private int launchSize; - - @Value("${pdf.pool.contextSize}") - private int contextSize; - - @Value("${pdf.pool.sessionSize}") - private int sessionSize; - - @Value("${pdf.tempPath}") - private String tempPath; - - - @PreDestroy - public void destory() { - log.warn("销毁程序-销毁连接池"); - if(!CollectionUtils.isEmpty(HTML2PDF.sessionPool)){ - for(PDFSessionDetail pdfSessionDetail:HTML2PDF.sessionPool){ - try { - if(pdfSessionDetail.getSession()!=null) - pdfSessionDetail.getSession().close(); - } catch (Exception e) { - log.warn("销毁连接失败"); - } - try { - if(pdfSessionDetail.getSessionFactory()!=null) - pdfSessionDetail.getSessionFactory().close(); - } catch (Exception e) { - log.warn("销毁连接失败"); - } - try { - if(pdfSessionDetail.getLauncher()!=null) - pdfSessionDetail.getLauncher().kill(); - } catch (Exception e) { - log.warn("销毁连接失败"); - } - } - - log.warn("销毁程序-完成销毁:"+HTML2PDF.sessionPool.size()); - } - - } - - @Override - public void run(ApplicationArguments args) throws Exception { - Test.test(); - log.warn("###初始化pdf连接池###"); - for(int i=1;i<=launchSize;i++){ - Launcher launcher=HTML2PDF.createLauncher(tempPath+"/"+i); - SessionFactory factory=HTML2PDF.createFactory(launcher); - for(int j=1;j<=contextSize;j++){ - String context=HTML2PDF.createBrowserContext(factory); - for(int k=1;k<=sessionSize;k++){ - Session session=HTML2PDF.createSession(factory,context); - - PDFSessionDetail pdfSessionDetail=new PDFSessionDetail(); - pdfSessionDetail.setHold(false); - pdfSessionDetail.setActive(true); - pdfSessionDetail.setLauncher(launcher); - pdfSessionDetail.setSessionFactory(factory); - pdfSessionDetail.setBrowserContext(context); - pdfSessionDetail.setSession(session); - pdfSessionDetail.setLastHoldDate(new Date()); - session.navigate("http://www.baidu.com"); -// session.waitDocumentReady(); -// session.printToPDF(new File("d:/test.pdf").toPath()); - HTML2PDF.sessionPool.add(pdfSessionDetail); - - } - } - } - - log.warn("###完成初始化pdf连接池###"+HTML2PDF.sessionPool.size()); - - } -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java deleted file mode 100644 index 5f1fca1a4..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/RedisConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.config; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -/** - * @Description: redis - * @Author: houyong - * @Date: 2019/12/11 - */ -@Configuration -public class RedisConfiguration { - @Bean - @ConditionalOnMissingBean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ - RedisTemplate template = new RedisTemplate<>(); - RedisSerializer stringSerializer = new StringRedisSerializer(); - template.setKeySerializer(stringSerializer); - template.setValueSerializer(stringSerializer); - template.setHashKeySerializer(stringSerializer); - template.setHashValueSerializer(stringSerializer); - template.setConnectionFactory(redisConnectionFactory); - return template; - } -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java deleted file mode 100644 index 6ba1dd4e3..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/Test.java +++ /dev/null @@ -1,459 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.config; - -import io.webfolder.cdp.Browser; -import io.webfolder.cdp.Options; -import io.webfolder.cdp.WfProcessManager; -import io.webfolder.cdp.channel.ChannelFactory; -import io.webfolder.cdp.exception.CdpException; -import io.webfolder.cdp.session.SessionFactory; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.net.ServerSocket; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - - -public class Test { - //浏览器标签Id - static String targetId=""; - //contextId - static String browserContextId; - //页面sessionId - static String sessionId=""; - //数据流 - static String ioHandle=""; - static String ioData=""; - static boolean ioEof=false; - - public static void main(String[] args) { - - } - - public static void test() { - try { - -// Options options = Options.builder() -// .headless(true) -// .build(); - -// Launcher launcher = new Launcher(options); -// launcher.launch(); - - - String cmdID=Long.toHexString(ThreadLocalRandom.current().nextLong()); - - //命令启动浏览器 - List arguments=new ArrayList<>(); - String os = System.getProperty("os.name"); - if(os.toLowerCase().startsWith("windows")){ - arguments.add("C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"); - }else if(os.toLowerCase().startsWith("linux")){ - arguments.add("google-chrome"); - } - arguments.add("--disable-features=TranslateUI"); - arguments.add("--disable-extensions"); - arguments.add("--disable-background-networking"); - arguments.add("--safebrowsing-disable-auto-update"); - arguments.add("--disable-sync"); - arguments.add("--metrics-recording-only"); - arguments.add("--disable-default-apps"); - arguments.add("--mute-audio"); - arguments.add("--no-first-run"); - arguments.add("--no-default-browser-check"); - arguments.add("--disable-plugin-power-saver"); - arguments.add("--disable-popup-blocking"); - arguments.add("--remote-debugging-port=0"); - arguments.add("--user-data-dir=d:\\chromeHome\\2"); - arguments.add("--headless"); - //arguments.add("--cdp4jId="+cmdID); - //arguments.add("--disable-gpu"); - // arguments.add("--enable-automation"); - - Options options = Options.builder() - .headless(true) - .userDataDir(new File("d:/chromeHome/2").toPath()) - .build(); - Launcher launcher = new Launcher(options); - launcher.launch(arguments); - //launchWithProcessBuilder(arguments,options,launcher); - - URI socketUri=null; - - - //Process process=Runtime.getRuntime().exec(String.join(" ",arguments)); - ProcessBuilder builder = new ProcessBuilder(arguments); - builder.environment().put("CDP4J_ID",cmdID); - - Process process=builder.start(); - - - Scanner scanner = new Scanner(process.getErrorStream()); - while (scanner.hasNext()){ - String line = scanner.nextLine().trim(); - if (!line.isEmpty() && line.toLowerCase().startsWith("devtools listening on")) { - int start = line.indexOf("ws://"); - socketUri = new URI(line.substring(start, line.length())); - break; - } - } - scanner.close(); - - - } catch (Exception e) { - e.printStackTrace(); - } - - - } - - - -} - - - - - - - - - class Launcher { - private static final boolean JAVA_8 = System.getProperty("java.version").startsWith("1.8."); - private static final String OS_NAME; - private static final boolean WINDOWS; - private static final boolean OSX; - private final Options options; - private final ChannelFactory channelFactory; - - public Launcher(Options options, ChannelFactory channelFactory) { - this.options = options; - this.channelFactory = channelFactory; - } - - public Launcher(ChannelFactory channelFactory) { - this(Options.builder().build(), channelFactory); - } - - public Launcher(Options options) { - this(options, createChannelFactory()); - } - - public Launcher() { - this(Options.builder().build(), createChannelFactory()); - } - - protected String findChrome() { - String executablePath = this.options.browserExecutablePath(); - if (executablePath != null && !executablePath.trim().isEmpty()) { - return executablePath; - } else if (WINDOWS) { - return this.findChromeWinPath(); - } else { - return OSX ? this.findChromeOsxPath() : "google-chrome"; - } - } - - protected String findChromeWinPath() { - try { - Iterator var1 = this.getChromeWinPaths().iterator(); - - InputStream is; - String var8; - while(true) { - Process process; - int exitCode; - do { - if (!var1.hasNext()) { - return null; - } - - String path = (String)var1.next(); - process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", "echo", path}); - exitCode = process.waitFor(); - } while(exitCode != 0); - - is = process.getInputStream(); - - try { - String location = this.toString(is).trim().replace("\"", ""); - File chrome = new File(location); - if (chrome.exists() && chrome.canExecute()) { - var8 = chrome.toString(); - break; - } - } catch (Throwable var10) { - if (is != null) { - try { - is.close(); - } catch (Throwable var9) { - var10.addSuppressed(var9); - } - } - - throw var10; - } - - if (is != null) { - is.close(); - } - } - - if (is != null) { - is.close(); - } - - return var8; - } catch (Throwable var11) { - return null; - } - } - - public boolean isChromeInstalled() { - return this.findChrome() != null; - } - - protected List getChromeWinPaths() { - Browser browser = this.options.getBrowser(); - List prefixes = Arrays.asList("%localappdata%", "%programfiles%", "%programfiles(x86)%"); - List suffixes = Collections.emptyList(); - switch(browser) { - case Any: - suffixes = Arrays.asList("\\Google\\Chrome Dev\\Application\\chrome.exe", "\\Google\\Chrome SxS\\Application\\chrome.exe", "\\Google\\Chrome\\Application\\chrome.exe", "\\Microsoft\\Edge\\Application\\msedge.exe"); - case Chrome: - default: - suffixes = Arrays.asList("\\Google\\Chrome\\Application\\chrome.exe"); - break; - case ChromeCanary: - suffixes = Arrays.asList("\\Google\\Chrome SxS\\Application\\chrome.exe"); - break; - case ChromeDev: - suffixes = Arrays.asList("\\\\Google\\\\Chrome Dev\\\\Application\\\\chrome.exe"); - break; - case MicrosoftEdge: - suffixes = Arrays.asList("\\Microsoft\\Edge\\Application\\msedge.exe"); - } - - List installations = new ArrayList(prefixes.size() * suffixes.size()); - Iterator var5 = prefixes.iterator(); - - while(var5.hasNext()) { - String prefix = (String)var5.next(); - Iterator var7 = suffixes.iterator(); - - while(var7.hasNext()) { - String suffix = (String)var7.next(); - installations.add(prefix + suffix); - } - } - - return installations; - } - - protected String findChromeOsxPath() { - Iterator var1 = this.getChromeOsxPaths().iterator(); - - File chrome; - do { - if (!var1.hasNext()) { - return null; - } - - String path = (String)var1.next(); - chrome = new File(path); - } while(!chrome.exists() || !chrome.canExecute()); - - return chrome.toString(); - } - - protected List getChromeOsxPaths() { - return Arrays.asList("/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary", "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"); - } - - protected List getCommonParameters(String chromeExecutablePath, List arguments) { - List list = new ArrayList(); - list.add(chromeExecutablePath); - list.add("--disable-features=TranslateUI"); - list.add("--disable-extensions"); - list.add("--disable-background-networking"); - list.add("--safebrowsing-disable-auto-update"); - list.add("--disable-sync"); - list.add("--metrics-recording-only"); - list.add("--disable-default-apps"); - list.add("--mute-audio"); - list.add("--no-first-run"); - list.add("--no-default-browser-check"); - list.add("--disable-plugin-power-saver"); - list.add("--disable-popup-blocking"); - if (!arguments.isEmpty()) { - list.addAll(arguments); - } - - return list; - } - - protected String toString(InputStream is) { - Scanner scanner = new Scanner(is); - - String var3; - try { - scanner.useDelimiter("\\A"); - var3 = scanner.hasNext() ? scanner.next() : ""; - } catch (Throwable var6) { - try { - scanner.close(); - } catch (Throwable var5) { - var6.addSuppressed(var5); - } - - throw var6; - } - - scanner.close(); - return var3; - } - - public SessionFactory launch(List argument) { - //launchWithProcessBuilder(arguments); - List arguments = this.getCommonParameters(this.findChrome(), this.options.arguments()); - if (arguments.contains("--remote-debugging-pipe")) { - arguments.remove("--remote-debugging-port=0"); - } else { - arguments.add("--remote-debugging-port=0"); - } - - Path userDataDir = this.options.userDataDir(); - if (this.options.userDataDir() == null) { - userDataDir = Paths.get(System.getProperty("java.io.tmpdir")).resolve("remote-profile"); - } - - arguments.add(String.format("--user-data-dir=%s", userDataDir.toString())); - boolean inUse = this.isInUse(userDataDir); - if (inUse) { - throw new CdpException("--user-data-dir [" + userDataDir.toString() + "] is used by another process."); - } else { - if (this.options.headless()) { - arguments.add("--headless"); - } - - SessionFactory factory = null; - switch(this.options.processExecutor()) { - case ProcessBuilder: - factory = this.launchWithProcessBuilder(argument); - break; - case WfExec: - if (!WINDOWS) { - throw new CdpException("WfExec supports only Windows."); - } - - if (!(this.options.processManager() instanceof WfProcessManager)) { - throw new CdpException("WfExec supports only WfProcessManager."); - } - - //factory = WfExecLauncher.launchWithWfExec(this.options, this.channelFactory, arguments); - } - - //return factory; - } - return null; - } - - private boolean isInUse(Path userDataDir) { - Path devToolsActivePort = userDataDir.resolve("DevToolsActivePort"); - if (Files.exists(devToolsActivePort, new LinkOption[0])) { - List lines = Collections.emptyList(); - - try { - lines = Files.readAllLines(devToolsActivePort); - } catch (IOException var11) { - throw new CdpException(var11); - } - - if (lines.size() >= 1) { - int port = Integer.parseInt((String)lines.get(0)); - if (port > 0) { - try { - ServerSocket ignored = new ServerSocket(port); - - boolean var6; - try { - var6 = false; - } catch (Throwable var9) { - try { - ignored.close(); - } catch (Throwable var8) { - var9.addSuppressed(var8); - } - - throw var9; - } - - ignored.close(); - return var6; - } catch (IOException var10) { - return true; - } - } - } - } - - return false; - } - - private SessionFactory launchWithProcessBuilder(List arguments) { - ProcessBuilder builder = new ProcessBuilder(arguments); - try { - Process process = builder.start(); - Scanner scanner = new Scanner(process.getErrorStream()); - - while(scanner.hasNext()) { - String line = scanner.nextLine().trim(); - if (!line.isEmpty() && line.toLowerCase(Locale.ENGLISH).startsWith("devtools listening on")) { - break; - } - } - } catch (IOException var11) { - throw new CdpException(var11); - } - - return null; - } - - protected static ChannelFactory createChannelFactory() { - try { - Class klass = null; - if (!JAVA_8) { - klass = io.webfolder.cdp.Launcher.class.getClassLoader().loadClass("io.webfolder.cdp.channel.JreWebSocketFactory"); - } else { - klass = io.webfolder.cdp.Launcher.class.getClassLoader().loadClass("io.webfolder.cdp.channel.NvWebSocketFactory"); - } - - Constructor constructor = klass.getConstructor(); - return (ChannelFactory)constructor.newInstance(); - } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException | ClassNotFoundException var2) { - throw new CdpException(var2); - } - } - - public boolean kill() { - return this.options.processManager().kill(); - } - - public Options getOptions() { - return this.options; - } - - static { - OS_NAME = System.getProperty("os.name").toLowerCase(Locale.ENGLISH); - WINDOWS = OS_NAME.startsWith("windows"); - OSX = OS_NAME.startsWith("mac"); - } -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java deleted file mode 100644 index 3c3d400bd..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/config/ThreadPoolConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.Executor; - -/** - * @Description: - * @Author: houyong - * @Date: 2019/12/27 - */ -@Configuration -public class ThreadPoolConfig { - - @Value("${spring.task.execution.pool.core-size}") - private Integer corePoolSize; - - @Value("${spring.task.execution.pool.max-size}") - private Integer maxPoolSize; - - @Bean("executorPool") - public Executor executorPool() { - ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); - taskExecutor.setCorePoolSize(corePoolSize); - //taskExecutor.setMaxPoolSize(maxPoolSize); - //taskExecutor.setQueueCapacity(20000); - taskExecutor.setThreadNamePrefix("donwnTask"); - taskExecutor.initialize(); - - return taskExecutor; - } -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java deleted file mode 100644 index 049a3fbeb..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/PDFService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.service; - -import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; - -/** - * @Description: - * @Author: houyong - * @Date: 2020/2/4 - */ -public interface PDFService { - - void generatePDF(PDFSessionDetail pdfSessionDetail, String value); - -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java deleted file mode 100644 index f65b46f50..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/service/impl/PDFImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.xz.datacenter.datacollector.pdf.service.PDFService; -import com.xz.datacenter.datacollector.pdf.util.HTML2PDF; -import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; -import com.xz.datacenter.datacollector.pdf.vo.Result; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** - * @Description: - * @Author: houyong - * @Date: 2020/2/4 - */ -@Slf4j -@Service -public class PDFImpl implements PDFService { - - - @Value("${pdf.pdfWrongServer}") - private String pdfWrongServer; - - @Value("${pdf.storagePath}") - private String storagePath; - - @Value("${spring.redis.pdfCallbackKey}") - private String pdfCallbackKey; - - @Value("${spring.redis.pdfRollbackKey}") - private String pdfRollbackKey; - - @Autowired - private RedisTemplate redisTemplate; - - @Override - @Async("executorPool") - public void generatePDF(PDFSessionDetail pdfSessionDetail, String value) { - - JSONObject msgJson= JSON.parseObject(value); - - String projectId=msgJson.getString("projectId"); - String studentId=msgJson.getString("studentId"); - String subjectId=msgJson.getString("subjectId"); - String schoolId=msgJson.getString("schoolId"); - String classId=msgJson.getString("classId"); - String errorBookName=msgJson.getString("errorBookName"); - String schoolName=msgJson.getString("schoolId"); - String className=msgJson.getString("className"); - String studentName=msgJson.getString("studentName"); - String subjectName=msgJson.getString("subjectName"); - - - String url = String.format(pdfWrongServer, projectId, subjectId, studentId); - - - String relationDir=projectId+"/"+schoolId+"/"+classId; - String filePath=storagePath+"/"+relationDir; - File pathFile=new File(filePath); - if(!pathFile.exists())pathFile.mkdirs(); - String fileName=errorBookName+"_"+schoolName+"_"+className+"_"+studentName+"_"+subjectName+".pdf"; - - String fullPath=filePath+"/"+fileName; - String relationPath=relationDir+"/"+fileName; - - Map map=new HashMap<>(); - log.warn("访问pdf服务:"+url); - Result result=HTML2PDF.html2Pdf(pdfSessionDetail.getSession(),url,fullPath); - log.warn("完成pdf:"+fullPath); - HTML2PDF.releaseSession(pdfSessionDetail); - - //完成后回调消息 - msgJson.put("success",result.isSuccess()); - msgJson.put("failure",!result.isSuccess()); - msgJson.put("filePath",result.isSuccess()?relationPath:""); - msgJson.put("code",result.getCode()); - msgJson.put("description",result.getMessage()); - - redisTemplate.opsForList().leftPush(pdfCallbackKey,JSON.toJSONString(msgJson)); - - //生成完成删除回滚中的消息 - redisTemplate.opsForList().remove(pdfRollbackKey,0,value); - } - -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java deleted file mode 100644 index 71f0b7a0f..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/task/RedisConsumerTask.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.task; - -// import com.xz.ajiaedu.common.lang.StringUtil; -import com.xz.datacenter.datacollector.pdf.service.PDFService; -import com.xz.datacenter.datacollector.pdf.util.HTML2PDF; -import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @Description:下载任务消费定时任务 - * @Author: houyong - * @Date: 2019/12/26 - */ - -@Slf4j -@Component -public class RedisConsumerTask extends Thread { - - @Value("${spring.redis.pdfKey}") - private String pdfKey; - - @Value("${spring.redis.pdfRollbackKey}") - private String pdfRollbackKey; - - @Autowired - private RedisTemplate redisTemplate; - - @Autowired - private PDFService pdfService; - - @Scheduled(fixedDelayString = "${pdf.redis.consumer.interval}") - public void consumerTask(){ - try { - long msgSize=redisTemplate.opsForList().size(pdfKey); - if(msgSize>0){ - for(int i=0;i redisTemplate; - - @Scheduled(fixedDelayString = "${pdf.redis.consumer.rollback.interval}") - public void callbackTask(){ - try { - List list=redisTemplate.opsForList().range(pdfRollbackKey,0,-1); - long currentTime=new Date().getTime(); - log.debug("检查超时队列总数:"+(list!=null?list.size():0)+",时间"+currentTime); - if(!CollectionUtils.isEmpty(list)){ - for(Object obj:list){ - if(obj!=null&& StringUtil.isNotEmpty(obj.toString())){ - JSONObject msgObj= JSON.parseObject(obj.toString()); - long createTime=msgObj.getLong("createTime"); - if(currentTime-createTime>timeoutMillisecond){ - log.debug("检查到超时的消息:"+obj.toString()); - //检查重试次数 超过3次直接丢弃 - int retryTimes=msgObj.getIntValue("retryTimes"); - retryTimes=retryTimes<0?0:retryTimes; - retryTimes++; - if(retryTimes<=3){ - msgObj.put("retryTimes",retryTimes); - redisTemplate.opsForList().leftPush(pdfKey,JSON.toJSONString(msgObj)); - } - redisTemplate.opsForList().remove(pdfRollbackKey,0,obj); - - } - } - } - - } - - - } catch (Exception e) { - log.error(e.getMessage(),e); - } - - - } - - -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java deleted file mode 100644 index 6f863b9de..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/util/HTML2PDF.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.util; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.xz.datacenter.datacollector.pdf.vo.PDFSessionDetail; -import com.xz.datacenter.datacollector.pdf.vo.Result; -import io.webfolder.cdp.Launcher; -import io.webfolder.cdp.Options; -import io.webfolder.cdp.command.IO; -import io.webfolder.cdp.session.Session; -import io.webfolder.cdp.session.SessionFactory; -import io.webfolder.cdp.type.io.ReadResult; -import io.webfolder.cdp.type.page.PrintToPDFResult; -import lombok.extern.slf4j.Slf4j; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.springframework.util.CollectionUtils; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Date; -import java.util.Vector; - -import static io.webfolder.cdp.type.constant.PdfTransferMode.ReturnAsStream; -import static java.util.Base64.getDecoder; - -/** - * @Description: - * @Author: houyong - * @Date: 2020/2/19 - */ -@Slf4j -public class HTML2PDF { - public static int c=0; - - public static Vector sessionPool=new Vector(); - - public synchronized static PDFSessionDetail useSession(){ - PDFSessionDetail returnSession=null; - if(!CollectionUtils.isEmpty(sessionPool)) - for(PDFSessionDetail pdfSessionDetail:sessionPool){ - if(!pdfSessionDetail.isHold()&&pdfSessionDetail.isActive()){ - pdfSessionDetail.setHold(true); - pdfSessionDetail.setLastHoldDate(new Date()); - pdfSessionDetail.setHoldTimes(pdfSessionDetail.getHoldTimes()+1); - returnSession=pdfSessionDetail; - break; - } - } - return returnSession; - } - - public static void releaseSession(PDFSessionDetail pdfSessionDetail){ - if(pdfSessionDetail!=null){ - if(pdfSessionDetail.getHoldTimes()>100){ - log.warn("切换session"); - Session session=pdfSessionDetail.getSession(); - session.close(); - session=null; - pdfSessionDetail.setSession(null); - - Session newSession=createSession(pdfSessionDetail.getSessionFactory(),pdfSessionDetail.getBrowserContext()); - pdfSessionDetail.setSession(newSession); - pdfSessionDetail.setHoldTimes(0); - } - pdfSessionDetail.setHold(false); - } - } - - public static Session createSession(SessionFactory factory ,String context){ - return factory.create(context); - } - - public static String createBrowserContext(SessionFactory factory){ - return factory.createBrowserContext(); - } - - public static Launcher createLauncher(String tempPath){ - File tempFile =new File(tempPath); - if(tempFile.exists()){ - deleteDirectoryContent(tempFile); - }; - - Options options = Options.builder() - .headless(true) - .userDataDir(tempFile.toPath()) - .build(); - - Launcher launcher = new Launcher(options); - return launcher; - - } - - public static SessionFactory createFactory(Launcher launcher){ - return launcher.launch(); - } - - - public static Result html2Pdf(Session session, String url, String path) { - FileOutputStream out=null; - IO io=null; - String stream=null; - try { - log.warn("开始访问"); - session.navigate(url); - session.waitDocumentReady(); - String html=session.getContent(); - Document doc= Jsoup.parse(html); - String str=doc.body().text(); - - JSONObject errObject=null; - try { - if(str.contains("statusCode")) - errObject= JSON.parseObject(str); - } catch (Exception e) { - log.error(e.getMessage(),e); - } - - - - if(errObject!=null&&errObject.containsKey("statusCode")){ - return Result.failure(errObject.getString("statusCode"),errObject.getString("error")); - }else { - log.warn("完成文档渲染-开始打印PDF"); - PrintToPDFResult result = session.getCommand().getPage().printToPDF(null, null, - true, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, ReturnAsStream); - - io = session.getCommand().getIO(); - stream = result.getStream(); - - out = new FileOutputStream(path); - - boolean eof = false; - while (!eof) { - ReadResult streamResult = io.read(stream); - eof = streamResult.getEof(); - if (streamResult.getBase64Encoded()) { - if (streamResult.getData() != null && - !streamResult.getData().isEmpty()) { - byte[] content = getDecoder().decode(streamResult.getData()); - out.write(content); - } - } else { - return Result.failure("-9","编码错误:Inavlid content encoding: it must be base64"); - } - } - result = null; - return Result.sucess("0",null); - } - } catch (Throwable e) { - log.error(e.getMessage(),e); - return Result.failure("-10","未知错误:"+e.getMessage()); - } finally { - try { - out.flush(); - out.close(); - io.close(stream); - } catch (IOException e) { - log.error(e.getMessage(),e); - } - } - } - - - public static void deleteDirectoryContent(File file){ - File[] list = file.listFiles(); - for (File f:list){ - if (f.isDirectory()){ - deleteDirectoryContent(new File(f.getPath())); - }else{ - f.delete(); - } - } - file.delete(); - }; - -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java deleted file mode 100644 index 1e913f040..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/PDFSessionDetail.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.vo; - -import io.webfolder.cdp.Launcher; -import io.webfolder.cdp.session.Session; -import io.webfolder.cdp.session.SessionFactory; -import lombok.Data; - -import java.util.Date; - -/** - * @Description: - * @Author: houyong - * @Date: 2020/2/21 - */ -@Data -public class PDFSessionDetail { - - boolean isHold; - - boolean isActive; - - SessionFactory sessionFactory; - - Launcher launcher; - - String browserContext; - - Session session; - - Date lastHoldDate; - - int holdTimes=0; - -} diff --git a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java b/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java deleted file mode 100644 index ed4a3224e..000000000 --- a/chrome-html2pdf.SAVED/src/main/java/com/xz/datacenter/datacollector/pdf/vo/Result.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.xz.datacenter.datacollector.pdf.vo; - -import lombok.Data; - -/** - * @Description: - * @Author: houyong - * @Date: 2020/3/9 - */ -@Data -public class Result { - boolean success; - String message; - String code; - - public static Result sucess(String code,String msg){ - Result r=new Result(); - r.setSuccess(true); - r.setCode(code); - r.setMessage(msg); - return r; - } - - public static Result failure(String code,String msg){ - Result r=new Result(); - r.setSuccess(false); - r.setCode(code); - r.setMessage(msg); - return r; - } -} diff --git a/chrome-html2pdf.SAVED/src/main/resources/application-dev.properties b/chrome-html2pdf.SAVED/src/main/resources/application-dev.properties deleted file mode 100644 index 48cdfc1e2..000000000 --- a/chrome-html2pdf.SAVED/src/main/resources/application-dev.properties +++ /dev/null @@ -1,35 +0,0 @@ -server.port=8802 - -pdf.tempPath=d:/pdfTest -pdf.storagePath=d:/pdfTest - -pdf.pdfWrongServer= - -spring.redis.pdfKey=pdfTask -spring.redis.pdfRollbackKey=pdfRollbackTask -spring.redis.pdfCallbackKey=pdfCallbackKey - -pdf.pool.launchSize=1 -pdf.pool.contextSize=1 -pdf.pool.sessionSize=1 - -pdf.redis.consumer.interval=2000 -pdf.redis.consumer.rollback.interval=10000 -pdf.redis.consumer.rollback.timeout=60000 - -spring.task.execution.pool.core-size=6 -spring.task.execution.pool.max-size=10 - -#redis -spring.redis.host= -spring.redis.port=6379 -spring.redis.password= - - - - - - - - - diff --git a/chrome-html2pdf.SAVED/src/main/resources/application-pro.properties b/chrome-html2pdf.SAVED/src/main/resources/application-pro.properties deleted file mode 100644 index d3f5a12fa..000000000 --- a/chrome-html2pdf.SAVED/src/main/resources/application-pro.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/chrome-html2pdf.SAVED/src/main/resources/application-test.properties b/chrome-html2pdf.SAVED/src/main/resources/application-test.properties deleted file mode 100644 index d3f5a12fa..000000000 --- a/chrome-html2pdf.SAVED/src/main/resources/application-test.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/chrome-html2pdf.SAVED/src/main/resources/application.properties b/chrome-html2pdf.SAVED/src/main/resources/application.properties deleted file mode 100644 index ed9373e7a..000000000 --- a/chrome-html2pdf.SAVED/src/main/resources/application.properties +++ /dev/null @@ -1,18 +0,0 @@ -spring.profiles.active=dev - -spring.application.name=data-collector-pdf - -#eureka.client.fetch-registry=true -# -#server.tomcat.max-http-post-size=-1 -# -#ribbon.ReadTimeout=60000 -#ribbon.ConnectTimeout=60000 -#ribbon.MaxAutoRetries=0 -#ribbon.MaxAutoRetriesNextServer=1 -# -#spring.main.allow-bean-definition-overriding=true -# -#security.oauth2.client.grant-type=client_credentials -#security.oauth2.client.client-id=cloud_client -#security.oauth2.client.client-secret=znxzDatacenterClient888 \ No newline at end of file diff --git a/chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml b/chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml deleted file mode 100644 index 986911767..000000000 --- a/chrome-html2pdf.SAVED/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - ${log.pattern} - - - - - - - ${log.path}/downloader-info.log - - - - ${log.path}/downloader-info.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - INFO - - - - - - - - ${log.path}/downloader-warn.log - - - - ${log.path}/downloader-warn.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - WARN - - ACCEPT - - DENY - - - - - - - ${log.path}/downloader-error.log - - - - ${log.path}/downloader-error.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - ERROR - - ACCEPT - - DENY - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java b/chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java deleted file mode 100644 index 42186de34..000000000 --- a/chrome-html2pdf.SAVED/src/test/java/com/xz/datacenter/datacollector/downloader/EcgManagerApplicationTests.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.xz.datacenter.datacollector.downloader; - -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import java.util.UUID; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest -@Slf4j -class EcgManagerApplicationTests { - - @Autowired - private RedisTemplate redisTemplate; - - - @Test - void redisTest(){ - - for(int i=0;i<100000;i++){ - String value= UUID.randomUUID()+"|"+UUID.randomUUID()+"|"+UUID.randomUUID(); - redisTemplate.opsForList().leftPush("pdfTask",value); - - } - - - - -// try { -// while (true){ -// Thread.sleep(100); -// -// for(int i=0;i<100;i++){ -// new Thread(new Runnable() { -// @Override -// public void run() { -// long a=new Date().getTime(); -// Object o=redisTemplate.opsForValue().get("a"); -// redisTemplate.opsForValue().set("a",a+""); -// System.out.println(o); -// long b=new Date().getTime(); -// log.warn("完成:"+(b-a)); -// } -// }).start(); -// } -// -// -// } -// -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } - - } - - -} From c3ba1bfe8f6e8b54a5e85741bfc7ff0843c8c6ca Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 26 Jul 2023 00:17:35 +0200 Subject: [PATCH 029/171] intermediate revision - consolidated ODS Localized and English files and tests into one --- xls-validate/src/main/java/example/ODS.java | 12 +-- .../ODS/ContainsLocalizedRowTest.java | 96 ------------------ .../ODS/ContainsLocalizedTextTest.java | 70 ------------- .../example/matchers/ODS/ContainsRowTest.java | 33 +++--- .../matchers/ODS/ContainsTextTest.java | 37 +++---- .../example/matchers/XLS/ContainsRowTest.java | 2 +- xls-validate/src/test/resources/localized.ods | Bin 16506 -> 0 bytes xls-validate/src/test/resources/testdata.ods | Bin 13557 -> 16480 bytes 8 files changed, 39 insertions(+), 211 deletions(-) delete mode 100644 xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java delete mode 100644 xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java delete mode 100644 xls-validate/src/test/resources/localized.ods diff --git a/xls-validate/src/main/java/example/ODS.java b/xls-validate/src/main/java/example/ODS.java index 9df211dd6..685fe2aad 100644 --- a/xls-validate/src/main/java/example/ODS.java +++ b/xls-validate/src/main/java/example/ODS.java @@ -88,16 +88,12 @@ public Object safeOOCellValue(Cell cell) { result = data; break; case DATE: - Date date; - try { - date = new SimpleDateFormat("MM/dd/yy").parse(data); - } catch (ParseException e) { - date = new Date("01/01/1970"); - } - result = date; + // NOTE: too many date formats. Keep reading cell value as plain text + result = data; break; case TIME: - result = null; // TODO + // NOTE: too many time formats. Keep reading cell value as plain text + result = data; break; case BOOLEAN: result = Boolean.getBoolean(data); diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java deleted file mode 100644 index 962800456..000000000 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedRowTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package example.matchers.ODS; - -/** - * Copyright 2023 Serguei Kouzmine - */ - -// import java.util.Date; -// import java.text.DateFormat; -// import java.text.SimpleDateFormat; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Objects; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import example.ODS; -import static example.ODS.containsRow; - -public class ContainsLocalizedRowTest { - private ODS sheet; - - @Before - public void before() throws Exception { - sheet = new ODS(Objects.requireNonNull( - getClass().getClassLoader().getResource("localized.ods"))); - } - - @Test - public void rowContainsCells_partial() throws IOException { - for (String[] texts : Arrays.asList( - new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, - { "3", "spock", "22" }, { "4", "allure", "50" } })) { - assertThat(sheet, containsRow(texts)); - - } - } - - @Test - public void rowContainsCells_all() throws IOException { - /* - @SuppressWarnings("deprecation") - Date date = new Date("07/23/2023"); - String dateString = DateFormat.getDateInstance(DateFormat.DEFAULT) - .format(date); - */ - String dateString = "Sun Jul 23 00:00:00 EDT 2023"; - for (String[] texts : Arrays.asList(new String[][] { - { "1", "junit", "202", dateString }, - { "2", "testng", "52", dateString }, { "3", "spock", "22", dateString }, - { "4", "allure", "50", dateString }, { "5", "хабр", "123", dateString }, - { "6", "разработка", "192", dateString }, - { "7", "фриланс", "83", dateString }, - { "4", "allure", "50", dateString }, - { "8", "расчёт", "9", dateString } })) { - assertThat(sheet, containsRow(texts)); - - } - } - - @Ignore - @Test - public void rowContainsCells_withGaps() throws Exception { - assertThat(sheet, containsRow("PP028000")); - assertThat(sheet, containsRow("PP028000", "281814930")); - assertThat(sheet, containsRow("281814930")); - assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); - } - - @Test - public void rowContainsCells_noMatch() throws IOException { - assertThat(sheet, not(containsRow("foobar"))); - assertThat(sheet, not(containsRow("2", "testng", "51"))); - assertThat(sheet, not(containsRow("1", "testng", "52"))); - } - - @Test - public void errorDescription() throws IOException { - String text = "wrong data"; - String message = String.format("Expected: a ODS containing row \"[%s]\"", - text); - try { - assertThat(sheet, containsRow(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString(message)); - } - } -} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java deleted file mode 100644 index 9660c70da..000000000 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsLocalizedTextTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package example.matchers.ODS; - -/** - * Copyright 2023 Serguei Kouzmine - */ - -import static example.ODS.containsText; -import static example.ODS.doesNotContainText; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Objects; - -import org.junit.Before; -import org.junit.Test; - -import example.ODS; - -public class ContainsLocalizedTextTest { - private ODS sheet; - - @Before - public void before() throws Exception { - sheet = new ODS(Objects.requireNonNull( - getClass().getClassLoader().getResource("localized.ods"))); - } - - @Test - public void canAssertThatXlsContainsText() throws IOException { - for (String text : Arrays.asList(new String[] { "junit", "testng", "allure", - "хабр", "разработка", "фриланс", "расчёт" })) { - assertThat(sheet, containsText(text)); - } - } - - @Test - public void canAssertXlsDoesNotContainText() throws IOException { - for (String text : Arrays.asList(new String[] { "xunit", "яндекс" })) { - assertThat(sheet, doesNotContainText(text)); - } - } - - @Test - public void errorDescriptionForDoesNotContainTextMatcher() { - String text = "хабр"; - try { - assertThat(sheet, doesNotContainText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString( - String.format("Expected: a ODS not containing text \"%s\"", text))); - } - } - - @Test - public void errorDescriptionForContainsTextMatcher() { - String text = "яндекс"; - String message = String.format("Expected: a ODS containing text \"%s\"", - text); - try { - assertThat(sheet, containsText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString(message)); - } - } -} diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java index 80bc81463..223c7491c 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsRowTest.java @@ -32,10 +32,11 @@ public void before() throws Exception { @Test public void rowContainsCells_all() throws IOException { for (String[] texts : Arrays.asList(new String[][] { - { "1", "junit", "202", "Sun Jul 23 00:00:00 EDT 2023" }, - { "2", "testng", "52", "Sun Jul 23 00:00:00 EDT 2023" }, - { "3", "spock", "22", "Sun Jul 23 00:00:00 EDT 2023" }, - { "4", "allure", "50", "Sun Jul 23 00:00:00 EDT 2023" } })) { + { "1", "junit", "202", "07/23/23" }, + { "2", "testng", "52", "07/23/23" }, { "3", "spock", "22", "07/23/23" }, + { "4", "allure", "50", "07/23/23" }, { "5", "хабр", "123", "07/23/23" }, + { "6", "разработка", "192", "07/23/23" }, + { "7", "фриланс", "83", "07/23/23" } })) { assertThat(sheet, containsRow(texts)); } @@ -43,28 +44,22 @@ public void rowContainsCells_all() throws IOException { @Test public void rowContainsCells_partial() throws IOException { - for (String[] texts : Arrays.asList( - new String[][] { { "1", "junit", "202" }, { "2", "testng", "52" }, - { "3", "spock", "22" }, { "4", "allure", "50" } })) { + for (String[] texts : Arrays.asList(new String[][] { + { "1", "junit", "202" }, { "2", "testng", "52" }, + { "3", "spock", "22" }, { "4", "allure", "50" }, { "5", "хабр", "123" }, + { "6", "разработка", "192" }, { "7", "фриланс", "83" } })) { assertThat(sheet, containsRow(texts)); } } - @Ignore - @Test - public void rowContainsCells_withGaps() throws Exception { - assertThat(sheet, containsRow("PP028000")); - assertThat(sheet, containsRow("PP028000", "281814930")); - assertThat(sheet, containsRow("281814930")); - assertThat(sheet, containsRow("Итого по терминалу", "48,271.00")); - } - @Test public void rowContainsCells_noMatch() throws IOException { - assertThat(sheet, not(containsRow("foobar"))); - assertThat(sheet, not(containsRow("2", "testng", "51"))); - assertThat(sheet, not(containsRow("1", "testng", "52"))); + for (String[] texts : Arrays.asList(new String[][] { { "foobar" }, + { "2", "testng", "51" }, { "2", "testng", "testng", "52" }, + { "7", "фриланс", "83", "123", "456" } })) { + assertThat(sheet, not(containsRow(texts))); + } } @Test diff --git a/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java b/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java index 5d3385ca8..ee754e968 100644 --- a/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java +++ b/xls-validate/src/test/java/example/matchers/ODS/ContainsTextTest.java @@ -30,8 +30,8 @@ public void before() throws Exception { @Test public void canAssertThatXlsContainsText() throws IOException { - for (String text : Arrays - .asList(new String[] { "junit", "testng", "allure" })) { + for (String text : Arrays.asList(new String[] { "junit", "testng", "allure", + "хабр", "разработка", "фриланс", "расчёт" })) { assertThat(sheet, containsText(text)); } } @@ -43,26 +43,29 @@ public void canAssertXlsDoesNotContainText() throws IOException { @Test public void errorDescriptionForDoesNotContainTextMatcher() { - String text = "junit"; - try { - assertThat(sheet, doesNotContainText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString( - String.format("Expected: a ODS not containing text \"%s\"", text))); + for (String text : Arrays.asList(new String[] { "allure", "хабр" })) { + try { + assertThat(sheet, doesNotContainText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString( + String.format("Expected: a ODS not containing text \"%s\"", text))); + } } } @Test public void errorDescriptionForContainsTextMatcher() { - String text = "wrong text"; - String message = String.format("Expected: a ODS containing text \"%s\"", - text); - try { - assertThat(sheet, containsText(text)); - fail("expected AssertionError"); - } catch (AssertionError expected) { - assertThat(expected.getMessage(), containsString(message)); + for (String text : Arrays.asList(new String[] { "nunit", "кодер" })) { + + String message = String.format("Expected: a ODS containing text \"%s\"", + text); + try { + assertThat(sheet, containsText(text)); + fail("expected AssertionError"); + } catch (AssertionError expected) { + assertThat(expected.getMessage(), containsString(message)); + } } } } diff --git a/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java b/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java index 50c2be1a0..ca2eefaf6 100644 --- a/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java +++ b/xls-validate/src/test/java/example/matchers/XLS/ContainsRowTest.java @@ -18,7 +18,7 @@ public class ContainsRowTest { @Test public void rowContainsCells_all() throws IOException { XLS xls = new XLS(getClass().getClassLoader().getResource("acquiring.xls")); - assertThat(xls, + assertThat(xls , containsRow("PP028000", "дом 261Б, ул Семафорная, г Красноярск, 197372, РОССИЯ", "Оплата", "1,021.00", "10.21", "1,010.79", "27.05.2015 00:00:00", diff --git a/xls-validate/src/test/resources/localized.ods b/xls-validate/src/test/resources/localized.ods deleted file mode 100644 index a4cb3433729fcb9690f5f51c479f7ef28d5b3df1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16506 zcmdtJbzGdu@-K`83+_RJ210Om3GNQToxz>KVF(r+f(7^B?he5dT!PCaI1KJGz)Q~l z_U!JtyXU?4{&}0vH2n-+)!o%ibyYp}Rgs5(h6e+K3!ef2KHjxT~41_tKW=jkgL zduw|D(8~#6;^bs!ZDsGjt&;qmToTp;^xZE;^gS$=JdqEjpd)|NdJz`#nI9Q;Oc5>;__c8 zU;GW_ufhI1)!)t26=(u<`@a|s=;&zo$7smN$p4b`zeV!Yc>OnXG%+&+*a4n|^PFj|4*iWAkrW z5D;AGhFWa0zi@rfMqoKj!&&W&NqDFFxpXi4`+B7m2RNoa{lJ9uYh-P4w+5%#8=4^* ztA zfTC~RVkaD z6-BN2<1?gZOafgG1Qgdaad;Aw@tNTq2@>=Dpd(XQRL}cqaXh6%HhGljD)j9UZdzXV z66v)ci`UmbqrCu7;92b4_p9*8WHPrp6l83|D3#ZWcInNH%PLU4v%nMh5$85=S<2I-xsN8&1d;hLD^ zIZF@C!}YUAPvGY=8J!@mIz2vutW7VJ=++B_Ug$zxaGJ5?-7Lt`y>6#14SOZ70vZDj zgD~dW82aiJY2rxSr95s8TvY1mF2c|>@YuHnc}qO zU$@se`Kc`bMFE=+P_1qxvMU;7-5Y$b(^dUS?G52q?S3BAA-RodMnneD3pMD8cpwor z1>TVLFk*-WMV?y~UW`3TMy+|dC!TvU8Z48FIR9H+O(I*oy(z?zGu@V;1`7g>S7G>P zSwAkyYSnN^2~yvc&JLxhamXp+h|f=$>!ceHQi%D^!hg zI%JQx+O~>Wabk+*SJ>2kZ?fj2+Jd?t{8K|aa9C0$*3wUDOlP5~F=Z?&-E{N(O?jHI zOUa=78a3%iMQoa!=lE0<-RC*;m8pA^E%KY9fJ}_q?=DvF=P@Esks@Q()p(9bAP1WQ@RnaHe~#M{nn zbAH=@K7`Ou23T zbNcy+=J~S1qE}%}sKyZQpW)heOnze{+~;NLyH46#S_x^dIVf!?Bc%L%`@&{|D>tUg z=T%Vo30v-G7U&v2SyVLmi1(1`+d>f2?dFei+>|sX?klK?{Hq$qgkBHdS5uzQF=&%{ zgkF+VYxqX4QodUno$Q781Kqy$Fa30l0`K=AICRd&cqK6@Ku+V$(kXd_ zRo2nWejf;bFUBz8!woY%oJ;Z^9ihTK*>gt~Q*|H3-A+aC62&jg0DZzvZ#jl(1pD%> zUn`SRkzQf&o39syvUb?;Q_+_ zlfnn8tw(RIWX`-cF5Xh>N@HezvPpiN1`G~krw=|{ZYJv8w4wviU0WZH&)t2~xK$9B zD%F30su*JkDvOq<(AY*?(dUxeY~#A!RhqM6y#n_VSULNz-oy>FmGzGy{=lxQK;c0D6t->8TO|5~SqA&NMbYSEg@8_r04=CkOO}FZz^4TDvV>^L)OTD2h z$J}l4E_%1`ro!ZPDdW-%TW5!+S>sEMH!L^(MW=z9R~-#DR(Ej3`8W3(xFM(V`)tw9 zsf=*bA@ge00z-V!m(5d!%=rX_3zr@Fi*Bj*cRiZ~G$DNZYXG)3$dCyv3k#XMQ6NOa zjYo=7Aza6Bxxt2V@+G+=8;&yYye~BHRanxITgvGCR5%3@0=w8qqJ@IK-}yIj(TtzZ z^4a?%(|O(`Ia7KufoHQ&kythL9#)$6|pxrZ8mR(QeL^? z+hiWIFXDXwWeEiWZx}?Ciz}~bxS5&gu_+Z^nd$E^3oQlI(q?(q!viwhjqRMKW*>zT ziy8e&qwZJ=Rw)+c$|?D_TiLgPYQ2pt%=TRI_*?yh znbQ`V9Zn7~h3p^17|9lu>}@!+G`iTO7EbDNuw06SJE6N)?Ry2>NO%p+sQRDQ?unbS z4JO57rcpf3*^4yFizr925ij$H?8L?T8n4jfVEH{btK_y#Iv}w8N0U70b6&G$XZ!Q~ zKBv+~aU#x({ua)jw2h5E%JT%Wg{P09hb*q^Xpu{WCY$1pZq>fJ{iUnY@zr}euW|v; z?quf}VG#0R(y;)X>*%sznmDt13j1quu|&$M4Of}X9XXw^&V9vsnUaN`o9ND78s)_t zaHVQerE_zA;t6PRzUkzY1Rv)&IOFb80>g>NV#^mPC@)(`9Wm6*9m{ zhE$B2U!cc_i&&vAUyTiA3A$nP2CAQI#NAh!Y6x~CqlXZwD*Fy*rs6Ap!`cb+pqUQ$ zCg;eUXnQmvMC>${QuM0T_8GKCNI%^3aExXncQ-gzp5|EtHai9SaT|?F-FCE;x2#h218;MBc|Z@{0^T(h%`fRmtOl1;qHM?@%)dVs>hAN6l5yFN}= zRi95wM@f1;BH%Q2^k}I+hswTe$qHuTOIvD^^@Ol0@rll>W2z54V0>S$*OlSVz_$>w zv>m=pg6DynH;Cx@p85YWUZZAI(?XtX(@X9DX1xB(&jbKXewnV(3G$8^tau?;_xNG% zr~@fKP1qz>G)lkI$FZxnk$CN+Izwut2ZGPR$=it%b#wyRcQ3)N_WG+GSxHxLjY(2R zexy>JNNFULZgp4L7)F81U1h?Fg_Sf&^k_$8IR;LMgYDg=di=?kAWJT;@+792eKaPw zj5O4p8L=kLOk$=8HlN3Z7F014vy3EV_Hz&vZeZ=Ik+SfC%+M?hSpruV78aH z0lU8fm`uE9%fLl+kNt5fq=I+RpChf5%wjZSd^M7GMvvY*2zBf|d3{L8g7}9{-=Ex= z=Kt!(pgy@VW{wWP|M7JX^p+f!xL<7jz|J&>AT{|RYX7R-oQ)c8y zjP!%dcXa{Ou{W=X$+^dsx?FEZUrQUktfrtKBfA}u7bBG&G>Z%N=XuMI)0^l$ui(jP zE`!Aur4rV!;w?_FPM1tf&=R`%&b?>e#FYvl2sEJi=(5i$>@H9-TbT|TYk{}0-BnY0 zZ4AR5759o-m)%=d7HBduW>J@^qm^!li3qQy?)nbQ;p^N}vUMs%s9qk0($q2S?z)O4 zZyu?9LO_YaS2XMJeMHhaoTZ?mdW~u5RNEo!?f53Ig+8&r6K7q+XHUx1hymZ#i-Z0) z&^O8Hnuegl^|T2e+`bBff>e2s6!jgQ^;RA*F_?O!qAK>4E-Gi@u$@`Q2ya{p;e1E* zK3QIt3C8~L3syG;E`+GiywZ#>5`&80XfPd^Zv)Cw75ZS-*gJ0KfqCy~uz68hwGau6 z22yY(#WW((<%x&9!YoKs>-8$v*gP`6ew_6{lN{A~(}u8E&PKqAH;MRcy4??oLpao^K?_{vL`@NVY5Ec>5kR2UEL3Thij=s zokqNU&q3pP*-(N^*;*^Nc3x3t6=QQ^LEle`x=B?s*ls`?!CrF4K1etl;&4U>MxUxi znInBxP0b5?TD@)-8<8JWAD6l=b*m%FYbU(Q9%q^k%^C}bSVygr(!^p^9_)6_Xl zN>AsiU-TGMw7E4TX68!-QpyTSL)at>{XbQEm)l1H=q`do@WW|MzK_sEhAN>k;kn9I zTRpSmU3+1`OO3XIheto%G7#k_<;$g^E8r8fLN>X%PH=1oH@860Jf_q((?;2Rcquq{ zgy|3%Jtvt|xA2^m_f4Lh?4DELH&3dhlS>eJlp|sW@_w~;JeFz^9g|n!fwR0uw15bj z38a5HeDZ}rNgw7hBs?$kD)5ZZL}7t+{Y(i0<%=3fDkG>&Jp>D5vq_$z0W8Grza6tX zi){sghF_ha zp2w0Q74)Onyd!^pih;3Ip}ofuk>?DTcso_k$oFdQ=QN*fl&pRVy6_?MlhUYNn*UatCIxVC$O^31B`umFDbT5X6ZWH{>F@A+*Kk zRQXJIGFi5bA)qyWQEmuxuQh)aMSfF51`+e7KXEB!3j!H*k3SczDfyQ8tqM!uL|D$FxO#5 z7Lnpbi1{6h33AAW-jx2K?VZWOiVZQ99BvGG@yo{jMH2`cW>Z?IP+Rpf7yVYM{~(?L z)caz0?`-W}e63_PA2Ma;me6TnBWQ74!QnYh&+KEQfY=p^_8|TU^}RS+Tc0t~%5Kaa zg>P$sxhAXgDqCoG#819wp-uM>PEa|Z0 ze7!%k-!T$QNKS5X@lu=5>^LQlM|rXq^n-x`d~kJnS$cZyt=)E|&)3wbE%@z%ULJJf zC=v3QRdOy}24%gkd-q^{@yNw{i}~yF?x(fc4Mu{2DQErNjQjm{fs#s7FMd^<>mGDbqEAXn?fzYE>5aB68lv>0*GVrxyGSQ(K8J=Ig?&;yyu$Ni%9B@b{C~)vceN+T z_aTCRcAbkgH2Ib`Cw+Hp%8vXwH!t#SlbkEJ2H}FbYYNg|UNuwCX2c!}F673)$=^RZ zZ1Jf&`f@r$9e=h31$685X-Qo~D2x3NDwe1=5PZYi7`{o|BoPM0o=TtlO( zxtd7)tGnLIu{>ZNSo$58J?`T=*zZM*EWc(R%A->dins?Am#8&Tv9OEEG_|?%haZ1#eGQtw7#M%IFj|k<_|Cr4BdQk(pzC>+aJ?dQMZumX!pjNc z+!JkqeRjIIE*LTK(MyVP^zmE(R*APeD@lRa}nje$w#$op0fVg;`=OT*BW z+1ndkG>D=1nPa8DST@5kya+Os;$L-6>?V)Un06x>0Q#6>A)Fqe3<0kZE^$43X&%c! zU^;2#{wdxT0PqE}p;csyuElm3pK<=e#?4Gz1B%NVf3>;SpS55J2E zyI;icV`$Mva%tu_(Z zSih*`>AWTbSf!5WPj_=uHH70s#x{vJxg%8`BPF7)rE|v++k=BkLW{*BN6mbJUGr2K z#k-c-nCG*&r+Pc$cZD)mFI%~ht(@z9&YA2;t=t*?5;QLc4!4&2Ioj6lAH1a-@o%W^ z@}C0-V--|qwkj0w^m&&bGwbhP8EkxBLCvp*#aLa}HpYI&z5QVZQPI3nXo&?Qgq^Uw z&GyrwOon8k(HKi}ok%Hv;S|x`68S+?DIHmV%SpP>V+~E3BlNNwE%{N1Icr;EtTo2b zgOf9P_S-|&J=dj|t@Taj_lHJ_DT=r#?OR+FGH0g?)NTQC9kC)fi?7Q`ryN6 zlC?{oeU>I6o-^Bx)TQwmkA;_Ch4c=mdCzWmGo`8YotSwtG>3xJ+`$+&HP9W1^C0h? z05s}8giI) z(cJP2t$+TbZ3x82;VkIhppR%UJ3liz-Jy)tNWtVtkBZEr-Y(bcrsp%CL>L;x+qo)O zrD80yO(2b^>87?b3QYD)^s;F1v^KiTkgwFH+6dypN8Tm$JkW`W^f}uiVU}XZYZ6Hl zaRtwl{X-rWAWHi0o|r+$Vx5uT=riN|*=8*?apd2dCM!TgMLKaesb zz^tUMX|J)t5bs;|Eqy!<&ZXl>*xM0-BdK)vKv1P4q0wV;*6us^C|+{2ev$3D62FVL zkUi&IS63_;T;w(wb+y~*pWoW~YH2(pv+3#}{q+w$ORd}uWA%Ee1k%=STapj?iZqaS z^P0J@QD@R$D2*#GN>Bt9pX2bwcCmbyNjI!8d82!UcDrs$zsi+|u(3Lq%LAGHSZVHP zv9uz89i0Im1a5FPZ>|i-i>o=G`5x!Q?lxZ5SbY{^yXt@vLZ4r!cv|EqV4+CXdGhUc zd-T!xYh0bF<`SUGQTxf%+_>8;)+n2Ymm^(r(;`ks6sho699cT z&Yj_9oIJr}7Sm~6v^^lWY`i!T0l{&^J5nBGA=ETNX>$Yl)=Iixb=4(|9+oLFUl9&Q zS2_ARcSBxCP5X>jxVF~{&QAe6q_R9>uk%<`Pa$^iG!>vgy&}kP2l2_;D*%~tOK2ldi_Cx_SG=M}Wu#L{o;{@l#m$71JPFh0B{;1ff zKA1{&b$X5` z8s5=@)|@6CKBJxH&|tS?*QQb&Gb5pcnYr4Z!CV8Y$@kTfV$U4~XgW>7=qsS^YZQm^ z%)l;392y1b(T?0w)JipH_9J@`WxCMP?Ki}nxIOnMBNmXU$8kb`)rAy_9Cyq`O8>-h zE|o*gi8a>lmwWI{qi1EO?V#N*i+60(fHElt$N~A(Ufy8(Q4)gV&FvxPKt|#ITCV!- z`uMT$VV6duZ#iwh^0^T+XwB((3F+qi+3Spme&cp9oG;Pu{0t%i#pl+R6j zGnxVCOz{FfX0&LN3HpcOqRw`a`!}YJcE~`=rld=! zNw$-X?*+c+k@O?uWro+RVOqx|85Y|-Q>$$LD+jTP$7?nRgJMzbh`L#EV7l3WJx4(7 zhNqqAK@I6_*I-Pu&MxzIS4M?$C~3(z$s+T1=e*FdtrwmsT{G6P2!t%UZjMPe+UB@NGPtU)bKSD>fJGt= z8%0W3gsN**8NLMw(RQAtooUfedtM=RQ30){55_OGjsqw^yGmijV~1bNU3x@kHy=|n z?3Wd^Q;)KhvVv>WwPFvs@O}3?g0n5V@t_?EbNO0A=l(P&ws&)+Y>!^|U{E4<5jcfx zylU}UA%?fbJ@93&zBtB(L36Sz>eC9;U}-WwnExO?iN8jXOEe6R!7W!`(FL@`itt5I zJqgro8t5~yObLATK}ladq{xr%<_v+e{Ilo??ZVnut+tz0QzQ|lC2|3`B_U;s!LxzG z;Vplk$EFEbkE{`oyL@ugP3^ns)N)?b-W$%aYGi9~tWv?2#&8jREPQ6kt>{_aH^5vx z9aX%|JnGa<_W7Obd`+)&-7+Mi6ajaZb)Li57o0Ip>GUGAMmEwCnO@)#sZHJtgE}QB&F>0X5z9&lPKuwlJmdbe-F%XGKH|ejtIcex32( z>ieVXiv0`!&Z;Wq-Y>G_dadpkF1ACFE0bEY$_Dd}(b-l2<8#i+{CI0s{V|fLj@x>i z4qkSrubE`wUsRPFtJ--$d7d~W^%(F)x#Y>z7N&x^+qoVHNs3#Q-l*Sb_^l3J$If-| zfT)JH{ahy{niN(PEjLt4FLnsHE%MOdV#;`vEp!0p{`mOk{XahoCJL>I9z|!X93DWa z8|n)mR8soVcnbk;v@2on2&tB6uYjFbZkQ1iC!cf-KCGJECSDCFmpdqJlj}e*;a7i* zP4Z7UeRda!0e-t=8BcDb5Xc+F>EDhmh%3)N_OXNpC#4_6_Mp(V_9X{ipM1lwWG+4x zIuZ2u2hBdr9)Be^NnwnIt`dpVRLie4L2W3#j@&6eQ#!O@}j`u^r!ad>SLhp^*Ju|-a6Z!83V=n}{FA0Zw6owf%)SM#v5WVm1;EtlQ z=f8G$>9p}UiUdy+qohVrNftlncLVTOM4OTYP5>!w$p#Llx%VRnmGO$u z@1PJkk>fk9nK#dG|Ileowpl8-MuA3MyOqO6hcox)H>yMK?L-C=L)6@zd zg5_D)clkztF73EG<4et2{)}#o?oBN1NbRybi@fHdV$OK{l*DzCu5O1w>Sf^k5rkbT zTUDv|`853T)9g4Yzg{k@TK&c+{Yt_?_VHIYWEKSsad@2>=dXf#w5q;|bd|&tXnSe; z=?=t0`@QWWBCZ)VtveZ~)tuK7?l(1=(UJCdE=mV6xUXyU{b>i-{wi1+r$3Sri|*8pTpA3le#*k&Ik#8*g0L zu5wvoDQIX8`Y-#JSzaDttR9%Q3ep&=mXX|2DqL_+CspZmRc1noMX-sN3a^PVtl1kP zE(b#6N0e?Xn13LYW~s5p*6f>6LYq4dU*Dvz>?y3sLBnsmmvyjlkw%sV zk>BM*HP}2%B98=9IV+m3X?)gD?rbh_^p)N6*NJL}bmc(@21c%+x8tmWS!gQpEC$~E zz$I&u2}^nXB?k;sKEp;!UO?vo>UFBe9YldeXK1*Z3;gw=(5osZA6GEb@??VM^W{h7 zzzOsj4_CHmb6N}zSJcrB4w46r*;~N2haEj%p3;p|=x9{zPJ4b5`>Z(-F@c%RiQFbB78A&de7V2j#4SRKHafs;3{!?#sU8ue`WeOI@=h znN!-Iorz!fg&x~xvG`mNCZ0(j2YtbOQUg!*?K4om+pSS( z3X@IWc$!+9p2=v>#x6?plX^+{wo4AKb!l>euOXM0xsjxk>S#Ii6J7cFq${6UyLwa& zXv{{ZFvtyrq6}jbePLQIh9vpuMH(ZH4*-B3`b)*x?5wdZh0E{L>Wokl0t0gqWgYy zoZR;DiSp}Sj8uTWXh8GM%$q7v+&&g_kVbf3ROWeE>HeFt4@To9xm{<@TB&H4K}*y` zf|txsmj!R>;0Xm`Pke~`WGimj&$-r(Vf&QqiwBPnV2Z_DWdjo4YTxw@*8Jy@GACa) z)r3x9J9$8XHUn9>LHE0Y51hv_IpNFT4B?KtE=nx1Asdm=Wv@kQUk2yB}*81wAGU)h%WGUPA=O-&$FT9%+|FtJ= zFa3o`L`F8o?CiaTp!YMy4Y|>gBh#A`O7eWVs`cbFWDXkFA8F)0)Dk zX_+ePnpOxXDkh{LA?i?OQn8OGOvAq*k>?%A+8<|7+qBTSn-(qr6nC9K$Jy2iha$yq zkN|i4fltQr_a=f|lmsh*5jTy8!EH;2_mio%Qh$}&@EPOO(;nu`Cr6^|K9^t&4tw*e z=WG6QU0?!9U%fC>f4MXO6w^3DMr@QFVI)QpUnKnqPG5g5HF%a};Exf~G!kP)FlVHt z71hdFF7;+EB@KOTJHkD(A8<%QId0*fQJm{{{@B3>qSEv_>=Wop!_b$bYcAK=lJ!$k z>e@?;PbL8+IDJESIVH~E#~w{}NOHyY{`hJ8NU^HP3-Pcj-$_^~P=DqWY4)+5L`^Lc z8{xJH)SbQYg#x!xx^UOmQ=pkoooDmxwe@92&6(ETHN*Fw?@ShkxGtv(JCX%2k)RiC zG)3trkl!CYnNu&m#US~pDbvB-ZmXrTjmRBXTIlW`u!_C;q?k78C@y=hJP&ernI*C0 zy7e+Xo4pPXB!ym%!ciJ%c`nffS0%Cy^kZi+Tz;dBHewb_iyUxm%+5tiyfYuU+`100 zY2V7mvL~}B4A{x9CVJEV!*6J~R{zbq#FwJ^icOSQGwX=0U9p+uZz7cZ==aJOi%{Gj zSCh~*Q>kze>%SdSieF0ODdPBV1@ij|`0X709*q3I?{+MX{r)K;gmwKZF7zi`^f%w@ zw_wp9_5aJ=u5*!p{cHXI3ih|X_`8)i;FZhKk00^{pu>1`{psVVdCxZp*GBUXV zYH8`H;(9dTR3ReJkVL=FIk6AM4*#MuLXl?V4{yZ`>8UJ>Zz~%Te2*bybj7(MBqX%_ z(BPaoMU2oluxik98_tmY(b9POvb?R9o1m&Q@zLhdJ(3W0=`9m3Np7T|w#E7ziwg}MjxMURL3i#v zuR07C@LFmdHjULB_bh+gE1AJ%~Db7CPN7Ndrv40>^ zs1}kk#*^I&NDM|Cfg3uQCoAoGWsT-dvHgNQ1gbC*L>V@rMyTc)jPBm^{)cgJxMC`* z0*e(rm`Vgd3C{R{hGtV0wX^l3t)SZu{7DSnj`DUx@ucBT;24&w5hv!tq?Q(I)F=^qB8aC@Mo6FqmL5@~6N@4psT zhzw*NfS7&9aCiD>&D@vhBU|3?EsPNMKDh0}=(JkkqnP91iT7cCXW@r3QWWdas5rh>azF`iS6G`grS*&LjOcOPO2b94z28lrC(b~MUXUK7HN6Fg{4 z%l_;hpxygKLk)YmpX|$U?{CT9RsrCK6+ORR6J5kcWNj=oDxrc29rfuurSXp4ez`;R z_08M4&Lcanz(8|7FR$y5YZyQ@f;?*nR^FGLb-}QlDXQ+(5Tvj^ZvT@gMW^kr&-y-) z$#dIhM=+i+8q>(n_nkRS6naXD^a)e*zy5(aG7A>fi8VBB4H+%?vJ5eBp&pPhppsaS zDu)4n1GG>tp);y{F?I8JWl)_)5qDVGT*i*cLWg@B0mtGDQQaZpR9JJRj9R4$_pR!0 zIYv9}zI>PFSbJgmel$Y{wD#cvR$Sd=^@Gk2y0@q16;j|RmkVPm}W&*=Am=7$#s>z-N=658L3I>v!ZhV#97%N`SP$)$}! z`LW!oj%E*r9z|XUC+%>=Ez1%Y%qH-jL>QB*L9`s(PRy74@|^5_{_BN_~=cnBn4GJ>E&97rW13V0{}l?p092IHFgyTxYq8>0`YU z&;1d4a6RL1Y$srUh$0eTF@8Z_xJOOVX-D;DIL14{*fC*E@M10`fm4BBfql^jycb>W zir$^S2Moq;cjss!wZk+|F2W&_4^LM^-HHaEee6aCQe{PN86Alwu3c^7RaMhM&(xJP zafeBa=$#{L2aW?vS9aoO{NM~)hOr!uivwcUE!)@p>tip$jy>bDF1k#eVZFJ`KVGV7 z(NlF6C!~MPpnu8Rg4jAX9Kj50Ul5CL!U2;<*0bAT<}_rCcCAXCCwMgO*0wZJZf%qsRHs3)Kg2)XE+%Vis|aL(#VP{0eAQ zMcHM7-Y=07sO*ZG%_0KF-$e)((n05~A*#))2`}FV5-gCUjTe~|-F@brBd4D0(uig{ zicG4{o0feFk&Ubg8=3fYk=uQaZsdrT2dv&8tbJW{<3I3Hl@_o{MQ5q2j zChZC2_|F#*{?i4dD5)XJB&#IF@^2vEQ$lb>qM}1D1y;xvUr2u=`?;lh?!1o19?BHF ziXg8HD+MTTdPANi}CyViX=53dOev*;^AFh=f#kQgnUid7=w3LvOrC_z5)r;XO^V~5W0wwAccmL zcnb$44$p^cv?_}^9b=tW)1Z0CS)=$$y+~TrbR!bAhIg~Z9E^lbiZ1DpY5P!J*2zry zwn#EFhK!i1okut3!#tS)zs1|_{OKL|Fy=!T925ESc0P^Pag)!3mb9Or!507nzLEC8 zu;d#$Up~D>9*ibJLgloj-wp<>P4f`*yM;RKdcW8*{ER(4`L;byi@qs@X+T$I4V+6e z1iW+dA6z-Cy_d*UG`H4Oi@nFkwwJ`Tn>YHz`B`H%)~C*}j=W0#4&m26oOf$wNj_!Z zrab$#53q1}F#nAD{be-#QGUk&|0mTSJ)UxD{`>%=@$~ecz|%jYeE&N7pGkk=eE%p> zPtE^@&tFi#|IF!EI?^9y;Hmkaoc=%o|1+1rt_%7%T>gv-{%1aaoek&HKK$ow{y+); z#^uju+V4=`UpV1Eip}3}`3KbSf7`lWDB(X!_unx6UogY}yX$=T8)koCi2s?(U!~6Z zwEVx5*6*0&zsl>+fZ1PW?H|SNiO;`P%M-@Fl_6~@zu|ATD!PpUsB)&0tQ|D(8I{Ur{3DQwHAeTz+5d xpVjhT#RTE_t1s}Mlz&zvztr|0#g6|Ul(>pK!qW`^1B3naF`KbO;iHfJjI;5+jW?QqtW>4vf@1NH{zqb-fQkt`^5ls0u5!%d*oX{}&2^uKkxDMt|{7s{{^=zswS(F#dXB ztv7}^`k&6)M$F6yf1%zGvH;yFOXj??^V%g7>>v3wTWGv@@Z1p93f;jc@Z^m|*;-by z?5oFckGDn(tyxLu81+f=`~I}@ZP;lv44$>;*@UKnbFfm$#KH<@YdUD*$E8F+5t{M%dASH-%Pgj zm{0eg!_WPHB}8<|Y339+=LMQJDcerU;>N!Gky0cl(rIVi<9!1O{y0xK`i5bmTv5g^ zFf?nhdQndLcI^Dqp)j@@%0Xh@ZKWimeuE-~Cftli=AlB$Jx%Jx z6F*-S1{T{mog&*W_}>9U=cbh7zB%L>?1kyEf*S7$v*?t+CUsxNGts$QNvRM%(#p_` z?l7hvg0KGWMB@dIseZq8z5g~O;q#T)H7Calu^}x9TGumwJ@GbvV?=E^I)PW(Qo6W) zWA-qKwK?fB&&`Ppq26>uPqw#@3Ykj~E%y`(V~=>LC1Xv{T#ni%;sxmN8->1?((8<# zNAW2NZ0jvA3@lIx;d5A9*c3sv0ZWtcR%|Buy*cm<0c2-{5&N@lOhJ^Lnq{m`te(N&4b zNp?o;GP6Y%c03T6AAS1W>)|M=wZ~`K_XRtRdT*=Er+pL796CaGsp5ra)Rpp>4c$`` z#t5(;OfLhM7umh0&O}*8pPF%QmZT)x1n|1%VU99*(yr?kb(hMv}g)&o*0y~kKq1XUbW2GfAppz z;^oMih>a07;3`mCSMZJ@HL}}p;dHmF1==S!UR@VdxRN&NOV(L#{5e$_D$jJqYQLTb zP7G!mEN_T=YJe+{INf8mmKe_fm0=8GYF?RMlo z=IL#hP952x{gsZT+VjWfxzFW6ZOSd>K>-~oGw*X{Ai$4es=#4Zhx$PK)RPRdH0^%t zdUQ0AzDUfO(l<1SrmjfNIsBFP{JMVvqp1R~h~Na>R_S0zS&Kv(Y@O8k+fi?fc5->B znB0RSF{(gveRo+S@l|HBXq&6?rcm5bixjocQd$Vw9*$ao_|CFjZ>?;aK1x2v z2^%WP0G@oI+x#smqqyl;Z9=X?ZX3-ME+!zv%Oou@f4Xf-YS-+;5~D>P@j%8jHzlGn z`QoP>-mzS4iXxGcVA8US&9_SgFD+tu~FpK>R#spk~!Nacr& zY8p2?N2_^~??uUf4`qrSqp=On^?omH{bD+$dL+Ek=bfXiOVupX$Ay>ZBQIPtRo^3a zz8ba~1|pn?J+5ySg?_y=))r0YL=Q@0EJ-Y&U`dH)c}?ZAfBxgb=X=C=!YF2363@t= z@hrapx(3Diu%%A9=rZF^6chH4;>oa%fs#9)?>TKdc4 ztKsw^okTfHYd%9A?A4FHixl*fXzLKlEX&SGU|3hE_Su%3am)7!T7Y-i;cSXXKPA>J zfRsHs3M05Ao?Bwzv25QXwf%6p21N#<>7=z4ropE_dP@0xl9)-?J*z05u&Z?2#~VOa zgKMqC-D=)AwAQJ(({UeeuH=B#-=|GR1%3Tzn90PiztBC-|#8Cny!&gP=MXq$fOJ&>pS{ljkZIJ^dLfi>oXf5u^IHQHiT$ zMIhFF(JLaaWMC*z9m%z!ERjO$!Lt6fAwlkZYGDv}#3bo-t8Boo$pi0XLS0m5%n1aUW>yx zOzR_*m01=k*?zn~9&s&g;pCZ|KNF~XTBV(!Aes3N$AiS(Bft$5LbDv0t%CLh-bD=)e%~=7`EO-=Oy)PMf&whFm@x1ok1xw&L2g97Itc zQj$5o7j%jgdi3;QWTe&wu#^AJFf!MHed+D47wEKKR1$Y3ok1YPt0aTCGmH3i(HX*d zqjlTZQNx+h?JteZH3^W)i!YM_Z)AjBVC}J@BBA%B(<+Qpd-UbUyiNt~SfaTd#QT;q z)Y4FG}4t27F+{ItWP~@DC{#3JSKK?8Rzt1KDqp-9g<0$QM zgYY&yJ3hSE*RX8PxoEO_hUZ|OxqYpjUZB*q_?#~^$Mh#hm1pKu+xQlsD>D&@W$p;y z1uu=EViqARGO*#3naWu^BNgQi*4*DJ|5{%XC)!R4z z7MQDhFt8^-POO>cic;LIvYsY1yfd()JKJe@hkr@oz0G3txgMD8DOI1|rz2B8m1yRY z_~h~vq8#%U3oaUTUIr}Jod32u5bIrppKcVD0u>;mYwuIHQp>*N2p(|at z-?vURNZa03P{mE4)6Lc8b@y?j%XH$^odf*l*qaSmyV2YNDT3Odz%}C3WtyIDV_U4s zz1u83uR(pR2DFDU_ z;o;%$?;jKt6crVfkdTm(k&&ODUs_sPTU*=O+S<|4F)%PNK0ZD-H@C8~fGfx@I+%}q+}279rXuXNW}p5%G{G1AD8LlE$P7mxk=9rRiUwzBPKm-0J(MOt7DbuCmI>ue_#wVemqs zhsgY${k6 z(DP8XtNLEPGa(L^648>W-He|Jn>vY+%8`A$a3Vi2J9`H>UJn>?BY z&Wb$3qN@ZOXn-nMfD-o&(XOrkLFw%dne*H2$iX=luKqk$6^Y1e=$GQx^^DwnQi^ro zJZnuR60DH8C}(wV^2RlYE#Tvk4{rc1>){s$8(A3xSx@*l17q@TK-&$?>6-T}(4llr~<3h!UPy^2z4y6~E4T9}0c&LGIuz+`r` zsgQTI{M`J7jyR)(s%PDhiW!RFWrI*!ESHBKypia0^_^L3$z=v^f$y{W z>0R~XX>;J#9#unoot+9o>GKv2_Xhns?HP*kApGn|*9d0pAk5r8KH$ZJ9=MT57D7CxCxT3C``KeXB zk8MrD=BF-^2KWdQpJSH_Ksx*R0VW6s_2e&^6SpQTG5n^U&Kh-_Vk4Ozsg8gzQ_c$B zdu$c=oWf%4t)CiBDk&GI2PDgN({Ue<3S{`@OX5L~C3Ctiz{lNpy39<ZnfOS zsq}vc<0R<zNBYei5|O!sm5{+=DUXur1BB!5?ir=cOp%LD zzSx#ks-o&u(^Tw(DY7HOO_{4gMZ3q%LO6DAUwuzFooMa6IQ$cIPP_NkXS?`YmalJo z6zU%$8L#pmfP3OpG$+@~Rj-Uh=58~;UOzQnEttmx@~hAZ7gpYwk=zs72%W@IwW^nx z@gemA;=m9DGlFkRxdnmNq{bykI+d@I3~ zwV^%S9P0uR5J;ZtyUDs1Jo9$6M`ljk)XV;S^05@mRBWuhl<@w0e+9_v+Fh@hMd21) z&F*Og!1o$ymd}KDxEmydj~!Q2XGbO>zaRHX819XW93w?C6&Q_Nxr8%x`h#A3!3iCz zQJV<29+4|CRP=QSgIwS=XeJv_f_`k+(=yYdJ+h$gF}-*Ga5zWVL6(xHoY?Eq=dfhi zbEs3`9R$K*W&8aZkbmnKg79@d4!Sn(r0M~(^D|@8olAL4Rm}Gd8R;NjopQaA?FFK; z;rIw2x5{9R^5Li!u{5d%WKCN%obH~~Sy9hXO-!kYXo*9WDZ*Wp9wzZ1(3O++0q+cD zmTCwKjhwlR%DcmzJqtpS+^*Udv0(+*uIJMr;fB%CTV3weXzZ?|XmrwT!gjTpvn%;iN+S2uk7NNK7 z0&Pqe`=7oy}pcD>iZ^I!~8BPo3$3v_4THGwppld_^V+mg@V23 zy4+2^Dl^>D~Vw2jhN86L{5P_|5#6U_k@c&K{3 z`Ixg-NLwY|M{v4EvgC*KGgO6J=Wpr>`EKdQzR2w!d``#>=-AO>UiO?)U9gAJ+qZQ? zuD@J8W6c_+J0g_fZI(PLY#G~TU$oIJK4&&F8i^ovA>UW;;il9v#clC~`qjvJox^Gq zhW1L;xXvkiBJ+qgT9;HsWB`r*-f1L#Art%e6CkNzf|5^|pgDYds0v{(BQCM_MiXu7 z*+{obes0ka=4ju^;W-|*sw=9qO(E649zr?YjlOB3Wr0@LmGO*gwpDq$T0 zR^JaAEjdr!yny!qT!DzM1%#q<3i-Y3rTkYY*m5r@(!WRg*Y$Lb0}D2x6X&WG3Q6Y1 zkG36A`$N0A_@H#0-f#B&W8tMN(6DQ_E76RK>w>J#XkJxHmTcRC{0sHn#2y|E%9CTL zn?ekNy;Rk0UC@z@_Om?14;`leOaNgOH6px5af}2?VTMZXtQf=_bY0oF$Xe zP`^`LM98E4i<2&g=~Ki4bX$~M&AaXFco~O!2OAcdJ^Gmm^`1sQu!Yqha!7jU$5FmH ztspD^cK?fM>y2na2QWt#7fVZCWjvm^{dq~0;9D^F#H~AU?ekC{?j!l&S_U~LU*bQ5 z;m`Q*z+U-dKUotU`%Ox} z5o0l@Pq=0;*OpnF38CX?7t+ttv+}x05?icdK8HVpN*gRPK|KYsV@#Fyg8Pxphh!~5 z0DO*bmnI2e(x|H3q%2;!i(xw%Qg*3W9%{|RK|u8NX=;3CG{ zW&tOdhyJ+0bsotKgt?G1t0)Y$=9b_A6|dd+_TNGo(j{gu`>=98ZhJ+Wazia32MJx3 zr}DT;Lb0bQU84uNjLy}E_QYG?ui?o0cNJ}pJx*KPK5-4*>a>JVXPl$A%EsfjatKl% zA&9gy-4ibsrK*=JBL{waFztH3vS(fDC#GD`W!HmQ?4@HtU-R|k#Nq;o2m}MjL`aco zFAERU*5#y2pey-HqdJ9t^}H!+O%<c};ON*qJ~nTE3AwjHh;YiSXGXji zq3PoJyX}K1D|9tEtU1UWFkSPOBL4K1akph;3ZPWDpP0=^5cEVNmTll0k2Q58xwa-Q ze5Ip8ukN%Rx1eErQs@0igWlou$t3v1ep6!$Ju0zwNZ)(de(7VN?w?U9cD zhGmfT5zadGe%r-5ZuOm$)NVEH6s#wU2kT-c<2 z+{_#;Y?8C-`db6+#FdZ5R=lqSj4jcadwqbg zd}!i)NcOy=y3L>;bHp@C)+S6#uhQhDwZyZw!vu6Xf)&9l3I>~eY@uvz)wTfjI=_E{8^F5_XWxdqz0e;UhdUvK`vNe zgE(jD#XNyo3H2vE$K87a>wxcV!zel=YY=jkPmj0u=4w2(Oa!k3DG*+TWA8&;BHmOV z0Wu{{^h7ZcGiL{F{Nm4rn-~%Jol~H#vQoX{`>PSdX0KCs$Ns4KF}*2u<6kZ@*>=`u zCju4u@%EZV!!*&YmtRR+MfhBMGwC9}YpT~*eiMe~y(2CDN{CsMOP|bSVb@4;~q(Fc_NlKMB23x_xWR4_JOZ0DmW>9 zH?AG`S#xJ{;KgCz!wRl1M-qqP005o3nL6mDHc#P*LoHB&s;iXe8&D1m-uqrgUX<3C z7Q?NpTZ}*THdb+WUEEo(Qt1psPd{`lwjPp+yQVqmq^>dZV?EL;A6Tn*0~$6zHy1eQ zh+bx#3A1s5$MZR?fVjGgJM8MBUVSExG=D%pxNuuCxzJ~|X4_IU{ZM(rc=(ank2A{t zc9ntW{I6XjJF$GOoiO&Jvw!vefa$jgyMThnsc}=I8RQVGOQ#dT>+PbJJD%1r%400( z0!P6Nj&$9-<3c-8J?i8@5y2G-fdM+W(wk&^aQW}(*5H_>acLT83LBBU?MQ^V#&O!h z4Kca#;_N?+wfDz|jg2#@ga#|~tZa!6EzNFvxjmGhvR#U4j_F7&X-$RM9!FgWGIC|y zeo7KNOxJR{PwQ>$_5n&#@~X1Ju;3`-_S4h|?F++Pfamqs)lWthls$YSPmy#spPzpu zZ_7A&8q}^=*$09Z$5XuV*6}y!jz@L*yp4>!;Lx#e;~0PKww!Riro%;my|a00ah!M1 z#5*fKqg%&0;8LyLMof4Z)oV%Fbt&zfyZ*{q-UL>^2lgO&n8;60Ir4STJGTp=ocFtF z+q&>39jM$E+yLQQ7{;!aNwJEy*~F_YhIeaIP4n-YzUwbS%UW6cL68|BErWF&$df&6 z^JUk=G>&mjoa)^&&EUm`+3Km|f}kz2indM{>L7Gn;6Z(p)mAoC=L6 zRqDekGEvkZ66)E)3u;1pzPiY>?y!%=VVu|p04;X|R=l~Py>On*d-jJ#CBmq9BM6vB zuDDGOv;T(aEXKw+GJu7JK>xPf^I?tk*r5W1awC?XWX-dIa#`qp<%`=*#ysoiZwJ`Vy58<0OFg%#{UQwuoBFyOmy;cwiH*((?^}gZDsWfZljw9#s^L!` zM69eaRkRnD=ionVxqjvB;I4q90HwdmM``my%%k?jQw7Q!E|`6najzUsNsZJ!^H->9 z`VEw!yT+y-(3c}T;#v3_@!ZBfFTk_*0BF=!*=W|8&_dLt-d4oAZ5Qt%6>^18;nwdT zs1k(t-V}OQ=H!!!XWAZ)G8deEP!Aj>n1p!n##lWg;yV`mmQM(;u*<#9bizryx@96qI2(~jJ z?GuL>!Qc4Cm%d4EAF@35>lrBAmJLBvte;m?r4I{V<&Re=eWYl+l6akCD+FDLu2Hp2 zd@y52EZGek^hKdQ(#8}L`|%T9CLSvs1brvE3kP@d@*Xtb^U^ddh0~#PB<*#Jq4`kz>K1O}U7Shj+oFfpxHq_C zR?{mhBIQ`+TbuU$rRJCJqUJq&4@hOV_Eb#Db0sSGd#V~5!E{^1)`am-Mh-vcfLUpD zk#%xgLA4|D zqBBoQOLo{wLrq7Db79ABda3wlL98*&ZL_HP%d4x-{LqI`B3n z`}7793V$+_t8PpqQsuX@%9H;fO7Zaf+G~kJ^fqB=phI^SSI6pY)-@+JVUaz z7REp<-R}Szn)9Av@_X*KoxCy^aC3+{zsoqI;U2A}iWw9?vD7zKu4-LcXl>uRAwgsl zq0U~q9bBnE$FqvCrO2}T?i>jR^~aqy5yvgGNG3q0RPpPHy1|s=@a#*v(x+D{ zc%#-;`Fh}(f37w#fu{4TBxhHdf;BX@evppZG&|B% znkK$T;TE30!Xn>uoMa3ThBOSu0(KPBrh0nO%>rfeY||-e1j`$dUQu1vdo&CqHbBOg zT>q2XR#7OUj`v=t7%Yv@NQt$vOnd#6znU6sJ25_)2Abg7cmMHEndkm|F^qdO=ez+2 zcRNT+Tt#0Es`D-vI#VpLi(Y=8@MpCm6a3#m3fDr%6t39 zNO8!Db6K|$v*ToQtT4o5E>+TnE_jxPplG!r+9-kkdjIZ(^{6iv+xN9PE5_x<>r~!B zrCnPagRNa2X|_+QX=5%juTIo|LA~6kXlw;9z0HoNE+PVHQD;LK490rzW?6$P6M4J4 zNV1-v^)bYla!IE}b$bBy*}3?MS5|{(>lYE#-`2B<-_qF>zTeERqGIb>^zR?2F=AVh z{a*B|d<{3w(mry1OL{W755(|-;9C8321T}bK88xOkdJ`!{Oi{GAznEjiX1gk-i9n1RzU-*C2OSfsNw$3eVnG0W^?RqJCwYak$ zk*O`MCw)(cHW5O!^~{XuarUR#xwpWY?*~&1 z=t~a+{G-n5&1GV6lA}>J5nLg*RfP3YumePK(;xIBX~obkrp#ZLRT35dlXuXpeTWw$ z|4q$V!BYV%3JqtLGmUHJS7f6SqB_0gNBmOfp--fhjTM(jgnmUx2X>G=Bedq?Y0WA2 zi$Z~Mkm~|gX0L5S62E(X!S@Gfc1wZxGFT>J1b!?BA&+gbpKs`&rZy%MJQ35T(~4}x z!x-T?(++jNNXkSnkrAFzn3vDj@L9FO)~+7{&g=ur#K<(d!y6FAS~ z;+fX78tt!zaZc9hEh5mDLIT3x-_}Q&MF$DNZ85RlapOE*W%NbpTr7b=n|#eUc&sP) zIMDxraTk6yf|_U0v~GKDgD72cx{wS@+^{t{pO|?7jw=MgPp5j|#tv%whRJ*(qY@R! z)r}yVAoOy3H)`Y%<5TW6-uT^-^Cg?VV#?~rjRBE8CcA1Y)RBrTt5ydnb64!LV;rn^*P30~rahPmiR()y_P@bV^a(5AvQMOqK)n83qHe3rZF>cAU52A+sN{o*zxCW$Y+<^>VI zu5BNp_=5T6DMxqw=!s3%m3aESib?dj18-vG>s&{l3P)!&U5U(EharMFjvufwEA?-m zUSyPqf7f;7CsGULvf_I+@Amcp!>P8=Wlj@sU*xGcTR5^q7FVe^Uw}S&;@T-2Cxx7%h5OtqI*sfsm?o*JVbAj`JzRfA2aHB*rP-p}N$_T=?(2vU7(FSIGftEnS`Vv@pcUUb ziupYrpqm7Ed$JwRxZ`)%J>%Uzm&t$D;?zHvFhU>ASZvcJr%txRLHG19EcttiBcY(w zL}5mmV>DdWiBLz4A|!>fj7{BUTrTqZf_5`hfhpfvj()8&?r7T3^?t>N=5X@UE^;k5DG)=W8X|JBQxne}JbU%3qLPuj zQ9FinKPss#Z~RqD{psMcq^Y?tjNYl>XR~}POE#oF({R7s?;QDtdB3Ci4E~2HGE%#c zDUXGQmd5f=rpP}Sp0y`jVSmwk6QDeQbAqFJX%a?w*#BbsqIeYk(%<-K63ls7|9Xz* zmHSuQ{y*BN`Ck9k=EA4+k3N}yU}+K_^Z)%WCH}ve$-(@B1b5U@-G7lz6T11?=>N3* zM>-4MpQQM&k4^%i0QHkUn12&n(9jO!3KAC zXK*gb`RQHjy?ft#_w_$tudeRe)wQa-dhM?kKA@ah;i-Vp&`Cg`2Ov;xFcOBRiuMbP z1%5-4&@YIQLZOdY5W|MuKKM&WAH$A9@;3?JZ*)V^_>DhMME*8TAH#`C{8u0Kx3X#v zR56ra1Jw;^Y1qFdZ}C}xIuE?JxT->N?6nFxilcjSv{%wIyl35sQMXsgHwS-Q!};bgMg@H?B`Kn8wFbB0kMPl~AXVe-88Wo_IR zGL9~Yo_Z;SNmezpu%r*wMp{hZGoAV37fe14{DLun`mxs2&Xj`YWs+Jb3Ucth7M?(s1tkCiZsDW_Hfp?trb$u8yt! zv>@Sai=naQw-&b8-3Iw)M%f`}%a1u!$>q>$9UZ#0!#f+Tx0~sVabXTvXXensG&X zOOQ62Tc7JOCv%J~XY_KnzBjdtbj|Bjw3^p-)IQJihlMqm8Xj4QI7#Lb+kh=(MbI{P zB*sqKq)fhYx*_`1c=3k)K8Y^UuNvb-%=S?Thfi6D1}bVA3TK5771oIo&FG)7dj=>iE+A?DYfyx2}4h;csdlcBE!AHS}}fW#dfGI|@R7E1%TuSo?hn^ZJjD zhq!evCN=yMHYS+OY$@@U<&^Z-8W*^tH6$0K(RE|F8iV!cj*4aPtFIdx_1yH68uNnM zTtfw8Io-G$uxA};PG_6GMxeF?FDdN{J&Dlhd;qK(mJQW_@hc<@u-B zvbG(EXT$2r=G&rNFxAl%9abS`_h}=#19IGW$$HYP(YHwX8Skg&gF;*_@HoeZy#cQi z#+#>wCwMgvw!Y~uf1ePwH}~I~Ah9BUmr8V<7_{(;(9y+LN1)2pL&Zmkv}y_M z&LrLwGw)i1df9=94B$o3dPKMqSCSg-Wa(|R@d%grW4#f@Q;N&LHR+qikHus({nNpz zn}lGf6s*z8I8vqQT^5PLpPmQgH@G$&wRovGwQ<8yEdkR4jHsCPhIP@_ATML5m+Rk2 zrqH-|JHe$fwuQRoBhuOQ1JbRdBWunVlZ%w0#?TUTh=JvE7;wNa&@4A>aN@M{_K5(R zKyZgM^G9E##fJeLQp%C=PRbTj*ydteTT@K?!#)KpPKl=O@H1KbR{=wZBMsq5@`mN* znEdxK)A*X9tC)Z2RYEj%%^mPLlb|Nv?xv{KDetqsk$*L3TW#SgHAC5J7T8^%<;;6- z;&&vRMibqWvWbmXr_HEe#^Uai25Vwjd>kyi-IJulb6x zp3}N{{L@gzO^q$A@CP&zo_?#2P$4 z-lPjB)_J1%MRdi)LU;3;s_mLEJ}nXJXOr38 z%Lk*{+L2?9&IOxsTscAPC)`*&%;%Jkg@Ox2?zS{Ub)K!xazz+G=9g)4{Z$XBv)ysd z-tr3_V+xOsNxWs{`8Hlm4O0LsirD|WmdLaqAWcdGuCMz#*a`tLrj%a8`I*yvf_Vww zx#FJ4)_Gs}WN}9rflx-e`A;TTcMyAj^te(=B2E$f2Y&LN+t=@Pv;;`X`PQ({o8-DX zE^Z{BQ>o=2+*+Cm`-6V(Kw_3SxICFmTQhM3z zLBAM2WxRmE_owqXKM~v6dZnj*v3R(`x&cOXS<$pOdWcPbfe&v8#4}vc*xq<#Li9n!cq8M(9Ki-spK&YSx z_t^xr`J^EJ9?Vq~HDpmxP;hW?9zA+QO-;?fz`()5!NCzKy%PBP+1`Yq#OFq6MckU#N?w=nsb%mR8cb-3smH zQZS5eKk}X}GPtwPIKg%#!MLU-N4Y=sAhoKm!IiAR4qKz~m65Jy+RcLL{26dOkMD97 zAp9-22+QrkmG53{y64q0|5l~jI;G?rm{Ly-+(8~v-@1V?yE48IsA3-5l6z=yQSHxF zsX$DcToST#sKMDxTq_+hufSr`9Ljmj+ziYq<}0tSHqTS_&X7e!vp0%buyj{yUz@#YhFq?!W;aK}J@#{$AEUrsty*4ro(w_s zA0chp;li8QwX-5Zz$rN-5((eh#~XJV=sg+AXr=EPvOTX=Z6k;)3B{ZxY|vU(&me7bSX**ztknd}p^W2aeG=P;A?xN9E&|0z z`d8zHef3bScrm8c1R;Oj0g(&I$3`Uv%S9GfQ34ZMHi84i(01h`Us0v(ymC`<9|rk) zG<|!uh#>@o)c0~ASsK&NwOu2dWfgIM(lYWRcj=b z`8-XP=4?mYl5&!i^ZNXrQ)?reueWr4B;9KLnwH1c@X0G6Vbv})M!r1qe&>#(nE(KW;MnUd_zioI#!OI|lNoK+YFrPjDa~INjesmRXP-H%IgR4X4#j!wwz*Wc^P# zbH{wSyuM2cTx1#BFpzhCT8=&HqK8{+&UoCabxQm2eF{$e*RM{#l6|RcJoU+bhv~7* zfXdJ*p4k}tO&1`U%MeCom(>)|6JcRF`nB(R@<)G-U~jbko<&IZ z8KuHU>hE4^Wkoy6*6uO`AH3StmwmgOK#XKE7&(x#<@}~s9yM9&#;$73nr+yN&k{Pc zSfI}HE9>0zrY(YLrP-Nj2kooMq&X*Yszt62Xo);^|7&9HH$9l}gy8`0#Y zX5(@agoI+cRF0L5c1P0@5VP>(xmxw6dx$e#o~FW8KUt*saBtA;Qj}!G^9Z^E z{QCui%&%m{6@b%4PTyRDfu{hQatd-yfWwuhB#!CgjK!48!LnVwP8~+VPrNwuNK~Uj z|DEM@>t(^d#pcaqPxQF18h)TH!8o!MBB!;=V~(CCX&sNmx-8*zR5Gxj%tVN$HAcuCpSNYa$@v- z#2fOjR(+oK)y*Ct&x%quVN~jOK}bl9SinL$MxkU9dVi55E7<&*#*;zb#BuTbR69P3 z$O>Q04Fy5Es4HJ5!K>^3Egs}d)I~TF2bObKP`;OyKWGlvEK7Q1r#5y;X-OI)90xb^ zu4Xc0l?_9shEIzSPGl3+TuF*XZXwFqJ!^8iE^D3DK0**zNVilTCyyYb9wxis?w{{M zwM4dJ$k(7#o$NMd#$oHL9jh)?sBSxLb~y{XZ)<6*_vB*wcX@8D6CUDOryfssBB)wM7mTy|bx2s0%pb1#VqP@L0W>8FRdk&pS ztA_kyTTE?_%wZC#hca6oUivJqnq7OuGTcBmO*UXTqW*SXJSVkDfv=&s2X$U=ibQN( zj;^5n$hQj7?d6;9L8}KRrz%;tA0=-k7wskIUlcJA6z8v_Ml+A zy_sz!{q%=yJNWc+L->}y%n^*rGi0PbMj&WNP)w-Gvk4+))~jzAz^as~ZP6k0BiS&%VSbtA77_euiJ3808vOcIlmXq>%85EPxNeTS_evN{V4CP>%~l_4 z<*2eXqH&CKlK;<|m~trQn>j75%_|u{Hfyq_);Y@0LOf`2ve2aD ztIXao#tEktFMnXzkP%iQ!K3A7Uox7Gw$5GwogG+J=t#=#Wvs8bP4!?;IjQvh5e_h` zcty^*rBkIcc8l8)v=VR=N}NOJ90cdr7ZR(Sj<(eIEn7}r@&!VR#L%SnkxVnW%X2)e2MOYNpz)a7SVgfJoSimOA$y z8^BkN$t+n)?k)mfi$*nd1(jDdc7Kl8S>@05skn)<7f*(1GV%B}yW`Y6LfjPzCt$Y8 zRVEy>H@zrvE$zs;47+jktEeeXKB*M)L2RTMZd(7IDB_>YUC(5Hro63#o`-4Hmnw(s znmDDWG+W?!iQJ0A0~UWfs*ibTrEr3DquQd?qfC7*LZ!}s1NDlc$>s-7eJroDVK%v4 zsKalCS}B%vx(RE065GoLU3XiwuvR;}gMB_ynLPl;Su|9B|N2EWrN6(*N@xlsmBIXh zw8M8DW4K2RFhy)7m)iYz!?|p$ovpA(u~kW~z%bBQYE9l%T!;HSS#-t81$MPoTUch# zR(uJ5eGgJ`dS3byr+%ieKICd6TQGN!-gXU%J%oyS}|t zo`y}#qjN%h8A9H==<5#$5(K6!fLms$Bh>-?`ix_edD)a@accU|`D+i-H_Y7Cm2c3p z0qACapIgsKTo$u06(5|lBPV{9>(RO~37u0$5bFs+{Jp8no8Lm_tldy($8wha)w0v* zyj?bipu2n={xag)_Fd-PyQTX}nrFsHwx7E_Y1Xh$Ce|Uds}?@72xQc@fgsDl{2MK; z4JEBuF4qhl?P?oBOO5J?8>?XmCx`qLkkCk}X=xF?i#ck?vz4YJrJFRfSCz}}ccjTU z1&_HiJbF>q?zXKBEY`Wnw! z6SLj6?itKwe%z;$SubmAfUP`0IOeEXXFhAH$*?`Od#u@gx6)HqqcJ}BgK>Ytq~UhZE_+#|Oskoz(7xWb zZv7$nf}MEML6khD^tx|4@RS8`$Yifalie3&`g#h{mM<@cgwecUXx|IsUvVD^sd$WR#N%Hse}3>^ihg@7;b?Qu;V`EUQUo&T6~b znWR>U6%BWD6Q_JnL9&7wc2}yriZ{0W9i<*o)N^+rH*|Q0o=4<3 z^!ppc+7oddjbuXumwhI)OJ5F0+cqbGHR6H;wTzRCoU2jppW%(ph(KKv;(~?RGDQdB z+@#$@9!R6TB3v?u<;v9W<_reGRFI8M)Lj|vF0QUIa4{RjJ!;}-GxLV6c?n(i{(m$I z_`lxg|BO+mq!?z^rnT zt;MsJV(tfr)3rKPPqNPg(25a8iG4a}cM+bu6LUv#5)sR99Qble>vc+XJl$Sd8`<0G ze!`AdweYhI^v+H;udNKr)K9XDB zT2nd4A-^QAv-l#wi-cr7zk8euEr6q^yhN9)G}@DY9Q}dvMQu#t%bNs7r5DH*jVGGj zgXli3Iam+HzFjt|5-u5iewm`OoUvBe=rLpB9eEx5$=idP_gOGpx@vzy#t%pjJQHaB zCiRZK>*GGUM0MYeQ7(hO1QD`1%j8qGyzUlR8~0E<_QdwCAb#$QphGT@*&R5>dIZ z^LJEp;TU@~lc8OHKboyBD;o~rLApGls4^ZJ^#sqv)1R<#kZ1(H|M%=7-w`q1PM^eM zAtz;uij#hW2((yg&sT}l^fubE{q>xz^n|R6oPC12 zbo|sXpXEfqDq~r6|BxxqcW}(N=&&G%Z)zNsqGacDxD?lYzYPPn(L1G9U|0l%KZ{JvQ&^$h*57#C%_cS8vTrj=h+!q`;d>su!0n7n z`9l>KrVl9m1*)!<+gPlMHn%&Esn)l;(X;TxlWnFX7Oj>b-{s@0ii^q0&o3D~Nw$B&Z zD)qo?I-*Qbyg5g4g9E#Hw6qIm5yculnEULKOMYcvBo#dPgwDpk@RC`aCuo8*c;yw@ z2?0ei@u{F9+N+1r`4$4$awi#n5m*G{abdkidLD}Nl42v?i${$;8XFhT?24oH2QUh( zzEQ4E;{vM=9iXOgzX z2ANw-Tv7NuX*<6gtx%LLQ&4>%)i&vugQ5w65A1P!R(S%sO?t#CVmtc-V_;~7iqdav za1B40@z>y`TJpp?qk^znbe8N2LFY*d<=`}ByzSv^vixI16aa~yE^|igjN(rC5#u?I zinJ#jg)huS3V4|Q4uRr>YtGQe==>B!nJI+c9$@!OaZTtU4ZOwXqLP#1Eak&0h|d7> z&FGOw85c0NtBxY`40ARyw|H`#gWTdA?T>a2+xPRgBz$9xN6eD7rhj@s-zsaB^S5n@ ze@vgqexU8{9S#sITQn~LpCb?F>1GDyvE`m#EWUag-maUIt|I3RW6`b@j%$4H_>e!G zlt~G+rKZkkCyw4s*0u>Zc{Z$qvhzG-wvmOazomMZOG{%5S=6|)FYv9mdebtOfFDy? zhiE~^LE*R`rFO8ZdJ~SC--6a4P<}{UuCrq)2)kxcY6N&M*;TfQi#eIJ^h00R)JVfU zB!{V@U)J}FdDz&I$P4uGT(Vo39X<(>ECI>n38)Dhr13`Qsrf!?5m2KDS$`MLmv8et zg%ffI(pLkP=@6rw6ylEb^~SVzr1R-}u6)uD0c#f+1MABb)go*?r=%;F>sytiKKaou&W)R+bs3P}R~$7v zS5kO!b^O?==QTo8fu(a(ZW&=?p%OXU*J!`U1iN?0SBjV*P$n^M@oGbph_bO)_Q$ft<{oovrLFoVeZpss8V@{7IX3y6in+ cpNI|uk^bAtb?z8D5%L&?7lfGh&wfe%14^`JvH$=8 From adb97e85f1dfa646925ea19856cac81a8cb0ba42 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 15 Aug 2023 00:03:06 -0400 Subject: [PATCH 030/171] intermediate revision - made recursion not the default option,integrated the command attributes --- utils/opt_deep.cmd | 12 ++++++++++++ utils/resampler.cmd | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 utils/opt_deep.cmd diff --git a/utils/opt_deep.cmd b/utils/opt_deep.cmd new file mode 100644 index 000000000..28f0cccce --- /dev/null +++ b/utils/opt_deep.cmd @@ -0,0 +1,12 @@ +@echo OFF +set DEEP=%1 +set SOURCEPATH=. +set OPT= +if "%DEEP%" equ "1" set OPT=/R "%SOURCEPATH%" +echo OPT=%OPT% + +REM Walks the directory tree %SOURCEPATH%, executing the FOR statement in each directory of the tree +REM or just the current directory when the DEEP option is not set +for %OPT% %%_ in (*.flac) do ( + echo %%_ +) diff --git a/utils/resampler.cmd b/utils/resampler.cmd index d78c549ee..776ab02e9 100644 --- a/utils/resampler.cmd +++ b/utils/resampler.cmd @@ -18,6 +18,10 @@ set "SOURCPATH=%CD%" if not "%~1" == "" set "SOURCPATH=%~1" set TIMEOUT=10 set PATH=%PATH%;c:\tools\resampler + +set OPT= +if not "%2" equ "" set OPT=/R "%SOURCEPATH%" + set "MAX_PROCESSES=2" set "PROCESS_COUNTER=0" for /F "tokens=2 delims==" %%. in ('wmic.exe cpu get NumberOfCores /format:list') do set /A "MAX_PROCESSES=%%. * 2" @@ -28,10 +32,15 @@ REM no need for "tokens=*" REM set OPTIONS=-r 44100 -b 16 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" set OPTIONS=-r 44100 -b 16 --dither 3 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" -for /R "%SOURCPATH%" %%_ in (*.flac) do ( +REM Relies on + +REM Walks the directory tree %SOURCEPATH%, executing the FOR statement in each directory of the tree +REM or just the current directory when the option is not set + +for %OPT% %%_ in (*.flac) do ( set "INPUTFILE=%%_" set "OUTPUTFILE=%%~dp_%%~n_ - 01%%~x_" - rem NODE dealing with quotes + rem NODE dealing with quotes set "COMMAND=ReSampler.exe -i "!INPUTFILE!" -o "!OUTPUTFILE!" !OPTIONS!" echo Launch the resampler tool in a separate process: !COMMAND! start /B CMD /C "!COMMAND!" @@ -56,6 +65,7 @@ for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH') do ) ) set "PROCESS_COUNTER=0" +cls exit /B goto :EOF @@ -66,7 +76,7 @@ rem Wait untill at least one processes finish C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak set IMAGENAME=ReSampler.exe set /A RUNNING_PPOCESS_COUNT=0 -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe /i "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( set /A RUNNING_PPOCESS_COUNT=%%_ echo !RUNNING_PPOCESS_COUNT! !IMAGENAME! is running if !RUNNING_PPOCESS_COUNT! equ !MAX_PROCESSES! ( From eafd63de0f2264e25d0fb3fa16549e73ebe63715 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 25 Aug 2023 21:04:51 -0400 Subject: [PATCH 031/171] intermediate revision - updated slides and documentation --- ...ation.odp => Application Fluidization.odp} | Bin 64457 -> 59205 bytes .../Application Fluidization.pdf | Bin 0 -> 102660 bytes yaml_config_extend/Process Fluidization.pdf | Bin 207412 -> 0 bytes yaml_config_extend/README.md | 9 +++++++-- 4 files changed, 7 insertions(+), 2 deletions(-) rename yaml_config_extend/{Process Fluidization.odp => Application Fluidization.odp} (63%) create mode 100644 yaml_config_extend/Application Fluidization.pdf delete mode 100644 yaml_config_extend/Process Fluidization.pdf diff --git a/yaml_config_extend/Process Fluidization.odp b/yaml_config_extend/Application Fluidization.odp similarity index 63% rename from yaml_config_extend/Process Fluidization.odp rename to yaml_config_extend/Application Fluidization.odp index 3425add81616d6302368506bf6852b4dba350f89..09e56870e59daa05071052c3adcfb553ae821247 100644 GIT binary patch delta 16056 zcmc(`byObD@;CV49^BnExFk3PcXtWy?m9@2AVD62OMu`G!QI{6-66Q!Cii>qdw=`> zw|jQa+kIxby1J@orswpTs+vy?-a++_LA_Iwg@VQcf#5+PMmPe^xOd9Xe_OB!1X)}# z*1zbuH1>bmN$!8fkRbkH{1M{(hvNnD@!z6k;5i74f0%!!03$>GdyYvmuoxuHKLZAk zLJ;)eOh_C6OOj=}DB}GO5m(^A9uy7xu(!M)&Epwlv_tXcUs$r_2=XKRSl-@5`g(Dn z%TDP3bW7?m;e5DsJ|=SO4)vn-bqg0&0%~O;=C{`FizDHq2fUcQ>wYjw)NkXbcQ6zC z(Z9ux_?FaFf+k)ZiTgWOEyV~}5wSx`;Vh?ocLV!=%~R+BrXl zxbu6AkMRWitD_Oh7PyhOQqe0V$dQ%s3Ov7jrd`I&?roxS-}{nJxxV7+j3!X_6T(|Z z9l5m?fX(JqOZX7Rp*0YLL5-vPv^)wKI<*yyhXqTJHe5bu;GRv`twdIDGibN5NYANk z+GnP5ac?Acgq8ELs5&>VWzqy8is;LYh7hT8P6Eq_N&fmK!;P5iuNyX*1t02{?tM@w za}gwooqLjxr~!Isc_NZNA$sbJS?PAP<|(@r@SgTY3CSLFoQ_{)#~qtj!Rid}y~`H? zj5+Mx!I0((6~#l*7+oC(9jktL`ZOsgzfx|x227nuWLx2u@>qXv?~d=+0O}csB(c5e zP4L9t$;!J`;Ux)tH+##;d`JerFZ5XVV*ES>??my?sf>9MhHmKV2A$fR1gzTF>_TE7 zfi^}IlI-{Aof1#6aTi5glPE^ypWm%tY6D--quQal)rc&8CYO0esPlTEZqq6~g?w?F zKxq)SZRsGShxqT2^3u`OL4tE)CpkG8gyJ6~I->1LofSd#)MKBiCTp2zc^s7vrWc?5 z?};zd=gm%9BmD%4vpXd>B&mt~Q6RDWfEvkuL>q0SN!WYhYK_oLCI^aq(hck5!1JG# z1jJiSBJYr!q32Fw8x;b(WAtP$B;XZu;&hkYIyQWEB*U3N#ahF0#9TjR@9=p?7mBOE zzwfQXw4(8ejLV8(ND&U9&NcH~#C4QSpjecVdHR3cZY+^UOt6zYBlw5fQ(ODE0_?Y5 zoDS_dc(aPw^u6?Qmy~+sAMUr4Wb8k5N_Tic+b}61uvqn0wZ;_V2ugp9^l$O|#0}@E z|BeWEc_iS~nCbPvn`92qNU%K?m=Ej8jAw5t>5&ye-E7^^lzpTv>KbnT)s+u8+YL~x z#;o8Cm)I-`g-GmjEhI>t3U5a~tvG9WFSo>NkL9@`jxG%= z`eI~M(C2HFgkYnS$d;0&zmO#g|H5k}4vFAYfaGKRJ-mc)`m0g8{t9YQW+LKKb{v6X z`d8KbK9^7Pn~UNvnBF8yv(jm~vFHndb1h;Uy`H?&eHIw^+XT?8LrCbNd_bR~DF<&^ zW!71k#!}h~#p{r4ii>DY!pC~IgoGPWd*OS8(46qIu2^Ku6bPxFZN4udldwx26R`Px zL&W^u#|K4>EliAOFD%M zc8+*O)8cGUw)HHjoqNc-)&t!!DoPz)$bu>ZXHi963gcgYc72E?ID}O^KZnye;0@Eq}9XRMqnEo{Zf7=jG<2k;V&cO zoeKvcyCKdhP6dk;MTAJfuC8&F8IQS#L}5o+c;XmiSuin%*{~HWM-4FDhe+Lt8HG1h zQpn_aE=LE=XX=4(OU{`_m*A__?R?J*Cmsi0qK>1T(5BgA@Q}1NDYlNB0;B8viHr?i z@3lP3At`Y08_iTCgh@sa7Pi4vQr;VGS@SJ4hY^~-Z#Gq*FgPwZTn^*I+>vSiw*sW&AZcTZ~?*coC{XZD%5jgH1kO;FR+X+d=>pO(N5!-5@$`uaqLE}xkD&i zSxh5R$VaL*B`&FH<5m>u39yalw*b$wqrDmQL{6HzEE%O!6ibvUHJNycrG?H4AD3Pp`YD`K*-~bEl3;-^P4f}IDg{!7bb|^{* zfdj>}3$mLp7+#+D(?E-~Z~p40ORm579KPr_;m!2bJM<=bp)#8c5mWu7T%2Ms z@p7T{wmPA2hu`+BHvc(@0Q{F8?EWq`=qY^Zrwe@0;VY zBY1tDgyq17exqWpy6p$XAkJQs_MmeFv*vA~wWgz=U*|3E)uAKtVvVV5FMe{z1b`G! zL6Itf^JnY0w)1#p>VvCsv+9~$9{ zY<*$}D0)WU^$bsJIav1d@fesWigbyo2Xc_C!x#anzGYZl)HhXJI7vCiQdf6`yD>x= zXe5K{f)sDG;}pPld5tI}tOX~~&_%*QHja01DXfF)sCwy8HOUA+3Kd~{t+Ra|4%hOO zY<~DK6nIYl6DX$b>*^sh#Yj*@$e_g-5P7s;@m)A%<($5H+zn-$zUxhn)UaV*>Mfk| zoto2QppqNibv8{WC>zPMhA(PNm*D;Q4H)uRbsZCAMWFRUy#$|!oR0l8+DW03@4qPs zwaM+ej4G%NKe%G2?oTV7CWvfSX^Ym29RUCRZa|r-2?^E%P%pZz7}4-W;E%t zJ2niTyJDjPcB_B3%tr6|&rKRMXE8$8;95x_iDr0ekA8O zJ2D-pi8_R1OM9)34&GOq+eoJU$d(|zj~l(`z~uPs4IbT;V^mK q`OcySTq4*?=I zg=n3M6Khl=jJm}X5<{4CN%)OkY>%8iGs{5Oek80FW0kf|5{cdK$inWFsmR)zA3CcS zV;TIOBob3Fn}yxV>yZVyFt<7UnGWAfUggrvad+{Fw*N*T@dkRi%sTel?FlDaR$=ec z&@@Pf-E*Dcd>q6}Rgk=qwuWsPPXHkM75vf{mvHq+bl27qC--u>)Re;-+~lb%JuK* zJpC+aVbWf4)LQ}_vZRWx>TL!N4QB+}2vZWpEEnh3)|c1A7omqSZiLpE1Y0 z?~67)vUOFw0(X7-cNOx>QS&@U!%R<%7wlCpX9QP5N|@ylW_g4W!@{m|Z0f{J7wbu0 z*B8Z~&MD=sM=ZG5VtkX-xi7<9wN|HBNW(M&myeU}uhV-+;cocw@+>!xamrc01e!I7 z8QT44B*K_!F4|3qkA6Q+em4V`qcFi<{)QSZZvk(hU;}6mvIr}9wSj3zl)3R_(wMjc zf?eXYn=4&htZX1{ofMd30_uj}U#;DPlPA&Gt~`7C+`_+W?5(5C;#76jesK>^K|$yE zCRvI$Q-8k~HyOU8W)TQ!&zyiiKmlW+LW_{ttF%?~16 zd|6!1z7c4B6wyg_ycE+}(ry~;b0bo`b!0ND2cQh!VB20%d~uzj=h_3$xW08f@|@o| zY#gt5%(n+t08r~8SpoXmA_$9$XFE@pAg4k#Q10=Zf<8L)~+SXsv0lo3R|l1^LfYn(q+wx6S?hz zOJm73xmq|}XnKR~jZLWoi8tM1ZD{>bDjwpqcKomi>aOMc!US2oon}cG>0t zl9J9i($g5IoRT>`ru}3*RkyKgP6(if6SFzdc zi*5hLxy5La_w46t15cFvTUbUq5xy5r%2M;yy#}o!P0MCI=k3z8~DGm@Q?dmE_ zKgkuHT}S$GUQL*@snx1lrat}tXu;n^Sda4AY{z$setgAq4aV|Nh$ z3J*8ZN@=De^x>jc6Wt)fz`ADeD=Ysk?Dnp)C$9kit-^K@TZ=~ITdU=HOUWZ6b8Q9^ z-}MmEd+*iV@ynr;$jE4BKoEE~_$4JGg=3a*Kb6qK<5o^uoU=K2*lpm7Z|*SLiqRSA z5u{i|sflWM5#-3&y7`c$N$qn{e1@;SPk`>rG$Q(?cC+!mRMy7F6R4hdFz8$~%^I1b zt+^Sr#SK>a59!Cg?1g>=UVJp=elV?j?5&$*se9^mZ(sNg;4UYHDg7aEmtTyV4Q=lt zPlqK64Q-KlBpF;_z!50n#*anH8Zt3d{O6((1DG}IC%=N;Piwc~8x^(~+)w30qX<=2 zP}Q=%Bfqq!<3}P{k%+V$GtQKjrzppKxK{g&qWYVof*&Fng{-3`Nfi&n)U|1XV~C zmM#Fe6(ci&7Jr$2|6RhEpwwTV9qT+l}6yy|IDrDr|TiVIcKRJ?ouG1Q zL^EJ@NrJ_2`Jj8na-R%a`p&?FN~kY1@93(FjPR%@IWo93qCV}sI$gh#j&So!aIuZh z;k>pBSxhnZ^N)eWd8?T3-sMMo4Jy{E86%|(MVK@SF+q?N^(2o)c)Jnsv%dm=*sD&lA9) z>H|Unp_EZcat8ScG4{DJ+~Tsl_j?xaCqPLS4n9@Uo!=K71S*{df&K~Gz{A7;D{KS$ z9|h?TZQ@|>YG&`s>}h9vDxm94*l2TNqs9w!d zgu|&q3N;FFf7S-`sz0G#R-!(=UCQ1b?@^$UO=85e+Gk(4a3M)So|P`|V&ulktB zg?C}isK?10#=CM>MRLTNEiZ3_{e&GLccd0xytM1lfx1#&;CnYZGzqjewgFt`3nIgv zrdOXq1FHnGCAD)BG-l=Dnq#`8g?7JjD{UYR6e{H!#mfyLH`^&=9^V?-nXUDZ z2y)*!6GE3odAk`6PhAschH@LjQJ2h-=@VNU&ruoOzy{hRI6BIf064b38zNNfoZ(*+ zVrFjWW4wxmhf$Wl=HYntt#oP?x(vz_kFKS_*q6HAT3iAnPZ-R3!n2;~$Wr zU+De`S;Eg6W@vpPi>>JA(oh5MV5WD2blQ?(MloS_f!L!#hu2tY0TxAGsup}NCP*FoCNj!lD zDiP@#^eCc6x>iV(vyZ~7aEgd@=RAyzEpE4IZ6B9r-3IiBfcM7B&n(WPX1VfuE$@8C zq(M=WJ`FXpMvgN*4v97!^h6y&OB_Q39z&`t+|`3vQ@BvgIXz&~yADm(#9SgsD>G-F z;H8AxMkuIwky|SY^FDpR{Qxa#KX<=ujdW_$z9W{@G&O&~3GJss>#qOb(8kpWis5@ z;qyOi8Tly48OR>G&19N?D6>ua@!)mrA#hHEBD7|FolLXNiMz-;37uCKjDbu1#Y1#%9ij0^r(U$09D@zhSKsU~= z`i>9w#askDCgbRP!A@H$YJ^%mS;$W!&6}W1XvYe^dlP4mAA_HOrb_gF#rRg8HUnFI zzb-p+j(Z6Es|cj^=j@v52VeIcj!xm(-r4hAB9DfP4AxU*8>ZSi@hF$V;yY^ z>oRcKvfZ`=Ao0hEL07zY z(|c;Q|-+UyLZ#tEv^@TSV%`RJe+He{%tkT)4qx$D=bFM<^zO*9$xz0X<- zxiach2Ucbt+Vj{RKaDy{_N)#WrhAu{JEJBYc_X_Ho{M`$I=gi7!CVFGCf0K7~~?)#1r$Rg@>(6D}W2+g*|{l%D09ruE%tqX_WT4l!^}J|%XQo4J4)Lg8)xj^0Tk2wpKw$Rd z5i9(ROeFa9Ncx5eI8gYxxF~Tt3@wf3(QMp_)AN10Xzzg}M@TRVE@QV%c zup(Ztd+*>%=JdLd4e`dXD1(GYDtq3l;2}63CC>7^8bEf-Z&oNRQ}0`v+ys|Yx$}Q? zUGlfohK78uUzEt4qx2UZ66|uYiumeUkZOt^ig9lb9c>`A6bInRv6fE_3ZbH73NlLN>B>#>WU4vE4TMUOA5w=zCphi6TbWT0YY8Ntt6Gk%Qsj3eQv`?eQ@ zntc24Ti&(9=k~hmJJebY?xZE*d&^`&8K<(f8yz+*oZ!0W>yxc5=#6XSqm{sLLoi9h zMgaz56OGcVhGa*T+v>jRx>I$IoP={A!`mzNDUb#8b(~ zknT0RYh*$zdXBt(N+7}Pm?~eN3&YrtJc(_{DjsANX9D9i62FR^%))x8)^j6SP?Iml zy?UoQ&SIrtS8AK9bv&fkBRxKP_6~NMMa}8pFIvKJpb6rlH-B&);>I*2hRAp->CyB7 zgiojWZzOd>A9W;WudhcgSNfr6oD;)QNnDSIz#8<5OXdlo#CG%yA=_Zg1W-ulhv4{P z+UcQ=m@y}VNiss@si>vlakf%;RgaMNRf=FRdOE+2ngL(&^K{AcYS(uE5o6MG@`o67 zQpV3P35w6bKwZZ49g0W9BNV5!-;e?@eWab_Z9B`jxU?Q$Hu$iLUuT|-Xmn8+Uo?E> zUcb-i(J$^?ZVL$p@qH!2f&*rCkG-I19w^=3v!iU={U+QA^1g^soZVw7&2A|YNUiXs zbUCY!7->DDD`T1P3rH7}*#*6B~RCyv&=B zEqY&j3D6nxw~RUqwZ5r_d}L6sq`|V6C4r5SD@Y#9hT}G{MpxNFefJ4NTgqe{#!L4= z)Y*Sk`L7g>ZRcekwkx_>)4+ZT~+G};9kZs#xk8+nYN>wzvHbK0)rXT4aFgA|**;)UGk;e>65XL&fIPM{CR9{L`-u8GM0MR)V+_oT zOv+-DXwXOeI~8TNqnaX9>7Et`J6TQW7{*Rv^`O|sw&TX3OB`lM56U7c1OqTMNFhfE zYr}b!M}k@m(37=zU&Z7JXkpR4!&BN?yy0N{Zjr5063*-SeRY9QSGY%T+iM5|zER-S zN-IRmxpXkW*)*AB&&dDLPh&S)`o5oqUYD*da0Rnhgp3)UIizKrPME;2MuS;(6}yXy zmNqcP&L$7i5sw)knUVyW0-=<=IGW;k%z0b_(J6AFswj?vYXa92FrUmHbZz?B3bIj@ zOHUrggh@dB83siq2a-xr^gI<=fMESW15ZF{K;|oXkn(ju;JJrp-Av4uvPzSGOv89W zU=K&yKAY4fa?d65^=kM%Z1g_PAP;7V3zGWmU6O7B-K(SOIdtNtz_}CbroA36ti{2V zVomtcYW0HGLwNcu@F8#Tdi&SIHRVIR$!uL;<=e>=Dr>air}6GU=P*iUJ*Tcw`sO62 zj}JZM+{P=r1D<<40To|SPM#8Ig)w|ER)m0bqsV=6w4<^MrLX}f!b6FJRVz&t3UI_1X537g zSUqQ)nGtqFY=3t2L@sg?EmcAsy(Q;&sWPKl-4U{|M*Z5^G`(TMP;sj%&2!2hFLk*q zBG+W@fqJR701gr*%o|TGYdIy%!hAC$eR#6kU}*cq8KYWt7k0H$IqUUa<{8UitD-6K(Dr#`$7oMz^=kx{cbr^_dCCU{I5M%XgXdi zu1xR5dIMjpKEzhmH*R%oJYd85cSQG}Ow0MmUWI*kCAO2EpDq=IZ?f*zOI@F5uwnM` z^=5n1IYp-A@Z&N`J5UON(Bu}=^NkE5ec$7mp!=YoXAFTnqvNf+w~h3Z$%H zxvwP_&8KPfsX;%=uXA9hX`xyv{-)DMD1T=q37kf2y!U9IK0|e88z$5JLF@rbaQ1DJ z;#~|8iQU#()+nA3_>_??2<nL+K2DJXcHJ@1Bd`{~B-u@vEe zPW-TsX)vR(^o%c*qbN2djTuC(1fneRk&jFHLWTCZKMWSJvgx@G0dBfM%9S{(Cs-k_ z3kd#J9#h>`HIM%d4rRjgTJVvtjsMgSFGk@hH(QXzdg=a1ecE$n(kH}K^cZ2dJEW$`?)PWX*Q{pIqqTZ-_`-yCwq*~Fib!6r6AI<^3Uk{8qX;SJws0;8 z>%-RyLllRmu-T$Mf8Sl@mFu*>z#W2BMhO zc@Fh&u0pIGWXTV9qjd$(;m8l}l5}X3P_1I=i*>0)R?~I(F>mnPB(__v`jxv-X*aju ziSgWsw@@Xh&B`~Uk=-xZpg#xE3P!xjV*4rI&ZKglJu<7jGFUGLo4jv+&~d*cnyyNG zIkH*Im1(lq9oCo~QyRvt(OgeH1lqsp+@d&QA{k}I6a2+D)V%hi$E7+mgvi|UL3ew}7w=cs-@0?I>jg@$ zEW&-pHg4Nj4E&!SPlsm@|=f4-JF9dGR~vt%j0db_N$ zx^RIG2)PetsMm8XAUr!)(HzPjFv6{Z4+85kcNt-ft}W24GU-TTg@SQLib-&_EX)nX zvE00)a_YY2Tw--X09%XW@+?P6{)l?d&KfFu+eqIt2j)hJmlE|-X5b%G{p^B+vYdh= z-{Ahn&^o$(f7kxOJ9)SNCx-SH`o#1H@`U?Rfq#Pn0^Oj1pXfvY(7uwKn)shs8WIu` z78Vu}5fKFi1tTLP2L}f~Kfg3PyTXSLYHV!kf`YmqK8T8n%F4=W3JYtAh^VQl>FMd2 ziilWCO4>?GTdS%%XlVg@dL||&*4EZOrlx?UrHhM;zrTN=fkCK=NwBSLgoQ=CgF~i| zPjGN>WMpLOmoH!d3{Fo^FA5DU27@b-lYhmo0rKRQO=9ZL{)YR0pwzhVcmW~z| zPn4C-w6-qP)~>g-ba!_T4-c>O_O1^MOixd*tgIaN_5B_mzFJv%U0&Ya-abA)e%jf2 zJ2<$yx_Z01dVPKU^Mr42Zz`_Cu&Z2+2(ssZ{!P>&qtt4jNkTi7zS;z`96$J7Bq%s!` z7u)u>t81%!P`B`PQkQwU11~Kjid%DF&6TjM^R-IqHzkLv@PII>Lg2~Ie~VA>oFj{i(j9e72B$;CO6hz|4iwHeJ_`Jl(~@z zx_CnSu{z?4Z{c-CiAkos%WO#2K_Q(uPW15DwolVQ-Ju2jn6~Ny#5LOW@k_^BK&!=F zX~;Wn-QKJQTCIF{R^wlC;#2-|>4z|Jpt3&A=FvCff({*ttFb8>z}L5*v2BSD&GNfZ zzaqKw@!9B{34%MP!&oZp^aXvRapdgEhOVPnaPG4G(ev2>k(C{NgSy0c@z{tt!b30S zcXYv<4MfijS6rDjaJp{c<<2{AMa1I9W$l#B%k#jm5YYzmO4OeBDEXjZij?e_I-2WQ ztBOuD+;eH0YGKCGNuCx-Ydh-OIOu%QD`FZyhYPtAEL;X%Sj{AKa8KcH?VVR-DhNj# z&?@q5^1AFEl34(!PlOH%^2#J0r*-Nd6YD=!S&2&-4Y3Uef|F0cbc+Vx!mEm&t&DLP zDbiXSO(W-Us#Cb5lUA9(-ZkD2MzxEsc%L(PlwVOrsHz9q*)uet^Qd!gcLzgCd2v|1 zt=L@p{T@YPZ^?U7s&FI#a5ob5!@hp?E3&U&c;*#IokTAza7Flb`%OvHilLnqb@d(0 zK>7R0rcFO(fPlkp#|yxna3%N7=d21*&>@Dy{*G(Ho!y8xTSq=8nPI(z4ArrA3Ulq? z^OSz&WtTd|j3vRBq)$Hl2f*QCMEAk%yG>F)^p(cEtY96AErQvRB+P&siR_J@htZ~@ zc{Pp8GM0-Fni@2xYFTYH!zL}-`3)-05iU-O3kAuXuL!TA5Im_w00!R zCrBc*?EV@hk8hYiPN1b)-Bu_0dD9-Sxpwpomm%M~8Iok=d{-bH*_x0;XW&~zON-VG z9<-^_{FpLJmw8me2X-XYnisE+UV?)`qfS18bKr#t()JT93ajTmfX#hrl)r&LtUVZT zzb_Ub1^SkD%0_+&)W>CNSufT|>+|SCKFIrWek$d}m6+DA{oOTy0#U3BxiCUFn|Jz9 z*fg{bo9Oe9k~(K#`JmuE!d07Ud(`9xIpF@To`O=lVc>db3EX2c$!{7t#8IS+#QqV;;iM(qsx1fXHR-CIzGXw+yAuKFErh1+1rAY3%O zW{p}3%I2&mK73W%`aNQ-fU;01w5M0Oe2f++IXyVn(~##CO2TRoQA<-7byBFR5C`pHF{6eB}`|`s@639aEfRLtH9*`5k#A z(Rph?3cZE<$Gt@N?76*TW8kA!2FO3CbUC<=w|_;UU^@`B{eeAe6jQasZ10K@PQfpzt*Nm{WW>}atdG?5 zdT++y;i@WI-lbM-O;@gfYQ2(hwiMl}3(`(3IxU?+sB{meo-`a?HMVg5cs%xaleGAI zUOSUnzH3U}$si~rEpUguZzR5nkd|j0Vv05&l;%~RBf|n?NnM-J-gJyy(#LSKUk!Gb@dp zYSFP$AuR)n0HW!*CBnwIq(;v=q;v~e9)s>-x4WL(%=XG_oak9rNKb?)etpuAB=jG& z9ef@Ts<@f+NvgtA#9my|ZyPj(asWigu{~eE+j4Lz>DBh@qM{L%;L)Q)^!shvceP30 zL{aj)^1F4dL%78eAyHI(_^UDxE4{&xJ*|=_Pv03sAr}fi;JN%+aO-0X+Tor^P%Bpe zZHFsaM=d<-y4Jh#1sFZViN#$U(3Xg5ZHECxMD3+{A@5pLG}=pwahyn@(`LZO4&=T zcCkp-FJ*G|Hn!bku(V%VIRN=ucttyrR(djmQcd&P2#MNP`VRs$0YsEFvnqa~HG6|A zo?OF4uN16JdLAq*R;#{kQnUIl6{}739W)1XR^7?YT#$OJFgxz@tI$b#gDWc=iV)Ti zN}fhC2)`QGUo_62L3@ty3jMqBzog zlQ-qf^mS+MMiFicrfShhqT#9kiMyFYu$?zP1R|ftb+x&PPA=CzuD-lo(3BmN>XrKQ z3H)acMq3iA36{~m#C(!WD5_V!ik|DINkb^xXId@bdQkMG2kS>nTzsEfo2Ap58hLQE7V}=$MUKEaSCgGgtRrP}{N@`iShn)qbA4|6mclgFEeLt)W!o zQmKa}Is!iOR!3%5IaUOT6@Y9;y&K;tZ0b=Etxb^9@g)U#>=`Lor8$B!zX zgrsCDS!XCnBD=A&#r@IX(8SM0Y;|eZp6S!RsTJxbn7Pww2g6k|^G+O8?;o8MJY`zP z=^mT5#q4ut1EAja>%kT;O878Fs@}u|sngSrJ`~Y!tkAsbFx2(eFoZX~5BC=RP#2cr z2XRSu;O{XhmGSZ0Cm+1BJ=?ON2tARjWKiy!NKgv)_f>Psq-7ez6VW?`Ep|xPGxY=o zGt1P?&tt2qx{c>sW)lqu?VtT`3546-Fc-7fIbs$^>;Mbfx_nrgEAh7wKYLl*m@Es4 z07jNzSJ!p{m;v-dcdzZy&!2V-Fi-kdZQ?ew>e3<4qE+tL2O_x2nsMd5{Zo)N!|#wB zFW1J3=fT<<3t?$I#rh(O+C(h!4|NpT{_RIoC3opIH8cVdKDg|>>Q?bXoFNPMKh0PI z{f+dJtAOfJ*Kaw7&h2szZ`XUXX)Nph^M0?dN24V|#aXX6Pl|%CJ6C7zPe-%I>;8=X zz}3;s*|h-hdYx<7^164*Lvy-c0X#jDZWT*e2^oHEZhM@SBz@bnxp={Cf89N94}TVX zTI?5kJJCHuaCmzNQxw9Oe=P={(gyaCZl;qcfS8K)S0BgX%+YPSL2m$&YE172KSHy$RDK%_w+Y{=(dFl3NqAjs!0(B~RI%xfkL%evkgK>;8j z;Lqv*Uh?R?e4*G8r z%wJECwVN)lrc1Vw68dki25^Yt`-eg;*%AW&^8V`nry&0!T+Ccut?Vsa{sp+u(RJBs z!0=x;jLUH^F+akB3e9MOh_O#3QLmaP?BPa|J$8_aru&h-xwh87 zvpVmK+WQPLW94P)G4;V@>s??xPw3Ci5`y@l{8}w^G4t5CIFL!pPfm6~zp+>0VL0ahTWHWM3Em+FEhY zV5sg++`=?d$kQmxRIhtGE6S>rog2Sa#`23eVmr0UohDS`S`L^HNwt%^1NHkwG+tgYg*uV%;teA6X% zly}@Ja5B2_IIQ5dthu;50OoeCwn=0+_zpe1mm8U5aZFEr^Hddc2&)1SK>i`m-|8*S z!S`a4y2Vw$e0Ho&ZEfqB`b4m4|LaClQtikF$NXLi)it2AefjKSe$VWjp`LSHfP3@U zTXk=S`e>H4aDcE_;gwD2RlX(IwX(2>_f>hO#_%h?BMox4>-*6y&I}sfky@Wl1=5O* zqy%GV>BC2oEs$B~JRWt0TRNOKOETJlV$qH>d}a+RKNJ%lb16HL}R% zU8w4YJ~6;#QcgmRDLeSnAm=tE5v;zHZ4_hxWdr?$XWnLn&=N8)X4QlvIyl#O-UVUD zQtX08L)Vbgk!+FLJMYSx>(p}XlEFB_{c19d5dFqryBnmRPA>{yN3ZYk$FX&#FQ5$)|ZAXB}RbOdSR&emOq|S%c(%fl=EqD$Q1Mbi@&1!$# zJV>7qhO)<%fLc*>s72M9+6dNoKiS#f?Z(PEcZ2hR-OqU;Cl=yXp0Z)K#Jbn&v`@%r;~>D zC~fJh?M?dFQnCj|fb5A`uUq8)!t}28>#Y?p`SQa|00ryM?Jrm9ntMzaG%|^o0M$-4sT? zr`nKyzQe!!%RPm={^kpD6ke00Txs)dVUmeIwx&%u%DO%OiJfS$BJD2t_rVVL8Uf&k zR&sEXV<3Ql=A!I)X%y}$w)kj5^NQKiJ+JdrrDhwm|5l=g%QyqsQc&I}P`mk_|G6^x zVZlD|=-deHrsmLFjDCv3Pf!pYxm}d@r{t=L{8N5nrO2h)Z z9V$QhalgGS9Kl2MeTLSFqwr=Nci>vu^61xX=_0v#%Gxfo{@HR_K#@gP6q5reM7h-L z|2h-)S;2wdcXbts*|reae!F|Vd%hyQ*{6cbOnsgV{iK@5_tU)s{*65)L-JP7p>q+R zRo<*LP2h9sXi>Q!N`QH&qknK&v0yT!8I|8%`~hQgFlo{^_RP#Rygr>~wm^36k+7KI za_x{B3HTWatZDwjjswd{V}A}H#Dx^rgwE%&;kVF{0**nFg<$qL?|ql_(G!%aRK zYc`Xy)3`07%7N6^5%=y5Q-ZCj+0nTWGm$XWj@;xHS8wf`wo_hR{I;( z4*o}H%TESmk2Adot?>+~@5HSO2$SfXp+ksF?JNR1rOcznH*J_%ED_ZlzMkOR_(o;Y z;JEmePkOvFVviBac8yj>ALb>IHpKe1gZpiJ)nun7nQlU7f1GlU^&PqU!*SCGS+m*D zPHTp{XyjJl$FIkiU|GmlpbDdu>=QO=1iACIr2fOpC%WR27{0pi0g-5+lo$FR?n}j_ zs)^048cV^{u*9%0vsBkD9x)%-nIIeSe_-(4u@ztyAT@q(=PI2-FuAXTPhj6tj63%@ zgC4z(EbjhsO3~#)S_2-8L#7uZdSOpa+j2&IY(#ZWagLn3yXZqp1}MmbVA4suBsuj% z*5ZY6aW`VjGU+D7Rb)~e(LVk@6gnFp5*}9~b9j}9u^yA0G(@K)b0o(P>De+;7PL=l zzYCAvL6NRndUU+1Q(H(Q%~#frO4(8x0^csd{Bnb~lW|NveKlbkUNIPGp?)tH+{NDN z0nRDisHZaU?`8jrqI#lf>RC_T?@&MIlJfgS{L2o3M?G>(+rb0xPG7P}68l}65}Mp* z@jDV0^|ckua-t?_|CfKkC$nRfk3!)~Gv#8p&jUgDUtTwNqQ+%YLb%ZzD zsucO9+=>@JL-7|g5S%r3gB766iW$c(89*M@`P??aQl{3<^2~}nDNKX2>-8>w8D{sS z>xOn(0n0-8m+?qHBo=vPrHQ~@B5UDxzt>nPpBQ4iF=eB0C-^J0IAV$fVVO&KQBqG|M8{9cjuN=^2u3(treWmrby#3J=}8Lx z%0+d@!)G|OOK^&@x}nE`NxC1+`SRi}w$po4K#S4#`_|j})dMnV2!=tK{Eak8)IB>k zYMnAsHhlXV!0fjS*ZdZj_r$qY8tdn9&C*Fk#x!_TO74~^x@HQO$mQEC&_h4Oios^i zD$Zn;IQD#%_QFD1LtH<^JIFoVC>S;Ql9`^s7)*sCtR7G@8KB!9e8loM=0Di1f;I~Q z0?GZc`TmQW{om}knwIMdh=1~v9d7@f-<)|*0B*l!_=kIXEBX(?aVPN);dl3M&R@CJ zyMN0e-An&RfdK4$PxntJ^Iq&9V((r8n(s4pRkFr)<7UTGgqU(*7ARD?SE~>fF}Y-(hYF?H7<^lEDY@5sWAUkH5d?R JdGl}Y{{rJ`459!4 delta 21367 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 Z>#Bzjpa_@Aa0>QNbj$1n7W?Ps{|8u<(31cF diff --git a/yaml_config_extend/Application Fluidization.pdf b/yaml_config_extend/Application Fluidization.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5cc5792dfb452857c2c007bf83b9a5ced62fd86d GIT binary patch literal 102660 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 z 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%0AXL&|-iW|Hp~X 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

bdfFrpoR zk)VMA`gVY3JY>HJ7y*ix2$&=kh!8LWG*ZX_BN7SFs4zVYdM~sZfdPgG0~o-!>0y8t zA{0guFcQ??LcqvSq(s0-P#j}~5wK8~nGuGEFUdi`&`?ZAz~KHK0)~f{2q9ot=yDST z3zvqW%r6ha?ppmU_Xpz*kA@Dbth z5=L5x)A%3}2Q61bw8KIRBoHt>RADf}NRm*k#0VowLQ9_zFg$a7CK8zal1O5X?L;DT zOoRl3dzwuG4lpr0)%LXWsb!p0#Zld9eC!PLc%lI8j*yC zt}dg02c%1;JcuX2*R0XE1MeUrWd#y80h(Y(v?DRcb`lxtj3C;PkuedJ2Jlb;V>>dM zS#M-4vkb`7#6L1z&miy-ppj$*49D!#WIWUxK(r&`nRH1eFv%H2CS*Q`PR4+Was)mS zlMj-~B&gD+ZwKT8>LMl>7Fz#+Xa{N{W*Ah{A==@gi7a{;nn1)Oa}OHW0W#MDS_sIP z17P5k6GnUx3_9F|{v7~DoQ4k)GQUBzAmsRXGYpN)Tc8rfGRqnCml6I3+Toz7Lq@rP>j{~3i6J2Q0MCMIndwO4h)b1Q_R5vRU+&FI1wJ|H8MPlB}g*aE|vgpUq!Z)#6XL27@oypaZJ7nU`#%P z1ECHfD=>Nh)Q-f5!y)YoNEF9Z*8vz)P63if+%Rv0(=5^;7>|mq)0}YjN85)TzrTp z17#2~N(zb?Wd%^tl2p)23gqqE!2v?QZ32z!C^=dv?xR}Ry1Lt=BuHdMw8D0@5~znr t$|{m*1t1MYMHLc2kK0ZlfV^ diff --git a/yaml_config_extend/README.md b/yaml_config_extend/README.md index e8d4f40b0..1b0317656 100644 --- a/yaml_config_extend/README.md +++ b/yaml_config_extend/README.md @@ -1,8 +1,9 @@ ### Info -Replica of [sixface/YamlConfig](https://github.com/jsixface/YamlConfig) by Arumugam Jeganathan from version __1.0.1__ -extended +Replica of [sixface/YamlConfig](https://github.com/jsixface/YamlConfig) by Arumugam Jeganathan from version __1.0.1__ (the latest release is __1.1.1__) + +extended the upstream class by adding methods to load Maps: ```java public Map getMap(String key) @@ -106,6 +107,10 @@ grep -i -A 1 @test src/test/java/example/YamlConfigExtendedTest.java | grep -i public void getDocString2() { public void getDocString3() { ``` +### Note + +there exists a similar [PR](https://github.com/jsixface/YamlConfig/pull/12) with `getStringList()` method by some other developer + ### See Also * https://www.vogella.com/tutorials/Hamcrest/article.html From 7a32862da250d4b7e1e729b41127e7a3c421c778 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 26 Aug 2023 00:10:10 -0400 Subject: [PATCH 032/171] intermediate revision - added elementary snakeyaml test for comparison --- yaml_config_extend/pom.xml | 4 +- .../src/test/java/example/SnakeYamlTest.java | 143 ++++++++++++++++++ 2 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 yaml_config_extend/src/test/java/example/SnakeYamlTest.java diff --git a/yaml_config_extend/pom.xml b/yaml_config_extend/pom.xml index 16882e728..52b709ef9 100644 --- a/yaml_config_extend/pom.xml +++ b/yaml_config_extend/pom.xml @@ -3,8 +3,8 @@ 4.0.0 example yamlconfig_extend - 0.6.1-SNASHOT - yamlconfigi_extend + 0.7.0-SNASHOT + yamlconfig_extend serialize application configuration in YAML file and support classpath-style dotted notation. 1.3 diff --git a/yaml_config_extend/src/test/java/example/SnakeYamlTest.java b/yaml_config_extend/src/test/java/example/SnakeYamlTest.java new file mode 100644 index 000000000..ed9a8563c --- /dev/null +++ b/yaml_config_extend/src/test/java/example/SnakeYamlTest.java @@ -0,0 +1,143 @@ +package example; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.greaterThan; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.Yaml; + +import example.YamlConfig; +import static org.hamcrest.MatcherAssert.assertThat; + +@SuppressWarnings({ "deprecation", "unchecked" }) +public class SnakeYamlTest { + + // https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation + private LoaderOptions options; + private Yaml yaml; + + private final String data = "aGVsbG8sIHdvcmxkCg=="; + private File file; + private String text; + private final String yamlFile = "test.yml"; + private final InputStream resource = getClass().getClassLoader() + .getResourceAsStream(yamlFile); + + @Before + public void setup() throws IOException { + options = new LoaderOptions(); + yaml = new Yaml(options); + file = File.createTempFile("key", "yaml"); + } + + @After + public void after() { + file.delete(); + } + + @Test + public void test1() throws IOException { + String data = "---\n\nversion: 3\nservices:\n db:\n image: mysql\n container_name: mysql_db\n restart: always\n environment:\n - MYSQL_ROOT_PASSWORD=secret\n"; + + saveString2File(file, data); + + System.err.println("Written " + file.length() + " chars of data"); + String filePath = file.getAbsolutePath(); + + Path resource = Paths.get(filePath); + byte[] payload = Files.readAllBytes(resource); + text = new String(payload, "UTF-8"); + + // List list = (List) yaml.load(text); + System.out.println(text); + Object object1 = yaml.load(text); + assertThat(object1, notNullValue()); + Map object = (Map) yaml.load(text); + System.out.println(object); + assertThat(object.containsKey("services"), is(true)); + + Map services = (Map) object.get("services"); + assertThat(services.containsKey("db"), is(true)); + + Map db = (Map) services.get("db"); + assertThat(db, notNullValue()); + assertThat(db.containsKey("image"), is(true)); + + } + + @Test + public void test2() throws IOException { + text = readAll(resource); + Object object1 = yaml.load(text); + assertThat(object1, notNullValue()); + Map object = (Map) yaml.load(text); + System.out.println(object); + assertThat(object.containsKey("services"), is(true)); + + Map services = (Map) object.get("services"); + assertThat(services.containsKey("db"), is(true)); + + Map db = (Map) services.get("db"); + assertThat(db, notNullValue()); + assertThat(db.containsKey("image"), is(true)); + assertThat(services.containsKey("names"), is(true)); + List> names = (List>) services + .get("names"); + assertThat(names, notNullValue()); + assertThat(names.size(), is(2)); + + Map name1 = (Map) names.get(0); + assertThat(name1, notNullValue()); + assertThat(name1.containsKey("first"), is(true)); + assertThat(name1.containsKey("last"), is(true)); + } + + // origin:http://www.java2s.com/ref/java/java-file-write-text-to-file.html + public static final boolean saveString2File(File file, String content) { + try { + BufferedWriter bw = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(file))); + bw.write(content); + bw.close(); + return true; + } catch (Exception e) { + return false; + } + } + + // http://www.java2s.com/example/java-utility-method/inputstream-read-all/readall-inputstream-in-c5be9.html + public static final String readAll(InputStream in) throws IOException { + StringBuilder bob = new StringBuilder(); + int c; + while ((c = in.read()) != -1) { + bob.append((char) c); + } + return bob.toString(); + } +} From 3fc39d3c638c80aaf052ad1650a537c6ca93a836 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 28 Aug 2023 13:57:14 -0400 Subject: [PATCH 033/171] intermediate reviion - added typed object loading and saving with plain SnakeYAML examples --- yaml_config_extend/pom.xml | 2 +- .../java/example/ComplexConfiguration.java | 56 ++++++ .../src/test/java/example/Configuration.java | 43 +++++ .../src/test/java/example/Microservice.java | 32 ++++ .../src/test/java/example/Services.java | 23 +++ .../src/test/java/example/Settings.java | 43 +++++ .../example/SnakeStronglyTypedYamlTest.java | 171 ++++++++++++++++++ .../test/resources/task_complex_config.yml | 26 +++ .../src/test/resources/task_config.yml | 18 ++ .../test/resources/task_config_compact.yml | 9 + .../src/test/resources/task_config_plain.yml | 16 ++ 11 files changed, 438 insertions(+), 1 deletion(-) create mode 100644 yaml_config_extend/src/test/java/example/ComplexConfiguration.java create mode 100644 yaml_config_extend/src/test/java/example/Configuration.java create mode 100644 yaml_config_extend/src/test/java/example/Microservice.java create mode 100644 yaml_config_extend/src/test/java/example/Services.java create mode 100644 yaml_config_extend/src/test/java/example/Settings.java create mode 100644 yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java create mode 100644 yaml_config_extend/src/test/resources/task_complex_config.yml create mode 100644 yaml_config_extend/src/test/resources/task_config.yml create mode 100644 yaml_config_extend/src/test/resources/task_config_compact.yml create mode 100644 yaml_config_extend/src/test/resources/task_config_plain.yml diff --git a/yaml_config_extend/pom.xml b/yaml_config_extend/pom.xml index 52b709ef9..d2a53ede5 100644 --- a/yaml_config_extend/pom.xml +++ b/yaml_config_extend/pom.xml @@ -3,7 +3,7 @@ 4.0.0 example yamlconfig_extend - 0.7.0-SNASHOT + 0.8.0-SNASHOT yamlconfig_extend serialize application configuration in YAML file and support classpath-style dotted notation. diff --git a/yaml_config_extend/src/test/java/example/ComplexConfiguration.java b/yaml_config_extend/src/test/java/example/ComplexConfiguration.java new file mode 100644 index 000000000..2cc8292f8 --- /dev/null +++ b/yaml_config_extend/src/test/java/example/ComplexConfiguration.java @@ -0,0 +1,56 @@ +package example; + +import java.util.List; + +public class ComplexConfiguration { + private String version; + private List services; + + public static class Service { + private Microservice microservice; + + public static class Microservice { + private String name; + private String image; + private String container_name; + private String restart; + private String build; + private List depends_on; + private List environment; + private List ports; + private String property; + + } + } + + public static class Settings { + private boolean boolean_setting; + private Integer integer_setting; + + public boolean isBoolean_setting() { + return boolean_setting; + } + + public void setBoolean_setting(boolean boolean_setting) { + this.boolean_setting = boolean_setting; + } + + public Integer getInteger_setting() { + return integer_setting; + } + + public void setInteger_setting(Integer integer_setting) { + this.integer_setting = integer_setting; + } + + public String getString_setting() { + return string_setting; + } + + public void setString_setting(String string_setting) { + this.string_setting = string_setting; + } + + private String string_setting; + } +} diff --git a/yaml_config_extend/src/test/java/example/Configuration.java b/yaml_config_extend/src/test/java/example/Configuration.java new file mode 100644 index 000000000..603c267ce --- /dev/null +++ b/yaml_config_extend/src/test/java/example/Configuration.java @@ -0,0 +1,43 @@ +package example; + +import java.util.List; + +public class Configuration { + private String version; + // NOTE: has to be named "Services" , not "Service" + private Services services; + private Settings settings; + + public Settings getSettings() { + return settings; + } + + public void setSettings(Settings settings) { + this.settings = settings; + } + + public Configuration(String version, Services services, Settings settings) { + this.version = version; + this.services = services; + this.settings = settings; + } + + public Configuration() { + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Services getServices() { + return services; + } + + public void setServices(Services services) { + this.services = services; + } +} diff --git a/yaml_config_extend/src/test/java/example/Microservice.java b/yaml_config_extend/src/test/java/example/Microservice.java new file mode 100644 index 000000000..6c1ce1039 --- /dev/null +++ b/yaml_config_extend/src/test/java/example/Microservice.java @@ -0,0 +1,32 @@ +package example; + +public class Microservice { + public Microservice() { + } + + public Microservice(String name, String image) { + super(); + this.name = name; + this.image = image; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + private String name; + private String image; + +} diff --git a/yaml_config_extend/src/test/java/example/Services.java b/yaml_config_extend/src/test/java/example/Services.java new file mode 100644 index 000000000..24358e77c --- /dev/null +++ b/yaml_config_extend/src/test/java/example/Services.java @@ -0,0 +1,23 @@ +package example; + +import java.util.List; + +public class Services { + private List microservice; + + public Services() { + } + + public Services(List microservice) { + this.microservice = microservice; + } + + public List getMicroservice() { + return microservice; + } + + public void setMicroservice(List microservice) { + this.microservice = microservice; + } + +} diff --git a/yaml_config_extend/src/test/java/example/Settings.java b/yaml_config_extend/src/test/java/example/Settings.java new file mode 100644 index 000000000..f09213f76 --- /dev/null +++ b/yaml_config_extend/src/test/java/example/Settings.java @@ -0,0 +1,43 @@ +package example; + +public class Settings { + private boolean boolean_setting; + private Integer integer_setting; + private String string_setting; + + public Settings(boolean boolean_setting, Integer integer_setting, + String string_setting) { + super(); + this.boolean_setting = boolean_setting; + this.integer_setting = integer_setting; + this.string_setting = string_setting; + } + + public Settings() { + } + + public boolean isBoolean_setting() { + return boolean_setting; + } + + public void setBoolean_setting(boolean boolean_setting) { + this.boolean_setting = boolean_setting; + } + + public Integer getInteger_setting() { + return integer_setting; + } + + public void setInteger_setting(Integer integer_setting) { + this.integer_setting = integer_setting; + } + + public String getString_setting() { + return string_setting; + } + + public void setString_setting(String string_setting) { + this.string_setting = string_setting; + } + +} diff --git a/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java b/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java new file mode 100644 index 000000000..6278bdf90 --- /dev/null +++ b/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java @@ -0,0 +1,171 @@ +package example; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.greaterThan; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +// import java.lang.reflect.Constructor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.DumperOptions.FlowStyle; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.constructor.ConstructorException; +import org.yaml.snakeyaml.nodes.Tag; + +import static org.hamcrest.MatcherAssert.assertThat; +import example.Configuration; +import example.Microservice; +import example.Services; +import example.Settings; + +@SuppressWarnings({ "deprecation", "unchecked" }) +public class SnakeStronglyTypedYamlTest { + + // https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation + private LoaderOptions options; + private Yaml yaml1; + private Yaml yaml2; + private Yaml yaml3; + + private String text; + private final String yamlFile1 = "task_config.yml"; + private final InputStream resource1 = getClass().getClassLoader() + .getResourceAsStream(yamlFile1); + + private final String yamlFile3 = "task_config_plain.yml"; + private final InputStream resource3 = getClass().getClassLoader() + .getResourceAsStream(yamlFile3); + + private final String yamlFile2 = "task_config_compact.yml"; + private final InputStream resource2 = getClass().getClassLoader() + .getResourceAsStream(yamlFile2); + DumperOptions dumperOptions = new DumperOptions(); + + @Before + public void setup() throws IOException { + options = new LoaderOptions(); + yaml1 = new Yaml(options); + yaml2 = new Yaml(new Constructor(Configuration.class)); + dumperOptions.setIndent(2); + dumperOptions.setPrettyFlow(true); + dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + yaml3 = new Yaml(dumperOptions); + } + + @After + public void after() { + } + + // see also: + // https://stackabuse.com/reading-and-writing-yaml-files-in-java-with-snakeyaml/ + // https://github.com/TaimoorChoudhary/snake-yaml + @Test + public void test3() { + + Settings settings = new Settings(true, 100, "value"); + Microservice microservice = new Microservice("db", "mysql:latest"); + Services services = new Services( + Arrays.asList(new Microservice[] { microservice })); + String version = "2.0"; + Configuration object3 = new Configuration(version, services, settings); + String output = yaml3.dump(object3); + + System.err.println("test3 result (with indentation):" + "\n" + output); + } + + // see also: + // https://stackabuse.com/reading-and-writing-yaml-files-in-java-with-snakeyaml/ + @Test + public void test4() /* throws IOException */ { + + Settings settings = new Settings(true, 100, "value"); + Microservice microservice1 = new Microservice("db", "mysql:latest"); + Microservice microservice2 = new Microservice("web", "alpine:python"); + Services services = new Services( + Arrays.asList(new Microservice[] { microservice1, microservice2 })); + String version = "2.0"; + Configuration object3 = new Configuration(version, services, settings); + String output = yaml2.dump(object3); + + System.err.println("test4 result:" + output); + Configuration object2 = (Configuration) yaml2.load(output); + assertThat(object2, notNullValue()); + System.err.println("test4 : " + "Configuration: " + object2); + System.err.println("dump: "); + // see also: + // https://www.tabnine.com/code/java/methods/org.yaml.snakeyaml.Yaml/dumpAs + yaml2.dumpAs(object2, Tag.STR, FlowStyle.BLOCK); + } + + @Test + public void test1() throws IOException { + text = readAll(resource3); + Map object1 = (Map) yaml1.load(text); + assertThat(object1, notNullValue()); + System.err.println("Object: " + object1); + // Configuration object2 = (Configuration) object1; + // assertThat(object2, notNullValue()); + // System.err.println("Configuration: " + object2); + } + + // @Ignore + @Test(expected = ConstructorException.class) + public void test2() throws ConstructorException, IOException { + try { + text = readAll(resource1); + Configuration object2 = (Configuration) yaml2.load(text); + assertThat(object2, notNullValue()); + System.err.println("Configuration: " + object2); + } catch (ConstructorException e) { + + System.err.println("test2: " + "exception (captured): " + e.getClass() + + " " + e.toString()); + throw e; + } + } + + // @Ignore + @Test + public void test5() throws IOException { + text = readAll(resource2); + Configuration object2 = (Configuration) yaml2.load(text); + assertThat(object2, notNullValue()); + System.err.println("Configuration: " + object2); + } + + // http://www.java2s.com/example/java-utility-method/inputstream-read-all/readall-inputstream-in-c5be9.html + public static final String readAll(InputStream in) throws IOException { + StringBuilder bob = new StringBuilder(); + int c; + while ((c = in.read()) != -1) { + bob.append((char) c); + } + return bob.toString(); + } +} diff --git a/yaml_config_extend/src/test/resources/task_complex_config.yml b/yaml_config_extend/src/test/resources/task_complex_config.yml new file mode 100644 index 000000000..182672337 --- /dev/null +++ b/yaml_config_extend/src/test/resources/task_complex_config.yml @@ -0,0 +1,26 @@ +--- +version: 3 +setting: + boolean_setting: true + integer_setting: 42 + string_setting: somethings +services: + - microservice: + name: db + image: mysql + container_name: mysql_db + restart: always + environment: + - MYSQL_ROOT_PASSWORD="secret" + - microservice: + name: web + image: apache + build: ./webapp + depends_on: + - db + - microservice: + container_name: apache_web + restart: always + property: ~ + ports: + - "8080:80" diff --git a/yaml_config_extend/src/test/resources/task_config.yml b/yaml_config_extend/src/test/resources/task_config.yml new file mode 100644 index 000000000..5f1ccad6b --- /dev/null +++ b/yaml_config_extend/src/test/resources/task_config.yml @@ -0,0 +1,18 @@ +--- +!!example.Configuration +# require for ??? +services: + - microservice: + name: db + image: mysql + - microservice: + name: web + image: apache + +settings: + boolean_setting: true + integer_setting: 42 + string_setting: somethings + +version: 3 + \ No newline at end of file diff --git a/yaml_config_extend/src/test/resources/task_config_compact.yml b/yaml_config_extend/src/test/resources/task_config_compact.yml new file mode 100644 index 000000000..6cfba9098 --- /dev/null +++ b/yaml_config_extend/src/test/resources/task_config_compact.yml @@ -0,0 +1,9 @@ +--- +!!example.Configuration +# the type is optional +services: + microservice: + - {image: 'mysql:latest', name: db} + - {image: 'alpine:python', name: web} +settings: {boolean_setting: true, integer_setting: 100, string_setting: value} +version: '2.0' \ No newline at end of file diff --git a/yaml_config_extend/src/test/resources/task_config_plain.yml b/yaml_config_extend/src/test/resources/task_config_plain.yml new file mode 100644 index 000000000..ecf6e9eaa --- /dev/null +++ b/yaml_config_extend/src/test/resources/task_config_plain.yml @@ -0,0 +1,16 @@ +--- +services: + - microservice: + name: db + image: mysql + - microservice: + name: web + image: apache + +settings: + boolean_setting: true + integer_setting: 42 + string_setting: somethings + +version: 3 + \ No newline at end of file From 7bc5d572c395f4c5de7d5eb108000b9b72aaed11 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 28 Aug 2023 16:54:13 -0400 Subject: [PATCH 034/171] intermediate revision - fixed the mismatch between objects and YAML, still struggling with nested object with multiple variant properties, marked as expected exception --- yaml_config_extend/pom.xml | 2 +- .../java/example/ComplexConfiguration.java | 94 ++++++++++++++++++- .../src/test/java/example/Configuration.java | 9 +- .../src/test/java/example/Services.java | 8 +- .../example/SnakeStronglyTypedYamlTest.java | 30 ++++-- .../src/test/resources/task_config.yml | 3 +- .../test/resources/task_config_compact.yml | 5 +- 7 files changed, 124 insertions(+), 27 deletions(-) diff --git a/yaml_config_extend/pom.xml b/yaml_config_extend/pom.xml index d2a53ede5..d7d833442 100644 --- a/yaml_config_extend/pom.xml +++ b/yaml_config_extend/pom.xml @@ -3,7 +3,7 @@ 4.0.0 example yamlconfig_extend - 0.8.0-SNASHOT + 0.9.0-SNASHOT yamlconfig_extend serialize application configuration in YAML file and support classpath-style dotted notation. diff --git a/yaml_config_extend/src/test/java/example/ComplexConfiguration.java b/yaml_config_extend/src/test/java/example/ComplexConfiguration.java index 2cc8292f8..37b9582fc 100644 --- a/yaml_config_extend/src/test/java/example/ComplexConfiguration.java +++ b/yaml_config_extend/src/test/java/example/ComplexConfiguration.java @@ -4,9 +4,25 @@ public class ComplexConfiguration { private String version; - private List services; + private List services; - public static class Service { + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public List getServices() { + return services; + } + + public void setServices(List services) { + this.services = services; + } + + public static class Services { private Microservice microservice; public static class Microservice { @@ -20,12 +36,85 @@ public static class Microservice { private List ports; private String property; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getContainer_name() { + return container_name; + } + + public void setContainer_name(String container_name) { + this.container_name = container_name; + } + + public String getRestart() { + return restart; + } + + public void setRestart(String restart) { + this.restart = restart; + } + + public String getBuild() { + return build; + } + + public void setBuild(String build) { + this.build = build; + } + + public List getDepends_on() { + return depends_on; + } + + public void setDepends_on(List depends_on) { + this.depends_on = depends_on; + } + + public List getEnvironment() { + return environment; + } + + public void setEnvironment(List environment) { + this.environment = environment; + } + + public List getPorts() { + return ports; + } + + public void setPorts(List ports) { + this.ports = ports; + } + + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + } } public static class Settings { private boolean boolean_setting; private Integer integer_setting; + private String string_setting; public boolean isBoolean_setting() { return boolean_setting; @@ -51,6 +140,5 @@ public void setString_setting(String string_setting) { this.string_setting = string_setting; } - private String string_setting; } } diff --git a/yaml_config_extend/src/test/java/example/Configuration.java b/yaml_config_extend/src/test/java/example/Configuration.java index 603c267ce..4c285ca92 100644 --- a/yaml_config_extend/src/test/java/example/Configuration.java +++ b/yaml_config_extend/src/test/java/example/Configuration.java @@ -5,7 +5,7 @@ public class Configuration { private String version; // NOTE: has to be named "Services" , not "Service" - private Services services; + private List services; private Settings settings; public Settings getSettings() { @@ -16,7 +16,8 @@ public void setSettings(Settings settings) { this.settings = settings; } - public Configuration(String version, Services services, Settings settings) { + public Configuration(String version, List services, + Settings settings) { this.version = version; this.services = services; this.settings = settings; @@ -33,11 +34,11 @@ public void setVersion(String version) { this.version = version; } - public Services getServices() { + public List getServices() { return services; } - public void setServices(Services services) { + public void setServices(List services) { this.services = services; } } diff --git a/yaml_config_extend/src/test/java/example/Services.java b/yaml_config_extend/src/test/java/example/Services.java index 24358e77c..608f1e62d 100644 --- a/yaml_config_extend/src/test/java/example/Services.java +++ b/yaml_config_extend/src/test/java/example/Services.java @@ -3,20 +3,20 @@ import java.util.List; public class Services { - private List microservice; + private Microservice microservice; public Services() { } - public Services(List microservice) { + public Services(Microservice microservice) { this.microservice = microservice; } - public List getMicroservice() { + public Microservice getMicroservice() { return microservice; } - public void setMicroservice(List microservice) { + public void setMicroservice(Microservice microservice) { this.microservice = microservice; } diff --git a/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java b/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java index 6278bdf90..082dd7808 100644 --- a/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java +++ b/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java @@ -52,6 +52,7 @@ public class SnakeStronglyTypedYamlTest { private Yaml yaml1; private Yaml yaml2; private Yaml yaml3; + private Yaml yaml4; private String text; private final String yamlFile1 = "task_config.yml"; @@ -76,6 +77,7 @@ public void setup() throws IOException { dumperOptions.setPrettyFlow(true); dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); yaml3 = new Yaml(dumperOptions); + yaml4 = new Yaml(new Constructor(ComplexConfiguration.class)); } @After @@ -90,27 +92,27 @@ public void test3() { Settings settings = new Settings(true, 100, "value"); Microservice microservice = new Microservice("db", "mysql:latest"); - Services services = new Services( - Arrays.asList(new Microservice[] { microservice })); + Services services = new Services(microservice); String version = "2.0"; - Configuration object3 = new Configuration(version, services, settings); + Configuration object3 = new Configuration(version, + Arrays.asList(new Services[] { services }), settings); String output = yaml3.dump(object3); System.err.println("test3 result (with indentation):" + "\n" + output); } - // see also: - // https://stackabuse.com/reading-and-writing-yaml-files-in-java-with-snakeyaml/ @Test public void test4() /* throws IOException */ { Settings settings = new Settings(true, 100, "value"); Microservice microservice1 = new Microservice("db", "mysql:latest"); Microservice microservice2 = new Microservice("web", "alpine:python"); - Services services = new Services( - Arrays.asList(new Microservice[] { microservice1, microservice2 })); + Services services1 = new Services(microservice1); + Services services2 = new Services(microservice2); + String version = "2.0"; - Configuration object3 = new Configuration(version, services, settings); + Configuration object3 = new Configuration(version, + Arrays.asList(new Services[] { services1, services2 }), settings); String output = yaml2.dump(object3); System.err.println("test4 result:" + output); @@ -134,8 +136,7 @@ public void test1() throws IOException { // System.err.println("Configuration: " + object2); } - // @Ignore - @Test(expected = ConstructorException.class) + @Test(/* expected = ConstructorException.class */) public void test2() throws ConstructorException, IOException { try { text = readAll(resource1); @@ -159,6 +160,15 @@ public void test5() throws IOException { System.err.println("Configuration: " + object2); } + // @Ignore + @Test(expected = ConstructorException.class) + public void test6() throws IOException { + text = readAll(resource3); + ComplexConfiguration object2 = (ComplexConfiguration) yaml4.load(text); + assertThat(object2, notNullValue()); + System.err.println("Configuration: " + object2); + } + // http://www.java2s.com/example/java-utility-method/inputstream-read-all/readall-inputstream-in-c5be9.html public static final String readAll(InputStream in) throws IOException { StringBuilder bob = new StringBuilder(); diff --git a/yaml_config_extend/src/test/resources/task_config.yml b/yaml_config_extend/src/test/resources/task_config.yml index 5f1ccad6b..0fa996748 100644 --- a/yaml_config_extend/src/test/resources/task_config.yml +++ b/yaml_config_extend/src/test/resources/task_config.yml @@ -14,5 +14,4 @@ settings: integer_setting: 42 string_setting: somethings -version: 3 - \ No newline at end of file +version: 3 \ No newline at end of file diff --git a/yaml_config_extend/src/test/resources/task_config_compact.yml b/yaml_config_extend/src/test/resources/task_config_compact.yml index 6cfba9098..81193a1ea 100644 --- a/yaml_config_extend/src/test/resources/task_config_compact.yml +++ b/yaml_config_extend/src/test/resources/task_config_compact.yml @@ -2,8 +2,7 @@ !!example.Configuration # the type is optional services: - microservice: - - {image: 'mysql:latest', name: db} - - {image: 'alpine:python', name: web} + - microservice: {image: 'mysql:latest', name: db} + - microservice: {image: 'alpine:python', name: web} settings: {boolean_setting: true, integer_setting: 100, string_setting: value} version: '2.0' \ No newline at end of file From 18eca29cd2e87b4e0bdf9f450e7608aae97b8e8d Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 28 Aug 2023 16:14:28 -0700 Subject: [PATCH 035/171] intermediate revision - removed SnakeYaml tests from YamlConfig (Extended) project --- yaml_config_extend/pom.xml | 2 +- .../java/example/ComplexConfiguration.java | 144 -------------- .../src/test/java/example/Configuration.java | 44 ----- .../src/test/java/example/Microservice.java | 32 ---- .../src/test/java/example/Services.java | 23 --- .../src/test/java/example/Settings.java | 43 ----- .../example/SnakeStronglyTypedYamlTest.java | 181 ------------------ .../src/test/java/example/SnakeYamlTest.java | 143 -------------- .../test/resources/task_complex_config.yml | 26 --- .../src/test/resources/task_config.yml | 17 -- .../test/resources/task_config_compact.yml | 8 - .../src/test/resources/task_config_plain.yml | 16 -- 12 files changed, 1 insertion(+), 678 deletions(-) delete mode 100644 yaml_config_extend/src/test/java/example/ComplexConfiguration.java delete mode 100644 yaml_config_extend/src/test/java/example/Configuration.java delete mode 100644 yaml_config_extend/src/test/java/example/Microservice.java delete mode 100644 yaml_config_extend/src/test/java/example/Services.java delete mode 100644 yaml_config_extend/src/test/java/example/Settings.java delete mode 100644 yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java delete mode 100644 yaml_config_extend/src/test/java/example/SnakeYamlTest.java delete mode 100644 yaml_config_extend/src/test/resources/task_complex_config.yml delete mode 100644 yaml_config_extend/src/test/resources/task_config.yml delete mode 100644 yaml_config_extend/src/test/resources/task_config_compact.yml delete mode 100644 yaml_config_extend/src/test/resources/task_config_plain.yml diff --git a/yaml_config_extend/pom.xml b/yaml_config_extend/pom.xml index d7d833442..1e28edae7 100644 --- a/yaml_config_extend/pom.xml +++ b/yaml_config_extend/pom.xml @@ -3,7 +3,7 @@ 4.0.0 example yamlconfig_extend - 0.9.0-SNASHOT + 0.10.0-SNASHOT yamlconfig_extend serialize application configuration in YAML file and support classpath-style dotted notation. diff --git a/yaml_config_extend/src/test/java/example/ComplexConfiguration.java b/yaml_config_extend/src/test/java/example/ComplexConfiguration.java deleted file mode 100644 index 37b9582fc..000000000 --- a/yaml_config_extend/src/test/java/example/ComplexConfiguration.java +++ /dev/null @@ -1,144 +0,0 @@ -package example; - -import java.util.List; - -public class ComplexConfiguration { - private String version; - private List services; - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public List getServices() { - return services; - } - - public void setServices(List services) { - this.services = services; - } - - public static class Services { - private Microservice microservice; - - public static class Microservice { - private String name; - private String image; - private String container_name; - private String restart; - private String build; - private List depends_on; - private List environment; - private List ports; - private String property; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getImage() { - return image; - } - - public void setImage(String image) { - this.image = image; - } - - public String getContainer_name() { - return container_name; - } - - public void setContainer_name(String container_name) { - this.container_name = container_name; - } - - public String getRestart() { - return restart; - } - - public void setRestart(String restart) { - this.restart = restart; - } - - public String getBuild() { - return build; - } - - public void setBuild(String build) { - this.build = build; - } - - public List getDepends_on() { - return depends_on; - } - - public void setDepends_on(List depends_on) { - this.depends_on = depends_on; - } - - public List getEnvironment() { - return environment; - } - - public void setEnvironment(List environment) { - this.environment = environment; - } - - public List getPorts() { - return ports; - } - - public void setPorts(List ports) { - this.ports = ports; - } - - public String getProperty() { - return property; - } - - public void setProperty(String property) { - this.property = property; - } - - } - } - - public static class Settings { - private boolean boolean_setting; - private Integer integer_setting; - private String string_setting; - - public boolean isBoolean_setting() { - return boolean_setting; - } - - public void setBoolean_setting(boolean boolean_setting) { - this.boolean_setting = boolean_setting; - } - - public Integer getInteger_setting() { - return integer_setting; - } - - public void setInteger_setting(Integer integer_setting) { - this.integer_setting = integer_setting; - } - - public String getString_setting() { - return string_setting; - } - - public void setString_setting(String string_setting) { - this.string_setting = string_setting; - } - - } -} diff --git a/yaml_config_extend/src/test/java/example/Configuration.java b/yaml_config_extend/src/test/java/example/Configuration.java deleted file mode 100644 index 4c285ca92..000000000 --- a/yaml_config_extend/src/test/java/example/Configuration.java +++ /dev/null @@ -1,44 +0,0 @@ -package example; - -import java.util.List; - -public class Configuration { - private String version; - // NOTE: has to be named "Services" , not "Service" - private List services; - private Settings settings; - - public Settings getSettings() { - return settings; - } - - public void setSettings(Settings settings) { - this.settings = settings; - } - - public Configuration(String version, List services, - Settings settings) { - this.version = version; - this.services = services; - this.settings = settings; - } - - public Configuration() { - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public List getServices() { - return services; - } - - public void setServices(List services) { - this.services = services; - } -} diff --git a/yaml_config_extend/src/test/java/example/Microservice.java b/yaml_config_extend/src/test/java/example/Microservice.java deleted file mode 100644 index 6c1ce1039..000000000 --- a/yaml_config_extend/src/test/java/example/Microservice.java +++ /dev/null @@ -1,32 +0,0 @@ -package example; - -public class Microservice { - public Microservice() { - } - - public Microservice(String name, String image) { - super(); - this.name = name; - this.image = image; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getImage() { - return image; - } - - public void setImage(String image) { - this.image = image; - } - - private String name; - private String image; - -} diff --git a/yaml_config_extend/src/test/java/example/Services.java b/yaml_config_extend/src/test/java/example/Services.java deleted file mode 100644 index 608f1e62d..000000000 --- a/yaml_config_extend/src/test/java/example/Services.java +++ /dev/null @@ -1,23 +0,0 @@ -package example; - -import java.util.List; - -public class Services { - private Microservice microservice; - - public Services() { - } - - public Services(Microservice microservice) { - this.microservice = microservice; - } - - public Microservice getMicroservice() { - return microservice; - } - - public void setMicroservice(Microservice microservice) { - this.microservice = microservice; - } - -} diff --git a/yaml_config_extend/src/test/java/example/Settings.java b/yaml_config_extend/src/test/java/example/Settings.java deleted file mode 100644 index f09213f76..000000000 --- a/yaml_config_extend/src/test/java/example/Settings.java +++ /dev/null @@ -1,43 +0,0 @@ -package example; - -public class Settings { - private boolean boolean_setting; - private Integer integer_setting; - private String string_setting; - - public Settings(boolean boolean_setting, Integer integer_setting, - String string_setting) { - super(); - this.boolean_setting = boolean_setting; - this.integer_setting = integer_setting; - this.string_setting = string_setting; - } - - public Settings() { - } - - public boolean isBoolean_setting() { - return boolean_setting; - } - - public void setBoolean_setting(boolean boolean_setting) { - this.boolean_setting = boolean_setting; - } - - public Integer getInteger_setting() { - return integer_setting; - } - - public void setInteger_setting(Integer integer_setting) { - this.integer_setting = integer_setting; - } - - public String getString_setting() { - return string_setting; - } - - public void setString_setting(String string_setting) { - this.string_setting = string_setting; - } - -} diff --git a/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java b/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java deleted file mode 100644 index 082dd7808..000000000 --- a/yaml_config_extend/src/test/java/example/SnakeStronglyTypedYamlTest.java +++ /dev/null @@ -1,181 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.Matchers.hasItems; -import static org.hamcrest.Matchers.greaterThan; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -// import java.lang.reflect.Constructor; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.io.IOException; -import java.io.InputStream; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.DumperOptions.FlowStyle; -import org.yaml.snakeyaml.LoaderOptions; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.constructor.ConstructorException; -import org.yaml.snakeyaml.nodes.Tag; - -import static org.hamcrest.MatcherAssert.assertThat; -import example.Configuration; -import example.Microservice; -import example.Services; -import example.Settings; - -@SuppressWarnings({ "deprecation", "unchecked" }) -public class SnakeStronglyTypedYamlTest { - - // https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation - private LoaderOptions options; - private Yaml yaml1; - private Yaml yaml2; - private Yaml yaml3; - private Yaml yaml4; - - private String text; - private final String yamlFile1 = "task_config.yml"; - private final InputStream resource1 = getClass().getClassLoader() - .getResourceAsStream(yamlFile1); - - private final String yamlFile3 = "task_config_plain.yml"; - private final InputStream resource3 = getClass().getClassLoader() - .getResourceAsStream(yamlFile3); - - private final String yamlFile2 = "task_config_compact.yml"; - private final InputStream resource2 = getClass().getClassLoader() - .getResourceAsStream(yamlFile2); - DumperOptions dumperOptions = new DumperOptions(); - - @Before - public void setup() throws IOException { - options = new LoaderOptions(); - yaml1 = new Yaml(options); - yaml2 = new Yaml(new Constructor(Configuration.class)); - dumperOptions.setIndent(2); - dumperOptions.setPrettyFlow(true); - dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - yaml3 = new Yaml(dumperOptions); - yaml4 = new Yaml(new Constructor(ComplexConfiguration.class)); - } - - @After - public void after() { - } - - // see also: - // https://stackabuse.com/reading-and-writing-yaml-files-in-java-with-snakeyaml/ - // https://github.com/TaimoorChoudhary/snake-yaml - @Test - public void test3() { - - Settings settings = new Settings(true, 100, "value"); - Microservice microservice = new Microservice("db", "mysql:latest"); - Services services = new Services(microservice); - String version = "2.0"; - Configuration object3 = new Configuration(version, - Arrays.asList(new Services[] { services }), settings); - String output = yaml3.dump(object3); - - System.err.println("test3 result (with indentation):" + "\n" + output); - } - - @Test - public void test4() /* throws IOException */ { - - Settings settings = new Settings(true, 100, "value"); - Microservice microservice1 = new Microservice("db", "mysql:latest"); - Microservice microservice2 = new Microservice("web", "alpine:python"); - Services services1 = new Services(microservice1); - Services services2 = new Services(microservice2); - - String version = "2.0"; - Configuration object3 = new Configuration(version, - Arrays.asList(new Services[] { services1, services2 }), settings); - String output = yaml2.dump(object3); - - System.err.println("test4 result:" + output); - Configuration object2 = (Configuration) yaml2.load(output); - assertThat(object2, notNullValue()); - System.err.println("test4 : " + "Configuration: " + object2); - System.err.println("dump: "); - // see also: - // https://www.tabnine.com/code/java/methods/org.yaml.snakeyaml.Yaml/dumpAs - yaml2.dumpAs(object2, Tag.STR, FlowStyle.BLOCK); - } - - @Test - public void test1() throws IOException { - text = readAll(resource3); - Map object1 = (Map) yaml1.load(text); - assertThat(object1, notNullValue()); - System.err.println("Object: " + object1); - // Configuration object2 = (Configuration) object1; - // assertThat(object2, notNullValue()); - // System.err.println("Configuration: " + object2); - } - - @Test(/* expected = ConstructorException.class */) - public void test2() throws ConstructorException, IOException { - try { - text = readAll(resource1); - Configuration object2 = (Configuration) yaml2.load(text); - assertThat(object2, notNullValue()); - System.err.println("Configuration: " + object2); - } catch (ConstructorException e) { - - System.err.println("test2: " + "exception (captured): " + e.getClass() - + " " + e.toString()); - throw e; - } - } - - // @Ignore - @Test - public void test5() throws IOException { - text = readAll(resource2); - Configuration object2 = (Configuration) yaml2.load(text); - assertThat(object2, notNullValue()); - System.err.println("Configuration: " + object2); - } - - // @Ignore - @Test(expected = ConstructorException.class) - public void test6() throws IOException { - text = readAll(resource3); - ComplexConfiguration object2 = (ComplexConfiguration) yaml4.load(text); - assertThat(object2, notNullValue()); - System.err.println("Configuration: " + object2); - } - - // http://www.java2s.com/example/java-utility-method/inputstream-read-all/readall-inputstream-in-c5be9.html - public static final String readAll(InputStream in) throws IOException { - StringBuilder bob = new StringBuilder(); - int c; - while ((c = in.read()) != -1) { - bob.append((char) c); - } - return bob.toString(); - } -} diff --git a/yaml_config_extend/src/test/java/example/SnakeYamlTest.java b/yaml_config_extend/src/test/java/example/SnakeYamlTest.java deleted file mode 100644 index ed9a8563c..000000000 --- a/yaml_config_extend/src/test/java/example/SnakeYamlTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.Matchers.hasItems; -import static org.hamcrest.Matchers.greaterThan; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.io.IOException; -import java.io.InputStream; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.yaml.snakeyaml.LoaderOptions; -import org.yaml.snakeyaml.Yaml; - -import example.YamlConfig; -import static org.hamcrest.MatcherAssert.assertThat; - -@SuppressWarnings({ "deprecation", "unchecked" }) -public class SnakeYamlTest { - - // https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation - private LoaderOptions options; - private Yaml yaml; - - private final String data = "aGVsbG8sIHdvcmxkCg=="; - private File file; - private String text; - private final String yamlFile = "test.yml"; - private final InputStream resource = getClass().getClassLoader() - .getResourceAsStream(yamlFile); - - @Before - public void setup() throws IOException { - options = new LoaderOptions(); - yaml = new Yaml(options); - file = File.createTempFile("key", "yaml"); - } - - @After - public void after() { - file.delete(); - } - - @Test - public void test1() throws IOException { - String data = "---\n\nversion: 3\nservices:\n db:\n image: mysql\n container_name: mysql_db\n restart: always\n environment:\n - MYSQL_ROOT_PASSWORD=secret\n"; - - saveString2File(file, data); - - System.err.println("Written " + file.length() + " chars of data"); - String filePath = file.getAbsolutePath(); - - Path resource = Paths.get(filePath); - byte[] payload = Files.readAllBytes(resource); - text = new String(payload, "UTF-8"); - - // List list = (List) yaml.load(text); - System.out.println(text); - Object object1 = yaml.load(text); - assertThat(object1, notNullValue()); - Map object = (Map) yaml.load(text); - System.out.println(object); - assertThat(object.containsKey("services"), is(true)); - - Map services = (Map) object.get("services"); - assertThat(services.containsKey("db"), is(true)); - - Map db = (Map) services.get("db"); - assertThat(db, notNullValue()); - assertThat(db.containsKey("image"), is(true)); - - } - - @Test - public void test2() throws IOException { - text = readAll(resource); - Object object1 = yaml.load(text); - assertThat(object1, notNullValue()); - Map object = (Map) yaml.load(text); - System.out.println(object); - assertThat(object.containsKey("services"), is(true)); - - Map services = (Map) object.get("services"); - assertThat(services.containsKey("db"), is(true)); - - Map db = (Map) services.get("db"); - assertThat(db, notNullValue()); - assertThat(db.containsKey("image"), is(true)); - assertThat(services.containsKey("names"), is(true)); - List> names = (List>) services - .get("names"); - assertThat(names, notNullValue()); - assertThat(names.size(), is(2)); - - Map name1 = (Map) names.get(0); - assertThat(name1, notNullValue()); - assertThat(name1.containsKey("first"), is(true)); - assertThat(name1.containsKey("last"), is(true)); - } - - // origin:http://www.java2s.com/ref/java/java-file-write-text-to-file.html - public static final boolean saveString2File(File file, String content) { - try { - BufferedWriter bw = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(file))); - bw.write(content); - bw.close(); - return true; - } catch (Exception e) { - return false; - } - } - - // http://www.java2s.com/example/java-utility-method/inputstream-read-all/readall-inputstream-in-c5be9.html - public static final String readAll(InputStream in) throws IOException { - StringBuilder bob = new StringBuilder(); - int c; - while ((c = in.read()) != -1) { - bob.append((char) c); - } - return bob.toString(); - } -} diff --git a/yaml_config_extend/src/test/resources/task_complex_config.yml b/yaml_config_extend/src/test/resources/task_complex_config.yml deleted file mode 100644 index 182672337..000000000 --- a/yaml_config_extend/src/test/resources/task_complex_config.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- -version: 3 -setting: - boolean_setting: true - integer_setting: 42 - string_setting: somethings -services: - - microservice: - name: db - image: mysql - container_name: mysql_db - restart: always - environment: - - MYSQL_ROOT_PASSWORD="secret" - - microservice: - name: web - image: apache - build: ./webapp - depends_on: - - db - - microservice: - container_name: apache_web - restart: always - property: ~ - ports: - - "8080:80" diff --git a/yaml_config_extend/src/test/resources/task_config.yml b/yaml_config_extend/src/test/resources/task_config.yml deleted file mode 100644 index 0fa996748..000000000 --- a/yaml_config_extend/src/test/resources/task_config.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -!!example.Configuration -# require for ??? -services: - - microservice: - name: db - image: mysql - - microservice: - name: web - image: apache - -settings: - boolean_setting: true - integer_setting: 42 - string_setting: somethings - -version: 3 \ No newline at end of file diff --git a/yaml_config_extend/src/test/resources/task_config_compact.yml b/yaml_config_extend/src/test/resources/task_config_compact.yml deleted file mode 100644 index 81193a1ea..000000000 --- a/yaml_config_extend/src/test/resources/task_config_compact.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -!!example.Configuration -# the type is optional -services: - - microservice: {image: 'mysql:latest', name: db} - - microservice: {image: 'alpine:python', name: web} -settings: {boolean_setting: true, integer_setting: 100, string_setting: value} -version: '2.0' \ No newline at end of file diff --git a/yaml_config_extend/src/test/resources/task_config_plain.yml b/yaml_config_extend/src/test/resources/task_config_plain.yml deleted file mode 100644 index ecf6e9eaa..000000000 --- a/yaml_config_extend/src/test/resources/task_config_plain.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -services: - - microservice: - name: db - image: mysql - - microservice: - name: web - image: apache - -settings: - boolean_setting: true - integer_setting: 42 - string_setting: somethings - -version: 3 - \ No newline at end of file From f70b73aa635c31e4c72f009948636a556bb9137f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 30 Aug 2023 15:41:21 -0700 Subject: [PATCH 036/171] removed unneded backups --- .gitmodules | 5 - Jenkinsfile | 38 - .../src/main/java/example/ChartEx.java.SAVED | 133 -- .../java/example/CommandLineParser.java.SAVED | 87 -- jcucumberng-framework/pom.xml.SAVED | 136 -- .../java/example/AutoItXLibraryGenerator.java | 71 - .../src/main/java/example/Constants.java | 93 -- .../src/main/java/example/UnsignedInt.java | 29 - .../test/java/example/EnvironmentTest.java | 47 - .../src/test/java/example/FirefoxTest.java | 245 ---- .../InternetExplorerMultiThreadTest.java | 169 --- .../java/example/InternetExplorerTest.java | 134 -- jna_autoit/src/test/java/example/Utils.java | 40 - jodl_stw/pom.xml.SAVED | 287 ---- protractor/pom.xml.saved | 146 -- remote_browser_log/pom.xml.SAVED | 530 ------- .../src/main/java/example/App.java.SAVED | 472 ------- rrd-javafx/build.gradle.SAVED | 582 -------- swet_javafx/run.cmd | 2 +- .../swet_javafx/SwetMainFlowPanel.java.SAVE | 421 ------ utils/2 | 1246 ----------------- utils/a | 1246 ----------------- utils/generate_convert.sh.SAVED | 217 --- utils/pickproject.sh.SAVED | 12 - 24 files changed, 1 insertion(+), 6387 deletions(-) delete mode 100644 .gitmodules delete mode 100644 Jenkinsfile delete mode 100644 javafx_treeview/src/main/java/example/ChartEx.java.SAVED delete mode 100644 javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED delete mode 100644 jcucumberng-framework/pom.xml.SAVED delete mode 100644 jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java delete mode 100644 jna_autoit/src/main/java/example/Constants.java delete mode 100644 jna_autoit/src/main/java/example/UnsignedInt.java delete mode 100644 jna_autoit/src/test/java/example/EnvironmentTest.java delete mode 100644 jna_autoit/src/test/java/example/FirefoxTest.java delete mode 100644 jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java delete mode 100644 jna_autoit/src/test/java/example/InternetExplorerTest.java delete mode 100644 jna_autoit/src/test/java/example/Utils.java delete mode 100644 jodl_stw/pom.xml.SAVED delete mode 100644 protractor/pom.xml.saved delete mode 100644 remote_browser_log/pom.xml.SAVED delete mode 100644 rrd-cachedb/src/main/java/example/App.java.SAVED delete mode 100644 rrd-javafx/build.gradle.SAVED delete mode 100644 swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE delete mode 100644 utils/2 delete mode 100644 utils/a delete mode 100755 utils/generate_convert.sh.SAVED delete mode 100755 utils/pickproject.sh.SAVED diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 2901cecfa..000000000 --- a/.gitmodules +++ /dev/null @@ -1,5 +0,0 @@ -[submodule "selenium_tests"] - path = selenium_tests/selenium_tests - url = https://github.com/sergueik/selenium_tests - path = cdp_webdriver/cdp_webdriver - url = https://github.com/sergueik/cdp_webdriver diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 532b37355..000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,38 +0,0 @@ -pipeline { - agent any - triggers { - pollSCM('H/5 * * * *') - } - - stages { - stage('Example') { - steps { - echo 'hello jenkins' - } - } - } -} - -node { - def mvnHome - stage('Preparation') { - git 'https://github.com/LinuxSuRen/phoenix.webui.server.git' - mvnHome = tool 'M3' - } - - stage('Build') { - if(isUnix()){ - sh "'${mvnHome}/bin/mvn' clean package" - }else{ - bat(/"${mvnHome}\bin\mvn" clean package/) - } - } - - stage('Deploy') { - if(isUnix()){ - sh "'${mvnHome}/bin/mvn' deploy -DsignSkip=false -DdocSkip=false" - }else{ - bat(/"${mvnHome}\bin\mvn" deploy -DsignSkip=false -DdocSkip=false/) - } - } -} diff --git a/javafx_treeview/src/main/java/example/ChartEx.java.SAVED b/javafx_treeview/src/main/java/example/ChartEx.java.SAVED deleted file mode 100644 index 975465473..000000000 --- a/javafx_treeview/src/main/java/example/ChartEx.java.SAVED +++ /dev/null @@ -1,133 +0,0 @@ -package example; - -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; - -// import org.apache.commons.cli.CommandLine; -// import org.apache.commons.cli.CommandLineParser; -// import org.apache.commons.cli.DefaultParser; -// import org.apache.commons.cli.Options; -// import org.apache.commons.cli.ParseException; -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVRecord; - -import example.TreeViewSample.Employee; -import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.chart.LineChart; -import javafx.scene.chart.NumberAxis; -import javafx.scene.chart.XYChart; -import javafx.scene.control.TreeItem; -import javafx.stage.Stage; - -import example.CommandLineParser; - -// import org.apache.common.commons-csv.*; -// https://www.baeldung.com/apache-commons-csv -/** - * based on Oracle's example at - * https://docs.oracle.com/javafx/2/charts/line-chart.htm#CIHGBCFI - */ - -@SuppressWarnings("restriction") -public class ChartEx extends Application { - private static String[] HEADERS = { "column1", "column2" }; - // problamatic with JDK 11 - // private static CommandLineParser commandLineparser = new DefaultParser(); - // private static CommandLine commandLine = null; - // private final static Options options = new Options(); - private final static List> data = new ArrayList<>(); - private static CommandLineParser commandLineParser; - private static String resource = "data.csv"; - - public static void main(String[] args) { - // options.addOption("h", "help", false, "Help"); - // options.addOption("d", "debug", false, "Debug"); - // options.addOption("r", "resource", true, "Resource"); - commandLineParser = new CommandLineParser(); - commandLineParser.saveFlagValue("resource"); - - commandLineParser.parse(args); - - try { - // commandLine = commandLineparser.parse(options, args); - resource = commandLineParser.getFlagValue("resource"); - // String resource = commandLine.getOptionValue("resource"); - if (resource == null) { - System.err.println("Missing required argument: resource"); - return; - } - - Reader in; - Iterable records; - in = new FileReader(resource); - records = CSVFormat.DEFAULT.withHeader(HEADERS).parse(in); - for (CSVRecord record : records) { - String columnOne = record.get("column1"); - String columnTwo = record.get("column2"); - List row = new ArrayList<>(); - row.add(Float.parseFloat(columnOne)); - row.add(Float.parseFloat(columnTwo)); - data.add(row); - } - in.close(); - data.clear(); - in = new FileReader("data.csv"); - records = CSVFormat.DEFAULT.parse(in); - for (CSVRecord record : records) { - String columnOne = record.get(0); - String columnTwo = record.get(1); - List row = new ArrayList<>(); - row.add(Float.parseFloat(columnOne)); - row.add(Float.parseFloat(columnTwo)); - data.add(row); - } - System.err.println("data: " + data); - launch(args); - // } catch (ParseException e) { - } catch (IOException e) { - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void start(Stage stage) { - - stage.setTitle("Line Chart Sample"); - // defining the axes - final NumberAxis xAxis = new NumberAxis(); - final NumberAxis yAxis = new NumberAxis(); - xAxis.setLabel("Time"); - // creating the chart - final LineChart lineChart = new LineChart<>(xAxis, yAxis); - - lineChart.setTitle("Chart"); - XYChart.Series series = new XYChart.Series(); - series.setName("Load Average"); - for (int cnt = 0; cnt != data.size(); cnt++) { - List row = data.get(cnt); - series.getData().add(new XYChart.Data(cnt, row.get(0))); - } - - XYChart.Series series1 = new XYChart.Series(); - series1.setName("Status"); - for (int cnt = 0; cnt != data.size(); cnt++) { - List row = data.get(cnt); - series1.getData().add(new XYChart.Data(cnt, row.get(1))); - } - - Scene scene = new Scene(lineChart, 800, 600); - lineChart.getData().add(series); - lineChart.getData().add(series1); - - stage.setScene(scene); - stage.show(); - } - - public static void help() { - System.exit(1); - } -} \ No newline at end of file diff --git a/javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED b/javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED deleted file mode 100644 index 8cfcd96fe..000000000 --- a/javafx_treeview/src/main/java/example/CommandLineParser.java.SAVED +++ /dev/null @@ -1,87 +0,0 @@ -package example; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -// origin: -// 50b3627fa1204747ccd871eac876ecdab80d0da9 -// https://github.com/sergueik/selenium_java/blob/master/xslt-example/src/main/java/example/CommandLineParser.java -// based on: http://www.java2s.com/Code/Java/Development-Class/ArepresentationofthecommandlineargumentspassedtoaJavaclassmainStringmethod.htm -// see also: -// https://github.com/freehep/freehep-argv/blob/master/src/main/java/org/freehep/util/argv/ArgumentParser.java - -public class CommandLineParser { - // non-flag values - private String[] arguments = null; - - public String[] getArguments() { - return arguments; - } - - private Map _flags = new HashMap<>(); - - // - // the flag values that are expected to be followed with a value - // that allows the application to process the flag. - // - private Set _flagsWithValues = new HashSet<>(); - - public Set getFlags() { - Set result = _flags.keySet(); - return result; - } - - public String getFlagValue(String flagName) { - return (String) _flags.get(flagName); - } - - public int getNumberOfArguments() { - return arguments.length; - } - - public int getNumberOfFlags() { - return _flags.size(); - } - - public boolean hasFlag(String flagName) { - return _flags.containsKey(flagName); - } - - // contains no constructor nor logic to discover unknown flags - public void parse(String[] args) { - List regularArgs = new ArrayList<>(); - - for (int n = 0; n < args.length; ++n) { - if (args[n].charAt(0) == '-') { - String name = args[n].replaceFirst("-", ""); - String value = null; - // remove the dash - - System.err.println("Examine: " + name); - if (_flagsWithValues.contains(name) && n < args.length - 1) { - value = args[++n]; - System.err.println("Collect value for: " + name + " = " + value); - } else { - - System.err.println("Ignore the value for " + name); - - } - - _flags.put(name, value); - } - - else - regularArgs.add(args[n]); - } - - arguments = (String[]) regularArgs.toArray(new String[regularArgs.size()]); - } - - public void saveFlagValue(String flagName) { - _flagsWithValues.add(flagName); - } -} diff --git a/jcucumberng-framework/pom.xml.SAVED b/jcucumberng-framework/pom.xml.SAVED deleted file mode 100644 index 727f51c79..000000000 --- a/jcucumberng-framework/pom.xml.SAVED +++ /dev/null @@ -1,136 +0,0 @@ - - - 4.0.0 - krollo.jcucumberng - jcucumberng-framework - 0.0.1-SNAPSHOT - jar - jCucumberNG-Framework - A test framework using Selenium, Cucumber, and ngWebDriver or jProtractor (Protractor) in Java - - - - UTF-8 - - ${maven.build.timestamp} - yyyyMMdd-HHmm - - 3.13.0 - 1.1.4 - 3.0.2 - 1.2.17 - 1.8 - ${project.build.directory}/jcucumberng-output - - - - - log4j - log4j - ${log4j.version} - - - org.seleniumhq.selenium - selenium-server - ${selenium.version} - test - - - - com.paulhammant - ngwebdriver - ${ngwebdriver.version} - test - - - - io.cucumber - cucumber-junit - ${cucumber.version} - test - - - - io.cucumber - cucumber-picocontainer - ${cucumber.version} - test - - - - org.assertj - assertj-core - 3.10.0 - test - - - - org.apache.logging.log4j - log4j-core - 2.11.0 - test - - - - com.itextpdf - itextpdf - 5.5.13 - - - - org.apache.poi - poi-ooxml - 3.17 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.21.0 - - - **/*Runner.java - - true - ./target/test-output/${timestamp} - - - - net.masterthought - maven-cucumber-reporting - 3.16.0 - - - execution - verify - - generate - - - Simply Do - Balance Projector - ${project.build.directory} - - ${project.build.directory}/cucumber-generated-reports/cucumber-report.json - - - **/classifications/*.properties - - false - - - - - - - diff --git a/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java b/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java deleted file mode 100644 index 6df318022..000000000 --- a/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2018 midorlo. - * - * Licensed 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. - */ -package example; - -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; - -/** - * Util Class which helped me generate the interface. Stays here - * in case I need it again. - * @author midorlo - */ -class AutoItXLibraryGenerator { - - protected static void printJavaMethods() { - Method[] methods = new AutoItX().LIB.getClass().getMethods(); - for (Method method : methods) { - System.out - .println("public " + method.getReturnType() + " " + method.getName() - + "(" + prefixPrintJavaMethods(method.getParameters()) + ") {" - + System.lineSeparator() - + ((method.getReturnType().getSimpleName().equals("void")) ? "" - : "return ") - + " LIB." + method.getName() + "(" - + paramsPrintJavaMethods(method.getParameters()) + ");" - + System.lineSeparator() + "}"); - } - } - - private static String prefixPrintJavaMethods(Parameter[] xx) { - String r = ""; - for (Parameter parameter : xx) { - r += parameter.getType().getSimpleName() + " " + parameter.getName() - + ", "; - } - if (r.length() > 0) { - r = r.substring(0, r.length() - 2); - } - return r; - } - - private static String paramsPrintJavaMethods(Parameter[] xx) { - String r = ""; - for (Parameter parameter : xx) { - r += parameter.getName() + ", "; - } - if (r.length() > 0) { - r = r.substring(0, r.length() - 2); - } - return r; - } - - public static void main(String[] args) { - String libraryPath = System.getProperty("user.dir"); - System.setProperty("java.library.path", libraryPath); - printJavaMethods(); - } -} diff --git a/jna_autoit/src/main/java/example/Constants.java b/jna_autoit/src/main/java/example/Constants.java deleted file mode 100644 index a8565218b..000000000 --- a/jna_autoit/src/main/java/example/Constants.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * - * Licensed 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. - */ -package example; - -import java.util.HashMap; -import java.util.Map; - -/** - * @via https://www.autoitscript.com/forum/topic/72905-c-use-of-the-dll-some-idears-for-you/ - * - * @author midorlo - * @author sergueik - */ -public class Constants { - - public static final int AU3_INTDEFAULT = -2147483647; - // "Default" value for _some_ final int parameters (largest negative number) - public static final int ERROR = 1; - public static final int SW_HIDE = 2; - public static final int SW_MAXIMIZE = 3; - public static final int SW_MINIMIZE = 4; - public static final int SW_RESTORE = 5; - public static final int SW_SHOW = 6; - public static final int SW_SHOWDEFAULT = 7; - public static final int SW_SHOWMAXIMIZED = 8; - public static final int SW_SHOWMINIMIZED = 9; - public static final int SW_SHOWMINNOACTIVE = 10; - public static final int SW_SHOWNA = 11; - public static final int SW_SHOWNOACTIVATE = 12; - public static final int SW_SHOWNORMAL = 13; - public static final int VERSION = 109; - - public static final int RUN_LOGON_NOPROFILE = 0; - public static final int RUN_LOGON_PROFILE = 1; - public static final int RUN_LOGON_NETWORK = 2; - public static final int RUN_LOGON_INHERIT = 4; - - // The AutoIt v3 functions return values are unusual - // for a Java program - // e.g. - // https://www.autoitscript.com/autoit3/docs/functions/WinClose.htm - // https://www.autoitscript.com/autoit3/docs/functions/WinKill.htm - // etc. illustrate the pattern: - // Success: 1. - // Failure: 0 if the window is not found, - // or can not be activated - // some functions only return success value of 1. - - // https://www.autoitscript.com/autoit3/docs/appendix/AutoItConstants.htm - // https://github.com/310ken1/AutoItSciTEj/blob/master/language/au3/Include/AutoItConstants.au3 - // TODO: rename constants used in this class - public static final int AU3_SUCCESS = 1; - public static final int AU3_FAILURE = 0; - - public static final int AU3_WINDOWS_NOONTOP = 0; - public static final int AU3_WINDOWS_ONTOP = 1; - - public static final int WIN_STATE_EXISTS = 1; - public static final int WIN_STATE_VISIBLE = 2; - public static final int WIN_STATE_ENABLED = 4; - public static final int WIN_STATE_ACTIVE = 8; - public static final int WIN_STATE_MINIMIZED = 16; - public static final int WIN_STATE_MAXIMIZED = 32; - - public static final Map stateNames = new HashMap<>(); - static { - stateNames.put(WIN_STATE_EXISTS, "Window exists"); - stateNames.put(WIN_STATE_VISIBLE, "Window is visible"); - stateNames.put(WIN_STATE_ENABLED, "Window is enabled"); - stateNames.put(WIN_STATE_ACTIVE, "Window is active"); - stateNames.put(WIN_STATE_MINIMIZED, "Window is minimized"); - stateNames.put(WIN_STATE_MAXIMIZED, "Window is maximized"); - } - - public static final int AU3_SEND_DEFAULT = 0; - public static final int AU3_SEND_RAW = 1; - - public static final String DLL = (System.getProperty("os.arch") - .equals("amd64") ? "AutoItX3_x64.dll" : "AutoItX3.dll"); -} diff --git a/jna_autoit/src/main/java/example/UnsignedInt.java b/jna_autoit/src/main/java/example/UnsignedInt.java deleted file mode 100644 index 7ed55d94a..000000000 --- a/jna_autoit/src/main/java/example/UnsignedInt.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2018 midorlo. - * - * Licensed 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. - */ -package example; - -import com.sun.jna.IntegerType; - -/** - * @author midorlo - * @author sergueik - */ -@SuppressWarnings("serial") -public class UnsignedInt extends IntegerType { - public UnsignedInt() { - super(4, true); - } -} \ No newline at end of file diff --git a/jna_autoit/src/test/java/example/EnvironmentTest.java b/jna_autoit/src/test/java/example/EnvironmentTest.java deleted file mode 100644 index 69b4a5e30..000000000 --- a/jna_autoit/src/test/java/example/EnvironmentTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * - * Licensed 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. - */ -package example; - -import java.util.Arrays; -import java.util.List; - -import org.testng.Assert; -import org.testng.annotations.Test; - -/** - * @author midorlo - * @author sergueik - */ -public class EnvironmentTest { - - /** - * Tests Plattform. This will fail on non-windows, - * and also on windows xp and older (chosen voluntarily). - */ - @Test(enabled = true) - public void testEnvironment() { - System.err.println("OS test is Running: " + System.getProperty("os.name")); - String result = System.getProperty("os.name"); - - List osNames = Arrays.asList("Windows 10", "Windows 8", - "Windows 8.1", "Windows 7", "Windows Server 2012 R2"); - Assert.assertTrue(osNames.contains(result)); - // see also: - // https://www.programcreek.com/java-api-examples/index.php?api=org.hamcrest.core.AnyOf - // NOTE: anyOf(containsString(expResult1),...) does not work with testng ? - } - -} diff --git a/jna_autoit/src/test/java/example/FirefoxTest.java b/jna_autoit/src/test/java/example/FirefoxTest.java deleted file mode 100644 index 74a357295..000000000 --- a/jna_autoit/src/test/java/example/FirefoxTest.java +++ /dev/null @@ -1,245 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.time.Duration; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; - -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebDriverException; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.chrome.ChromeOptions; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.FirefoxProfile; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.logging.LogType; -import org.openqa.selenium.logging.LoggingPreferences; -import org.openqa.selenium.remote.CapabilityType; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.ExpectedCondition; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; - -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.User32; -import com.sun.jna.platform.win32.WinDef.HWND; - -public class FirefoxTest { - - private String title = null; - private String text = ""; - private String result = null; - private AutoItX instance = null; - private static final boolean debug = true; - - // for Selenium part of the test - public int scriptTimeout = 5; - public int flexibleWait = 60; // too long - public int implicitWait = 1; - public int pollingInterval = 500; - @SuppressWarnings("unused") - private static long highlightInterval = 100; - public WebDriver driver; - public WebDriverWait wait; - public Actions actions; - public JavascriptExecutor js; - public TakesScreenshot screenshot; - - private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; - private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; - // see also: - // private final static String baseURL = - // "http://spreadsheetpage.com/index.php/file/C35/P10/" - // private final static String xpath = - // String.format"//*[@id='content']//a[contains(text(), '%s')]", "xls"); - private final static String locator = "table#table-files a.btn"; - private static final int timeout = 2000; - private static String fileType = "zip"; - private final static String xpath = String.format( - "//table[@id='table-files']//a[contains(@class,'btn')][contains(text(), '%s')]", - fileType.toUpperCase()); - private static List elements; - private static WebElement element; - private static String osName = getOSName(); - - @SuppressWarnings("deprecation") - @BeforeMethod - public void beforeMethod() throws IOException { - instance = AutoItX.getInstance(); - - System.setProperty("webdriver.gecko.driver", osName.equals("windows") - ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() - : /* String.format("%s/Downloads/geckodriver", System.getenv("HOME"))*/ - Paths.get(System.getProperty("user.home")).resolve("Downloads") - .resolve("geckodriver").toAbsolutePath().toString()); - System.setProperty("webdriver.firefox.bin", - osName.equals("windows") - // TODO: detect architecture - ? new File("c:/Program Files/Mozilla Firefox/firefox.exe") - .getAbsolutePath() - : "/usr/bin/firefox"); - // https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities - DesiredCapabilities capabilities = DesiredCapabilities.firefox(); - FirefoxProfile profile = new FirefoxProfile(); - capabilities.setCapability("marionette", false); - capabilities.setCapability(FirefoxDriver.PROFILE, profile); - try { - driver = new FirefoxDriver(capabilities); - } catch (WebDriverException e) { - e.printStackTrace(); - throw new RuntimeException( - "Cannot initialize Firefox driver: " + e.toString()); - } - - assertThat(driver, notNullValue()); - actions = new Actions(driver); - - driver.manage().timeouts().setScriptTimeout(scriptTimeout, - TimeUnit.SECONDS); - wait = new WebDriverWait(driver, flexibleWait); - - wait.pollingEvery(Duration.ofMillis(pollingInterval)); - - screenshot = ((TakesScreenshot) driver); - js = ((JavascriptExecutor) driver); - - } - - // using arrow and tab keys to select "Download" - // https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm - @Test(enabled = true) - public void testDirectURLDownoadManagerDialog() { - driver.navigate().to(directURL); - sleep(timeout); - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - System.err.println( - String.format("The active window title is \"%s\"", windowTitle)); - sleep(100); - instance.Send("{DOWN}", true); // arrow key down - sleep(100); - instance.Send("{TAB}", true); - sleep(100); - instance.Send("{TAB}", true); - sleep(100); - instance.Send("{TAB}", true); - sleep(100); - instance.Send("{ENTER}", true); - sleep(10000); - result = instance.WinGetText(title, text); - // NOTE: Mozilla Firefox Download Manager dialog button does not return any - // text of interest - assertThat(result, notNullValue()); - System.err.println(String.format("The result is \"%s\"", result)); - // Downloaded file will be found in the default location, that is - // configurable through Mozilla Firefox profile e.g. - // $env:USERPROFILE:/Downloads - sleep(1000); - - } - - @Test(enabled = false) - public void testButtonClickDownoadManagerDialog() { - driver.navigate().to(baseURL); - elements = driver.findElements(By.cssSelector(locator)); - // inventory - elements.stream().map(e -> e.getText()).forEach(System.err::println); - elements.stream().forEach(button -> { - actions.moveToElement(button).build().perform(); - highlight(button, 500); - }); - // click on a mime type in question - element = driver.findElement(By.xpath(xpath)); - assertThat(element, notNullValue()); - element.click(); - sleep(timeout); - } - - // Utilities - private static String getOSName() { - if (osName == null) { - osName = System.getProperty("os.name").toLowerCase(); - if (osName.startsWith("windows")) { - osName = "windows"; - } - } - return osName; - } - - public void sleep(Integer milliSeconds) { - try { - Thread.sleep((long) milliSeconds); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public Object executeScript(String script, Object... arguments) { - if (driver instanceof JavascriptExecutor) { - JavascriptExecutor javascriptExecutor = JavascriptExecutor.class - .cast(driver); - return javascriptExecutor.executeScript(script, arguments); - } else { - throw new RuntimeException("Script execution failed."); - } - } - - public void highlight(WebElement element) { - highlight(element, 100, "solid yellow"); - } - - public void highlight(WebElement element, long highlightInterval) { - highlight(element, highlightInterval, "solid yellow"); - - } - - public void highlight(WebElement element, long highlightInterval, - String color) { - System.err.println("Color: " + color); - if (wait == null) { - wait = new WebDriverWait(driver, flexibleWait); - } - wait.pollingEvery(Duration.ofMillis(pollingInterval)); - try { - // wait.until(ExpectedConditions.visibilityOf(element)); - executeScript(String.format("arguments[0].style.border='3px %s'", color), - element); - Thread.sleep(highlightInterval); - executeScript("arguments[0].style.border=''", element); - } catch (InterruptedException e) { - // System.err.println("Exception (ignored): " + e.toString()); - } - } - - @AfterMethod - public void afterMethod() { - - driver.get("about:blank"); - if (driver != null) { - try { - driver.close(); - driver.quit(); - } catch (Exception e) { - } - } - - } -} diff --git a/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java b/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java deleted file mode 100644 index 919a16858..000000000 --- a/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java +++ /dev/null @@ -1,169 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.net.MalformedURLException; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.ie.InternetExplorerDriver; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -public class InternetExplorerMultiThreadTest { - - @SuppressWarnings("unused") - private String title = null; - @SuppressWarnings("unused") - private String text = ""; - @SuppressWarnings("unused") - private static final int timeout = 1000; - @SuppressWarnings("unused") - private String result = null; - @SuppressWarnings("unused") - private AutoItX instance = null; - @SuppressWarnings("unused") - private static final boolean debug = true; - - public WebDriver driver; - public WebDriverWait wait; - public Actions actions; - public JavascriptExecutor js; - public TakesScreenshot screenshot; - @SuppressWarnings("unused") - private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; - private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; - @SuppressWarnings("unused") - private String originalHandle; - @SuppressWarnings("unused") - private StringBuffer verificationErrors = new StringBuffer(); - - @BeforeMethod - public void beforeMethod() throws Exception { - } - - @Test(enabled = true) - public void multiThreadTest() { - try { - App.main(new String[] { "dummy" }); - } catch (InterruptedException | MalformedURLException e) { - System.err.println("Exception (ignored) " + e.toString()); - } - } - - private static class App implements Runnable { - private String title = null; - private String text = ""; - @SuppressWarnings("unused") - private static final int timeout = 1000; - private String result = null; - private AutoItX instance = null; - private static final boolean debug = true; - public static WebDriver driver; - @SuppressWarnings("unused") - private static Set windowHandles; - Thread thread; - - App() throws InterruptedException { - thread = new Thread(this, "test"); - thread.start(); - } - - @SuppressWarnings("unused") - public void run() { - String currentHandle = null; - - try { - System.err.println("Thread: sleep 3 sec."); - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.err.println("Thread: wake."); - // With modal window, WebDriver appears to be hanging on [get current - // window handle] - instance = AutoItX.getInstance(); - - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - System.err.println( - String.format("The active window title is \"%s\"", windowTitle)); - sleep(100); - instance.Send("{DOWN}", true); // arrow key down - sleep(100); - instance.Send("{ENTER}", true); - sleep(10000); - result = instance.WinGetText(title, text); - // NOTE: Mozilla Firefox Download Manager dialog button does not return - // any - // text of interest - assertThat(result, notNullValue()); - System.err.println(String.format("The result is \"%s\"", result)); - // Downloaded file will be found in the default location, that is - } - - @SuppressWarnings("deprecation") - public static void main(String args[]) - throws InterruptedException, MalformedURLException { - - System.setProperty("webdriver.ie.driver", - "c:/java/selenium/IEDriverServer.exe"); - // Started InternetExplorerDriver server (32-bit) 2.42.0.0 - DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); - capabilities.setCapability( - InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, - true); - driver = new InternetExplorerDriver(capabilities); - // org.openqa.selenium.WebDriverException: java.net.SocketException: - // Software caused connection abort: recv failed - // https://stackoverflow.com/questions/21330079/i-o-exception-and-unable-to-find-element-in-ie-using-selenium-webdriver/21373224 - // possibly caused by incorrect IE security settings or the lagging - // iedriverserver.exe - // installing 3.14.0 (32 bit) from https://www.seleniumhq.org/download/ - // resolves the issue - // For IE Internet zones see https://github.com/allquixotic/iepmm (NOTE: - // cryptic) - - driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); - // launch second thread to monitor download dialog option - new App(); - WebDriverWait wait = new WebDriverWait(driver, 5); - wait.pollingEvery(500, TimeUnit.MILLISECONDS); - Actions actions = new Actions(driver); - - System.err.println("Navigating to: " + directURL); - driver.navigate().to(directURL); - - System.err.println("main: sleeping 10 sec"); - - Thread.sleep(10000); - System.err.println("main: closing the browser window"); - driver.close(); - System.err.println("main: quitting the browser"); - driver.quit(); - } - - public void sleep(Integer milliSeconds) { - try { - if (debug) { - System.err.println("Sleeping " + milliSeconds + " milliseconds."); - } - Thread.sleep((long) milliSeconds); - } catch ( - - InterruptedException e) { - e.printStackTrace(); - } - } - - } - -} \ No newline at end of file diff --git a/jna_autoit/src/test/java/example/InternetExplorerTest.java b/jna_autoit/src/test/java/example/InternetExplorerTest.java deleted file mode 100644 index 979abfe4c..000000000 --- a/jna_autoit/src/test/java/example/InternetExplorerTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.util.concurrent.TimeUnit; - -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.ie.InternetExplorerDriver; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -public class InternetExplorerTest { - - private String title = null; - private String text = ""; - private static final int timeout = 1000; - private String result = null; - private AutoItX instance = null; - private static final boolean debug = true; - - public WebDriver driver; - public WebDriverWait wait; - public Actions actions; - public JavascriptExecutor js; - public TakesScreenshot screenshot; - @SuppressWarnings("unused") - private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; - private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; - private String originalHandle; - @SuppressWarnings("unused") - private StringBuffer verificationErrors = new StringBuffer(); - - @SuppressWarnings("deprecation") - @BeforeMethod - public void beforeMethod() throws Exception { - instance = AutoItX.getInstance(); - System.setProperty("webdriver.ie.driver", - "c:/java/selenium/IEDriverServer.exe"); - // Started InternetExplorerDriver server (32-bit) 2.42.0.0 - DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); - capabilities.setCapability( - InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, - true); - driver = new InternetExplorerDriver(capabilities); - // org.openqa.selenium.WebDriverException: java.net.SocketException: - // Software caused connection abort: recv failed - // https://stackoverflow.com/questions/21330079/i-o-exception-and-unable-to-find-element-in-ie-using-selenium-webdriver/21373224 - // possibly caused by incorrect IE security settings or the lagging - // iedriverserver.exe - // installing 3.14.0 (32 bit) from https://www.seleniumhq.org/download/ - // resolves the issue - // For IE Internet zones see https://github.com/allquixotic/iepmm (NOTE: - // cryptic) - - originalHandle = driver.getWindowHandle(); - System.err.println("The current window handle " + originalHandle); - - driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); - } - - @Test(enabled = false) - public void testDirectDownload() { - // System.err.println("Getting: " + directURL); - // driver.get(directURL); - System.err.println("Navigating to: " + directURL); - driver.navigate().to(directURL); - // IE and Java surefire hangs here: - // Windows Internet Explorer - // "What do you want to do with zip_9MB.zip" - - // is a modal dialog. - sleep(timeout); - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - System.err.println( - String.format("The active window title is \"%s\"", windowTitle)); - sleep(100); - instance.Send("{DOWN}", true); // arrow key down - sleep(100); - instance.Send("{ENTER}", true); - sleep(10000); - result = instance.WinGetText(title, text); - // NOTE: Mozilla Firefox Download Manager dialog button does not return any - // text of interest - assertThat(result, notNullValue()); - System.err.println(String.format("The result is \"%s\"", result)); - // Downloaded file will be found in the default location, that is - - } - - @AfterMethod - public void afterMethod() { - - if (debug) { - System.err.println("navigating to blank page"); - } - driver.get("about:blank"); - if (driver != null) { - try { - if (debug) { - System.err.println("closing the browser window " + originalHandle); - } - driver.close(); - if (debug) { - System.err.println("quitting the browser " + originalHandle); - } - driver.quit(); - } catch (Exception e) { - System.err.println("Exception (ignored)" + e.toString()); - } - } - } - - public void sleep(Integer milliSeconds) { - try { - if (debug) { - System.err.println("Sleeping " + milliSeconds + " milliseconds."); - } - Thread.sleep((long) milliSeconds); - } catch ( - - InterruptedException e) { - e.printStackTrace(); - } - - } -} diff --git a/jna_autoit/src/test/java/example/Utils.java b/jna_autoit/src/test/java/example/Utils.java deleted file mode 100644 index 99b9dca10..000000000 --- a/jna_autoit/src/test/java/example/Utils.java +++ /dev/null @@ -1,40 +0,0 @@ -package example; - -import java.net.*; -import org.openqa.selenium.WebDriver; -import java.io.*; - -// origin: https://gist.github.com/daluu/4411221 -public class Utils { - - // for download completion and validation readiness - public static String downloadFileDirect(String url, String filenamePrefix, - String fileExtension, WebDriver driver) throws Exception { - // request setup... - URLConnection request = null; - request = new URL(url).openConnection(); - // extract session cookie from browser and use with HTTP request calls - final String sessionCookie = "PHPSESSID"; - request.setRequestProperty("Cookie", String.format("%s=%s", sessionCookie, - driver.manage().getCookieNamed(sessionCookie).getValue())); - // other headers as needed... - // handle the download file request and return temp file path - // optionally check for HTTP status code 200 - InputStream in = request.getInputStream(); - File downloadedFile = File.createTempFile(filenamePrefix, fileExtension); - FileOutputStream out = new FileOutputStream(downloadedFile); - byte[] buffer = new byte[1024]; - int len = in.read(buffer); - while (len != -1) { - out.write(buffer, 0, len); - len = in.read(buffer); - if (Thread.interrupted()) { - throw new InterruptedException(); - } - } - in.close(); - out.close(); - return downloadedFile.getAbsolutePath(); - } - -} diff --git a/jodl_stw/pom.xml.SAVED b/jodl_stw/pom.xml.SAVED deleted file mode 100644 index 721c84dc3..000000000 --- a/jodl_stw/pom.xml.SAVED +++ /dev/null @@ -1,287 +0,0 @@ - - - 4.0.0 - example - canvasex - 0.0.1-SNAPSHOT - jar - ${project.groupId}:${project.artifactId} - - - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - - - - - CanvasEx - UTF-8 - 1.10 - 1.3 - 2.5 - 3.3.1 - 4.3 - 3.3.0-I20070606-0010 - org.eclipse.swt.win32.win32.x86_64 - 1.3 - 1.8 - 4.5.2 - 4.12 - 1.2.17 - 2.11.1 - 3.6.1 - 1.8 - 2.20 - 3.0.2 - 1.8 - - - - org.apache.logging.log4j - log4j-core - ${log4j-core.version} - - - org.apache.logging.log4j - log4j-api - ${log4j-core.version} - - - log4j - log4j - ${log4j.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - test - - - org.eclipse.swt - ${eclipse.swt.artifactId} - ${eclipse.swt.version} - - - org.eclipse - jface - ${jface.version} - - - net.java.dev.jna - jna-platform - ${jna-platform.version} - - - commons-configuration - commons-configuration - ${commons-configuration.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - junit - junit - ${junit.version} - - - - org.jogamp.jogl - jogl-all-main - 2.3.2 - - - - - org.jogamp.gluegen - gluegen-rt - 2.3.2 - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - utf-8 - -Xlint:all - true - true - - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - ${project.build.sourceEncoding} - -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp - - - - - - - windows32 - - - windows - x86 - - - - win32 - org.eclipse.swt.win32.win32.x86 - - - - windows64 - - - dos - amd64 - - - - org.eclipse.swt.win32.win32.x86_64 - win64 - - - - - windows64_2 - - - windows - amd64 - - - - win64 - org.eclipse.swt.win32.win32.x86_64 - - - - mac64 - - - mac - x86_64 - - - - mac64 - org.eclipse.swt.cocoa.macosx.x86_64 - 2.48.0 - - - - - unix32 - - - unix - i386 - - - - unix32 - 2.53.1 - org.eclipse.swt.gtk.linux.x86 - - - - unix64 - - - unix - amd64 - - - - unix64 - org.eclipse.swt.gtk.linux.x86_64 - - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - maven-central - maven central repo - https://mvnrepository.com/repos/central - - - osgeo - osgeo repo - http://download.osgeo.org/webdav/geotools/ - - - seasar - seasar repo - https://www.seasar.org/maven/maven2 - - - jcenter - https://jcenter.bintray.com/ - - - swt-repo - https://swt-repo.googlecode.com/svn/repo/ - - - central - http://central.maven.org/maven2/ - - - diff --git a/protractor/pom.xml.saved b/protractor/pom.xml.saved deleted file mode 100644 index 0a110ecf0..000000000 --- a/protractor/pom.xml.saved +++ /dev/null @@ -1,146 +0,0 @@ - - - 4.0.0 - com.jprotractor - jprotractor - 1.1-SNAPSHOT - jar - ${project.groupId}:${project.artifactId} - jProtractor is a port of Angular Protractor functionality to Java. - https://github.com/caarlos0/jprotractor - - - Carlos Alexandro Becker - caarlos0@gmail.com - - https://github.com/caarlos0 - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - 1.3 - 2.5 - 2.6 - 4.0 - 1.7 - 4.12 - 1.7 - 1.7 - 2.0.2 - 1.2.1 - 2.53.1 - 2.53.1 - - - - commons-lang - commons-lang - ${commons-lang.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - com.jcabi - jcabi-matchers - 1.3 - test - - - com.codeborne - phantomjsdriver - ${phantomjsdriver.version} - - - org.seleniumhq.selenium - selenium-remote-driver - - - - - junit - junit - ${junit.version} - test - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - true - - false - - - - unit-tests - test - - test - - - - false - - - **/*Test.java - - - - **/*IntegrationTest.java - - - - - integration-tests - integration-test - - test - - - - false - - - **/*IntegrationTest.java - - - - - - - - \ No newline at end of file diff --git a/remote_browser_log/pom.xml.SAVED b/remote_browser_log/pom.xml.SAVED deleted file mode 100644 index a492d9c1f..000000000 --- a/remote_browser_log/pom.xml.SAVED +++ /dev/null @@ -1,530 +0,0 @@ - - - - 4.0.0 - example - logging - jar - 0.1.0-SNAPSHOT - logging - http://maven.apache.org - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - ${encoding} - ${encoding} - chrome - 1.3 - 2.7 - 3.0.1 - 1.3 - 2.0.4 - 2.37.0 - 1.8 - 20080701 - [2.9.10,) - - 2.9.9 - 2.9.10.7 - 1.11.3 - 4.13.2 - 2.13.2 - 3.6.0 - 1.8 - 1.8 - 3.1.0 - 2.20 - 0.9.5 - 1.4.4 - - 4.0.0-alpha-2 - - 3.141.59 - 3.13.0 - ${selenium.version} - ${selenium.version} - ${selenium.version} - - 1.26 - 3.25.2 - - 6.14.3 - 1.4.9 - 2.8.5 - 23.1 - 4.3.0 - 1.1.0 - 1.0.2 - 1.3.0 - 2.12.0 - - - - io.rest-assured - rest-assured - ${rest-assured.version} - - - - - com.eclipsesource.minimal-json - minimal-json - ${minimal-json.version} - - - xerces - xercesImpl - ${xerces.version} - - - com.rationaleemotions - simple-ssh - ${simple-ssh.version} - - - org.apache.sshd - sshd-core - ${sshd-core.version} - test - - - org.exparity - hamcrest-date - ${hamcrest-date.version} - - - org.mongodb - mongo-java-driver - 3.6.1 - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - test - - - net.sourceforge.htmlunit - htmlunit - ${htmlunit.version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-databind.version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${jackson.version} - - - org.jsoup - jsoup - ${jsoup.version} - - - com.google.code.gson - gson - ${gson.version} - - - - com.google.guava - guava - - - - - com.sikulix - sikulixapi - ${sikulixapi.version} - - - org.apache.logging.log4j - log4j-core - ${log4j.version} - - - org.apache.commons - - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - junit - junit - ${junit.version} - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - - - org.seleniumhq.selenium - selenium-chrome-driver - ${selenium-chrome-driver.version} - - - org.seleniumhq.selenium - selenium-ie-driver - ${selenium-ie-driver.version} - - - org.seleniumhq.selenium - selenium-server - ${selenium.version} - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - com.codeborne - phantomjsdriver - ${phantomjsdriver.version} - test - - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - - - org.json - json - ${json.version} - - - org.yaml - snakeyaml - ${snakeyaml.version} - - - org.xerial - sqlite-jdbc - ${sqlite-jdbc.version} - - - com.mashape.unirest - unirest-java - ${unirest-java.version} - - - org.testng - testng - ${testng.version} - - - junit - junit - - - - - - - - com.opera - firefoxdriver - 1.1 - - - org.seleniumhq.selenium - selenium-remote-driver - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - ${encoding} - - -Xlint:all - -Xlint:-processing - - - - true - true - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - ${encoding} - - - - - src/test/resources/testng.xml - - - -Dfile.encoding=${encoding} - - true - - - - unit-tests - test - - test - - - false - - ${browser.name} - ${selenium.version} - ${property.filepath} - - - - - - - org.apache.maven.plugins - ${maven-resources-plugin.version} - maven-resources-plugin - - ${encoding} - - - - - - - properties - - - target/classes - sergueik2016 - automationnewuser24@gmail.com - ${env.TEST_PASSWORD} - - - - - - org.codehaus.mojo - properties-maven-plugin - 1.0.0 - - - generate-resources - - write-project-properties - - - - ${project.build.outputDirectory}/test.properties - - - - - - - - - - false - - - - chrome - - chrome - - - true - - - - edge - - edge - - - - firefox - - firefox - - - - - yandex - - yandex - - - - com.opera - operadriver - 0.7.3 - - - - - - - maven-central - maven central repo - https://mvnrepository.com/repos/central - - - osgeo - osgeo repo - https://download.osgeo.org/webdav/geotools/ - - - seasar - seasar repo - https://www.seasar.org/maven/maven2 - - - jcenter - https://jcenter.bintray.com/ - - - swt-repo - https://swt-repo.googlecode.com/svn/repo/ - - - central - https://repo1.maven.org/maven2/ - - - consol - https://labs.consol.de/maven/repository/ - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - project.local - project - file:${project.basedir}/repo - - - diff --git a/rrd-cachedb/src/main/java/example/App.java.SAVED b/rrd-cachedb/src/main/java/example/App.java.SAVED deleted file mode 100644 index e6d5b31dc..000000000 --- a/rrd-cachedb/src/main/java/example/App.java.SAVED +++ /dev/null @@ -1,472 +0,0 @@ -package example; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - -import java.io.BufferedReader; -import java.io.InputStreamReader; - -import org.rrd4j.ConsolFun; -import org.rrd4j.DsType; -import org.rrd4j.core.RrdDb; -import org.rrd4j.core.RrdMemoryBackendFactory; -import java.lang.IllegalArgumentException; - -import java.io.File; -import java.io.IOException; -import java.net.URL; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.ArrayList; -import java.util.Random; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.junit.Assert; -import org.junit.Test; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.hasKey; -import static org.hamcrest.Matchers.equalTo; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.RowId; - -// https://bitbucket.org/xerial/sqlite-jdbc -// https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlrowid.html - -public class App { - - private static final Random r = new Random(); - private static Connection connection = null; - private static String osName = getOSName(); - public static final int INVALID_OPTION = 42; - private Map flags = new HashMap<>(); - private static Map> dsMap = new HashMap<>(); - - private static boolean debug = false; - private static boolean save = false; - private static boolean verifylinks = false; - - private static String dbhost = null; - private static String database = null; - private static int dbport = 3306; - private static String database_table = null; - private static String database_user = null; - private static String database_password = null; - - private final static Options options = new Options(); - private static CommandLineParser commandLineparser = new DefaultParser(); - private static CommandLine commandLine = null; - - public static void main(String args[]) throws ParseException { - options.addOption("h", "help", false, "Help"); - options.addOption("d", "debug", false, "Debug"); - options.addOption("s", "save", false, "Save"); - options.addOption("s", "save", false, "Save"); - options.addOption("p", "path", true, "Path to scan"); - options.addOption("v", "verifylinks", false, - "verify file links that are found during scan"); - options.addOption("r", "reject", true, "folder(s) to reject"); - - options.addOption("z", "dbhost", true, "database host"); - options.addOption("y", "dbport", true, "database port"); - options.addOption("w", "database", true, "database"); - options.addOption("u", "user", true, "database user"); - options.addOption("t", "table", true, "database table"); - options.addOption("z", "password", true, "database password"); - - commandLine = commandLineparser.parse(options, args); - if (commandLine.hasOption("h")) { - help(); - } - if (commandLine.hasOption("d")) { - debug = true; - } - if (commandLine.hasOption("verifylinks")) { - verifylinks = true; - } - - if (commandLine.hasOption("save")) { - save = true; - } - - dbhost = commandLine.getOptionValue("dbhost"); - if (dbhost == null) { - System.err.println("Missing argument: dbhost. Using default"); - dbhost = "localhost"; - } - - try { - dbport = Integer.parseInt(commandLine.getOptionValue("dbport")); - } catch (Exception e) { - System.err.println("Missing argument: dbport. Using default"); - dbport = 3306; - } - - database = commandLine.getOptionValue("database"); - if (database == null) { - System.err.println("Missing argument: database. Using default"); - database = "test"; - } - - database_user = commandLine.getOptionValue("user"); - if (database_user == null) { - System.err.println("Missing argument: database_user. Using default"); - database_user = "java"; - } - - database_table = commandLine.getOptionValue("table"); - if (database_table == null) { - System.err.println("Missing argument: database_table. Using default"); - database_table = "cache_table"; - } - - database_password = commandLine.getOptionValue("password"); - if (database_password == null) { - System.err.println("Missing argument: database_password. Using default"); - database_password = "password"; - } - try { - testJDBCConnection(); - } catch (Exception e) { - System.err.println("Excetpion (ignored)" + e.toString()); - } - String path = commandLine.getOptionValue("path"); - if (path == null) { - System.err.println("Missing required argument: path"); - return; - } - String collect = commandLine.getOptionValue("collect"); - String reject = commandLine.getOptionValue("reject"); - - try { - List collectFolders = collect == null ? new ArrayList<>() - : Arrays.asList(collect.split(",")); - List rejectFolders = reject == null ? new ArrayList<>() - : Arrays.asList(reject.split(",")); - if (collectFolders.size() != 0 || rejectFolders.size() != 0) { - dsMap = listFilesDsNames(path, collectFolders, rejectFolders); - } else { - dsMap = listFilesDsNames(path); - } - } catch (IOException e) { - } - - if (save) { - createTable(); - saveData(dsMap); - displayData(); - } - if (debug) { - System.err.println("Done: " + path); - } - - } - - private static void displayData() { - try { - Statement statement = connection.createStatement(); - statement.setQueryTimeout(30); - - ResultSet rs = statement.executeQuery( - "SELECT DISTINCT fname, ds FROM cache ORDER BY fname, ds"); - while (rs.next()) { - System.err.println("fname = " + rs.getString("fname") + "\t" + "ds = " - + rs.getString("ds")); - } - statement.close(); - statement = connection.createStatement(); - statement.executeUpdate("delete from cache"); - } catch (SQLException e) { - System.err.println(e.getMessage()); - } finally { - try { - if (connection != null) - connection.close(); - } catch (SQLException e) { - System.err.println(e); - } - } - } - - private static void createTable() { - - try { - Class.forName("org.sqlite.JDBC"); - connection = DriverManager.getConnection("jdbc:sqlite::memory:"); - Statement statement = connection.createStatement(); - statement.setQueryTimeout(30); - String sql = String.format( - "CREATE TABLE IF NOT EXISTS %s " - + "(id INT PRIMARY KEY NOT NULL, ds CHAR(50) NOT NULL, fname CHAR(50) NOT NULL)", - "cache"); - statement.executeUpdate(sql); - statement.close(); - - } catch (ClassNotFoundException | SQLException e) { - System.err.println(e.getMessage()); - return; - } - } - - private static void saveData(Map> dsMap) { - dsMap.entrySet().stream().forEach(o -> { - String fname = o.getKey(); - o.getValue().stream().forEach(ds -> { - try { - Statement statement = connection.createStatement(); - statement.setQueryTimeout(30); - - PreparedStatement preparedStatement = connection.prepareStatement( - "INSERT INTO cache (id, fname, ds) VALUES (?, ?, ?)"); - int id = r.nextInt(1_000_000_000); - preparedStatement.setInt(1, id); - preparedStatement.setString(2, fname); - preparedStatement.setString(3, ds); - preparedStatement.execute(); - - } catch (SQLException e) { - System.err.println(e.getMessage()); - } - - }); - }); - - } - - @SuppressWarnings("unused") - private static Map> listFilesDsNames(String path, - List collectFolders, List rejectFolders) - throws IOException { - - final List result = new ArrayList<>(); - final Map> dsMap = new HashMap<>(); - Path basePath = Paths.get(path); - final String basePathUri = new URL( - getDataFileUri(basePath.toAbsolutePath().toString())).getFile() + "/"; - System.err.println("Scanning path: " + basePathUri); - List folders = new ArrayList<>(); - // Probably quite sub-optimal - try (Stream walk = Files.walk(basePath)) { - - folders = walk.filter(Files::isDirectory).filter(o -> { - String key = o.getFileName().toString(); - System.err.println("inspect: " + key); - boolean status = true; - if ((collectFolders.size() > 0 && !collectFolders.contains(key)) - || rejectFolders.size() > 0 && rejectFolders.contains(key)) { - status = false; - } - System.err.println("status: " + status); - return status; - }).collect(Collectors.toList()); - } - - for (Path folder : folders) { - Stream walk = Files.walk(folder); - walk.filter(Files::isRegularFile) - .filter(o -> o.getFileName().toString().matches(".*rrd$")) - .forEach(o -> { - System.err.println("add: " + o.getFileName().toString()); - result.add(o); - }); - } - result.stream().forEach(o -> { - try { - List dsList = new ArrayList<>(); - URL url = new URL(getDataFileUri(o.toAbsolutePath().toString())); - final String key = url.getFile().replaceFirst(basePathUri, "") - .replaceAll("/", ":").replaceFirst(".rrd$", ""); - System.err.println("Reading RRD file: " + key); - RrdDb rrd = RrdDb.getBuilder().setPath("test") - .setRrdToolImporter(url.getFile()) - .setBackendFactory(new RrdMemoryBackendFactory()).build(); - for (int cnt = 0; cnt != rrd.getDsCount(); cnt++) { - String ds = rrd.getDatasource(cnt).getName(); - System.err.println(String.format("ds[%d]= \"%s\"", cnt, ds)); - assertThat(ds, notNullValue()); - dsList.add(ds); - } - dsMap.put(key, dsList); - } catch (IllegalArgumentException | IOException e) { - System.err.println("Exception (ignored): " + e.toString()); - } - }); - assertThat(dsMap, notNullValue()); - return dsMap; - } - - private static Map> listFilesDsNames(String path) - throws IOException { - /* return listFilesDsNames(path, new ArrayList(), - new ArrayList()); - */ - - final Map> dsMap = new HashMap<>(); - Path basePath = Paths.get(path); - // NOTE: do not use File.separator - final String basePathUri = new URL( - getDataFileUri(basePath.toAbsolutePath().toString())).getFile() + "/"; - System.err.println("Scanning path: " + basePathUri); - // origin: - // https://github.com/mkyong/core-java/blob/master/java-io/src/main/java/com/mkyong/io/api/FilesWalkExample.java - // sub-optimal - List result; - List result2; - // - try (Stream walk = Files.walk(basePath)) { - result = walk.filter(Files::isRegularFile) - .filter(o -> o.getFileName().toString().matches(".*rrd$")) - .collect(Collectors.toList()); - } - // NOTE: streams are not meant to be reused - if (verifylinks) { - try (Stream walk = Files.walk(basePath)) { - result2 = walk.filter(Files::isSymbolicLink).filter(o -> { - try { - Path targetPath = Files.readSymbolicLink(o.toAbsolutePath()); - System.err.println("Testing link " + o.getFileName().toString() - + " target path " + targetPath.toString()); - - File target = new File(String.format("%s/%s", - o.getParent().toAbsolutePath(), targetPath.toString())); - if (target.exists() && target.isFile()) - System.err.println("Valid link " + o.getFileName().toString() - + " target path " + target.getCanonicalPath()); - return true; - } catch (IOException e) { - // fall through - } - return false; - }).filter(o -> o.getFileName().toString().matches(".*rrd$")) - .collect(Collectors.toList()); - } - } - // NOTE: streams are not meant to be reused - if (debug) { - System.err.println("RRD File paths: " - + result.stream().map(o -> o.toAbsolutePath().toString()) - .collect(Collectors.toList()).toString()); - return null; - } else { - result.stream().forEach(o -> { - try { - List dsList = new ArrayList<>(); - URL url = new URL(getDataFileUri(o.toAbsolutePath().toString())); - final String key = url.getFile().replaceFirst(basePathUri, "") - .replaceAll("/", ":").replaceFirst(".rrd$", ""); - System.err.println("Reading RRD file: " + key); - RrdDb rrd = RrdDb.getBuilder().setPath("test") - .setRrdToolImporter(url.getFile()) - .setBackendFactory(new RrdMemoryBackendFactory()).build(); - for (int cnt = 0; cnt != rrd.getDsCount(); cnt++) { - String ds = rrd.getDatasource(cnt).getName(); - System.err.println(String.format("ds[%d]= \"%s\"", cnt, ds)); - assertThat(ds, notNullValue()); - dsList.add(ds); - } - dsMap.put(key, dsList); - } catch (IllegalArgumentException | IOException e) { - System.err.println("Exception (ignored): " + e.toString()); - } - }); - assertThat(dsMap, notNullValue()); - return dsMap; - } - - } - - private static String getOSName() { - if (osName == null) { - osName = System.getProperty("os.name").toLowerCase(); - if (osName.startsWith("windows")) { - osName = "windows"; - } - } - return osName; - } - - private static String getDataFileUri(String dataFilePath) { - return osName.equals("windows") - ? "file:///" + dataFilePath.replaceAll("\\\\", "/") - : "file://" + dataFilePath; - } - - public static void testJDBCConnection() throws Exception { - try { - Class driverObject = Class.forName("org.gjt.mm.mysql.Driver"); - System.out.println("driverObject=" + driverObject); - - final String url = "jdbc:mysql://" + dbhost + ":" + dbport + "/" - + database; - Connection connection = DriverManager.getConnection(url, database_user, - database_password); - if (connection != null) { - System.out.println("Connected to product: " - + connection.getMetaData().getDatabaseProductName()); - System.out.println("Connected to catalog: " + connection.getCatalog()); - // System.out.println("Connected to: " + connection.getSchema()); - // java.sql.SQLFeatureNotSupportedException: Not supported - - PreparedStatement preparedStatement = connection.prepareStatement(String - .format("INSERT INTO %s (ins_date, fname, ds) VALUES (now(), ?, ?)", - database_table)); - - preparedStatement.setString(1, "fname"); - preparedStatement.setString(2, "ds0"); - // preparedStatement.setInt(2, 2); - // preparedStatement.setInt(3, 42); - preparedStatement.execute(); - - Statement statement = connection.createStatement(); - statement.setQueryTimeout(30); - ResultSet resultSet = statement.executeQuery(String - .format("SELECT id, fname, ds, expose FROM %s", database_table)); - while (resultSet.next()) { - System.out.println("fname = " + resultSet.getString("fname") + "\\t" - + "ds = " + resultSet.getString("ds") + "\\t" + "expose = " - + resultSet.getString("expose") + "\\t" + "id = " - + resultSet.getInt("id")); - } - - } else { - System.out.println("Failed to connect"); - } - } catch (Exception e) { - System.out.println("Exception: " + e.getMessage()); - e.printStackTrace(); - } - } - - public static void help() { - System.exit(1); - } - -} - diff --git a/rrd-javafx/build.gradle.SAVED b/rrd-javafx/build.gradle.SAVED deleted file mode 100644 index 425d89ed9..000000000 --- a/rrd-javafx/build.gradle.SAVED +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright 2018-2020 Frederic Thevenet - * - * Licensed 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. - */ - - -import org.gradle.api.internal.file.copy.CopyAction -import org.gradle.api.internal.file.copy.CopyActionProcessingStream - -import java.nio.file.Files -import java.nio.file.Paths -import java.nio.file.StandardCopyOption -import java.text.SimpleDateFormat -import java.time.Duration - -plugins { - id "de.undercouch.download" version "4.1.1" - id 'org.kordamp.gradle.markdown' version '2.2.0' - id "com.github.ben-manes.versions" version "0.38.0" - id "de.marcphilipp.nexus-publish" version "0.4.0" apply false - id "signing" -} - -ext.IS_TAG = System.getenv('IS_TAG') != null ? System.getenv('IS_TAG') == "true" : false -ext.IS_RELEASE = IS_TAG && !(System.getenv('REPO_TAG_NAME').endsWith('-SNAPSHOT')) -ext.IS_BETA = false -ext.BINJR_BETA_VERSION = "0.0.0" -ext.BINJR_VERSION_STEM = "3.0.2" -ext.BINJR_VERSION = "${BINJR_VERSION_STEM}${IS_RELEASE ? '' : '-SNAPSHOT'}" -ext.BINJR_BUILD_NUMBER = System.getenv('BINJR_BUILD_NUMBER') == null ? ("000") : System.getenv('BINJR_BUILD_NUMBER') -ext.GROUP_ID = 'eu.binjr' -ext.LICENSE_NAME = 'Apache License, Version 2.0' -ext.LICENSE_URL = 'http ://www.apache.org/licenses/LICENSE-2.0.txt' -ext.LICENSE_DISTRIBUTION = 'repo' -ext.BINJR_COPYRIGHT = "Copyright (c) 2016-2021 Frederic Thevenet" -ext.BINJR_DESCRIPTION = "A Time Series Browser" -ext.OS_NAME = System.getProperty("os.name").toLowerCase() -ext.OS_ARCH = System.getProperty("os.arch") -ext.IS_64 = OS_ARCH.toLowerCase().contains("64") -ext.IS_MAC = OS_NAME.contains("mac") || OS_NAME.contains("darwin") -ext.IS_WINDOWS = OS_NAME.contains("windows") -ext.IS_LINUX = OS_NAME.contains("linux") -ext.OS_FAMILY = IS_MAC ? 'mac' : IS_WINDOWS ? 'windows' : IS_LINUX ? 'linux' : 'unsupported' -ext.JDK_HOME = System.getProperty("java.home") -ext.OPENJFX_VERSION = "16" -ext.OPENJFX_PLATEFORM_CLASSIFIER = IS_MAC ? 'mac' : IS_WINDOWS ? 'win' : IS_LINUX ? 'linux' : 'unsupported' -ext.OPENJFX_JMODS_DOWNLOAD_URL = "https://gluonhq.com/download/javafx-${OPENJFX_VERSION.replaceAll("ea\\+[0-9]+", "ea").replace(".", "-")}-jmods-${OS_FAMILY}" -ext.DL_CACHE_PATH = System.getProperty("java.io.tmpdir") + "/gradle_dl_cache/" - -ext.JLINK_ADD_MODULES = "javafx.controls," + - "javafx.fxml," + - "javafx.swing," + - "java.base," + - "java.prefs," + - "java.sql," + - "java.xml," + - "java.management," + - "java.rmi," + - "jdk.localedata," + - "java.management.rmi," + - "jdk.management.agent," + - "jdk.security.auth,jdk.management," + - "jdk.management.jfr," + - "jdk.zipfs," + - "jdk.unsupported.desktop," + - "jdk.crypto.ec," + - "jdk.crypto.cryptoki" + - "${IS_WINDOWS ? ",jdk.crypto.mscapi" : ""}" - -ext.DISTRIBUTION_NAME = "${project.name}-${BINJR_VERSION}_${OS_FAMILY}-${OS_ARCH}" -ext.APP_IMAGE_ROOT = "${buildDir}/app_image/${DISTRIBUTION_NAME}" -ext.APP_IMAGE_PATH = IS_WINDOWS ? "${APP_IMAGE_ROOT}" : "${APP_IMAGE_ROOT}/${BINJR_VERSION}" -ext.WIX_HOME = System.getenv("WIX") -ext.ARTIFACTS_PATH = file("${buildDir}/artifacts/") -ext."signing.keyId" = System.getenv('GPG_KEY_NAME') -ext."signing.secretKeyRingFile" = System.getenv('GPG_KEYRING_PATH') -ext."signing.password" = System.getenv('GPG_PASSPHRASE') - -System.out.println("Building version: ${BINJR_VERSION}") -System.out.println("Is tag: ${IS_TAG}") -System.out.println("Is release: ${IS_RELEASE}") - - -if (IS_TAG && System.getenv('REPO_TAG_NAME') != "v${BINJR_VERSION}") { - throw new GradleException("Tag name [${System.getenv('REPO_TAG_NAME')}] does not match version [${BINJR_VERSION}]") -} - -configure(subprojects) { - if (project == project(':binjr-app')) - apply plugin: 'application' - else - apply plugin: 'java-library' - apply plugin: "de.marcphilipp.nexus-publish" - apply plugin: "signing" - group GROUP_ID - version BINJR_VERSION - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - description BINJR_DESCRIPTION - compileJava.options.encoding = 'UTF-8' - - if (project != project(':binjr-app')) { - project.javadoc { - options.encoding = 'UTF-8' - options.tags = ["XmlJavaTypeAdapter", "XmlJavaTypeAdapters"] - } - - dependencies { - testImplementation('org.junit.jupiter:junit-jupiter-api:5.7.1') - testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.7.1') - compileOnly "org.openjfx:javafx-base:$OPENJFX_VERSION:$OPENJFX_PLATEFORM_CLASSIFIER" - compileOnly "org.openjfx:javafx-graphics:$OPENJFX_VERSION:$OPENJFX_PLATEFORM_CLASSIFIER" - compileOnly "org.openjfx:javafx-controls:$OPENJFX_VERSION:$OPENJFX_PLATEFORM_CLASSIFIER" - compileOnly "org.openjfx:javafx-fxml:$OPENJFX_VERSION:$OPENJFX_PLATEFORM_CLASSIFIER" - compileOnly "org.openjfx:javafx-swing:$OPENJFX_VERSION:$OPENJFX_PLATEFORM_CLASSIFIER" - } - } - - repositories { - mavenLocal() - mavenCentral() - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots' - } - } - - publishing { - publications { - mavenJava(MavenPublication) { - artifactId = project.name - if (project != project(':binjr-app')) { - from components.java - } - pom { - name = project.name - description = 'A Time Series Data Browser' - url = 'https://binjr.eu' - if (project == project(':binjr-app')) { - packaging = 'pom' - } else { - packaging = 'jar' - } - licenses { - license { - name = 'The Apache License, Version 2.0' - url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution = 'repo' - } - } - developers { - developer { - id = 'fthevenet' - name = 'Frederic Thevenet' - } - } - scm { - connection = 'scm:git:https://github.com/binjr/binjr.git' - developerConnection = 'scm:git:https://github.com/binjr/binjr.git' - url = 'https://github.com/binjr/binjr' - } - if (project == project(':binjr-app')) { - withXml { - Node pluginNode = asNode().appendNode('build') - .appendNode('plugins') - .appendNode('plugin') - pluginNode.appendNode('groupId', 'org.codehaus.mojo') - pluginNode.appendNode('artifactId', 'exec-maven-plugin') - pluginNode.appendNode('version', '1.2.1') - pluginNode.appendNode('executions') - .appendNode('execution') - .appendNode('goals') - .appendNode('goal', 'java') - pluginNode.appendNode('configuration') - .appendNode('mainClass', 'eu.binjr.core.Bootstrap') - - Node depsNode = asNode().appendNode('dependencies') - project.configurations.runtimeClasspath.each { - if (it.name.startsWith('binjr')) { - Node depNode = depsNode.appendNode('dependency') - depNode.appendNode('groupId', GROUP_ID) - depNode.appendNode('artifactId', it.name.replace("-${BINJR_VERSION}.jar", "")) - depNode.appendNode('version', BINJR_VERSION) - } - } - } - } - } - } - } - } - - tasks.withType(Sign) { - onlyIf { IS_RELEASE } - } - - nexusPublishing { - repositories { - sonatype { - username = System.getenv('OSSRH_JIRA_USERNAME') - password = System.getenv('OSSRH_JIRA_PASSWORD') - connectTimeout = Duration.ofSeconds(300) - clientTimeout = Duration.ofSeconds(300) - } - } - } -} - -task publishArtifacts(dependsOn: subprojects.publishToSonatype) { - doLast { - System.out.println("Done publishing artifacts from subprojects.") - } -} - -task copyAppLibs(type: Copy) { - into "$APP_IMAGE_PATH/libs" - from(project(":binjr-core").configurations.runtimeClasspath) { - exclude "javafx-*.jar" - } - from project(":binjr-adapter-jrds").configurations.runtimeClasspath { - exclude "javafx-*.jar" - } - from project(":binjr-adapter-rrd4j").configurations.runtimeClasspath { - exclude "javafx-*.jar" - } - from project(":binjr-core").jar -} - -task copyPluginLibs(type: Copy) { - into IS_MAC ? "$APP_IMAGE_PATH/libs" : "$APP_IMAGE_PATH/plugins" - from project(":binjr-adapter-rrd4j").jar -} - -task copyJpackageInputLibs(type: Copy) { - into "${buildDir}/tmp/input" - from(project(":binjr-core").configurations.runtimeClasspath) { - exclude "javafx-*.jar" - } - from project(":binjr-adapter-rrd4j").configurations.runtimeClasspath { - exclude "javafx-*.jar" - } -// from project(":binjr-adapter-text").configurations.runtimeClasspath { -// exclude "javafx-*.jar" -// } - from project(":binjr-core").jar - from project(":binjr-adapter-rrd4j").jar -// from project(":binjr-adapter-text").jar -} - -task copyPlatformSpecific(type: Copy) { - into APP_IMAGE_PATH - from "${projectDir}/distribution/platforms/${OS_FAMILY}" -} - -task copyResources(type: Copy) { - into "$APP_IMAGE_PATH/resources" - from "${projectDir}/distribution/resources" -} - -task expandMdTemplates(type: Copy) { - from "${projectDir}/distribution/templates" - into "${buildDir}/tmp/expanded" - filteringCharset = 'UTF-8' - def changeHistory = new File("${project.projectDir}/CHANGELOG.md").getText("UTF-8") - def currentChanges = new File("${project.projectDir}/UNRELEASED.md").getText("UTF-8") - expand(["version" : "$BINJR_VERSION", - "releaseDate" : "${new SimpleDateFormat("EEE, d MMM yyyy").format(new Date())}", - "changeHistory" : "$changeHistory", - "currentChanges": "$currentChanges", - "tagName" : "v${BINJR_VERSION}" - ]) -} - -task copyInfo(type: Copy, dependsOn: expandMdTemplates) { - from { - ["${buildDir}/tmp/expanded/CHANGELOG.md", - "${buildDir}/tmp/expanded/LICENSE.md", - "${buildDir}/tmp/expanded/NOTICE.md", - "${buildDir}/tmp/expanded/README.md"] - } - into "${buildDir}/tmp/info" -} - -markdownToHtml.dependsOn(copyInfo) - -markdownToHtml { - sourceDir = file("${buildDir}/tmp/info") - outputDir = file("$APP_IMAGE_PATH") - doLast { - ConfigurableFileTree tree = fileTree(dir: "$APP_IMAGE_PATH") - tree.include '**/*.html' - tree.each { File file -> - String path = file.path - File newFile = new File("${APP_IMAGE_PATH}/tmp_${file.name}") - newFile << "\n" + - "\n" + - " " + (file.name - ".html") + "\n" + - " \n" + - " \n" + - "" - newFile << file.getText("utf-8") - if (!file.name.startsWith("LICENSE")) { - newFile << "

" - } - file.delete() - newFile.renameTo(path) - } - } -} - -task downloadOpenJfxModules(type: Download) { - onlyIfModified true - src OPENJFX_JMODS_DOWNLOAD_URL - dest new File(DL_CACHE_PATH, 'openjfx-jmods.zip') -} - -task unzipOpenJfxModules(dependsOn: downloadOpenJfxModules, type: Copy) { - from zipTree(downloadOpenJfxModules.dest) - into "${buildDir}/jmods/" -} - -task createRuntimeImage(type: Exec, dependsOn: [unzipOpenJfxModules]) { - workingDir project.projectDir - commandLine = [ - "${JDK_HOME}/bin/jlink", - '-p', "${JDK_HOME}/jmods${File.pathSeparator}${buildDir}/jmods/javafx-jmods-${OPENJFX_VERSION.replaceAll "\\-ea\\+[0-9]+", ""}", - '--add-modules', JLINK_ADD_MODULES, - '--strip-debug', - '--no-header-files', - '--no-man-pages', - "--vm=server", - "--compress=2", - '--output', "${APP_IMAGE_PATH}/runtime" - ] - doLast { - System.out.println("Application '${project.name}' packaged.") - System.out.println(" -> location: ${APP_IMAGE_PATH}/") - } -} - -task prepareAppBundle(dependsOn: [copyAppLibs, copyPluginLibs, copyResources, copyPlatformSpecific, markdownToHtml, createRuntimeImage]) { - doFirst { - mkdir ARTIFACTS_PATH - } -} - -task listPackageContent(type: Exec, dependsOn: prepareAppBundle) { - workingDir APP_IMAGE_PATH - commandLine = [ - "sh", "-c", - "find . -mindepth 1 | sed -n 's@^\\./@@p' > .installed" - ] -} - -task packageDistributionTar(type: Exec, dependsOn: [listPackageContent]) { - workingDir APP_IMAGE_ROOT - commandLine = [ - "sh", "-c", - "ln -s \"${BINJR_VERSION}/binjr\" \"binjr\" && tar czf \"${ARTIFACTS_PATH}/${DISTRIBUTION_NAME}.tar.gz\" \"${BINJR_VERSION}\" \"binjr\"" - ] - outputs.dir ARTIFACTS_PATH -} - -task wixRunHeat(type: Exec, dependsOn: prepareAppBundle) { - doFirst { - Files.copy(Paths.get("${projectDir}/distribution/bundlers/win_msi/binjr.ini"), - Paths.get("${APP_IMAGE_PATH}/binjr.ini"), - StandardCopyOption.REPLACE_EXISTING) - } - workingDir project.projectDir - commandLine = [ - "${WIX_HOME}/bin/heat.exe", - "dir", "${APP_IMAGE_PATH}", - "-cg", "binjrFiles", - "-suid", "-gg", "-scom", "-sreg", "-sfrag", "-srd", - "-dr", "APPLICATIONFOLDER", - "-var", "var.buildSourceDir", - "-out", "${buildDir}/wix/binjrFiles.wxs" - ] -} - -task wixRunCandle(type: Exec, dependsOn: [wixRunHeat]) { - workingDir project.projectDir - commandLine = [ - "${WIX_HOME}/bin/candle.exe", - "-arch", "x64", - "-out", "${buildDir}/wix/obj/", - "${projectDir}/distribution/bundlers/win_msi/binjr.wxs", - "${buildDir}/wix/binjrFiles.wxs", - "-dbinjrVersion=${IS_BETA ? BINJR_BETA_VERSION : BINJR_VERSION_STEM}", - "-dbuildSourceDir=${APP_IMAGE_PATH}", - "-dresourcesDir=${projectDir}/distribution" - ] -} - -task wixRunLight(type: Exec, dependsOn: [wixRunCandle]) { - workingDir project.projectDir - commandLine = [ - "${WIX_HOME}/bin/light.exe", - "-sw", "-sice:ICE38", "-sice:ICE64", - "-out", "${ARTIFACTS_PATH}/${DISTRIBUTION_NAME}.msi", - "${buildDir}/wix/obj/*.wixobj", - "-ext", "WixUtilExtension", "-ext", "WixUIExtension.dll" - ] - outputs.dir ARTIFACTS_PATH -} - -task jpackageMacOS(type: Exec, dependsOn: [prepareAppBundle, copyJpackageInputLibs]) { - workingDir ARTIFACTS_PATH - commandLine = [ - "jpackage", - "--name", project.name, - "--input", "${buildDir}/tmp/input", - "--main-jar", "binjr-core-${BINJR_VERSION}.jar", - "--main-class", "eu.binjr.core.Binjr", - "--runtime-image", "${APP_IMAGE_PATH}/runtime", - "--type", "dmg", - "--copyright", BINJR_COPYRIGHT, - "--description", BINJR_DESCRIPTION, - "--app-version", "${IS_BETA ? BINJR_BETA_VERSION : BINJR_VERSION_STEM}", - "--icon", "${APP_IMAGE_PATH}/resources/icons/binjr.icns", - "--file-associations", "${projectDir}/distribution/bundlers/mac_dmg/file-associations.properties", - "--arguments", "--packaging=MAC_DMG", - "--java-options", "-Xmx4096M", - "--java-options", "-XX:+UnlockExperimentalVMOptions", - "--java-options", "-XX:+UseShenandoahGC", - "--java-options", "-XX:ShenandoahGCHeuristics=compact", - "--java-options", "-XX:ShenandoahAllocationThreshold=20", - "--java-options", "--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED", - "--java-options", "--add-exports=javafx.controls/com.sun.javafx.charts=ALL-UNNAMED", - "--java-options", "--add-opens=javafx.graphics/javafx.geometry=ALL-UNNAMED" - ] - doLast { - def source = java.nio.file.Path.of("${ARTIFACTS_PATH}/${project.name}-${IS_BETA ? BINJR_BETA_VERSION : BINJR_VERSION_STEM}.dmg") - Files.move(source, source.resolveSibling("${DISTRIBUTION_NAME}.dmg")) - } - outputs.dir ARTIFACTS_PATH -} - - -task jpackageDeb(type: Exec, dependsOn: [prepareAppBundle, copyJpackageInputLibs]) { - workingDir ARTIFACTS_PATH - commandLine = [ - "jpackage", - "--name", project.name, - "--input", "${buildDir}/tmp/input", - "--main-jar", "binjr-core-${BINJR_VERSION}.jar", - "--main-class", "eu.binjr.core.Binjr", - "--runtime-image", "${APP_IMAGE_PATH}/runtime", - "--type", "deb", - "--copyright", BINJR_COPYRIGHT, - "--description", BINJR_DESCRIPTION, - "--app-version", BINJR_VERSION, - "--icon", "${APP_IMAGE_PATH}/resources/icons/binjr.png", - "--license-file", "${projectDir}/LICENSE.md", - "--file-associations", "${projectDir}/distribution/bundlers/linux_deb/file-associations.properties", - "--resource-dir", "${projectDir}/distribution/bundlers/linux_deb/", - "--java-options", "-Xmx4096M", - "--java-options", "-XX:+UnlockExperimentalVMOptions", - "--java-options", "-XX:+UseShenandoahGC", - "--java-options", "-XX:ShenandoahGCHeuristics=compact", - "--java-options", "-XX:ShenandoahAllocationThreshold=20", - "--java-options", "--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED", - "--java-options", "--add-exports=javafx.controls/com.sun.javafx.charts=ALL-UNNAMED", - "--java-options", "--add-opens=javafx.graphics/javafx.geometry=ALL-UNNAMED", - "--arguments", "--system-plugins-path=/opt/binjr/plugins", - "--arguments", "--packaging=LINUX_DEB", - "--linux-package-name", "binjr", - "--linux-deb-maintainer", "binjr@free.fr", - "--linux-app-category", "Utility", - "--linux-menu-group", "Utility", - "--linux-rpm-license-type", "Apache-2.0", - "--linux-shortcut", - "--temp", "${buildDir}/tmp/apt", - "--verbose" - ] - doLast { - def source = java.nio.file.Path.of("${ARTIFACTS_PATH}/${project.name}_${BINJR_VERSION}-1_${OS_ARCH}.deb") - Files.move(source, source.resolveSibling("${DISTRIBUTION_NAME}.deb")) - } - outputs.dir ARTIFACTS_PATH -} - -task jpackageRpm(type: Exec, dependsOn: [prepareAppBundle, copyJpackageInputLibs]) { - workingDir ARTIFACTS_PATH - commandLine = [ - "jpackage", - "--name", project.name, - "--input", "${buildDir}/tmp/input", - "--main-jar", "binjr-core-${BINJR_VERSION}.jar", - "--main-class", "eu.binjr.core.Binjr", - "--runtime-image", "${APP_IMAGE_PATH}/runtime", - "--type", "rpm", - "--copyright", BINJR_COPYRIGHT, - "--description", BINJR_DESCRIPTION, - "--app-version", BINJR_VERSION.replace("-", "."), - "--icon", "${APP_IMAGE_PATH}/resources/icons/binjr.png", - "--license-file", "${projectDir}/LICENSE.md", - "--file-associations", "${projectDir}/distribution/bundlers/linux_rpm/file-associations.properties", - "--resource-dir", "${projectDir}/distribution/bundlers/linux_rpm/", - "--java-options", "-Xmx4096M", - "--java-options", "-XX:+UnlockExperimentalVMOptions", - "--java-options", "-XX:+UseShenandoahGC", - "--java-options", "-XX:ShenandoahGCHeuristics=compact", - "--java-options", "-XX:ShenandoahAllocationThreshold=20", - "--java-options", "--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED", - "--java-options", "--add-exports=javafx.controls/com.sun.javafx.charts=ALL-UNNAMED", - "--java-options", "--add-opens=javafx.graphics/javafx.geometry=ALL-UNNAMED", - "--arguments", "--system-plugins-path=/opt/binjr/plugins", - "--arguments", "--packaging=LINUX_RPM", - "--linux-package-name", "binjr", - "--linux-app-category", "Utility", - "--linux-menu-group", "Utility", - "--linux-rpm-license-type", "Apache-2.0", - "--linux-shortcut", - "--temp", "${buildDir}/tmp/rpm", - "--verbose" - ] - doLast { - def source = java.nio.file.Path.of("${ARTIFACTS_PATH}/${project.name}-${BINJR_VERSION.replace("-", ".")}-1.x86_64.rpm") - Files.move(source, source.resolveSibling("${DISTRIBUTION_NAME}.rpm")) - } - outputs.dir ARTIFACTS_PATH -} - - - - -def isNonStable = { String version -> - // Ignore javafx early access and glassfish beta - def regex = /(?i)^[0-9,.v-]+\-((ea)|(rc)|(b)|(m))[-\+]*[0-9.]+$/ - return (version ==~ regex) -} - -dependencyUpdates { - rejectVersionIf { - isNonStable(it.candidate.version) - } -} - - -/** - * This class is a no-op copy task whose purpose is to allow using the - * standard gradle signing plugin to sign any arbitrary file. - * The idea is to piggy-back on the existing support for signing - * of tasks extending AbstractArchiveTask; to use it, simply declare a - * task of that type and use the path to the file to be signed both as - * the source and target of the archive. - * NB: No copy/move/archiving will actually take place. - */ -class WrapTaskForSigning extends AbstractArchiveTask { - - @Override - protected CopyAction createCopyAction() { - return new noopCopyAction(); - } - - class noopCopyAction implements CopyAction { - - @Override - WorkResult execute(CopyActionProcessingStream stream) { - return WorkResults.didWork(true); - } - } -} diff --git a/swet_javafx/run.cmd b/swet_javafx/run.cmd index 307945b78..ad0973c3e 100644 --- a/swet_javafx/run.cmd +++ b/swet_javafx/run.cmd @@ -9,7 +9,7 @@ if "%JAVA_VERSION%"=="" set JAVA_VERSION=1.8.0_101 if "%JAVA_HOME%"=="" set JAVA_HOME=%TOOLS_DIR%\jdk%JAVA_VERSION% set JAVA_OPTS=-Xms256m -Xmx512m -if "%MAVEN_VERSION%"=="" set MAVEN_VERSION=3.6.1 +if "%MAVEN_VERSION%"=="" set MAVEN_VERSION=3.3.9 if "%M2_HOME%"=="" set M2_HOME=%TOOLS_DIR%\apache-maven-%MAVEN_VERSION% if "%M2%"=="" set M2=%M2_HOME%\bin diff --git a/swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE b/swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE deleted file mode 100644 index f71924265..000000000 --- a/swet_javafx/src/main/java/com/github/sergueik/swet_javafx/SwetMainFlowPanel.java.SAVE +++ /dev/null @@ -1,421 +0,0 @@ -package com.github.sergueik.swet_javafx; - -import org.apache.log4j.Category; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.FindBy; -import org.openqa.selenium.support.PageFactory; - -import com.github.sergueik.swet_javafx.ChoicesDialog; -import com.github.sergueik.swet_javafx.ConfigFormEx; - -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import javafx.application.Application; -import javafx.application.Platform; -import javafx.event.ActionEvent; -import javafx.event.EventHandler; -import javafx.scene.Group; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.control.Tooltip; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import javafx.scene.layout.FlowPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; -import javafx.scene.layout.VBox; -import javafx.stage.FileChooser; -import javafx.stage.Stage; -import javafx.stage.StageStyle; -import name.antonsmirnov.javafx.dialog.Dialog; - -@SuppressWarnings("restriction") -public class SwetMainFlowPanel extends Application { - - @SuppressWarnings("deprecation") - static final Category logger = Category.getInstance(SwetMainFlowPanel.class); - static Stage stage = null; - private Label statusLabel; - String configFilePath = null; - Scene scene = null; - private static String osName = getOsName(); - public static WebDriver driver = null; - - @SuppressWarnings("static-access") - @Override - public void start(Stage stage) { - this.stage = stage; - stage.setTitle("SWET/javaFx"); - stage.setWidth(500); - stage.setHeight(160); - scene = new Scene(new Group()); - - VBox vbox = new VBox(); - - FlowPane flow = new FlowPane(); - flow.setVgap(8); - flow.setHgap(4); - flow.setPrefWrapLength(300); - - Button launchButton = new Button(); - Image launchImage = new Image(getClass().getClassLoader().getResourceAsStream("browsers_32.png")); - launchButton.setGraphic(new ImageView(launchImage)); - launchButton.setTooltip(new Tooltip("Launch browser")); - // https://examples.javacodegeeks.com/desktop-java/javafx/javafx-concurrency-example/ - launchButton.setOnAction(new EventHandler() { - public void handle(ActionEvent event) { - startAsyncTask(); - } - }); - - Button injectButton = new Button(); - Image injectImage = new Image(getClass().getClassLoader().getResourceAsStream("find_32.png")); - injectButton.setGraphic(new ImageView(injectImage)); - injectButton.setTooltip(new Tooltip("Inject script")); - injectButton.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event) { - System.out.println("generate step!"); - for (int i = 0; i < 20; i++) { - Button stepButton = new Button(String.format("Step %d", i)); - stepButton.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event) { - // ComplexFormEx - Map inputData = new HashMap<>(); - Button button = (Button) event.getTarget(); - - inputData.put("dummy", "42"); - inputData.put("title", String.format("%s element Locators", button.getText())); - Map inputs = new HashMap<>(); - inputs.put("inputs", inputData); // TODO: JSON - // see also - // https://github.com/MrChebik/ControllerRelationship - scene.setUserData(inputs); - logger.info("launching complexFormEx for " + inputData.get("title")); - - ComplexFormEx complexFormEx = new ComplexFormEx(); - complexFormEx.setScene(scene); - try { - complexFormEx.start(new Stage()); - } catch (Exception e) { - } - } - }); - - flow.getChildren().add(stepButton); - - } - } - }); - Button generateButton = new Button(); - Image generateImage = new Image(getClass().getClassLoader().getResourceAsStream("codegen_32.png")); - generateButton.setGraphic(new ImageView(generateImage)); - generateButton.setTooltip(new Tooltip("Generate program")); - - generateButton.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event) { - - // Stage stage = new Stage(); - Map inputData = new HashMap<>(); - inputData.put("dummy", "42"); - inputData.put("title", "Step detail"); - Map inputs = new HashMap<>(); - inputs.put("inputs", inputData); // TODO: JSON - scene.setUserData(inputs); - - // See also: - // http://java-buddy.blogspot.com/2016/06/read-csv-run-in-background-thread-and.html - DataFormEx dataFormEx = new DataFormEx(); - // dataFormEx.setScene(scene); - try { - dataFormEx.start(new Stage()); - // TODO: block in a SWT fashion? - // https://docs.oracle.com/javafx/2/swt_interoperability/jfxpub-swt_interoperability.htm - /* - * while (!shell.isDisposed()) { if - * (!display.readAndDispatch()) display.sleep(); } - */ - Map data = dataFormEx.getInputData(); - logger.info("Get data from dataFormEx " + data.toString()); - - } catch (Exception e) { - } - } - }); - - Button loadButton = new Button(); - Image loadImage = new Image(getClass().getClassLoader().getResourceAsStream("open_32.png")); - loadButton.setGraphic(new ImageView(loadImage)); - loadButton.setTooltip(new Tooltip("Load session")); - loadButton.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event) { - // https://docs.oracle.com/javafx/2/ui_controls/file-chooser.htm - FileChooser fileChooser = new FileChooser(); - if (configFilePath != null) { - logger.info("Loading recording from: " + configFilePath); - try { - fileChooser.setInitialDirectory(new File(configFilePath)); - } catch (IllegalArgumentException e) { - logger.info("Exception (ignored): " + e.toString()); - } - } - // Set extension filter - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("YAML file", "*.yaml")); - fileChooser.setTitle("Open Recording"); - File file = fileChooser.showOpenDialog(stage); - if (file != null) { - logger.info("Load recording: " + file.getPath()); - configFilePath = file.getParent(); - openRecordingFile(file); - } - } - }); - - Button testsuiteButton = new Button(); - Image testsuiteImage = new Image(getClass().getClassLoader().getResourceAsStream("excel_gen_32.png")); - testsuiteButton.setGraphic(new ImageView(testsuiteImage)); - testsuiteButton.setTooltip(new Tooltip("Generate Excel TestSuite")); - testsuiteButton.setOnAction(new EventHandler() { - @SuppressWarnings("rawtypes") - @Override - public void handle(ActionEvent event) { - - // Stage stage = new Stage(); - Map inputData = new HashMap<>(); - inputData.put("dummy", "42"); - inputData.put("title", "Step detail"); - Map inputs = new HashMap<>(); - inputs.put("inputs", inputData); // TODO: JSON - scene.setUserData(inputs); - - // See also: - // http://java-buddy.blogspot.com/2016/06/read-csv-run-in-background-thread-and.html - TableEditorEx tableEditorEx = new TableEditorEx(); - tableEditorEx.setScene(scene); - try { - tableEditorEx.start(new Stage()); - } catch (Exception e) { - } - } - }); - - Button saveButton = new Button(); - Image saveImage = new Image(getClass().getClassLoader().getResourceAsStream("save_32.png")); - saveButton.setGraphic(new ImageView(saveImage)); - saveButton.setTooltip(new Tooltip("Save session")); - saveButton.setOnAction(new EventHandler() { - @SuppressWarnings("unused") - @Override - public void handle(ActionEvent event) { - try { - System.err.println("Exercise exception"); - testException(); - } catch (Exception e) { - Dialog.showThrowable("Exception", "Exception thrown", - (Exception) e /* e.getCause() */, stage); - } - - // save - - // https://docs.oracle.com/javafx/2/ui_controls/file-chooser.htm - FileChooser fileChooser = new FileChooser(); - if (configFilePath != null) { - logger.info("Saving recording to: " + configFilePath); - try { - fileChooser.setInitialDirectory(new File(configFilePath)); - } catch (IllegalArgumentException e) { - logger.info("Exception (ignored): " + e.toString()); - } - } - // Set extension filter - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("YAML file", "*.yaml")); - fileChooser.setTitle("Save Recording"); - File file = fileChooser.showSaveDialog(stage); - } - }); - - Button configButton = new Button(); - Image configImage = new Image(getClass().getClassLoader().getResourceAsStream("preferences_32.png")); - configButton.setGraphic(new ImageView(configImage)); - configButton.setTooltip(new Tooltip("Configure")); - configButton.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event) { - Stage stage = new Stage(); - ConfigFormEx s = new ConfigFormEx(); - s.start(stage); - } - }); - - Button quitButton = new Button(); - Image quitImage = new Image(getClass().getClassLoader().getResourceAsStream("quit_32.png")); - quitButton.setGraphic(new ImageView(quitImage)); - quitButton.setTooltip(new Tooltip("Exit")); - - stage.setOnCloseRequest(e -> { - e.consume(); - confirmClose(); - }); - - quitButton.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event) { - confirmClose(); - // TODO: refactor - // does not return - } - }); - - HBox toolbarHbox = new HBox(); - toolbarHbox.getChildren().addAll(launchButton, injectButton, generateButton, loadButton, testsuiteButton, - saveButton, configButton, quitButton); - - statusLabel = new Label(); - statusLabel.setText("Status"); - HBox statusbarHbox = new HBox(); - statusbarHbox.getChildren().addAll(statusLabel); - HBox.setHgrow(statusLabel, Priority.ALWAYS); - - vbox.getChildren().add(toolbarHbox); - vbox.getChildren().add(flow); - vbox.getChildren().add(statusbarHbox); - VBox.setVgrow(flow, Priority.ALWAYS); - - scene.setRoot(vbox); - stage.setScene(scene); - stage.show(); - } - - public void runTask() { - updateStatus("Launching"); - // sleep(10000); - setUpSeleniumDriver(); - updateStatus("Launched"); - return; // TODO: JavaFX concurrency framework - } - - public void sleep(Integer seconds) { - long secondsLong = (long) seconds; - try { - Thread.sleep(secondsLong); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public static String getOsName() { - if (osName == null) { - osName = System.getProperty("os.name").toLowerCase(); - if (osName.startsWith("windows")) { - osName = "windows"; - } - } - return osName; - } - - private void updateStatus(String status) { - // NOTE: there is no `HORIZONTAL ELLIPSIS` in default console code page - // 437 - logger.info(String.format("%s%s", status, osName == "windows" ? "..." : "\u2026")); - // Update the Label on the JavaFx Application Thread - Platform.runLater(new Runnable() { - @Override - public void run() { - statusLabel.setText(status); - } - }); - } - - public void startAsyncTask() { - // Create instance of Runnable - Runnable task = new Runnable() { - public void run() { - runTask(); - } - }; - - // Create background thread - Thread backgroundThread = new Thread(task); - // Terminate the running thread if the application exits - backgroundThread.setDaemon(true); - // Launch the thread - backgroundThread.start(); - } - - public static void main(String[] args) { - launch(args); - } - - public void confirmClose() { - - Map inputData = new HashMap<>(); - inputData.put("Exit and save my project", 2); - inputData.put("Exit and don't save", 1); - inputData.put("Don't exit", 10); - Map> inputs = new HashMap<>(); - inputs.put("inputs", inputData); // TODO: JSON - scene.setUserData(inputs); - - ChoicesDialog choicesDialog = new ChoicesDialog(new Stage(), scene); - // choicesDialog.initStyle(StageStyle.UNDECORATED); - choicesDialog.sizeToScene(); - // optionally hide self - // ((Node)(event.getSource())).getScene().getWindow().hide(); - /* - * choicesDialog.show(); while (choicesDialog.isShowing()) { - * - * } - */ - choicesDialog.showAndWait(); - @SuppressWarnings("unchecked") - Map data = (Map) choicesDialog.getScene().getUserData(); - int code = Integer.parseInt(data.get("result")); - logger.info("Exit app with code: " + code); - // code = Integer.parseInt(choicesDialog.getResult()); - // logger.info("Exit app with code: " + code); - if (code == 1 || code == 2) { - if (driver != null) { - tearDownSeleniumBrowswer(); - } - stage.close(); - } - } - - public void tearDownSeleniumBrowswer() { - // Close the browser - driver.quit(); - } - - private static void openRecordingFile(File file) { - } - - private static void testException() throws Exception { - throw new Exception("This is a test exception."); - } - - @SuppressWarnings("deprecation") - public void setUpSeleniumDriver() { - // Create a new instance of a driver - System.setProperty("webdriver.chrome.driver", (new File( - osName == "windows" ? "c:/java/selenium/chromedriver.exe" : "/home/sergueik/Downloads/chromedriver")) - .getAbsolutePath()); - DesiredCapabilities capabilities = DesiredCapabilities.chrome(); - - driver = new ChromeDriver(capabilities); - // Navigate to the right place - driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - driver.get("https://www.google.com/"); - } -} diff --git a/utils/2 b/utils/2 deleted file mode 100644 index ae05bcfd8..000000000 --- a/utils/2 +++ /dev/null @@ -1,1246 +0,0 @@ -Simple multimedia streams analyzer -usage: ffprobe [OPTIONS] [INPUT_FILE] - -Main options: --L show license --h topic show help --? topic show help --help topic show help ---help topic show help --version show version --buildconf show build configuration --formats show available formats --devices show available devices --codecs show available codecs --decoders show available decoders --encoders show available encoders --bsfs show available bit stream filters --protocols show available protocols --filters show available filters --pix_fmts show available pixel formats --layouts show standard channel layouts --sample_fmts show available audio sample formats --colors show available color names --loglevel loglevel set logging level --v loglevel set logging level --report generate a report --max_alloc bytes set maximum size of a single allocated block --cpuflags flags force specific cpu flags --hide_banner hide_banner do not show program banner --sources device list sources of the input device --sinks device list sinks of the output device --f format force format --unit show unit of the displayed values --prefix use SI prefixes for the displayed values --byte_binary_prefix use binary prefixes for byte units --sexagesimal use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units --pretty prettify the format of displayed values, make it more human readable --print_format format set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml) --of format alias for -print_format --select_streams stream_specifier select the specified streams --sections print sections structure and section information, and exit --show_data show packets data --show_data_hash show packets data hash --show_error show probing error --show_format show format/container info --show_frames show frames info --show_format_entry entry show a particular entry from the format/container info --show_entries entry_list show a set of specified entries --show_packets show packets info --show_programs show programs info --show_streams show streams info --show_chapters show chapters info --count_frames count the number of frames per stream --count_packets count the number of packets per stream --show_program_version show ffprobe version --show_library_versions show library versions --show_versions show program and library versions --show_pixel_formats show pixel format descriptions --show_private_data show private data --private same as show_private_data --bitexact force bitexact output --read_intervals read_intervals set read intervals --default generic catch all option --i input_file read specified file - - -AVFormatContext AVOptions: - -avioflags ED...... (default 0) - direct ED...... reduce buffering - -probesize .D...... set probing size (from 32 to I64_MAX) (default 5e+06) - -formatprobesize .D...... number of bytes to probe file format (from 0 to 2.14748e+09) (default 1.04858e+06) - -fflags ED...... (default 200) - ignidx .D...... ignore index - genpts .D...... generate pts - nofillin .D...... do not fill in missing values that can be exactly calculated - noparse .D...... disable AVParsers, this needs nofillin too - igndts .D...... ignore dts - discardcorrupt .D...... discard corrupted frames - sortdts .D...... try to interleave outputted packets by dts - keepside .D...... don't merge side data - fastseek .D...... fast but inaccurate seeks - nobuffer .D...... reduce the latency introduced by optional buffering - -seek2any .D...... allow seeking to non-keyframes on demuxer level when supported (from 0 to 1) (default 0) - -analyzeduration .D...... specify how many microseconds are analyzed to probe the input (from 0 to I64_MAX) (default 0) - -cryptokey .D...... decryption key - -indexmem .D...... max memory used for timestamp index (per stream) (from 0 to INT_MAX) (default 1.04858e+06) - -rtbufsize .D...... max memory used for buffering real-time frames (from 0 to INT_MAX) (default 3.04128e+06) - -fdebug ED...... print specific debug info (default 0) - ts ED...... - -max_delay ED...... maximum muxing or demuxing delay in microseconds (from -1 to INT_MAX) (default -1) - -fpsprobesize .D...... number of frames used to probe fps (from -1 to 2.14748e+09) (default -1) - -f_err_detect .D...... set error detection flags (deprecated; use err_detect, save via avconv) (default 1) - crccheck .D...... verify embedded CRCs - bitstream .D...... detect bitstream specification deviations - buffer .D...... detect improper bitstream length - explode .D...... abort decoding on minor error detection - ignore_err .D...... ignore errors - careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors - compliant .D...... consider all spec non compliancies as errors - aggressive .D...... consider things that a sane encoder shouldn't do as an error - -err_detect .D...... set error detection flags (default 1) - crccheck .D...... verify embedded CRCs - bitstream .D...... detect bitstream specification deviations - buffer .D...... detect improper bitstream length - explode .D...... abort decoding on minor error detection - ignore_err .D...... ignore errors - careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors - compliant .D...... consider all spec non compliancies as errors - aggressive .D...... consider things that a sane encoder shouldn't do as an error - -use_wallclock_as_timestamps .D...... use wallclock as timestamps (from 0 to 2.14748e+09) (default 0) - -skip_initial_bytes .D...... set number of bytes to skip before reading header and frames (from 0 to I64_MAX) (default 0) - -correct_ts_overflow .D...... correct single timestamp overflows (from 0 to 1) (default 1) - -f_strict ED...... how strictly to follow the standards (deprecated; use strict, save via avconv) (from INT_MIN to INT_MAX) (default 0) - very ED...... strictly conform to a older more strict version of the spec or reference software - strict ED...... strictly conform to all the things in the spec no matter what the consequences - normal ED...... - unofficial ED...... allow unofficial extensions - experimental ED...... allow non-standardized experimental variants - -strict ED...... how strictly to follow the standards (from INT_MIN to INT_MAX) (default 0) - very ED...... strictly conform to a older more strict version of the spec or reference software - strict ED...... strictly conform to all the things in the spec no matter what the consequences - normal ED...... - unofficial ED...... allow unofficial extensions - experimental ED...... allow non-standardized experimental variants - -max_ts_probe .D...... maximum number of packets to read while waiting for the first timestamp (from 0 to INT_MAX) (default 50) - -dump_separator ED...... set information dump field separator (default ", ") - -codec_whitelist .D...... List of decoders that are allowed to be used - -format_whitelist .D...... List of demuxers that are allowed to be used - -max_streams .D...... maximum number of streams (from 0 to INT_MAX) (default 1000) - -AVIOContext AVOptions: - -URLContext AVOptions: - -Async AVOptions: - -bluray AVOptions: - -playlist .D...... (from -1 to 99999) (default -1) - -angle .D...... (from 0 to 254) (default 0) - -chapter .D...... (from 1 to 65534) (default 1) - -Cache AVOptions: - -read_ahead_limit .D...... Amount in bytes that may be read ahead when seeking isn't supported, -1 for unlimited (from -1 to INT_MAX) (default 65536) - -crypto AVOptions: - -key ED...... AES encryption/decryption key - -iv ED...... AES encryption/decryption initialization vector - -decryption_key .D...... AES decryption key - -decryption_iv .D...... AES decryption initialization vector - -file AVOptions: - -ftp AVOptions: - -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) - -ftp-anonymous-password ED...... password for anonymous login. E-mail address should be used. - -http AVOptions: - -seekable .D...... control seekability of connection (from -1 to 1) (default -1) - -headers ED...... set custom HTTP headers, can override built in default headers - -content_type ED...... set a specific content type for the POST messages - -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") - -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") - -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) - -post_data ED...... set custom HTTP post data - -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax - -icy .D...... request ICY metadata (from 0 to 1) (default 1) - -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) - none ED...... No auth method set, autodetect - basic ED...... HTTP basic authentication - -location ED...... The actual location of the data received - -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) - -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) - -method ED...... Override the HTTP method or set the expected HTTP method from a client - -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) - -listen ED...... listen on HTTP (from 0 to 2) (default 0) - -https AVOptions: - -seekable .D...... control seekability of connection (from -1 to 1) (default -1) - -headers ED...... set custom HTTP headers, can override built in default headers - -content_type ED...... set a specific content type for the POST messages - -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") - -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") - -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) - -post_data ED...... set custom HTTP post data - -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax - -icy .D...... request ICY metadata (from 0 to 1) (default 1) - -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) - none ED...... No auth method set, autodetect - basic ED...... HTTP basic authentication - -location ED...... The actual location of the data received - -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) - -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) - -method ED...... Override the HTTP method or set the expected HTTP method from a client - -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) - -listen ED...... listen on HTTP (from 0 to 2) (default 0) - -icecast AVOptions: - -pipe AVOptions: - -rtp AVOptions: - -ttl ED...... Time to live (in milliseconds, multicast only) (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Send/Receive buffer size (in bytes) (from -1 to INT_MAX) (default -1) - -rtcp_port ED...... Custom rtcp port (from -1 to INT_MAX) (default -1) - -local_rtpport ED...... Local rtp port (from -1 to INT_MAX) (default -1) - -local_rtcpport ED...... Local rtcp port (from -1 to INT_MAX) (default -1) - -connect ED...... Connect socket (from 0 to 1) (default 0) - -write_to_source ED...... Send packets to the source address of the latest received packet (from 0 to 1) (default 0) - -pkt_size ED...... Maximum packet size (from -1 to INT_MAX) (default -1) - -dscp ED...... DSCP class (from -1 to INT_MAX) (default -1) - -sources ED...... Source list - -block ED...... Block list - -sctp AVOptions: - -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) - -timeout ED...... Connection timeout (in milliseconds) (from INT_MIN to INT_MAX) (default 10000) - -listen_timeout ED...... Bind timeout (in milliseconds) (from INT_MIN to INT_MAX) (default -1) - -max_streams ED...... Max stream to allocate (from 0 to 32767) (default 0) - -srtp AVOptions: - -srtp_in_suite .D...... - -srtp_in_params .D...... - -subfile AVOptions: - -start .D...... start offset (from 0 to I64_MAX) (default 0) - -end .D...... end offset (from 0 to I64_MAX) (default 0) - -tcp AVOptions: - -listen ED...... Listen for incoming connections (from 0 to 2) (default 0) - -timeout ED...... set timeout (in microseconds) of socket I/O operations (from -1 to INT_MAX) (default -1) - -listen_timeout ED...... Connection awaiting timeout (in milliseconds) (from -1 to INT_MAX) (default -1) - -tls AVOptions: - -ca_file ED...... Certificate Authority database file - -cafile ED...... Certificate Authority database file - -tls_verify ED...... Verify the peer certificate (from 0 to 1) (default 0) - -cert_file ED...... Certificate file - -key_file ED...... Private key file - -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) - -verifyhost ED...... Verify against a specific hostname - -udp AVOptions: - -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) - -localport ED...... Local port (from -1 to INT_MAX) (default -1) - -local_port ED...... Local port (from -1 to INT_MAX) (default -1) - -localaddr ED...... Local address - -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) - -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) - -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) - -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) - -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) - -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) - -sources ED...... Source list - -block ED...... Block list - -udplite AVOptions: - -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) - -localport ED...... Local port (from -1 to INT_MAX) (default -1) - -local_port ED...... Local port (from -1 to INT_MAX) (default -1) - -localaddr ED...... Local address - -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) - -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) - -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) - -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) - -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) - -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) - -sources ED...... Source list - -block ED...... Block list - -unix AVOptions: - -listen ED...... Open socket for listening (from 0 to 1) (default 0) - -timeout ED...... Timeout in ms (from -1 to INT_MAX) (default -1) - -type ED...... Socket type (from INT_MIN to INT_MAX) (default 1) - stream ED...... Stream (reliable stream-oriented) - datagram ED...... Datagram (unreliable packet-oriented) - seqpacket ED...... Seqpacket (reliable packet-oriented - -librtmp protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmpe protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmps protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmpt protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmpte protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -libssh AVOptions: - -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) - -private_key ED...... set path to private key - -aa AVOptions: - -aa_fixed_key .D...... Fixed key used for handling Audible AA files - -Artworx Data Format demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -APNG demuxer AVOptions: - -ignore_loop .D...... ignore loop setting (from 0 to 1) (default 1) - -max_fps .D...... maximum framerate (0 is no limit) (from 0 to INT_MAX) (default 15) - -default_fps .D...... default framerate (0 is as fast as possible) (from 0 to INT_MAX) (default 15) - -aqtdec AVOptions: - -subfps .D...S.. set the movie frame rate (from 0 to INT_MAX) (default 25/1) - -asf demuxer AVOptions: - -no_resync_search .D...... Don't try to resynchronize by looking for a certain optional start code (from 0 to 1) (default 0) - -export_xmp .D...... Export full XMP metadata (from 0 to 1) (default 0) - -avi AVOptions: - -use_odml .D...... use odml index (from -1 to 1) (default 1) - -Binary text demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -cavsvideo demuxer AVOptions: - -framerate .D...... (default "25") - -CDXL demuxer AVOptions: - -sample_rate .D...... (from 1 to INT_MAX) (default 11025) - -framerate .D...... - -concat demuxer AVOptions: - -safe .D...... enable safe mode (from -1 to 1) (default 1) - -auto_convert .D...... automatically convert bitstream format (from 0 to 1) (default 1) - -dirac demuxer AVOptions: - -framerate .D...... (default "25") - -dnxhd demuxer AVOptions: - -framerate .D...... (default "25") - -dvbsub demuxer AVOptions: - -framerate .D...... (default "25") - -flvdec AVOptions: - -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) - -live_flvdec AVOptions: - -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) - -g729 demuxer AVOptions: - -bit_rate .D...... (from 0 to INT_MAX) (default 0) - -GIF demuxer AVOptions: - -min_delay .D...... minimum valid delay between frames (in hundredths of second) (from 0 to 6000) (default 2) - -max_gif_delay .D...... maximum valid delay between frames (in hundredths of seconds) (from 0 to 65535) (default 65535) - -default_delay .D...... default delay between frames (in hundredths of second) (from 0 to 6000) (default 10) - -ignore_loop .D...... ignore loop setting (netscape extension) (from 0 to 1) (default 1) - -gsm demuxer AVOptions: - -sample_rate .D...... (from 1 to 6.50753e+07) (default 8000) - -h261 demuxer AVOptions: - -framerate .D...... (default "25") - -h263 demuxer AVOptions: - -framerate .D...... (default "25") - -h264 demuxer AVOptions: - -framerate .D...... (default "25") - -hevc demuxer AVOptions: - -framerate .D...... (default "25") - -hls,applehttp AVOptions: - -live_start_index .D...... segment index to start live streams at (negative values are from the end) (from INT_MIN to INT_MAX) (default -3) - -allowed_extensions .D...... List of file extensions that hls is allowed to access (default "3gp,aac,avi,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav") - -max_reload .D...... Maximum number of times a insufficient list is attempted to be reloaded (from 0 to INT_MAX) (default 1000) - -iCE Draw File demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -image2 demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -image2pipe demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -alias_pix demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -brender_pix demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -ingenient demuxer AVOptions: - -framerate .D...... (default "25") - -m4v demuxer AVOptions: - -framerate .D...... (default "25") - -microdvddec AVOptions: - -subfps .D...S.. set the movie frame rate fallback (from 0 to INT_MAX) (default 0/1) - -mjpeg demuxer AVOptions: - -framerate .D...... (default "25") - -mov,mp4,m4a,3gp,3g2,mj2 AVOptions: - -use_absolute_path .D.V.... allow using absolute path when opening alias, this is a possible security issue (from 0 to 1) (default 0) - -seek_streams_individually .D.V.... Seek each stream individually to the to the closest point (from 0 to 1) (default 1) - -ignore_editlist .D.V.... (from 0 to 1) (default 0) - -use_mfra_for .D.V.... use mfra for fragment timestamps (from -1 to 2) (default -1) - auto .D.V.... auto - dts .D.V.... dts - pts .D.V.... pts - -export_all .D.V.... Export unrecognized metadata entries (from 0 to 1) (default 0) - -export_xmp .D.V.... Export full XMP metadata (from 0 to 1) (default 0) - -activation_bytes .D...... Secret bytes for Audible AAX files - -audible_fixed_key .D...... Fixed key used for handling Audible AAX files - -enable_drefs .D.V.... Enable external track support. (from 0 to 1) (default 0) - -mp3 AVOptions: - -usetoc .D...... use table of contents (from -1 to 2) (default -1) - -mpegts demuxer AVOptions: - -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) - -fix_teletext_pts .D...... try to fix pts values of dvb teletext streams (from 0 to 1) (default 1) - -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) - -scan_all_pmts .D...... scan and combine all PMTs (from -1 to 1) (default -1) - -mpegtsraw demuxer AVOptions: - -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) - -compute_pcr .D...... compute exact PCR for each transport stream packet (from 0 to 1) (default 0) - -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) - -mpegvideo demuxer AVOptions: - -framerate .D...... (default "25") - -alaw demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -mulaw demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f64be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f64le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f32be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f32le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s32be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s32le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s24be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s24le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s16be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s16le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s8 demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u32be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u32le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u24be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u24le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u16be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u16le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u8 demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -rawvideo demuxer AVOptions: - -video_size .D...... set frame size - -pixel_format .D...... set pixel format (default "yuv420p") - -framerate .D...... set frame rate (default "25") - -RTP demuxer AVOptions: - -rtp_flags .D...... set RTP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -RTSP demuxer AVOptions: - -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) - -rtsp_transport ED...... set RTSP transport protocols (default 0) - udp ED...... UDP - tcp ED...... TCP - udp_multicast .D...... UDP multicast - http .D...... HTTP tunneling - -rtsp_flags .D...... set RTSP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - listen .D...... wait for incoming connections - prefer_tcp ED...... try RTP via TCP first, if available - -allowed_media_types .D...... set media types to accept from the server (default F) - video .D...... Video - audio .D...... Audio - data .D...... Data - subtitle .D...... Subtitle - -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) - -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) - -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) - -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -user-agent .D...... override User-Agent header (default "Lavf56.40.101") - -sbg_demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 0) - -frame_size .D...... (from 0 to INT_MAX) (default 0) - -max_file_size .D...... (from 0 to INT_MAX) (default 5e+06) - -SDP demuxer AVOptions: - -sdp_flags .D...... SDP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - custom_io .D...... use custom I/O - rtcp_to_source .D...... send RTCP packets to the source address of received packets - -allowed_media_types .D...... set media types to accept from the server (default F) - video .D...... Video - audio .D...... Audio - data .D...... Data - subtitle .D...... Subtitle - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -sln demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 8000) - -channels .D...... (from 0 to INT_MAX) (default 1) - -tedcaptions_demuxer AVOptions: - -start_time .D...S.. set the start time (offset) of the subtitles, in ms (from I64_MIN to I64_MAX) (default 15000) - -TTY demuxer AVOptions: - -chars_per_frame .D...... (from 1 to INT_MAX) (default 6000) - -video_size .D...... A string describing frame size, such as 640x480 or hd720. - -framerate .D...... (default "25") - -vc1 demuxer AVOptions: - -framerate .D...... (default "25") - -vobsub AVOptions: - -sub_name .D...... URI for .sub file - -WAV demuxer AVOptions: - -ignore_length .D...... Ignore length (from 0 to 1) (default 0) - -WebM DASH Manifest demuxer AVOptions: - -live .D...... flag indicating that the input is a live file that only has the headers. (from 0 to 1) (default 0) - -WebVTT demuxer AVOptions: - -eXtended BINary text (XBIN) demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -bmp demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -dds demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -dpx demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -exr demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -j2k demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -jpeg demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -jpegls demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -pictor demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -png demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -qdraw demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -sgi demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -sunrast demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -tiff demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -webp demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -Game Music Emu demuxer AVOptions: - -track_index .D..A... set track that should be played (from 0 to INT_MAX) (default 0) - -sample_rate .D..A... set sample rate (from 1000 to 999999) (default 44100) - -max_size .D..A... set max file size supported (in bytes) (from 0 to 1.84467e+19) (default 5.24288e+07) - -ModPlug demuxer AVOptions: - -noise_reduction .D...... Enable noise reduction 0(off)-1(on) (from 0 to 1) (default 0) - -reverb_depth .D...... Reverb level 0(quiet)-100(loud) (from 0 to 100) (default 0) - -reverb_delay .D...... Reverb delay in ms, usually 40-200ms (from 0 to INT_MAX) (default 0) - -bass_amount .D...... XBass level 0(quiet)-100(loud) (from 0 to 100) (default 0) - -bass_range .D...... XBass cutoff in Hz 10-100 (from 0 to 100) (default 0) - -surround_depth .D...... Surround level 0(quiet)-100(heavy) (from 0 to 100) (default 0) - -surround_delay .D...... Surround delay in ms, usually 5-40ms (from 0 to INT_MAX) (default 0) - -max_size .D...... Max file size supported (in bytes). Default is 5MB. Set to 0 for no limit (not recommended) (from 0 to 1.04858e+08) (default 5.24288e+06) - -video_stream_expr .D...... Color formula - -video_stream .D...... Make demuxer output a video stream (from 0 to 1) (default 0) - -video_stream_w .D...... Video stream width in char (one char = 8x8px) (from 20 to 512) (default 30) - -video_stream_h .D...... Video stream height in char (one char = 8x8px) (from 20 to 512) (default 30) - -video_stream_ptxt .D...... Print speed, tempo, order, ... in video stream (from 0 to 1) (default 1) - -ALSA demuxer AVOptions: - -sample_rate .D...... (from 1 to INT_MAX) (default 48000) - -channels .D...... (from 1 to INT_MAX) (default 2) - -DV1394 indev AVOptions: - -standard .D...... (from 0 to 1) (default 0) - PAL .D...... - NTSC .D...... - -channel .D...... (from 0 to INT_MAX) (default 63) - -fbdev indev AVOptions: - -framerate .D...... (default "25") - -iec61883 indev AVOptions: - -dvtype .D...... override autodetection of DV/HDV (from 0 to 2) (default 0) - auto .D...... auto detect DV/HDV - dv .D...... force device being treated as DV device - hdv .D...... force device being treated as HDV device - -dvbuffer .D...... set queue buffer size (in packets) (from 0 to INT_MAX) (default 0) - -dvguid .D...... select one of multiple DV devices by its GUID - -JACK indev AVOptions: - -channels .D...... Number of audio channels. (from 1 to INT_MAX) (default 2) - -lavfi indev AVOptions: - -graph .D...... set libavfilter graph - -graph_file .D...... set libavfilter graph filename - -dumpgraph .D...... dump graph to stderr - -openal AVOptions: - -channels .D...... set number of channels (from 1 to 2) (default 2) - -sample_rate .D...... set sample rate (from 1 to 192000) (default 44100) - -sample_size .D...... set sample size (from 8 to 16) (default 16) - -list_devices .D...... list available devices (from 0 to 1) (default 0) - true .D...... - false .D...... - -OSS demuxer AVOptions: - -sample_rate .D...... (from 1 to INT_MAX) (default 48000) - -channels .D...... (from 1 to INT_MAX) (default 2) - -Pulse demuxer AVOptions: - -server .D...... set PulseAudio server - -name .D...... set application name (default "Lavf56.40.101") - -stream_name .D...... set stream description (default "record") - -sample_rate .D...... set sample rate in Hz (from 1 to INT_MAX) (default 48000) - -channels .D...... set number of audio channels (from 1 to INT_MAX) (default 2) - -frame_size .D...... set number of bytes per frame (from 1 to INT_MAX) (default 1024) - -fragment_size .D...... set buffering size, affects latency and cpu usage (from -1 to INT_MAX) (default -1) - -wallclock .D...... set the initial pts using the current time (from -1 to 1) (default 1) - -V4L2 indev AVOptions: - -standard .D...... set TV standard, used only by analog frame grabber - -channel .D...... set TV channel, used only by frame grabber (from -1 to INT_MAX) (default -1) - -video_size .D...... set frame size - -pixel_format .D...... set preferred pixel format - -input_format .D...... set preferred pixel format (for raw video) or codec name - -framerate .D...... set frame rate - -list_formats .D...... list available formats and exit (from 0 to INT_MAX) (default 0) - all .D...... show all available formats - raw .D...... show only non-compressed formats - compressed .D...... show only compressed formats - -list_standards .D...... list supported standards and exit (from 0 to 1) (default 0) - all .D...... show all supported standards - -timestamps .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) - default .D...... use timestamps from the kernel - abs .D...... use absolute timestamps (wall clock) - mono2abs .D...... force conversion from monotonic to absolute timestamps - -ts .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) - default .D...... use timestamps from the kernel - abs .D...... use absolute timestamps (wall clock) - mono2abs .D...... force conversion from monotonic to absolute timestamps - -use_libv4l2 .D...... use libv4l2 (v4l-utils) conversion functions (from 0 to 1) (default 0) - -xcbgrab indev AVOptions: - -x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) - -y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) - -grab_x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) - -grab_y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) - -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "vga") - -framerate .D...... (default "ntsc") - -draw_mouse .D...... Draw the mouse pointer. (from 0 to 1) (default 1) - -follow_mouse .D...... Move the grabbing region when the mouse pointer reaches within specified amount of pixels to the edge of region. (from -1 to INT_MAX) (default 0) - centered .D...... Keep the mouse pointer at the center of grabbing region when following. - -show_region .D...... Show the grabbing region. (from 0 to 1) (default 0) - -region_border .D...... Set the region border thickness. (from 1 to 128) (default 3) - -libcdio indev AVOptions: - -speed .D...... set drive reading speed (from 0 to INT_MAX) (default 0) - -paranoia_mode .D...... set error recovery mode (default 0) - disable .D...... apply no fixups - verify .D...... verify data integrity in overlap area - overlap .D...... perform overlapped reads - neverskip .D...... do not skip failed reads - full .D...... apply all recovery modes - -libdc1394 indev AVOptions: - -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "qvga") - -pixel_format .D...... (default "uyvy422") - -framerate .D...... (default "ntsc") - -ADTS muxer AVOptions: - -AIFF muxer AVOptions: - -APNG muxer AVOptions: - -ass muxer AVOptions: - -AST muxer AVOptions: - -dash muxer AVOptions: - -f4v muxer AVOptions: - -flac muxer AVOptions: - -frame hash encoder class AVOptions: - -GIF muxer AVOptions: - -HDS muxer AVOptions: - -hls muxer AVOptions: - -image2 muxer AVOptions: - -ipod muxer AVOptions: - -ismv muxer AVOptions: - -LATM/LOAS muxer AVOptions: - -hash encoder class AVOptions: - -matroska muxer AVOptions: - -matroska audio muxer AVOptions: - -mov muxer AVOptions: - -MP3 muxer AVOptions: - -mp4 muxer AVOptions: - -mpeg muxer AVOptions: - -vcd muxer AVOptions: - -dvd muxer AVOptions: - -svcd muxer AVOptions: - -vob muxer AVOptions: - -MPEGTS muxer AVOptions: - -mpjpeg_muxer AVOptions: - -MXF muxer AVOptions: - -MXF-D10 muxer AVOptions: - -MXF-OPAtom muxer AVOptions: - -nutenc AVOptions: - -Ogg audio muxer AVOptions: - -Ogg muxer AVOptions: - -Ogg Opus muxer AVOptions: - -psp muxer AVOptions: - -RTP muxer AVOptions: - -RTSP muxer AVOptions: - -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) - -rtsp_transport ED...... set RTSP transport protocols (default 0) - udp ED...... UDP - tcp ED...... TCP - udp_multicast .D...... UDP multicast - http .D...... HTTP tunneling - -rtsp_flags .D...... set RTSP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - listen .D...... wait for incoming connections - prefer_tcp ED...... try RTP via TCP first, if available - -allowed_media_types .D...... set media types to accept from the server (default F) - video .D...... Video - audio .D...... Audio - data .D...... Data - subtitle .D...... Subtitle - -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) - -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) - -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) - -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -user-agent .D...... override User-Agent header (default "Lavf56.40.101") - -segment muxer AVOptions: - -stream_segment muxer AVOptions: - -smooth streaming muxer AVOptions: - -Ogg Speex muxer AVOptions: - -spdif AVOptions: - -tg2 muxer AVOptions: - -tgp muxer AVOptions: - -WAV muxer AVOptions: - -webm muxer AVOptions: - -WebM DASH Manifest muxer AVOptions: - -WebM Chunk Muxer AVOptions: - -WebP muxer AVOptions: - -caca_outdev AVOptions: - -fbdev outdev AVOptions: - -opengl outdev AVOptions: - -PulseAudio muxer AVOptions: - -sdl outdev AVOptions: - -xvideo outdev AVOptions: - diff --git a/utils/a b/utils/a deleted file mode 100644 index ae05bcfd8..000000000 --- a/utils/a +++ /dev/null @@ -1,1246 +0,0 @@ -Simple multimedia streams analyzer -usage: ffprobe [OPTIONS] [INPUT_FILE] - -Main options: --L show license --h topic show help --? topic show help --help topic show help ---help topic show help --version show version --buildconf show build configuration --formats show available formats --devices show available devices --codecs show available codecs --decoders show available decoders --encoders show available encoders --bsfs show available bit stream filters --protocols show available protocols --filters show available filters --pix_fmts show available pixel formats --layouts show standard channel layouts --sample_fmts show available audio sample formats --colors show available color names --loglevel loglevel set logging level --v loglevel set logging level --report generate a report --max_alloc bytes set maximum size of a single allocated block --cpuflags flags force specific cpu flags --hide_banner hide_banner do not show program banner --sources device list sources of the input device --sinks device list sinks of the output device --f format force format --unit show unit of the displayed values --prefix use SI prefixes for the displayed values --byte_binary_prefix use binary prefixes for byte units --sexagesimal use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units --pretty prettify the format of displayed values, make it more human readable --print_format format set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml) --of format alias for -print_format --select_streams stream_specifier select the specified streams --sections print sections structure and section information, and exit --show_data show packets data --show_data_hash show packets data hash --show_error show probing error --show_format show format/container info --show_frames show frames info --show_format_entry entry show a particular entry from the format/container info --show_entries entry_list show a set of specified entries --show_packets show packets info --show_programs show programs info --show_streams show streams info --show_chapters show chapters info --count_frames count the number of frames per stream --count_packets count the number of packets per stream --show_program_version show ffprobe version --show_library_versions show library versions --show_versions show program and library versions --show_pixel_formats show pixel format descriptions --show_private_data show private data --private same as show_private_data --bitexact force bitexact output --read_intervals read_intervals set read intervals --default generic catch all option --i input_file read specified file - - -AVFormatContext AVOptions: - -avioflags ED...... (default 0) - direct ED...... reduce buffering - -probesize .D...... set probing size (from 32 to I64_MAX) (default 5e+06) - -formatprobesize .D...... number of bytes to probe file format (from 0 to 2.14748e+09) (default 1.04858e+06) - -fflags ED...... (default 200) - ignidx .D...... ignore index - genpts .D...... generate pts - nofillin .D...... do not fill in missing values that can be exactly calculated - noparse .D...... disable AVParsers, this needs nofillin too - igndts .D...... ignore dts - discardcorrupt .D...... discard corrupted frames - sortdts .D...... try to interleave outputted packets by dts - keepside .D...... don't merge side data - fastseek .D...... fast but inaccurate seeks - nobuffer .D...... reduce the latency introduced by optional buffering - -seek2any .D...... allow seeking to non-keyframes on demuxer level when supported (from 0 to 1) (default 0) - -analyzeduration .D...... specify how many microseconds are analyzed to probe the input (from 0 to I64_MAX) (default 0) - -cryptokey .D...... decryption key - -indexmem .D...... max memory used for timestamp index (per stream) (from 0 to INT_MAX) (default 1.04858e+06) - -rtbufsize .D...... max memory used for buffering real-time frames (from 0 to INT_MAX) (default 3.04128e+06) - -fdebug ED...... print specific debug info (default 0) - ts ED...... - -max_delay ED...... maximum muxing or demuxing delay in microseconds (from -1 to INT_MAX) (default -1) - -fpsprobesize .D...... number of frames used to probe fps (from -1 to 2.14748e+09) (default -1) - -f_err_detect .D...... set error detection flags (deprecated; use err_detect, save via avconv) (default 1) - crccheck .D...... verify embedded CRCs - bitstream .D...... detect bitstream specification deviations - buffer .D...... detect improper bitstream length - explode .D...... abort decoding on minor error detection - ignore_err .D...... ignore errors - careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors - compliant .D...... consider all spec non compliancies as errors - aggressive .D...... consider things that a sane encoder shouldn't do as an error - -err_detect .D...... set error detection flags (default 1) - crccheck .D...... verify embedded CRCs - bitstream .D...... detect bitstream specification deviations - buffer .D...... detect improper bitstream length - explode .D...... abort decoding on minor error detection - ignore_err .D...... ignore errors - careful .D...... consider things that violate the spec, are fast to check and have not been seen in the wild as errors - compliant .D...... consider all spec non compliancies as errors - aggressive .D...... consider things that a sane encoder shouldn't do as an error - -use_wallclock_as_timestamps .D...... use wallclock as timestamps (from 0 to 2.14748e+09) (default 0) - -skip_initial_bytes .D...... set number of bytes to skip before reading header and frames (from 0 to I64_MAX) (default 0) - -correct_ts_overflow .D...... correct single timestamp overflows (from 0 to 1) (default 1) - -f_strict ED...... how strictly to follow the standards (deprecated; use strict, save via avconv) (from INT_MIN to INT_MAX) (default 0) - very ED...... strictly conform to a older more strict version of the spec or reference software - strict ED...... strictly conform to all the things in the spec no matter what the consequences - normal ED...... - unofficial ED...... allow unofficial extensions - experimental ED...... allow non-standardized experimental variants - -strict ED...... how strictly to follow the standards (from INT_MIN to INT_MAX) (default 0) - very ED...... strictly conform to a older more strict version of the spec or reference software - strict ED...... strictly conform to all the things in the spec no matter what the consequences - normal ED...... - unofficial ED...... allow unofficial extensions - experimental ED...... allow non-standardized experimental variants - -max_ts_probe .D...... maximum number of packets to read while waiting for the first timestamp (from 0 to INT_MAX) (default 50) - -dump_separator ED...... set information dump field separator (default ", ") - -codec_whitelist .D...... List of decoders that are allowed to be used - -format_whitelist .D...... List of demuxers that are allowed to be used - -max_streams .D...... maximum number of streams (from 0 to INT_MAX) (default 1000) - -AVIOContext AVOptions: - -URLContext AVOptions: - -Async AVOptions: - -bluray AVOptions: - -playlist .D...... (from -1 to 99999) (default -1) - -angle .D...... (from 0 to 254) (default 0) - -chapter .D...... (from 1 to 65534) (default 1) - -Cache AVOptions: - -read_ahead_limit .D...... Amount in bytes that may be read ahead when seeking isn't supported, -1 for unlimited (from -1 to INT_MAX) (default 65536) - -crypto AVOptions: - -key ED...... AES encryption/decryption key - -iv ED...... AES encryption/decryption initialization vector - -decryption_key .D...... AES decryption key - -decryption_iv .D...... AES decryption initialization vector - -file AVOptions: - -ftp AVOptions: - -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) - -ftp-anonymous-password ED...... password for anonymous login. E-mail address should be used. - -http AVOptions: - -seekable .D...... control seekability of connection (from -1 to 1) (default -1) - -headers ED...... set custom HTTP headers, can override built in default headers - -content_type ED...... set a specific content type for the POST messages - -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") - -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") - -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) - -post_data ED...... set custom HTTP post data - -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax - -icy .D...... request ICY metadata (from 0 to 1) (default 1) - -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) - none ED...... No auth method set, autodetect - basic ED...... HTTP basic authentication - -location ED...... The actual location of the data received - -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) - -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) - -method ED...... Override the HTTP method or set the expected HTTP method from a client - -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) - -listen ED...... listen on HTTP (from 0 to 2) (default 0) - -https AVOptions: - -seekable .D...... control seekability of connection (from -1 to 1) (default -1) - -headers ED...... set custom HTTP headers, can override built in default headers - -content_type ED...... set a specific content type for the POST messages - -user_agent .D...... override User-Agent header (default "Lavf/56.40.101") - -user-agent .D...... override User-Agent header (default "Lavf/56.40.101") - -multiple_requests ED...... use persistent connections (from 0 to 1) (default 0) - -post_data ED...... set custom HTTP post data - -cookies .D...... set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax - -icy .D...... request ICY metadata (from 0 to 1) (default 1) - -auth_type ED...... HTTP authentication type (from 0 to 1) (default 0) - none ED...... No auth method set, autodetect - basic ED...... HTTP basic authentication - -location ED...... The actual location of the data received - -offset .D...... initial byte offset (from 0 to I64_MAX) (default 0) - -end_offset .D...... try to limit the request to bytes preceding this offset (from 0 to I64_MAX) (default 0) - -method ED...... Override the HTTP method or set the expected HTTP method from a client - -reconnect .D...... auto reconnect after disconnect before EOF (from 0 to 1) (default 0) - -listen ED...... listen on HTTP (from 0 to 2) (default 0) - -icecast AVOptions: - -pipe AVOptions: - -rtp AVOptions: - -ttl ED...... Time to live (in milliseconds, multicast only) (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Send/Receive buffer size (in bytes) (from -1 to INT_MAX) (default -1) - -rtcp_port ED...... Custom rtcp port (from -1 to INT_MAX) (default -1) - -local_rtpport ED...... Local rtp port (from -1 to INT_MAX) (default -1) - -local_rtcpport ED...... Local rtcp port (from -1 to INT_MAX) (default -1) - -connect ED...... Connect socket (from 0 to 1) (default 0) - -write_to_source ED...... Send packets to the source address of the latest received packet (from 0 to 1) (default 0) - -pkt_size ED...... Maximum packet size (from -1 to INT_MAX) (default -1) - -dscp ED...... DSCP class (from -1 to INT_MAX) (default -1) - -sources ED...... Source list - -block ED...... Block list - -sctp AVOptions: - -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) - -timeout ED...... Connection timeout (in milliseconds) (from INT_MIN to INT_MAX) (default 10000) - -listen_timeout ED...... Bind timeout (in milliseconds) (from INT_MIN to INT_MAX) (default -1) - -max_streams ED...... Max stream to allocate (from 0 to 32767) (default 0) - -srtp AVOptions: - -srtp_in_suite .D...... - -srtp_in_params .D...... - -subfile AVOptions: - -start .D...... start offset (from 0 to I64_MAX) (default 0) - -end .D...... end offset (from 0 to I64_MAX) (default 0) - -tcp AVOptions: - -listen ED...... Listen for incoming connections (from 0 to 2) (default 0) - -timeout ED...... set timeout (in microseconds) of socket I/O operations (from -1 to INT_MAX) (default -1) - -listen_timeout ED...... Connection awaiting timeout (in milliseconds) (from -1 to INT_MAX) (default -1) - -tls AVOptions: - -ca_file ED...... Certificate Authority database file - -cafile ED...... Certificate Authority database file - -tls_verify ED...... Verify the peer certificate (from 0 to 1) (default 0) - -cert_file ED...... Certificate file - -key_file ED...... Private key file - -listen ED...... Listen for incoming connections (from 0 to 1) (default 0) - -verifyhost ED...... Verify against a specific hostname - -udp AVOptions: - -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) - -localport ED...... Local port (from -1 to INT_MAX) (default -1) - -local_port ED...... Local port (from -1 to INT_MAX) (default -1) - -localaddr ED...... Local address - -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) - -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) - -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) - -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) - -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) - -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) - -sources ED...... Source list - -block ED...... Block list - -udplite AVOptions: - -buffer_size ED...... System data size (in bytes) (from -1 to INT_MAX) (default -1) - -localport ED...... Local port (from -1 to INT_MAX) (default -1) - -local_port ED...... Local port (from -1 to INT_MAX) (default -1) - -localaddr ED...... Local address - -udplite_coverage ED...... choose UDPLite head size which should be validated by checksum (from 0 to INT_MAX) (default 0) - -pkt_size ED...... Maximum UDP packet size (from -1 to INT_MAX) (default 1472) - -reuse ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -reuse_socket ED...... explicitly allow reusing UDP sockets (from -1 to 1) (default -1) - -connect ED...... set if connect() should be called on socket (from 0 to 1) (default 0) - -fifo_size .D...... set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) (default 28672) - -overrun_nonfatal .D...... survive in case of UDP receiving circular buffer overrun (from 0 to 1) (default 0) - -timeout .D...... set raise error timeout (only in read mode) (from 0 to INT_MAX) (default 0) - -sources ED...... Source list - -block ED...... Block list - -unix AVOptions: - -listen ED...... Open socket for listening (from 0 to 1) (default 0) - -timeout ED...... Timeout in ms (from -1 to INT_MAX) (default -1) - -type ED...... Socket type (from INT_MIN to INT_MAX) (default 1) - stream ED...... Stream (reliable stream-oriented) - datagram ED...... Datagram (unreliable packet-oriented) - seqpacket ED...... Seqpacket (reliable packet-oriented - -librtmp protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmpe protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmps protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmpt protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -librtmpte protocol AVOptions: - -rtmp_app ED...... Name of application to connect to on the RTMP server - -rtmp_buffer ED...... Set buffer time in milliseconds. The default is 3000. (default "3000") - -rtmp_conn ED...... Append arbitrary AMF data to the Connect message - -rtmp_flashver ED...... Version of the Flash plugin used to run the SWF player. - -rtmp_live .D...... Specify that the media is a live stream. (from INT_MIN to INT_MAX) (default 0) - any .D...... both - live .D...... live stream - recorded .D...... recorded stream - -rtmp_pageurl .D...... URL of the web page in which the media was embedded. By default no value will be sent. - -rtmp_playpath ED...... Stream identifier to play or to publish - -rtmp_subscribe .D...... Name of live stream to subscribe to. Defaults to rtmp_playpath. - -rtmp_swfurl ED...... URL of the SWF player. By default no value will be sent - -rtmp_swfverify .D...... URL to player swf file, compute hash/size automatically. (unimplemented) - -rtmp_tcurl ED...... URL of the target stream. Defaults to proto://host[:port]/app. - -rtmp_buffer_size ED...... set buffer size in bytes (from -1 to INT_MAX) (default -1) - -libssh AVOptions: - -timeout ED...... set timeout of socket I/O operations (from -1 to INT_MAX) (default -1) - -private_key ED...... set path to private key - -aa AVOptions: - -aa_fixed_key .D...... Fixed key used for handling Audible AA files - -Artworx Data Format demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -APNG demuxer AVOptions: - -ignore_loop .D...... ignore loop setting (from 0 to 1) (default 1) - -max_fps .D...... maximum framerate (0 is no limit) (from 0 to INT_MAX) (default 15) - -default_fps .D...... default framerate (0 is as fast as possible) (from 0 to INT_MAX) (default 15) - -aqtdec AVOptions: - -subfps .D...S.. set the movie frame rate (from 0 to INT_MAX) (default 25/1) - -asf demuxer AVOptions: - -no_resync_search .D...... Don't try to resynchronize by looking for a certain optional start code (from 0 to 1) (default 0) - -export_xmp .D...... Export full XMP metadata (from 0 to 1) (default 0) - -avi AVOptions: - -use_odml .D...... use odml index (from -1 to 1) (default 1) - -Binary text demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -cavsvideo demuxer AVOptions: - -framerate .D...... (default "25") - -CDXL demuxer AVOptions: - -sample_rate .D...... (from 1 to INT_MAX) (default 11025) - -framerate .D...... - -concat demuxer AVOptions: - -safe .D...... enable safe mode (from -1 to 1) (default 1) - -auto_convert .D...... automatically convert bitstream format (from 0 to 1) (default 1) - -dirac demuxer AVOptions: - -framerate .D...... (default "25") - -dnxhd demuxer AVOptions: - -framerate .D...... (default "25") - -dvbsub demuxer AVOptions: - -framerate .D...... (default "25") - -flvdec AVOptions: - -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) - -live_flvdec AVOptions: - -flv_metadata .D.V.... Allocate streams according to the onMetaData array (from 0 to 1) (default 0) - -g729 demuxer AVOptions: - -bit_rate .D...... (from 0 to INT_MAX) (default 0) - -GIF demuxer AVOptions: - -min_delay .D...... minimum valid delay between frames (in hundredths of second) (from 0 to 6000) (default 2) - -max_gif_delay .D...... maximum valid delay between frames (in hundredths of seconds) (from 0 to 65535) (default 65535) - -default_delay .D...... default delay between frames (in hundredths of second) (from 0 to 6000) (default 10) - -ignore_loop .D...... ignore loop setting (netscape extension) (from 0 to 1) (default 1) - -gsm demuxer AVOptions: - -sample_rate .D...... (from 1 to 6.50753e+07) (default 8000) - -h261 demuxer AVOptions: - -framerate .D...... (default "25") - -h263 demuxer AVOptions: - -framerate .D...... (default "25") - -h264 demuxer AVOptions: - -framerate .D...... (default "25") - -hevc demuxer AVOptions: - -framerate .D...... (default "25") - -hls,applehttp AVOptions: - -live_start_index .D...... segment index to start live streams at (negative values are from the end) (from INT_MIN to INT_MAX) (default -3) - -allowed_extensions .D...... List of file extensions that hls is allowed to access (default "3gp,aac,avi,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav") - -max_reload .D...... Maximum number of times a insufficient list is attempted to be reloaded (from 0 to INT_MAX) (default 1000) - -iCE Draw File demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -image2 demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -image2pipe demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -alias_pix demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -brender_pix demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -ingenient demuxer AVOptions: - -framerate .D...... (default "25") - -m4v demuxer AVOptions: - -framerate .D...... (default "25") - -microdvddec AVOptions: - -subfps .D...S.. set the movie frame rate fallback (from 0 to INT_MAX) (default 0/1) - -mjpeg demuxer AVOptions: - -framerate .D...... (default "25") - -mov,mp4,m4a,3gp,3g2,mj2 AVOptions: - -use_absolute_path .D.V.... allow using absolute path when opening alias, this is a possible security issue (from 0 to 1) (default 0) - -seek_streams_individually .D.V.... Seek each stream individually to the to the closest point (from 0 to 1) (default 1) - -ignore_editlist .D.V.... (from 0 to 1) (default 0) - -use_mfra_for .D.V.... use mfra for fragment timestamps (from -1 to 2) (default -1) - auto .D.V.... auto - dts .D.V.... dts - pts .D.V.... pts - -export_all .D.V.... Export unrecognized metadata entries (from 0 to 1) (default 0) - -export_xmp .D.V.... Export full XMP metadata (from 0 to 1) (default 0) - -activation_bytes .D...... Secret bytes for Audible AAX files - -audible_fixed_key .D...... Fixed key used for handling Audible AAX files - -enable_drefs .D.V.... Enable external track support. (from 0 to 1) (default 0) - -mp3 AVOptions: - -usetoc .D...... use table of contents (from -1 to 2) (default -1) - -mpegts demuxer AVOptions: - -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) - -fix_teletext_pts .D...... try to fix pts values of dvb teletext streams (from 0 to 1) (default 1) - -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) - -scan_all_pmts .D...... scan and combine all PMTs (from -1 to 1) (default -1) - -mpegtsraw demuxer AVOptions: - -resync_size .D...... set size limit for looking up a new synchronization (from 0 to INT_MAX) (default 65536) - -compute_pcr .D...... compute exact PCR for each transport stream packet (from 0 to 1) (default 0) - -ts_packetsize .D....XR output option carrying the raw packet size (from 0 to 0) (default 0) - -mpegvideo demuxer AVOptions: - -framerate .D...... (default "25") - -alaw demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -mulaw demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f64be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f64le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f32be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -f32le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s32be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s32le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s24be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s24le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s16be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s16le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -s8 demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u32be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u32le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u24be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u24le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u16be demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u16le demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -u8 demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 44100) - -channels .D...... (from 0 to INT_MAX) (default 1) - -rawvideo demuxer AVOptions: - -video_size .D...... set frame size - -pixel_format .D...... set pixel format (default "yuv420p") - -framerate .D...... set frame rate (default "25") - -RTP demuxer AVOptions: - -rtp_flags .D...... set RTP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -RTSP demuxer AVOptions: - -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) - -rtsp_transport ED...... set RTSP transport protocols (default 0) - udp ED...... UDP - tcp ED...... TCP - udp_multicast .D...... UDP multicast - http .D...... HTTP tunneling - -rtsp_flags .D...... set RTSP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - listen .D...... wait for incoming connections - prefer_tcp ED...... try RTP via TCP first, if available - -allowed_media_types .D...... set media types to accept from the server (default F) - video .D...... Video - audio .D...... Audio - data .D...... Data - subtitle .D...... Subtitle - -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) - -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) - -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) - -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -user-agent .D...... override User-Agent header (default "Lavf56.40.101") - -sbg_demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 0) - -frame_size .D...... (from 0 to INT_MAX) (default 0) - -max_file_size .D...... (from 0 to INT_MAX) (default 5e+06) - -SDP demuxer AVOptions: - -sdp_flags .D...... SDP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - custom_io .D...... use custom I/O - rtcp_to_source .D...... send RTCP packets to the source address of received packets - -allowed_media_types .D...... set media types to accept from the server (default F) - video .D...... Video - audio .D...... Audio - data .D...... Data - subtitle .D...... Subtitle - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -sln demuxer AVOptions: - -sample_rate .D...... (from 0 to INT_MAX) (default 8000) - -channels .D...... (from 0 to INT_MAX) (default 1) - -tedcaptions_demuxer AVOptions: - -start_time .D...S.. set the start time (offset) of the subtitles, in ms (from I64_MIN to I64_MAX) (default 15000) - -TTY demuxer AVOptions: - -chars_per_frame .D...... (from 1 to INT_MAX) (default 6000) - -video_size .D...... A string describing frame size, such as 640x480 or hd720. - -framerate .D...... (default "25") - -vc1 demuxer AVOptions: - -framerate .D...... (default "25") - -vobsub AVOptions: - -sub_name .D...... URI for .sub file - -WAV demuxer AVOptions: - -ignore_length .D...... Ignore length (from 0 to 1) (default 0) - -WebM DASH Manifest demuxer AVOptions: - -live .D...... flag indicating that the input is a live file that only has the headers. (from 0 to 1) (default 0) - -WebVTT demuxer AVOptions: - -eXtended BINary text (XBIN) demuxer AVOptions: - -linespeed .D...... set simulated line speed (bytes per second) (from 1 to INT_MAX) (default 6000) - -video_size .D...... set video size, such as 640x480 or hd720. - -framerate .D...... set framerate (frames per second) (default "25") - -bmp demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -dds demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -dpx demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -exr demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -j2k demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -jpeg demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -jpegls demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -pictor demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -png demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -qdraw demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -sgi demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -sunrast demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -tiff demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -webp demuxer AVOptions: - -framerate .D...... set the video framerate (default "25") - -loop .D...... force loop over input file sequence (from 0 to 1) (default 0) - -pattern_type .D...... set pattern type (from 0 to INT_MAX) (default 4) - glob_sequence .D...... select glob/sequence pattern type - glob .D...... select glob pattern type - sequence .D...... select sequence pattern type - none .D...... disable pattern matching - -pixel_format .D...... set video pixel format - -start_number .D...... set first number in the sequence (from INT_MIN to INT_MAX) (default 0) - -start_number_range .D...... set range for looking at the first sequence number (from 1 to INT_MAX) (default 5) - -video_size .D...... set video size - -frame_size .D...... force frame size in bytes (from 0 to INT_MAX) (default 0) - -ts_from_file .D...... set frame timestamp from file's one (from 0 to 2) (default 0) - none .D...... none - sec .D...... second precision - ns .D...... nano second precision - -Game Music Emu demuxer AVOptions: - -track_index .D..A... set track that should be played (from 0 to INT_MAX) (default 0) - -sample_rate .D..A... set sample rate (from 1000 to 999999) (default 44100) - -max_size .D..A... set max file size supported (in bytes) (from 0 to 1.84467e+19) (default 5.24288e+07) - -ModPlug demuxer AVOptions: - -noise_reduction .D...... Enable noise reduction 0(off)-1(on) (from 0 to 1) (default 0) - -reverb_depth .D...... Reverb level 0(quiet)-100(loud) (from 0 to 100) (default 0) - -reverb_delay .D...... Reverb delay in ms, usually 40-200ms (from 0 to INT_MAX) (default 0) - -bass_amount .D...... XBass level 0(quiet)-100(loud) (from 0 to 100) (default 0) - -bass_range .D...... XBass cutoff in Hz 10-100 (from 0 to 100) (default 0) - -surround_depth .D...... Surround level 0(quiet)-100(heavy) (from 0 to 100) (default 0) - -surround_delay .D...... Surround delay in ms, usually 5-40ms (from 0 to INT_MAX) (default 0) - -max_size .D...... Max file size supported (in bytes). Default is 5MB. Set to 0 for no limit (not recommended) (from 0 to 1.04858e+08) (default 5.24288e+06) - -video_stream_expr .D...... Color formula - -video_stream .D...... Make demuxer output a video stream (from 0 to 1) (default 0) - -video_stream_w .D...... Video stream width in char (one char = 8x8px) (from 20 to 512) (default 30) - -video_stream_h .D...... Video stream height in char (one char = 8x8px) (from 20 to 512) (default 30) - -video_stream_ptxt .D...... Print speed, tempo, order, ... in video stream (from 0 to 1) (default 1) - -ALSA demuxer AVOptions: - -sample_rate .D...... (from 1 to INT_MAX) (default 48000) - -channels .D...... (from 1 to INT_MAX) (default 2) - -DV1394 indev AVOptions: - -standard .D...... (from 0 to 1) (default 0) - PAL .D...... - NTSC .D...... - -channel .D...... (from 0 to INT_MAX) (default 63) - -fbdev indev AVOptions: - -framerate .D...... (default "25") - -iec61883 indev AVOptions: - -dvtype .D...... override autodetection of DV/HDV (from 0 to 2) (default 0) - auto .D...... auto detect DV/HDV - dv .D...... force device being treated as DV device - hdv .D...... force device being treated as HDV device - -dvbuffer .D...... set queue buffer size (in packets) (from 0 to INT_MAX) (default 0) - -dvguid .D...... select one of multiple DV devices by its GUID - -JACK indev AVOptions: - -channels .D...... Number of audio channels. (from 1 to INT_MAX) (default 2) - -lavfi indev AVOptions: - -graph .D...... set libavfilter graph - -graph_file .D...... set libavfilter graph filename - -dumpgraph .D...... dump graph to stderr - -openal AVOptions: - -channels .D...... set number of channels (from 1 to 2) (default 2) - -sample_rate .D...... set sample rate (from 1 to 192000) (default 44100) - -sample_size .D...... set sample size (from 8 to 16) (default 16) - -list_devices .D...... list available devices (from 0 to 1) (default 0) - true .D...... - false .D...... - -OSS demuxer AVOptions: - -sample_rate .D...... (from 1 to INT_MAX) (default 48000) - -channels .D...... (from 1 to INT_MAX) (default 2) - -Pulse demuxer AVOptions: - -server .D...... set PulseAudio server - -name .D...... set application name (default "Lavf56.40.101") - -stream_name .D...... set stream description (default "record") - -sample_rate .D...... set sample rate in Hz (from 1 to INT_MAX) (default 48000) - -channels .D...... set number of audio channels (from 1 to INT_MAX) (default 2) - -frame_size .D...... set number of bytes per frame (from 1 to INT_MAX) (default 1024) - -fragment_size .D...... set buffering size, affects latency and cpu usage (from -1 to INT_MAX) (default -1) - -wallclock .D...... set the initial pts using the current time (from -1 to 1) (default 1) - -V4L2 indev AVOptions: - -standard .D...... set TV standard, used only by analog frame grabber - -channel .D...... set TV channel, used only by frame grabber (from -1 to INT_MAX) (default -1) - -video_size .D...... set frame size - -pixel_format .D...... set preferred pixel format - -input_format .D...... set preferred pixel format (for raw video) or codec name - -framerate .D...... set frame rate - -list_formats .D...... list available formats and exit (from 0 to INT_MAX) (default 0) - all .D...... show all available formats - raw .D...... show only non-compressed formats - compressed .D...... show only compressed formats - -list_standards .D...... list supported standards and exit (from 0 to 1) (default 0) - all .D...... show all supported standards - -timestamps .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) - default .D...... use timestamps from the kernel - abs .D...... use absolute timestamps (wall clock) - mono2abs .D...... force conversion from monotonic to absolute timestamps - -ts .D...... set type of timestamps for grabbed frames (from 0 to 2) (default 0) - default .D...... use timestamps from the kernel - abs .D...... use absolute timestamps (wall clock) - mono2abs .D...... force conversion from monotonic to absolute timestamps - -use_libv4l2 .D...... use libv4l2 (v4l-utils) conversion functions (from 0 to 1) (default 0) - -xcbgrab indev AVOptions: - -x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) - -y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) - -grab_x .D...... Initial x coordinate. (from 0 to INT_MAX) (default 0) - -grab_y .D...... Initial y coordinate. (from 0 to INT_MAX) (default 0) - -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "vga") - -framerate .D...... (default "ntsc") - -draw_mouse .D...... Draw the mouse pointer. (from 0 to 1) (default 1) - -follow_mouse .D...... Move the grabbing region when the mouse pointer reaches within specified amount of pixels to the edge of region. (from -1 to INT_MAX) (default 0) - centered .D...... Keep the mouse pointer at the center of grabbing region when following. - -show_region .D...... Show the grabbing region. (from 0 to 1) (default 0) - -region_border .D...... Set the region border thickness. (from 1 to 128) (default 3) - -libcdio indev AVOptions: - -speed .D...... set drive reading speed (from 0 to INT_MAX) (default 0) - -paranoia_mode .D...... set error recovery mode (default 0) - disable .D...... apply no fixups - verify .D...... verify data integrity in overlap area - overlap .D...... perform overlapped reads - neverskip .D...... do not skip failed reads - full .D...... apply all recovery modes - -libdc1394 indev AVOptions: - -video_size .D...... A string describing frame size, such as 640x480 or hd720. (default "qvga") - -pixel_format .D...... (default "uyvy422") - -framerate .D...... (default "ntsc") - -ADTS muxer AVOptions: - -AIFF muxer AVOptions: - -APNG muxer AVOptions: - -ass muxer AVOptions: - -AST muxer AVOptions: - -dash muxer AVOptions: - -f4v muxer AVOptions: - -flac muxer AVOptions: - -frame hash encoder class AVOptions: - -GIF muxer AVOptions: - -HDS muxer AVOptions: - -hls muxer AVOptions: - -image2 muxer AVOptions: - -ipod muxer AVOptions: - -ismv muxer AVOptions: - -LATM/LOAS muxer AVOptions: - -hash encoder class AVOptions: - -matroska muxer AVOptions: - -matroska audio muxer AVOptions: - -mov muxer AVOptions: - -MP3 muxer AVOptions: - -mp4 muxer AVOptions: - -mpeg muxer AVOptions: - -vcd muxer AVOptions: - -dvd muxer AVOptions: - -svcd muxer AVOptions: - -vob muxer AVOptions: - -MPEGTS muxer AVOptions: - -mpjpeg_muxer AVOptions: - -MXF muxer AVOptions: - -MXF-D10 muxer AVOptions: - -MXF-OPAtom muxer AVOptions: - -nutenc AVOptions: - -Ogg audio muxer AVOptions: - -Ogg muxer AVOptions: - -Ogg Opus muxer AVOptions: - -psp muxer AVOptions: - -RTP muxer AVOptions: - -RTSP muxer AVOptions: - -initial_pause .D...... do not start playing the stream immediately (from 0 to 1) (default 0) - -rtsp_transport ED...... set RTSP transport protocols (default 0) - udp ED...... UDP - tcp ED...... TCP - udp_multicast .D...... UDP multicast - http .D...... HTTP tunneling - -rtsp_flags .D...... set RTSP flags (default 0) - filter_src .D...... only receive packets from the negotiated peer IP - listen .D...... wait for incoming connections - prefer_tcp ED...... try RTP via TCP first, if available - -allowed_media_types .D...... set media types to accept from the server (default F) - video .D...... Video - audio .D...... Audio - data .D...... Data - subtitle .D...... Subtitle - -min_port ED...... set minimum local UDP port (from 0 to 65535) (default 5000) - -max_port ED...... set maximum local UDP port (from 0 to 65535) (default 65000) - -timeout .D...... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1) - -stimeout .D...... set timeout (in microseconds) of socket TCP I/O operations (from INT_MIN to INT_MAX) (default 0) - -reorder_queue_size .D...... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1) - -buffer_size ED...... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1) - -user-agent .D...... override User-Agent header (default "Lavf56.40.101") - -segment muxer AVOptions: - -stream_segment muxer AVOptions: - -smooth streaming muxer AVOptions: - -Ogg Speex muxer AVOptions: - -spdif AVOptions: - -tg2 muxer AVOptions: - -tgp muxer AVOptions: - -WAV muxer AVOptions: - -webm muxer AVOptions: - -WebM DASH Manifest muxer AVOptions: - -WebM Chunk Muxer AVOptions: - -WebP muxer AVOptions: - -caca_outdev AVOptions: - -fbdev outdev AVOptions: - -opengl outdev AVOptions: - -PulseAudio muxer AVOptions: - -sdl outdev AVOptions: - -xvideo outdev AVOptions: - diff --git a/utils/generate_convert.sh.SAVED b/utils/generate_convert.sh.SAVED deleted file mode 100755 index de91d7bc4..000000000 --- a/utils/generate_convert.sh.SAVED +++ /dev/null @@ -1,217 +0,0 @@ -#!/bin/bash - -# Convert high-res mp4 to low res mkv -# ffmpeg options taken from: -# https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats -# https://ffmpeg.org/ffmpeg-utils.html#Video-size -# e.g. svga, qhd, hd480, hd720 -# default is qhd which is scaled down hd720 with same aspect raio. -# videos converted from hs720 to svga is best viewed with aspect ratio of 16:9 -# lynx -dump https://ffmpeg.org/ffmpeg-utils.html#Video-size 2>&1 |sed -n '/Video size/,/Video rate/p' -# see also: https://www.maketecheasier.com/manipulate-html-and-xml-files-from-commnad-line/ -# to calculate the new video size based on the current use -# use https://www.commandlinefu.com/commands/view/2207/get-video-information-with-ffmpeg -# e.g. ffmpeg -i or ffprobe -show_streams - -# following is the complete list of abbreviations recognized by ffmpeg: - -# ‘sqcif’ 128x96 -# ‘qqvga’ 160x120 -# ‘qcif’ 176x144 -# ‘hqvga’ 240x160 -# ‘cga’ 320x200 -# ‘qvga’ 320x240 -# ‘cif’ 352x288 -# ‘film’ 352x240 -# ‘ntsc-film’ 352x240 -# ‘qntsc’ 352x240 -# ‘qpal’ 352x288 -# ‘wqvga’ 400x240 -# ‘fwqvga’ 432x240 -# ‘hvga’ 480x320 -# ‘ega’ 640x350 -# ‘nhd’ 640x360 -# ‘sntsc’ 640x480 -# ‘vga’ 640x480 -# ‘4cif’ 704x576 -# ‘ntsc’ 720x480 -# ‘pal’ 720x576 -# ‘spal’ 768x576 -# ‘svga’ 800x600 -# ‘hd480’ 852x480 -# ‘wvga’ 852x480 -# ‘qhd’ 960x540 -# ‘xga’ 1024x768 -# ‘hd720’ 1280x720 -# ‘sxga’ 1280x1024 -# ‘wxga’ 1366x768 -# ‘16cif’ 1408x1152 -# ‘uxga’ 1600x1200 -# ‘wsxga’ 1600x1024 -# ‘hd1080’ 1920x1080 -# ‘wuxga’ 1920x1200 -# ‘2kflat’ 1998x1080 -# ‘2k’ 2048x1080 -# ‘2kdci’ 2048x1080 -# ‘2kscope’ 2048x858 -# ‘qxga’ 2048x1536 -# ‘qsxga’ 2560x2048 -# ‘woxga’ 2560x1600 -# ‘wqsxga’ 3200x2048 -# ‘uhd2160’ 3840x2160 -# ‘wquxga’ 3840x2400 -# ‘4kflat’ 3996x2160 -# ‘4k’ 4096x2160 -# ‘4kdci’ 4096x2160 -# ‘4kscope’ 4096x1716 -# ‘hsxga’ 5120x4096 -# ‘whsxga’ 6400x4096 -# ‘uhd4320’ 7680x4320 -# ‘whuxga’ 7680x4800 - -# origin: https://gist.github.com/cosimo/3760587 -OPTS=`getopt -o vnhisbe: --long verbose,dry-run,help,inspect,size,batterycheck,extension: -n 'parse-options' -- "$@"` -if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi - -VERBOSE=false -HELP=false -DRY_RUN=false -BATTERY_CHECK=false -SIZE='qhd' -EXTENSION='mp4' - -while true; do - case "$1" in - -v | --verbose ) VERBOSE=true; shift ;; - -i | --inspect ) INSPECT=true; shift ;; - -h | --help ) HELP=true; shift ;; - -n | --dry-run ) DRY_RUN=true; shift ;; - -b | --battery-check ) BATTERY_CHECK=true; shift ;; - -s | --size ) SIZE="$2"; shift; shift ;; - -e | --extension ) EXTENSION="$2"; shift; shift ;; - -- ) shift; break ;; - * ) break ;; - esac -done - -if [[ "${VERBOSE}" = "true" ]]; then - echo VERBOSE=$VERBOSE - echo INSPECT=$INSPECT - echo HELP=$HELP - echo DRY_RUN=$DRY_RUN - echo SIZE=$SIZE - echo EXTENSION=$EXTENSION - echo BATTERY_CHECK=$BATTERY_CHECK -fi - -SCRIPT="/tmp/convert.$$.sh" -cat <>$SCRIPT -check_remaining_battery () { -STATE=\$(upower -i \$(upower -e | grep -i battery | head -1)| grep -E 'state: *' | awk '{print \$2}') -MINUTES=\$(upower -i \$(upower -e | grep -i battery | head -1)| grep 'time to empty' | grep minutes | awk '{print \$4}' | sed 's|\.[0-9][0-9]*||') -if [[ "\${STATE}" -ne 'charging' ]] -# when the battery is charging the time to empty is meaningless -then - if [[ ! -z \$MINUTES ]] - then - if [ \$MINUTES -lt 5 ] - then - echo 'Too little battery left - aborting' - exit 0 - fi - fi -fi -} -EOF -# NOTE: to set DEBUG need to export it from the calling shell -if [[ -z "${DEBUG}" ]] ; then - echo 'DEBUG was not set explicitly, default is false' - DEBUG='false' -fi -echo "DEBUG=${DEBUG}" -if [[ "${DEBUG}" = 'true' ]] ; then - echo "Finding files \"*${EXTENSION}\"" -fi -if [[ "${INSPECT}" = 'true' ]]; then - if [[ "${DEBUG}" = 'true' ]]; then - echo "Inspecting first file \"*${EXTENSION}\"" - fi - # ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_height=\(.*\)$|\1|p' - S=$(find . -iname "*${EXTENSION}" | head -1) - H=$(ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_height=\(.*\)$|\1|p') - W=$(ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_width=\(.*\)$|\1|p') - - CODED="${W}x${H}" - if [[ "${DEBUG}" = 'true' ]]; then - echo "height=$H" - echo "width=$W" - echo "coded dimensions=$CODED" - fi - - SIZES=( '1024x768:svga' - '1024x576:hd480' - '1920x1080:qhd' - '800x600:spal' - '1278x718:qhd' - '1280x720:qhd' - '1920x1080:qhd' - '1920x1088:qhd' ) - - SIZE='?' - - for ENTRY in "${SIZES[@]}" ; do - KEY="${ENTRY%%:*}" - VALUE="${ENTRY##*:}" - if [[ "${CODED}" = "${KEY}" ]] ; then - SIZE=$VALUE - fi - done - echo $CODED - echo $SIZE - exit 0 -fi -# technically able to descend, seldom used -find . -iname "*${EXTENSION}" | sort | while read filename ; do - D=$(dirname "$filename") - S=$(basename "$filename") - T="${S/.${EXTENSION}/.mkv}" - if [[ "$D" != '.' ]] - then - echo ">/dev/null pushd '$D'" - fi - echo "if [[ ! -f \"$T\" ]];" - echo ' then' - if [[ "${BATTERY_CHECK}" = 'true' ]] ; then - echo 'check_remaining_battery' - fi - echo "echo \"Converting \\\"$S\\\"\"" - echo " ffmpeg -i \"$S\" -c:v vp9 -s ${SIZE} -v 0 \"$T\"" - # TODO: - # echo " ffprobe -show_format -v quiet \"$T\" | grep -i duration| sed 's/duration=//'" - echo 'fi' - if [[ "$D" != '.' ]] - then - echo '>/dev/null popd' - fi -done | tee -a $SCRIPT -chmod +x $SCRIPT -if [[ "${DEBUG}" = 'true' ]] -then - echo "Generated ${SCRIPT}" -else - if [[ "${DRY_RUN}" = "true" ]]; then - echo "Generated ${SCRIPT}" - else - echo "Running ${SCRIPT}" - $SCRIPT - rm -f $SCRIPT - fi -fi -# TODO: -# find . -iname '*mp3' | xargs -IX ffprobe -show_format -v quiet X | grep 'track=' |sort -# NOTE; may be empty -# NOTE: xargs: unmatched single quote; by default quotes are special to xargs unless you use the -# find . -iname '*mp3' -exec ffprobe -show_format -v quiet {} 2>&1 \; | grep 'track *' -# find . -iname '*mp3' -exec ffprobe -show_format {} 2>&1 \; | grep -E '(track|title) *:' - - diff --git a/utils/pickproject.sh.SAVED b/utils/pickproject.sh.SAVED deleted file mode 100755 index b59ae3e7c..000000000 --- a/utils/pickproject.sh.SAVED +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -PROJECT=$1 -if [ -z $PROJECT ] ; then - PROJECT=$(pwd | sed 's|^.*/||') # current directory -else - mkdir $PROJECT - cd $PROJECT -fi -tar xzvf ~/$PROJECT.tar.gz -find . -type f -exec touch {} \; -git add --all . -git reset HEAD */bin */obj From 064facb6ec8eedb1e48eb6a75e05b9a34cf70362 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 17 Sep 2023 00:59:06 +0200 Subject: [PATCH 037/171] intermediate revision - small improvements in the wait_unti* and count* scripts, added wait_until service completes stop --- utils/count_processes.cmd | 5 ++++- utils/wait_until_running.cmd | 32 +++++++++++++++----------------- utils/wait_until_stopped.cmd | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 utils/wait_until_stopped.cmd diff --git a/utils/count_processes.cmd b/utils/count_processes.cmd index b2dd11c8a..eab119fde 100644 --- a/utils/count_processes.cmd +++ b/utils/count_processes.cmd @@ -1,15 +1,18 @@ @echo off -REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 SETLOCAL ENABLEDELAYEDEXPANSION set IMAGENAME=vivaldi.exe if not "%~1" == "" set "IMAGENAME=%~1" + call :COUNT_RUNNING_PROCESSES1 !IMAGENAME! call :COUNT_RUNNING_PROCESSES2 !IMAGENAME! goto :EOF :COUNT_RUNNING_PROCESSES1 +REM use trick to count the number of lines via find.exe +REM from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 + set IMAGENAME=%1 set /A RUNNING_PPOCESS_COUNT=0 for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe /i "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do set /A RUNNING_PPOCESS_COUNT=%%_ diff --git a/utils/wait_until_running.cmd b/utils/wait_until_running.cmd index da6ecb1d7..d04648df3 100644 --- a/utils/wait_until_running.cmd +++ b/utils/wait_until_running.cmd @@ -1,17 +1,15 @@ -@echo off -REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 -SETLOCAL ENABLEDELAYEDEXPANSION -set IMAGENAME=vivaldi.exe -if not "%~1" == "" set "IMAGENAME=%~1" - -:WAIT_FOR_PROCESS -echo Wait untill all processes finish -rem Wait untill all processes finish -C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak -set IMAGENAME=ReSampler.exe -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH') do ( - if "%%_" == "!IMAGENAME!" ( - rem There is still at least one instance of the ReSampler.exe tool running - goto :WAIT_FOR_PROCESS - ) -) +@echo off +SETLOCAL ENABLEDELAYEDEXPANSION +set TIMEOUT=10 +set IMAGENAME=vivaldi.exe +if not "%~1" == "" set "IMAGENAME=%~1" + +:WAIT_FOR_PROCESS +echo Wait until all %IMAGENAME% processes finish +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH') do ( + if "%%_" == "!IMAGENAME!" ( + REM There is still at least one instance of the %IMAGENAME% running + C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak + goto :WAIT_FOR_PROCESS + ) +) diff --git a/utils/wait_until_stopped.cmd b/utils/wait_until_stopped.cmd new file mode 100644 index 000000000..151e748b7 --- /dev/null +++ b/utils/wait_until_stopped.cmd @@ -0,0 +1,14 @@ +@echo off +SETLOCAL ENABLEDELAYEDEXPANSION +set TIMEOUT=10 +set SERVICENAME=Spooler +if not "%~1" == "" set "SERVICENAME=%~1" + +:WAIT_FOR_PROCESS +echo Wait until service %SERVICENAME% gets into stopped state +sc.exe query !SERVICENAME! | c:\Windows\System32\find.exe "STOPPED" > NUL +if %ERRORLEVEL% NEQ 0 ( + REM The %SERVICENAME% has not complete stopping + C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak + goto :WAIT_FOR_PROCESS +) From 812a50029ee51200bade7eea0281480cd17ba1b8 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 19 Sep 2023 07:39:19 -0400 Subject: [PATCH 038/171] intermediate revision - added a snapshot of JNA IsWindowsVersionOrGreater method example --- jna_versioninfo/README.md | 87 +++++ jna_versioninfo/pom.xml | 305 ++++++++++++++++++ .../src/test/java/example/VersionHelpers.java | 158 +++++++++ .../test/java/example/VersionHelpersTest.java | 85 +++++ 4 files changed, 635 insertions(+) create mode 100644 jna_versioninfo/README.md create mode 100644 jna_versioninfo/pom.xml create mode 100644 jna_versioninfo/src/test/java/example/VersionHelpers.java create mode 100644 jna_versioninfo/src/test/java/example/VersionHelpersTest.java diff --git a/jna_versioninfo/README.md b/jna_versioninfo/README.md new file mode 100644 index 000000000..eac1fb189 --- /dev/null +++ b/jna_versioninfo/README.md @@ -0,0 +1,87 @@ +### Info +this directory contains +a fragment of the `PDHTest.java` [test class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/PdhTest.java) from +[jna](https://github.com/java-native-access/jna) project focusing on collecting the `System\Processor Queue Length` performance metric + +The code was modeled after the native app implementation found in [host-sflow](https://github.com/sflow/host-sflow): +```c +uint64_t readFormattedCounter(char* path) +{ + PDH_HQUERY Query = NULL; + PDH_HCOUNTER Counter; + DWORD dwType; + PDH_FMT_COUNTERVALUE Value; + LONGLONG ret = 0; + + if(PdhOpenQuery(NULL, 0, &Query) == ERROR_SUCCESS) { + if(PdhAddCounter(Query, path, 0, &Counter) == ERROR_SUCCESS && + PdhCollectQueryData(Query) == ERROR_SUCCESS && + PdhGetFormattedCounterValue(Counter, PDH_FMT_LARGE, &dwType, &Value) == ERROR_SUCCESS) { + ret = Value.largeValue; + } + if (Query) PdhCloseQuery(Query); + } + return (uint64_t)ret; +} + + +``` +the test copied from existing JNA PDH tests: +```java + + @Test + public void testProcessorQueueLength() { + PDH_COUNTER_PATH_ELEMENTS elems = new PDH_COUNTER_PATH_ELEMENTS(); + + elems.szObjectName = "System"; + elems.szInstanceName = null; + elems.szCounterName = "Processor Queue Length"; + String counterName = makeCounterPath(pdh, elems); + + HANDLEByReference ref = new HANDLEByReference(); + assertErrorSuccess("PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), true); + + HANDLE hQuery = ref.getValue(); + try { + ref.setValue(null); + assertErrorSuccess("PdhAddEnglishCounter", + pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), true); + + HANDLE hCounter = ref.getValue(); + try { + assertErrorSuccess("PdhCollectQueryData", + pdh.PdhCollectQueryData(hQuery), true); + + DWORDByReference lpdwType = new DWORDByReference(); + PDH_RAW_COUNTER rawCounter = new PDH_RAW_COUNTER(); + assertErrorSuccess("PdhGetRawCounterValue", + pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), true); + assertEquals("Counter data status", WinError.ERROR_SUCCESS, + rawCounter.CStatus); + showRawCounterData(System.out, counterName, rawCounter); + } finally { + assertErrorSuccess("PdhRemoveCounter", pdh.PdhRemoveCounter(hCounter), + true); + } + } finally { + assertErrorSuccess("PdhCloseQuery", pdh.PdhCloseQuery(hQuery), true); + } + } + +``` +### Usage + +The easiest way to see a non-zero value of the Processor Queue is to run the test in the underpowered VM. + +```sh +mvn test +``` +```text +[INFO] Running com.sun.jna.platform.win32.PdhTest +``` +```text +\System\Processor Queue Length Thu Mar 03 08:50:27 PST 2022 1st=14 2nd=0 multi=1 +``` + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/jna_versioninfo/pom.xml b/jna_versioninfo/pom.xml new file mode 100644 index 000000000..e1e4200e1 --- /dev/null +++ b/jna_versioninfo/pom.xml @@ -0,0 +1,305 @@ + + + 4.0.0 + com.sun.jna.platform + jna_versioninfo + 0.1.0-SNAPSHOT + jar + ${project.groupId}:${project.artifactId} + jna version info test + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + UTF-8 + 1.10 + 4.2 + 1.3 + 2.7 + 3.3.1 + 30.0-jre + 1.3 + 1.8 + 5.4.0 + 4.13.1 + 2.17.1 + 1.7.5 + 3.6.1 + 2.20 + 3.0.2 + 3.2.0 + 3.1.1 + 3.0.2 + 1.8 + + + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + + + org.apache.logging.log4j + log4j-api + ${log4j-core.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + + + + net.java.dev.jna + jna-platform + ${jna-platform.version} + + + com.google.guava + guava + ${guava.version} + + + commons-configuration + commons-configuration + ${commons-configuration.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + junit + junit + ${junit.version} + + + + src/main/java + src/test/java + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven-assembly-plugin.version} + + SWTsample + false + + jar-with-dependencies + + + + ${project.groupId}.${mainClass} + + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} + + + copy-dependencies + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + ${project.groupId}.${mainClass} + true + true + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + false + ${project.build.sourceEncoding} + -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp + + + + + + + + + + + + windows 8.1 + + + windows + Windows 8.1 + + + + win32 + + + + + diff --git a/jna_versioninfo/src/test/java/example/VersionHelpers.java b/jna_versioninfo/src/test/java/example/VersionHelpers.java new file mode 100644 index 000000000..20b4dd9c3 --- /dev/null +++ b/jna_versioninfo/src/test/java/example/VersionHelpers.java @@ -0,0 +1,158 @@ +package example; + +import com.sun.jna.platform.win32.Kernel32; +import com.sun.jna.platform.win32.WinNT; +import com.sun.jna.platform.win32.WinDef.DWORD; +import com.sun.jna.platform.win32.WinDef.WORD; +import com.sun.jna.platform.win32.WinNT.OSVERSIONINFOEX; + +// origin: https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/VersionHelpers.java +// NOTE: the origin code is not published anywhere +public class VersionHelpers { + + public static boolean IsWindowsVersionOrGreater(int wMajorVersion, + int wMinorVersion, int wServicePackMajor) { + OSVERSIONINFOEX osvi = new OSVERSIONINFOEX(); + osvi.dwOSVersionInfoSize = new DWORD(osvi.size()); + osvi.dwMajorVersion = new DWORD(wMajorVersion); + osvi.dwMinorVersion = new DWORD(wMinorVersion); + osvi.wServicePackMajor = new WORD(wServicePackMajor); + + long dwlConditionMask = 0; + dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(dwlConditionMask, + WinNT.VER_MAJORVERSION, (byte) WinNT.VER_GREATER_EQUAL); + dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(dwlConditionMask, + WinNT.VER_MINORVERSION, (byte) WinNT.VER_GREATER_EQUAL); + dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(dwlConditionMask, + WinNT.VER_SERVICEPACKMAJOR, (byte) WinNT.VER_GREATER_EQUAL); + + return Kernel32.INSTANCE.VerifyVersionInfoW(osvi, WinNT.VER_MAJORVERSION + | WinNT.VER_MINORVERSION | WinNT.VER_SERVICEPACKMAJOR, + dwlConditionMask); + } + + public static boolean IsWindowsXPOrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), + (byte) Kernel32.WIN32_WINNT_WINXP, 0); + } + + public static boolean IsWindowsXPSP1OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), + (byte) Kernel32.WIN32_WINNT_WINXP, 1); + } + + public static boolean IsWindowsXPSP2OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), + (byte) Kernel32.WIN32_WINNT_WINXP, 2); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows XP with Service Pack 3 (SP3) version. + */ + public static boolean IsWindowsXPSP3OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), + (byte) Kernel32.WIN32_WINNT_WINXP, 3); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows Vista version. + */ + public static boolean IsWindowsVistaOrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_VISTA >>> 8), + (byte) Kernel32.WIN32_WINNT_VISTA, 0); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows Vista with Service Pack 1 (SP1) version. + */ + public static boolean IsWindowsVistaSP1OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_VISTA >>> 8), + (byte) Kernel32.WIN32_WINNT_VISTA, 1); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows Vista with Service Pack 2 (SP2) version. + */ + public static boolean IsWindowsVistaSP2OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_VISTA >>> 8), + (byte) Kernel32.WIN32_WINNT_VISTA, 2); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows 7 version. + */ + public static boolean IsWindows7OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN7 >>> 8), + (byte) Kernel32.WIN32_WINNT_WIN7, 0); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows 7 with Service Pack 1 (SP1) version. + */ + public static boolean IsWindows7SP1OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN7 >>> 8), + (byte) Kernel32.WIN32_WINNT_WIN7, 1); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows 8 version. + */ + public static boolean IsWindows8OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN8 >>> 8), + (byte) Kernel32.WIN32_WINNT_WIN8, 0); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows 8.1 version. For Windows 8.1 and/or Windows 10, + * {@link #IsWindows8Point1OrGreater} returns false unless the + * application contains a manifest that includes a compatibility + * section that contains the GUIDs that designate Windows 8.1 and/or + * Windows 10. + */ + public static boolean IsWindows8Point1OrGreater() { + return IsWindowsVersionOrGreater( + (byte) (Kernel32.WIN32_WINNT_WINBLUE >>> 8), + (byte) Kernel32.WIN32_WINNT_WINBLUE, 0); + } + + /** + * @return true if the current OS version matches, or is greater than, the + * Windows 10 version. For Windows 10, + * {@link #IsWindows8Point1OrGreater} returns false unless the + * application contains a manifest that includes a compatibility + * section that contains the GUID that designates Windows 10. + */ + public static boolean IsWindows10OrGreater() { + return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN10 >>> 8), + (byte) Kernel32.WIN32_WINNT_WIN10, 0); + } + + /** + * Applications that need to distinguish between server and client versions + * of Windows should call this function. + * + * @return true if the current OS is a Windows Server release. + */ + public static boolean IsWindowsServer() { + // This should properly be OSVERSIONINFOEXW which is not defined in JNA. + // The OSVERSIONINFOEX structure in JNA is the (W) Unicode-compliant + // version. + OSVERSIONINFOEX osvi = new OSVERSIONINFOEX(); + osvi.dwOSVersionInfoSize = new DWORD(osvi.size()); + osvi.wProductType = WinNT.VER_NT_WORKSTATION; + + long dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(0, + WinNT.VER_PRODUCT_TYPE, (byte) WinNT.VER_EQUAL); + + return !Kernel32.INSTANCE.VerifyVersionInfoW(osvi, WinNT.VER_PRODUCT_TYPE, + dwlConditionMask); + } +} diff --git a/jna_versioninfo/src/test/java/example/VersionHelpersTest.java b/jna_versioninfo/src/test/java/example/VersionHelpersTest.java new file mode 100644 index 000000000..2d5acfbaf --- /dev/null +++ b/jna_versioninfo/src/test/java/example/VersionHelpersTest.java @@ -0,0 +1,85 @@ +package example; +/** + * Copyright 2023 Serguei Kouzmine + */ + +import org.junit.Ignore; +import org.junit.Test; + +import com.sun.jna.platform.win32.VersionHelpers; + +import java.io.*; +import java.util.Properties; + +@SuppressWarnings({ "deprecation", "unused" }) +public class VersionHelpersTest { + + @Test + public void test1() { + System.err.println("status: " + VersionHelpers.IsWindows8Point1OrGreater()); + } + // origin: + // https://stackoverflow.com/questions/6109679/how-to-check-windows-edition-in-java + // msinfo32.exe /report %temp%/sysinfo.txt + // systeminfo.exe /fo list + // NOTE: both msinfo32.exe and systeminfo.exe run for a very long time and + // produce excessive inventory + // there appears no way to limit to summary: + // msinfo32.exe /nfo mysummary.nfo /categories +systemsummary /report + // %temp%/sysinfo1.txt + // especially for running tasks and loaded modules and error reporting + + @Ignore + @Test + public void test2() { + Runtime rt; + Process pr; + BufferedReader in; + String line = ""; + String sysInfo = ""; + String edition = ""; + String fullOSName = ""; + final String SEARCH_TERM = "OS Name:"; + final String[] EDITIONS = { "Basic", "Home", "Professional", "Enterprise" }; + + try { + rt = Runtime.getRuntime(); + pr = rt.exec("SYSTEMINFO"); + in = new BufferedReader(new InputStreamReader(pr.getInputStream())); + + // add all the lines into a variable + while ((line = in.readLine()) != null) { + if (line.contains(SEARCH_TERM)) // found the OS you are using + { + // extract the full os name + fullOSName = line.substring( + line.lastIndexOf(SEARCH_TERM) + SEARCH_TERM.length(), + line.length() - 1); + break; + } + } + + // extract the edition of windows you are using + for (String s : EDITIONS) { + if (fullOSName.trim().contains(s)) { + edition = s; + } + } + System.err + .println("status: " + VersionHelpers.IsWindows8Point1OrGreater()); + System.out.println("The edition of Windows you are using is " + edition); + + } catch (IOException ioe) { + System.err.println(ioe.getMessage()); + } + + } + + @Test + public void test3() { + + Properties properties = System.getProperties(); + System.err.println("System.Properties: " + properties.get("os.name") + " " + + "version: " + properties.get("os.version")); + } +} From 3151184125e4287f23742a1289d06f4ae8c9f1eb Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 19 Sep 2023 09:40:19 -0400 Subject: [PATCH 039/171] added links to better performing alternatives --- utils/save_image.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils/save_image.sh b/utils/save_image.sh index 5637b1f4a..3e8f23cac 100755 --- a/utils/save_image.sh +++ b/utils/save_image.sh @@ -3,6 +3,11 @@ IMAGE=${1:-lenovo40withminikube} DISK=${2:-/dev/sdc} # When copying larger ssd to a later useful is to provide count e.g. # count=64 bs=500M +# for reducing the volumne of copy to the Space In-Use onl +# see https://www.baeldung.com/linux/clone-space-in-use-from-disk +# see also https://askubuntu.com/questions/260620/resize-dev-loop0-and-increase-space +# for partclone see https://ru.linux-console.net/?p=11393#gsc.tab=0 (in Russian) +# original forum: https://qna.habr.com/q/1306968 (in Russian) - recommends preparing source partition with zero fills on sparse via dd if=/dev/zero of=$DISK/zero; rm $DISK/zero STAGING='/media/sergueik/Windows8_OS/Users/Serguei/Desktop/Private/z/' if [ ! -d $STAGING ] ;then exit 0 From 9336da4446f24224ef7319b1e87916643e030994 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Thu, 21 Sep 2023 21:52:00 -0400 Subject: [PATCH 040/171] undo accidental removal commit f70b73aa635c31e4c72f009948636a556bb9137f --- jna_autoit/README.md | 642 ++--- jna_autoit/pom.xml | 288 +- jna_autoit/src/main/java/example/AutoItX.java | 2560 ++++++++--------- .../src/main/java/example/AutoItXLibrary.java | 942 +++--- .../java/example/AutoItXLibraryGenerator.java | 71 + .../src/main/java/example/Constants.java | 93 + .../src/main/java/example/UnsignedInt.java | 29 + .../src/main/resources/AutoItX3.Assembly.dll | Bin 0 -> 42664 bytes .../main/resources/AutoItX3.PowerShell.dll | Bin 0 -> 51376 bytes jna_autoit/src/main/resources/AutoItX3.dll | Bin 0 -> 465080 bytes .../src/main/resources/AutoItX3_x64.dll | Bin 0 -> 524472 bytes .../test/java/example/EnvironmentTest.java | 47 + .../src/test/java/example/FirefoxTest.java | 245 ++ .../InternetExplorerMultiThreadTest.java | 169 ++ .../java/example/InternetExplorerTest.java | 134 + jna_autoit/src/test/java/example/Utils.java | 40 + 16 files changed, 3044 insertions(+), 2216 deletions(-) create mode 100644 jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java create mode 100644 jna_autoit/src/main/java/example/Constants.java create mode 100644 jna_autoit/src/main/java/example/UnsignedInt.java create mode 100755 jna_autoit/src/main/resources/AutoItX3.Assembly.dll create mode 100755 jna_autoit/src/main/resources/AutoItX3.PowerShell.dll create mode 100755 jna_autoit/src/main/resources/AutoItX3.dll create mode 100755 jna_autoit/src/main/resources/AutoItX3_x64.dll create mode 100644 jna_autoit/src/test/java/example/EnvironmentTest.java create mode 100644 jna_autoit/src/test/java/example/FirefoxTest.java create mode 100644 jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java create mode 100644 jna_autoit/src/test/java/example/InternetExplorerTest.java create mode 100644 jna_autoit/src/test/java/example/Utils.java diff --git a/jna_autoit/README.md b/jna_autoit/README.md index f2fb98e78..0f3cc6889 100644 --- a/jna_autoit/README.md +++ b/jna_autoit/README.md @@ -1,321 +1,321 @@ -### Info - -This project started from a replica of [JNAutoIt - JNA AutoitX dll wrapper](https://github.com/midorlo/JNAutoIt) -project by Michael Dorlöchter that offers a [Java Native Access](https://en.wikipedia.org/wiki/Java_Native_Access) -based providing dynamically invoked core AutoitX [functions](https://documentation.help/AutoItX/) methods -wrappers `AU3_*` -that are exported from the vendor dll which can be e.g. installed from -[Nuget package for AutoitX](https://www.nuget.org/packages/AutoItX/) with no -COM dll registration nor application installation. - -Since code differences are somewhat big, no upstream PR is available at this time. - -### Project Goals - -Unfortunately for the Java developer the original `AutoItXLibrary` interface method signatures are too low level - -This project adds a few more java-friendly methods like -```java -public String WinGetText(String title, String text) { -// ... -} -``` - -compared to underlying -```java -public void AU3_WinGetText(WString title, WString text, LPWSTR resultPointer, int bufSize) { -// ... -} -``` -both wrapping the [WinGetText](https://www.autoitscript.com/autoit3/docs/functions/WinGetText.htm) method for retrieving the text from a window. -```basic -WinGetText -Retrieves the text from a window. - -WinGetText ( "title" [, "text"] ) -``` -to `AutoItX`. This greately simplifies interacting with AutoIt, see below. - -Currently extended with Java-friendly signatures are the following metods: - - * `AutoItSetOption` - * `ClipGet` - * `ClipPut` - * `ControlCommand` - * `ControlClick` - * `ControlFocus` - * `ControlGetPos` - * `ControlGetText` - * `ControlShow` - * `ControlHide` - * `ControlSend` - * `DriveMapAdd` - * `DriveMapDel` - * `DriveMapGet` - * `MouseGetPos` - * `MouseClick` - * `ProcessClose` - * `ProcessExists` - * `ProcessWaitClose` - * `Run` - * `RunAs` - * `RunWait` - * `Send` - * `ToolTip` - * `WinActivate` - * `WinActive` - * `WinClose` - * `WinExists` - * `WinGetClassList` - * `WinGetHandle` - * `WinGetHandleAsText` - * `WinGetTextByHandle` - * `WinGetPos` - * `WinGetText` - * `WinGetState` - * `WinGetTitle` - * `WinSetOnTop` - * `WinSetState` - * `WinSetTitle` - * `WinKill` - * `WinMenuSelectItem` - * `WinClose` - * `WinWaitActive` - * `WinWaitNotActive` - -This addresses the anticipated needs of AutoIt with Selenium testing. - -Converting all methods is a work in progress (adequate tests might be a bit of a challenge). - -### Example Usage - -#### Save the downloaded File under desired Path - -This is much lightweight compared to the -original [file Upload Example using AutoIT and with Selenium Webdriver](https://www.guru99.com/use-autoit-selenium.html) recipe. -which requires an full "compile script to exe" -Windows executable generation from the following sample `.au3` [script](https://automated-testing.info/t/webdriver-features-rabota-s-upload-popup-windows-native-okno-pri-pomoshhi-selenium-web-driver/2288): -```basic -WinWaitActive("Open") // ждем активности Windows окна Open -Send("D:\AutoIT-commands\TestingVideo.mp4") //Отправляем иму путь к файлу (фокус по умолчанию стоит на текст-боксе где прописываеться путь к файлу) -Send("{ENTER}") //эмулируем нажатие клавиши Enter (а-ля загрузить) -``` - -```java -import example.AutoItX; -// pending PR -// import de.midorlo.jnautoit.jna.AutoItX; - - String windowTitle = "Save"; - String windowText = ""; - AutoItX instance = AutoItX.getInstance(); - String filePath = "C:\\Users\\user\\Downloads\\TestingVideo.mp4"; - // Selenium test launches file download - instance.WinWaitActive(windowTitle, windowText); - instance.Send(filePath); - instance.Send("\n"); -``` - -#### Change page Zoom or restore 100% zoom Settings - -The JNA verion supports the genuine [AutoIt keys and modifiers](https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm) - -```java -import example.AutoItX; - - @Test(enabled = true) - public void testZoomFirefoxBrowser() { - System.err.println("Close Mozilla Firefox Browser"); - title = "Mozilla Firefox Start Page"; - instance.AutoItSetOption("SendKeyDownDelay", 30); - instance.AutoItSetOption("SendKeyDelay", 10); - // zoom out four times - for (int cnt = 0 ; cnt!=4; cnt++){ - instance.Send("^-", true); - sleep(1000); - } - // zoom 100 % - instance.Send("^0", true); - sleep(1000); - // CTLR + is a bit tricky since the '+' itself has a special meaning - // zoom in 2 times - instance.Send("^{+}^{+}", true); - sleep(1000); - instance.WinClose(title, text); -``` - -### TODO: - - -One can generate the dump list of the `AutoItX3_x64.dll` exports using Visual Studio linker tool (platform-specific version): - -```cmd - -"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\link.exe" /dump /exports AutoItX3_x64.dll - AU3_AutoItSetOption - AU3_ClipGet - AU3_ClipPut - AU3_ControlClick - AU3_ControlClickByHandle - AU3_ControlCommand - AU3_ControlCommandByHandle - AU3_ControlDisable - AU3_ControlDisableByHandle - AU3_ControlEnable - AU3_ControlEnableByHandle - AU3_ControlFocus - AU3_ControlFocusByHandle - AU3_ControlGetFocus - AU3_ControlGetFocusByHandle - AU3_ControlGetHandle - AU3_ControlGetHandleAsText - AU3_ControlGetPos - AU3_ControlGetPosByHandle - AU3_ControlGetText - AU3_ControlGetTextByHandle - AU3_ControlHide - AU3_ControlHideByHandle - AU3_ControlListView - AU3_ControlListViewByHandle - AU3_ControlMove - AU3_ControlMoveByHandle - AU3_ControlSend - AU3_ControlSendByHandle - AU3_ControlSetText - AU3_ControlSetTextByHandle - AU3_ControlShow - AU3_ControlShowByHandle - AU3_ControlTreeView - AU3_ControlTreeViewByHandle - AU3_DriveMapAdd - AU3_DriveMapDel - AU3_DriveMapGet - AU3_Init - AU3_IsAdmin - AU3_MouseClick - AU3_MouseClickDrag - AU3_MouseDown - AU3_MouseGetCursor - AU3_MouseGetPos - AU3_MouseMove - AU3_MouseUp - AU3_MouseWheel - AU3_Opt - AU3_PixelChecksum - AU3_PixelGetColor - AU3_PixelSearch - AU3_ProcessClose - AU3_ProcessExists - AU3_ProcessSetPriority - AU3_ProcessWait - AU3_ProcessWaitClose - AU3_Run - AU3_RunAs - AU3_RunAsWait - AU3_RunWait - AU3_Send - AU3_Shutdown - AU3_Sleep - AU3_StatusbarGetText - AU3_StatusbarGetTextByHandle - AU3_ToolTip - AU3_WinActivate - AU3_WinActivateByHandle - AU3_WinActive - AU3_WinActiveByHandle - AU3_WinClose - AU3_WinCloseByHandle - AU3_WinExists - AU3_WinExistsByHandle - AU3_WinGetCaretPos - AU3_WinGetClassList - AU3_WinGetClassListByHandle - AU3_WinGetClientSize - AU3_WinGetClientSizeByHandle - AU3_WinGetHandle - AU3_WinGetHandleAsText - AU3_WinGetPos - AU3_WinGetPosByHandle - AU3_WinGetProcess - AU3_WinGetProcessByHandle - AU3_WinGetState - AU3_WinGetStateByHandle - AU3_WinGetText - AU3_WinGetTextByHandle - AU3_WinGetTitle - AU3_WinGetTitleByHandle - AU3_WinKill - AU3_WinKillByHandle - AU3_WinMenuSelectItem - AU3_WinMenuSelectItemByHandle - AU3_WinMinimizeAll - AU3_WinMinimizeAllUndo - AU3_WinMove - AU3_WinMoveByHandle - AU3_WinSetOnTop - AU3_WinSetOnTopByHandle - AU3_WinSetState - AU3_WinSetStateByHandle - AU3_WinSetTitle - AU3_WinSetTitleByHandle - AU3_WinSetTrans - AU3_WinSetTransByHandle - AU3_WinWait - AU3_WinWaitActive - AU3_WinWaitActiveByHandle - AU3_WinWaitByHandle - AU3_WinWaitClose - AU3_WinWaitCloseByHandle - AU3_WinWaitNotActive - AU3_WinWaitNotActiveByHandle - AU3_error -``` -The plain java library generator is failing on a vanilla system: - -```cmd -java -cp target\jnautoit-0.0.4-SNAPSHOT.jar;target\lib\* example.AutoItXLibraryGenerator -Exception in thread "main" java.lang.UnsatisfiedLinkError: -Unable to load library 'AutoItX3.dll': -Can't obtain InputStream for win32-x86/AutoItX3.dll - -``` -To solve this one may need a checked version of the dll or place some missing dependency -into the System32 folder (all imports listed by link.exe are already in `c:\Windows\System32`: -```cmd - -"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\link.exe" /dump /imports AutoItX3_x64.dll | findstr /i \.dll -Dump of file AutoItX3_x64.dll - MPR.dll - WINMM.dll - COMCTL32.dll - USERENV.dll - KERNEL32.dll - USER32.dll - GDI32.dll - ADVAPI32.dll - SHELL32.dll - ole32.dll - OLEAUT32.dll - RPCRT4.dll -``` -### See Also - - * Older Autoit [home page](https://www.autoitscript.com/site/) - * [Java Native Access](https://github.com/java-native-access/jna) project on github - * [Index of /autoit3/docs/functions](https://www.autoitscript.com/autoit3/docs/functions/) - * Powershell AutoIt cmdlets [documentation](https://www.autoitconsulting.com/site/scripting/autoit-cmdlets-for-windows-powershell/) - * Russian Autoit tester community [documentation](http://forum.ru-board.com/topic.cgi?forum=5&limit=1&m=9&start=0&topic=33902)(in Russian) - * [Autoit forum](https://www.autoitscript.com/forum/forum/35-windows-client/) - * [Autoit forum](http://autoit-script.ru/index.php)(in Russian) - * Misc. autoit-related topics in [QA forum](https//automated-testing.info/search?q=autoit)(in Russian) - * Yet another [Autoit forum](http://www.cyberforum.ru/autoit/) (in Russian) - * [Uploading a file using Autoit & WebDrive](https://selenium-training-way2automation.blogspot.com/2013/04/uploading-file-using-autoit-webdriver.html) - apparently very non-developer geared tutorial covering usage of Autoit's own __SciTe Script Editor__, an UFT-like control for enumerating Windows controls propeties and design Autoit *script* to automate browser file upload when impossible in plain Selenium - * post discussing [Mouse automation with AutoItX](https://www.codeproject.com/Articles/5258929/Mouse-automation) - * Mouse automation with [AutoItX](https://www.codeproject.com/Articles/5258929/Mouse-automation-with-AutoItX) - * Alterhative UI automation tool [PhantmTest](https://code.google.com/archive/p/phantomtest/source/default/source) - -### License -This project is licensed under the terms of the MIT license. - -### Author -[Serguei Kouzmine](kouzmine_serguei@yahoo.com) - +### Info + +This project started from a replica of [JNAutoIt - JNA AutoitX dll wrapper](https://github.com/midorlo/JNAutoIt) +project by Michael Dorlöchter that offers a [Java Native Access](https://en.wikipedia.org/wiki/Java_Native_Access) +based providing dynamically invoked core AutoitX [functions](https://documentation.help/AutoItX/) methods +wrappers `AU3_*` +that are exported from the vendor dll which can be e.g. installed from +[Nuget package for AutoitX](https://www.nuget.org/packages/AutoItX/) with no +COM dll registration nor application installation. + +Since code differences are somewhat big, no upstream PR is available at this time. + +### Project Goals + +Unfortunately for the Java developer the original `AutoItXLibrary` interface method signatures are too low level + +This project adds a few more java-friendly methods like +```java +public String WinGetText(String title, String text) { +// ... +} +``` + +compared to underlying +```java +public void AU3_WinGetText(WString title, WString text, LPWSTR resultPointer, int bufSize) { +// ... +} +``` +both wrapping the [WinGetText](https://www.autoitscript.com/autoit3/docs/functions/WinGetText.htm) method for retrieving the text from a window. +```basic +WinGetText +Retrieves the text from a window. + +WinGetText ( "title" [, "text"] ) +``` +to `AutoItX`. This greately simplifies interacting with AutoIt, see below. + +Currently extended with Java-friendly signatures are the following metods: + + * `AutoItSetOption` + * `ClipGet` + * `ClipPut` + * `ControlCommand` + * `ControlClick` + * `ControlFocus` + * `ControlGetPos` + * `ControlGetText` + * `ControlShow` + * `ControlHide` + * `ControlSend` + * `DriveMapAdd` + * `DriveMapDel` + * `DriveMapGet` + * `MouseGetPos` + * `MouseClick` + * `ProcessClose` + * `ProcessExists` + * `ProcessWaitClose` + * `Run` + * `RunAs` + * `RunWait` + * `Send` + * `ToolTip` + * `WinActivate` + * `WinActive` + * `WinClose` + * `WinExists` + * `WinGetClassList` + * `WinGetHandle` + * `WinGetHandleAsText` + * `WinGetTextByHandle` + * `WinGetPos` + * `WinGetText` + * `WinGetState` + * `WinGetTitle` + * `WinSetOnTop` + * `WinSetState` + * `WinSetTitle` + * `WinKill` + * `WinMenuSelectItem` + * `WinClose` + * `WinWaitActive` + * `WinWaitNotActive` + +This addresses the anticipated needs of AutoIt with Selenium testing. + +Converting all methods is a work in progress (adequate tests might be a bit of a challenge). + +### Example Usage + +#### Save the downloaded File under desired Path + +This is much lightweight compared to the +original [file Upload Example using AutoIT and with Selenium Webdriver](https://www.guru99.com/use-autoit-selenium.html) recipe. +which requires an full "compile script to exe" +Windows executable generation from the following sample `.au3` [script](https://automated-testing.info/t/webdriver-features-rabota-s-upload-popup-windows-native-okno-pri-pomoshhi-selenium-web-driver/2288): +```basic +WinWaitActive("Open") // ждем активности Windows окна Open +Send("D:\AutoIT-commands\TestingVideo.mp4") //Отправляем иму путь к файлу (фокус по умолчанию стоит на текст-боксе где прописываеться путь к файлу) +Send("{ENTER}") //эмулируем нажатие клавиши Enter (а-ля загрузить) +``` + +```java +import example.AutoItX; +// pending PR +// import de.midorlo.jnautoit.jna.AutoItX; + + String windowTitle = "Save"; + String windowText = ""; + AutoItX instance = AutoItX.getInstance(); + String filePath = "C:\\Users\\user\\Downloads\\TestingVideo.mp4"; + // Selenium test launches file download + instance.WinWaitActive(windowTitle, windowText); + instance.Send(filePath); + instance.Send("\n"); +``` + +#### Change page Zoom or restore 100% zoom Settings + +The JNA verion supports the genuine [AutoIt keys and modifiers](https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm) + +```java +import example.AutoItX; + + @Test(enabled = true) + public void testZoomFirefoxBrowser() { + System.err.println("Close Mozilla Firefox Browser"); + title = "Mozilla Firefox Start Page"; + instance.AutoItSetOption("SendKeyDownDelay", 30); + instance.AutoItSetOption("SendKeyDelay", 10); + // zoom out four times + for (int cnt = 0 ; cnt!=4; cnt++){ + instance.Send("^-", true); + sleep(1000); + } + // zoom 100 % + instance.Send("^0", true); + sleep(1000); + // CTLR + is a bit tricky since the '+' itself has a special meaning + // zoom in 2 times + instance.Send("^{+}^{+}", true); + sleep(1000); + instance.WinClose(title, text); +``` + +### TODO: + + +One can generate the dump list of the `AutoItX3_x64.dll` exports using Visual Studio linker tool (platform-specific version): + +```cmd + +"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\link.exe" /dump /exports AutoItX3_x64.dll + AU3_AutoItSetOption + AU3_ClipGet + AU3_ClipPut + AU3_ControlClick + AU3_ControlClickByHandle + AU3_ControlCommand + AU3_ControlCommandByHandle + AU3_ControlDisable + AU3_ControlDisableByHandle + AU3_ControlEnable + AU3_ControlEnableByHandle + AU3_ControlFocus + AU3_ControlFocusByHandle + AU3_ControlGetFocus + AU3_ControlGetFocusByHandle + AU3_ControlGetHandle + AU3_ControlGetHandleAsText + AU3_ControlGetPos + AU3_ControlGetPosByHandle + AU3_ControlGetText + AU3_ControlGetTextByHandle + AU3_ControlHide + AU3_ControlHideByHandle + AU3_ControlListView + AU3_ControlListViewByHandle + AU3_ControlMove + AU3_ControlMoveByHandle + AU3_ControlSend + AU3_ControlSendByHandle + AU3_ControlSetText + AU3_ControlSetTextByHandle + AU3_ControlShow + AU3_ControlShowByHandle + AU3_ControlTreeView + AU3_ControlTreeViewByHandle + AU3_DriveMapAdd + AU3_DriveMapDel + AU3_DriveMapGet + AU3_Init + AU3_IsAdmin + AU3_MouseClick + AU3_MouseClickDrag + AU3_MouseDown + AU3_MouseGetCursor + AU3_MouseGetPos + AU3_MouseMove + AU3_MouseUp + AU3_MouseWheel + AU3_Opt + AU3_PixelChecksum + AU3_PixelGetColor + AU3_PixelSearch + AU3_ProcessClose + AU3_ProcessExists + AU3_ProcessSetPriority + AU3_ProcessWait + AU3_ProcessWaitClose + AU3_Run + AU3_RunAs + AU3_RunAsWait + AU3_RunWait + AU3_Send + AU3_Shutdown + AU3_Sleep + AU3_StatusbarGetText + AU3_StatusbarGetTextByHandle + AU3_ToolTip + AU3_WinActivate + AU3_WinActivateByHandle + AU3_WinActive + AU3_WinActiveByHandle + AU3_WinClose + AU3_WinCloseByHandle + AU3_WinExists + AU3_WinExistsByHandle + AU3_WinGetCaretPos + AU3_WinGetClassList + AU3_WinGetClassListByHandle + AU3_WinGetClientSize + AU3_WinGetClientSizeByHandle + AU3_WinGetHandle + AU3_WinGetHandleAsText + AU3_WinGetPos + AU3_WinGetPosByHandle + AU3_WinGetProcess + AU3_WinGetProcessByHandle + AU3_WinGetState + AU3_WinGetStateByHandle + AU3_WinGetText + AU3_WinGetTextByHandle + AU3_WinGetTitle + AU3_WinGetTitleByHandle + AU3_WinKill + AU3_WinKillByHandle + AU3_WinMenuSelectItem + AU3_WinMenuSelectItemByHandle + AU3_WinMinimizeAll + AU3_WinMinimizeAllUndo + AU3_WinMove + AU3_WinMoveByHandle + AU3_WinSetOnTop + AU3_WinSetOnTopByHandle + AU3_WinSetState + AU3_WinSetStateByHandle + AU3_WinSetTitle + AU3_WinSetTitleByHandle + AU3_WinSetTrans + AU3_WinSetTransByHandle + AU3_WinWait + AU3_WinWaitActive + AU3_WinWaitActiveByHandle + AU3_WinWaitByHandle + AU3_WinWaitClose + AU3_WinWaitCloseByHandle + AU3_WinWaitNotActive + AU3_WinWaitNotActiveByHandle + AU3_error +``` +The plain java library generator is failing on a vanilla system: + +```cmd +java -cp target\jnautoit-0.0.4-SNAPSHOT.jar;target\lib\* example.AutoItXLibraryGenerator +Exception in thread "main" java.lang.UnsatisfiedLinkError: +Unable to load library 'AutoItX3.dll': +Can't obtain InputStream for win32-x86/AutoItX3.dll - +``` +To solve this one may need a checked version of the dll or place some missing dependency +into the System32 folder (all imports listed by link.exe are already in `c:\Windows\System32`: +```cmd + +"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\link.exe" /dump /imports AutoItX3_x64.dll | findstr /i \.dll +Dump of file AutoItX3_x64.dll + MPR.dll + WINMM.dll + COMCTL32.dll + USERENV.dll + KERNEL32.dll + USER32.dll + GDI32.dll + ADVAPI32.dll + SHELL32.dll + ole32.dll + OLEAUT32.dll + RPCRT4.dll +``` +### See Also + + * Older Autoit [home page](https://www.autoitscript.com/site/) + * [Java Native Access](https://github.com/java-native-access/jna) project on github + * [Index of /autoit3/docs/functions](https://www.autoitscript.com/autoit3/docs/functions/) + * Powershell AutoIt cmdlets [documentation](https://www.autoitconsulting.com/site/scripting/autoit-cmdlets-for-windows-powershell/) + * Russian Autoit tester community [documentation](http://forum.ru-board.com/topic.cgi?forum=5&limit=1&m=9&start=0&topic=33902)(in Russian) + * [Autoit forum](https://www.autoitscript.com/forum/forum/35-windows-client/) + * [Autoit forum](http://autoit-script.ru/index.php)(in Russian) + * Misc. autoit-related topics in [QA forum](https//automated-testing.info/search?q=autoit)(in Russian) + * Yet another [Autoit forum](http://www.cyberforum.ru/autoit/) (in Russian) + * [Uploading a file using Autoit & WebDrive](https://selenium-training-way2automation.blogspot.com/2013/04/uploading-file-using-autoit-webdriver.html) - apparently very non-developer geared tutorial covering usage of Autoit's own __SciTe Script Editor__, an UFT-like control for enumerating Windows controls propeties and design Autoit *script* to automate browser file upload when impossible in plain Selenium + * post discussing [Mouse automation with AutoItX](https://www.codeproject.com/Articles/5258929/Mouse-automation) + * Mouse automation with [AutoItX](https://www.codeproject.com/Articles/5258929/Mouse-automation-with-AutoItX) + * Alterhative UI automation tool [PhantmTest](https://code.google.com/archive/p/phantomtest/source/default/source) + +### License +This project is licensed under the terms of the MIT license. + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) + diff --git a/jna_autoit/pom.xml b/jna_autoit/pom.xml index 6cfd58984..e65e2a236 100644 --- a/jna_autoit/pom.xml +++ b/jna_autoit/pom.xml @@ -1,144 +1,144 @@ - - - 4.0.0 - example - jnautoit - 0.0.11-SNAPSHOT - jar - JNAutoIt - JNAutoIt - Java Native wrapper of AutoItX dll - - UTF-8 - 1.8 - 1.8 - 3.6.1 - 2.20 - 3.0.2 - 1.3 - 4.5.2 - 3.141.59 - 3.13.0 - ${selenium.version} - ${selenium.version} - ${selenium.version} - 6.14.3 - - - - net.java.dev.jna - jna - ${jna.version} - - - net.java.dev.jna - jna-platform - ${jna.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - test - - - org.testng - testng - ${testng.version} - test - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - - - org.seleniumhq.selenium - selenium-ie-driver - ${selenium-ie-driver.version} - - - org.seleniumhq.selenium - selenium-server - ${selenium.version} - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - - - jcenter - bintray - http://jcenter.bintray.com - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${maven.compiler.source} - ${maven.compiler.target} - utf-8 - -Xlint:all - true - true - - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - ${project.groupId}.${mainClass} - true - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - ${project.build.sourceEncoding} - -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp - - - - - + + + 4.0.0 + example + jnautoit + 0.0.11-SNAPSHOT + jar + JNAutoIt + JNAutoIt - Java Native wrapper of AutoItX dll + + UTF-8 + 1.8 + 1.8 + 3.6.1 + 2.20 + 3.0.2 + 1.3 + 4.5.2 + 3.141.59 + 3.13.0 + ${selenium.version} + ${selenium.version} + ${selenium.version} + 6.14.3 + + + + net.java.dev.jna + jna + ${jna.version} + + + net.java.dev.jna + jna-platform + ${jna.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + test + + + org.testng + testng + ${testng.version} + test + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + org.seleniumhq.selenium + selenium-firefox-driver + ${selenium-firefox-driver.version} + + + org.seleniumhq.selenium + selenium-ie-driver + ${selenium-ie-driver.version} + + + org.seleniumhq.selenium + selenium-server + ${selenium.version} + + + org.seleniumhq.selenium + selenium-support + ${selenium.version} + + + + + jcenter + bintray + http://jcenter.bintray.com + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${maven.compiler.source} + ${maven.compiler.target} + utf-8 + -Xlint:all + true + true + + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + ${project.groupId}.${mainClass} + true + true + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + false + ${project.build.sourceEncoding} + -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp + + + + + diff --git a/jna_autoit/src/main/java/example/AutoItX.java b/jna_autoit/src/main/java/example/AutoItX.java index 361258d87..dff0fc948 100644 --- a/jna_autoit/src/main/java/example/AutoItX.java +++ b/jna_autoit/src/main/java/example/AutoItX.java @@ -1,1280 +1,1280 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * - * Licensed 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. - */ -package example; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.sun.jna.Memory; -import com.sun.jna.Native; -import com.sun.jna.Pointer; -import com.sun.jna.WString; - -import com.sun.jna.platform.win32.WTypes.LPWSTR; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.WinDef.RECT; - -/** - * @author midorlo - * @author sergueik - */ - -public class AutoItX implements AutoItXLibrary { - - final AutoItXLibrary LIB; - private static AutoItX INSTANCE; - private static int bufSize = 1024; - private static String resultString = fill(bufSize, " "); - - private boolean debug = false; - - public void setDebug(boolean value) { - this.debug = value; - } - - @SuppressWarnings("deprecation") - AutoItX() { - LIB = Native.loadLibrary(Constants.DLL, AutoItXLibrary.class); - LIB.AU3_Init(); - INSTANCE = this; - } - - public static AutoItX getInstance() { - return (null == INSTANCE) ? new AutoItX() : INSTANCE; - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm - // The button to click default is the left button, can be - // left, right, middle, main, menu, primary, secondary - @Override - public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks, int x) { - return LIB.AU3_ControlClick(title, text, controlID, button, clicks, x); - } - - public boolean ControlClick(String title, String text, String controlID, String button, int clicks, int x) { - return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), - clicks, x) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks) { - return LIB.AU3_ControlClick(title, text, controlID, button, clicks); - } - - public boolean ControlClick(String title, String text, String controlID, String button, int clicks) { - return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), - clicks) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks, int x, - int y) { - return LIB.AU3_ControlClick(title, text, controlID, button, clicks, x, y); - } - - public boolean ControlClick(String title, String text, String controlID, String button, int clicks, int x, int y) { - return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), - clicks, x, y) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/Run.htm - @Override - public int AU3_Run(WString program, WString workingdir) { - return LIB.AU3_Run(program, workingdir); - } - - public boolean Run(String program, String workingdir) { - return (LIB.AU3_Run(new WString(program), new WString(workingdir)) != Constants.AU3_FAILURE); - } - // https://www.autoitscript.com/autoit3/docs/functions/InputBox.htm - // No API named AU3_InputBox is currently exported - - // https://www.autoitscript.com/autoit3/docs/functions/WinList.htm - // https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm - // No API named AU3_WinList is exported - - @Override - public int AU3_Run(WString program, WString workingdir, int showFlag) { - return LIB.AU3_Run(program, workingdir, showFlag); - } - - public boolean Run(String program, String workingdir, int showFlag) { - // SW_HIDE, SW_MINIMIZE, SW_MAXIMIZE - return (LIB.AU3_Run(new WString(program), new WString(workingdir), showFlag) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlSend.htm - @Override - public int AU3_ControlSend(WString title, WString text, WString controlID, WString data) { - return LIB.AU3_ControlSend(title, text, controlID, data); - } - - public boolean ControlSend(String title, String text, String controlID, String data) { - // data: String of characters to send to the control. - // flag = 0: Changes how "keys" is processed - // AU3_SEND_DEFAULT ($SEND_DEFAULT) (0) = - // special characters + and ! indicate SHIFT and ALT key-presses - // AU3_SEND_RAW ($SEND_RAW) (1) = keys are sent raw - return (LIB.AU3_ControlSend(new WString(title), new WString(text), new WString(controlID), - new WString(data)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlSend(WString title, WString text, WString controlID, WString data, int flag) { - return LIB.AU3_ControlSend(title, text, controlID, data, flag); - } - - public boolean ControlSend(String title, String text, String controlID, String data, int flag) { - return (LIB.AU3_ControlSend(new WString(title), new WString(text), new WString(controlID), new WString(data), - flag) == Constants.AU3_SUCCESS); - } - - @Override - public void AU3_Init() { - LIB.AU3_Init(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ClipPut.htm - @Override - public void AU3_ClipPut(WString value) { - LIB.AU3_ClipPut(value); - } - - public void ClipPut(String value) { - // TODO: boolean - LIB.AU3_ClipPut(new WString(value)); - } - - // https://www.autoitscript.com/autoit3/docs/functions/Sleep.htm - @Override - public void AU3_Sleep(int delay) { - LIB.AU3_Sleep(delay); - } - - public void Sleep(int delay) { - LIB.AU3_Sleep(delay); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetHandle.htm - @Override - public HWND AU3_WinGetHandle(WString title, WString text) { - return LIB.AU3_WinGetHandle(title, text); - } - - public HWND WinGetHandle(String title, String text) { - return LIB.AU3_WinGetHandle(new WString(title), new WString(text)); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetPos.htm - @Override - public int AU3_WinGetPos(WString title, WString text, RECT rect) { - return LIB.AU3_WinGetPos(title, text, rect); - // NOTE: return value is not compatible with other methods - } - - // 4-element array containing the following information: - // $_[0] = X position - // $_[1] = Y position - // $_[2] = Width - // $_[3] = Height - public int[] WinGetPos(String title, String text) { - RECT rect = new RECT(); - // @FieldOrder(value={"left", "top", "right", "bottom"}) - int[] pos = { 0, 0, 0, 0 }; - // NOTE: the successful call returns 0 - // other AU3 methods return 0 to indicate of a failure - // therefore is not verified - LIB.AU3_WinGetPos(new WString(title), new WString(text), rect); - // https://java-native-access.github.io/jna/4.2.1/com/sun/jna/platform/win32/WinDef.RECT.html - pos[0] = rect.left; - pos[1] = rect.top; - pos[2] = rect.right - rect.left; - pos[3] = rect.bottom - rect.top; - // TODO: the original autoit's - // WinGetPos() returns negative numbers such as -32000 for minimized - // windows, but works fine with (non-minimized) hidden windows. - return pos; - } - - @Override - public void AU3_WinGetText(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetText(title, text, resultPtr, bufSize); - } - - public String WinGetText(String title, String text) { - // https://www.programcreek.com/java-api-examples/index.php?api=com.sun.jna.platform.win32.WTypes - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetText(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/DriveMapGet.htm - @Override - public void AU3_DriveMapGet(WString device, LPWSTR resultPtr, int bufSize) { - LIB.AU3_DriveMapGet(device, resultPtr, bufSize); - } - - public String DriveMapGet(String device) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - // TODO: handle @error - LIB.AU3_DriveMapGet(new WString(device), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetState.htm - @Override - public int AU3_WinGetState(WString title, WString text) { - return LIB.AU3_WinGetState(title, text); - } - - public String WinGetState(String title, String text) { - int state = LIB.AU3_WinGetState(new WString(title), new WString(text)); - String stateName = ""; - - if (state != Constants.AU3_FAILURE) { - for (int defined_state : Constants.stateNames.keySet()) { - if ((state & defined_state) != 0) { - stateName += Constants.stateNames.get(defined_state); - stateName += "\n"; - } - } - } - return stateName; - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetTrans.htm - @Override - public int AU3_WinSetTrans(WString title, WString text, int transparency) { - return LIB.AU3_WinSetTrans(title, text, transparency); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinExists.htm - @Override - public int AU3_WinExists(WString title, WString text) { - return LIB.AU3_WinExists(title, text); - } - - public boolean WinExists(String title, String text) { - // NOTE: LIB.AU3_WinExists will return AU3_SUCCESS even if the window is - // hidden - return (LIB.AU3_WinExists(new WString(title), new WString(text)) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessClose.htm - @Override - public int AU3_ProcessClose(WString process) { - return LIB.AU3_ProcessClose(process); - } - - public boolean ProcessClose(String process) { - // TODO: implement accessing the @error - return (LIB.AU3_ProcessClose(new WString(process)) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/DriveMapDel.htm - @Override - public int AU3_DriveMapDel(WString drive) { - return LIB.AU3_DriveMapDel(drive); - } - - public boolean DriveMapDel(String drive) { - return (LIB.AU3_DriveMapDel(new WString(drive)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/DriveMapAdd.htm - @Override - public void AU3_DriveMapAdd(WString device, WString remoteShare, int flags, WString user, WString password, - LPWSTR arg5, int arg6) { - LIB.AU3_DriveMapAdd(device, remoteShare, flags, user, password, arg5, arg6); - } - - public void DriveMapAdd(String device, String remoteShare, int flags, String user, String password, LPWSTR arg5, - int arg6) { - LIB.AU3_DriveMapAdd(new WString(device), new WString(remoteShare), flags, new WString(user), - new WString(password), arg5, arg6); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetOnTop.htm - @Override - public int AU3_WinSetOnTop(WString title, WString text, int flag) { - return LIB.AU3_WinSetOnTop(title, text, flag); - } - - public boolean WinSetOnTop(String title, String text, int flag) { - if (flag == Constants.AU3_WINDOWS_NOONTOP || flag == Constants.AU3_WINDOWS_ONTOP) { - return (LIB.AU3_WinSetOnTop(new WString(title), new WString(text), flag) != Constants.AU3_FAILURE); - } else { - return false; - } - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinClose.htm - @Override - public int AU3_WinClose(WString title, WString text) { - return LIB.AU3_WinClose(title, text); - } - - public boolean WinClose(String title, String text) { - return (LIB.AU3_WinClose(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetState.htm - @Override - public int AU3_WinSetState(WString title, WString text, int flag) { - return LIB.AU3_WinSetState(title, text, flag); - } - - public boolean WinSetState(String title, String text, int flag) { - List sw_flags = Arrays.asList(Constants.SW_HIDE, Constants.SW_SHOW, Constants.SW_MINIMIZE, - Constants.SW_MAXIMIZE, Constants.SW_RESTORE); - /* - * TODO: Constants.SW_DISABLE, Constants.SW_ENABLE - */ - return (sw_flags.contains(flag)) - ? (LIB.AU3_WinSetState(new WString(title), new WString(text), flag) == Constants.AU3_SUCCESS) - : false; - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinKill.htm - // https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm - @Override - public int AU3_WinKill(WString title, WString text) { - return LIB.AU3_WinKill(title, text); - } - - public boolean WinKill(String title, String text) { - return (LIB.AU3_WinKill(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlHide.htm - // https://www.autoitscript.com/autoit3/docs/intro/controls.htm - @Override - public int AU3_ControlHide(WString title, WString text, WString controlID) { - return LIB.AU3_ControlHide(title, text, controlID); - } - - public boolean ControlHide(String title, String text, String controlID) { - return (LIB.AU3_ControlHide(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinActive.htm - @Override - public int AU3_WinActive(WString title, WString text) { - return LIB.AU3_WinActive(title, text); - } - - public boolean WinActive(String title, String text) { - return (LIB.AU3_WinActive(new WString(title), new WString(text)) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlFocus.htm - @Override - public int AU3_ControlFocus(WString title, WString text, WString controlID) { - return LIB.AU3_ControlFocus(title, text, controlID); - } - - public boolean ControlFocus(String title, String text, String controlID) { - return (LIB.AU3_ControlFocus(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetTitle.htm - @Override - public void AU3_WinGetTitle(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetTitle(title, text, resultPtr, bufSize); - } - - public String WinGetTitle(String title, String text) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - AU3_WinGetTitle(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlShow.htm - @Override - public int AU3_ControlShow(WString title, WString text, WString controlID) { - return LIB.AU3_ControlShow(title, text, controlID); - } - - public boolean ControlShow(String title, String text, String controlID) { - return (LIB.AU3_ControlShow(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ClipGet.htm - @Override - public void AU3_ClipGet(LPWSTR arg0, int arg1) { - LIB.AU3_ClipGet(arg0, arg1); - } - - public String ClipGet() { - resultString = fill(bufSize, " "); - // bufSize = resultString.length() + 1; - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ClipGet(resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - /* - * TODO: handle error 1 = if clipboard is empty 2 = if contains a non-text - * entry. 3 or 4 = if cannot access the clipboard. - */ - } - - // https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm - @Override - public int AU3_Opt(WString option, int param) { - return LIB.AU3_Opt(option, param); - } - - // You may use Opt() as an alternative to AutoItSetOption(). - public int Opt(String option, int param) { - return LIB.AU3_Opt(new WString(option), param); - } - - @Override - public void AU3_MouseWheel(WString arg0, int arg1) { - LIB.AU3_MouseWheel(arg0, arg1); - } - - @Override - public void AU3_MouseUp(WString arg0) { - LIB.AU3_MouseUp(arg0); - } - - @Override - public int AU3_error() { - return LIB.AU3_error(); - } - - @Override - public void AU3_MouseDown(WString arg0) { - LIB.AU3_MouseDown(arg0); - } - - @Override - public int AU3_Shutdown(int arg0) { - return LIB.AU3_Shutdown(arg0); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetTitle.htm - @Override - public int AU3_WinSetTitle(WString title, WString text, WString newTitle) { - return LIB.AU3_WinSetTitle(title, text, newTitle); - } - - public boolean WinSetTitle(String title, String text, String newTitle) { - return (LIB.AU3_WinSetTitle(new WString(title), new WString(text), - new WString(newTitle)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_WinSetTitle(WString title, WString text, WString newTitle, WString arg3) { - return LIB.AU3_WinSetTitle(title, text, newTitle, arg3); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinActivate.htm - @Override - public int AU3_WinActivate(WString arg0, WString arg1) { - return LIB.AU3_WinActivate(arg0, arg1); - } - - public boolean WinActivate(String title, String text) { - return (LIB.AU3_WinActivate(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_IsAdmin() { - return LIB.AU3_IsAdmin(); - } - - @Override - public void AU3_PixelSearch(RECT arg0, int arg1, int arg2, int arg3, Pointer arg4) { - LIB.AU3_PixelSearch(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public void AU3_ControlCommandByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, LPWSTR arg4, int arg5) { - LIB.AU3_ControlCommandByHandle(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_MouseGetCursor() { - return LIB.AU3_MouseGetCursor(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlEnable.htm - @Override - public int AU3_ControlEnable(WString title, WString text, WString controlID) { - return LIB.AU3_ControlEnable(title, text, controlID); - } - - public boolean ControlEnable(String title, String text, String controlID) { - return (LIB.AU3_ControlEnable(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlShowByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlShowByHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm - @Override - public int AU3_AutoItSetOption(WString option, int param) { - return LIB.AU3_AutoItSetOption(option, param); - } - - public boolean AutoItSetOption(String option, int param) { - return (LIB.AU3_AutoItSetOption(new WString(option), param) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlEnableByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlEnableByHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlCommand.htm - @Override - public void AU3_ControlCommand(WString title, WString text, WString controlID, WString command, WString option, - LPWSTR resultPtr, int bufSize) { - LIB.AU3_ControlCommand(title, text, controlID, command, option, resultPtr, bufSize); - /* - * Command, Option Return Value "IsVisible", "" Returns 1 if Control is visible, - * 0 otherwise "IsEnabled", "" Returns 1 if Control is enabled, 0 otherwise - * "ShowDropDown", "" Displays the ComboBox dropdown "HideDropDown", "" Hides - * the ComboBox dropdown "AddString", 'string' Adds a string to the end in a - * ListBox or ComboBox "DelString", occurrence Deletes a string according to - * occurrence in a ListBox or ComboBox "FindString", 'string' Returns occurrence - * ref of the exact string in a ListBox or ComboBox "SetCurrentSelection", - * occurrence Sets selection to occurrence ref in a ListBox or ComboBox - * "SelectString", 'string' Sets selection according to string in a ListBox or - * ComboBox "IsChecked", "" Returns 1 if Button is checked, 0 otherwise "Check", - * "" Checks radio or check Button "UnCheck", "" Unchecks radio or check Button - * "GetCurrentLine", "" Returns the line # where the caret is in an Edit - * "GetCurrentCol", "" Returns the column # where the caret is in an Edit - * "GetCurrentSelection", "" Returns name of the currently selected item in a - * ListBox or ComboBox "GetLineCount", "" Returns # of lines in an Edit - * "GetLine", line# Returns text at line # passed of an Edit "GetSelected", "" - * Returns selected text of an Edit "EditPaste", 'string' Pastes the 'string' at - * the Edit's caret position "CurrentTab", "" Returns the current Tab shown of a - * SysTabControl32 "TabRight", "" Moves to the next tab to the right of a - * SysTabControl32 "TabLeft", "" Moves to the next tab to the left of a - * SysTabControl32 "SendCommandID", Command ID Simulates the WM_COMMAND message. - * Usually used for ToolbarWindow32 controls - use the ToolBar tab of Au3Info to - * get the Command ID. - */ - } - - public String ControlCommand(String title, String text, String controlID, String command, String option) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ControlCommand(new WString(title), new WString(text), new WString(controlID), new WString(command), - new WString(option), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public int AU3_ControlDisable(WString title, WString text, WString controlID) { - return LIB.AU3_ControlDisable(title, text, controlID); - } - - @Override - public int AU3_ControlDisableByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlDisableByHandle(arg0, arg1); - } - - @Override - public int AU3_ControlSetTextByHandle(HWND arg0, HWND arg1, WString arg2) { - return LIB.AU3_ControlSetTextByHandle(arg0, arg1, arg2); - } - - @Override - public void AU3_ControlTreeViewByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, WString arg4, LPWSTR arg5, - int arg6) { - LIB.AU3_ControlTreeViewByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_ControlHideByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlHideByHandle(arg0, arg1); - } - - @Override - public int AU3_ControlFocusByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlFocusByHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetFocus.htm - @Override - public void AU3_ControlGetFocus(WString title, WString text, LPWSTR arg2, int arg3) { - LIB.AU3_ControlGetFocus(title, text, arg2, arg3); - } - - @Override - public void AU3_ControlListView(WString arg0, WString arg1, WString arg2, WString arg3, WString arg4, WString arg5, - LPWSTR arg6, int arg7) { - LIB.AU3_ControlListView(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessExists.htm - // NOTE: returns 0 if the process does not exist, and PID when process exists - @Override - public int AU3_ProcessExists(WString process) { - return LIB.AU3_ProcessExists(process); - } - - public boolean ProcessExists(String process) { - return (LIB.AU3_ProcessExists(new WString(process)) != 0); - } - - @Override - public int AU3_WinSetStateByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinSetStateByHandle(arg0, arg1); - } - - @Override - public int AU3_ProcessSetPriority(WString arg0, int arg1) { - return LIB.AU3_ProcessSetPriority(arg0, arg1); - } - - @Override - public int AU3_PixelGetColor(int arg0, int arg1) { - return LIB.AU3_PixelGetColor(arg0, arg1); - } - - @Override - public void AU3_ControlTreeView(WString arg0, WString arg1, WString arg2, WString arg3, WString arg4, WString arg5, - LPWSTR arg6, int arg7) { - LIB.AU3_ControlTreeView(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinMinimizeAll.htm - @Override - public String AU3_WinMinimizeAll() { - return LIB.AU3_WinMinimizeAll(); - // Send("#m") is a possible alternative. - } - - @Override - public void AU3_ControlGetTextByHandle(HWND arg0, HWND arg1, LPWSTR arg2, int arg3) { - LIB.AU3_ControlGetTextByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_ControlSetText(WString arg0, WString arg1, WString arg2, WString arg3) { - return LIB.AU3_ControlSetText(arg0, arg1, arg2, arg3); - } - - @Override - public HWND AU3_ControlGetHandle(HWND arg0, WString arg1) { - return LIB.AU3_ControlGetHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetHandle.htm - @Override - public void AU3_ControlGetHandleAsText(WString title, WString text, WString controlID, LPWSTR resultPtr, - int bufSize) { - LIB.AU3_ControlGetHandleAsText(title, text, controlID, resultPtr, bufSize); - } - - public String ControlGetHandleAsText(String title, String text, String controlID) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ControlGetHandleAsText(new WString(title), new WString(text), new WString(controlID), resultPtr, - bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetPos.htm - @Override - public int AU3_ControlGetPos(WString title, WString text, WString controlID, RECT rect) { - return LIB.AU3_ControlGetPos(title, text, controlID, rect); - } - - public boolean ControlGetPos(String title, String text, String controlID, RECT rect) { - return (LIB.AU3_ControlGetPos(new WString(title), new WString(text), new WString(controlID), - rect) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetText.htm - @Override - public void AU3_ControlGetText(WString title, WString text, WString controlID, LPWSTR resultPtr, int bufSize) { - LIB.AU3_ControlGetText(title, text, controlID, resultPtr, bufSize); - } - - public String ControlGetText(String title, String text, String controlID) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ControlGetText(new WString(title), new WString(text), new WString(controlID), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public void AU3_ControlGetFocusByHandle(HWND arg0, LPWSTR arg1, int arg2) { - LIB.AU3_ControlGetFocusByHandle(arg0, arg1, arg2); - } - - @Override - public int AU3_ControlGetPosByHandle(HWND arg0, HWND arg1, RECT arg2) { - return LIB.AU3_ControlGetPosByHandle(arg0, arg1, arg2); - } - - @Override - public void AU3_ControlListViewByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, WString arg4, LPWSTR arg5, - int arg6) { - LIB.AU3_ControlListViewByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_WinCloseByHandle(HWND arg0) { - return LIB.AU3_WinCloseByHandle(arg0); - } - - @Override - public void AU3_WinMinimizeAllUndo() { - LIB.AU3_WinMinimizeAllUndo(); - } - - // - @Override - public int AU3_ControlSendByHandle(HWND arg0, HWND arg1, WString arg2) { - return LIB.AU3_ControlSendByHandle(arg0, arg1, arg2); - } - - @Override - public int AU3_ControlSendByHandle(HWND arg0, HWND arg1, WString arg2, int arg3) { - return LIB.AU3_ControlSendByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinWaitActiveByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinWaitActiveByHandle(arg0, arg1); - } - - @Override - public int AU3_WinMoveByHandle(HWND arg0, int arg1, int arg2, int arg3) { - return LIB.AU3_WinMoveByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinMoveByHandle(HWND arg0, int arg1, int arg2, int arg3, int arg4) { - return LIB.AU3_WinMoveByHandle(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_StatusbarGetTextByHandle(HWND arg0, int arg1, LPWSTR arg2, int arg3) { - return LIB.AU3_StatusbarGetTextByHandle(arg0, arg1, arg2, arg3); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetClassList.htm - @Override - public void AU3_WinGetClassList(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetClassList(title, text, resultPtr, bufSize); - } - - public List WinGetClassList(String title, String text) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetClassList(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString().trim(); - if (debug) { - System.err.println("WinGetClassList: " + resultString); - } - return Arrays.asList(resultString.split("\\n")); - // no fancy regexp like (?:\\n+) appears to work - } - - @Override - public int AU3_WinExistsByHandle(HWND arg0) { - return LIB.AU3_WinExistsByHandle(arg0); - } - - @Override - public int AU3_MouseClickDrag(WString arg0, int arg1, int arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_MouseClickDrag(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_MouseClickDrag(WString arg0, int arg1, int arg2, int arg3, int arg4) { - return LIB.AU3_MouseClickDrag(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_WinWaitByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinWaitByHandle(arg0, arg1); - } - - @Override - public int AU3_ControlClickByHandle(HWND arg0, HWND arg1, WString arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_ControlClickByHandle(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_ControlClickByHandle(HWND arg0, HWND arg1, WString arg2, int arg3) { - return LIB.AU3_ControlClickByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinActivateByHandle(HWND arg0) { - return LIB.AU3_WinActivateByHandle(arg0); - } - - @Override - public int AU3_ControlMoveByHandle(HWND arg0, HWND arg1, int arg2, int arg3) { - return LIB.AU3_ControlMoveByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_ControlMoveByHandle(HWND arg0, HWND arg1, int arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_ControlMoveByHandle(arg0, arg1, arg2, arg3, arg4, arg5); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessWaitClose.htm - @Override - public int AU3_ProcessWaitClose(WString process) { - return LIB.AU3_ProcessWaitClose(process); - } - - public boolean ProcessWaitClose(String process) { - return (LIB.AU3_ProcessWaitClose(new WString(process)) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_ProcessWaitClose(WString process, int timeout) { - return LIB.AU3_ProcessWaitClose(process, timeout); - } - - @Override - public UnsignedInt AU3_PixelChecksum(RECT arg0) { - return LIB.AU3_PixelChecksum(arg0); - } - - @Override - public UnsignedInt AU3_PixelChecksum(RECT arg0, int arg1) { - return LIB.AU3_PixelChecksum(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetHandle.htm - @Override - public void AU3_WinGetHandleAsText(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetHandleAsText(title, text, resultPtr, bufSize); - } - - public String WinGetHandleAsText(String title, String text) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetHandleAsText(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public int AU3_WinGetCaretPos(Pointer arg0) { - return LIB.AU3_WinGetCaretPos(arg0); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinWaitActive.htm - @Override - public int AU3_WinWaitActive(WString title, WString text, int timeout) { - return LIB.AU3_WinWaitActive(title, text, timeout); - } - - // NOTE: not returning handle to requested window getting active - public boolean WinWaitActive(String title, String text, int timeout) { - return (LIB.AU3_WinWaitActive(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinWaitActive(WString title, WString text) { - return LIB.AU3_WinWaitActive(title, text); - } - - // NOTE: not returning handle to requested window getting active - public boolean WinWaitActive(String title, String text) { - return (LIB.AU3_WinWaitActive(new WString(title), new WString(text)) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinGetStateByHandle(HWND arg0) { - return LIB.AU3_WinGetStateByHandle(arg0); - } - - @Override - public int AU3_WinActiveByHandle(HWND arg0) { - return LIB.AU3_WinActiveByHandle(arg0); - } - - @Override - public int AU3_WinSetOnTopByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinSetOnTopByHandle(arg0, arg1); - } - - @Override - public int AU3_WinSetTitleByHandle(HWND arg0, WString arg1) { - return LIB.AU3_WinSetTitleByHandle(arg0, arg1); - } - - @Override - public DWORD AU3_WinGetProcessByHandle(HWND arg0) { - return LIB.AU3_WinGetProcessByHandle(arg0); - } - - @Override - public int AU3_WinGetClientSize(WString arg0, WString arg1, RECT arg2) { - return LIB.AU3_WinGetClientSize(arg0, arg1, arg2); - } - - @Override - public void AU3_WinGetTextByHandle(HWND hwnd, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); - } - - public String WinGetTextByHandle(HWND hwnd) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - public String WinGetTextByHandle(String windowHandle) { - HWND hwnd = new HWND(); - hwnd.setPointer(new Pointer(Long.decode(windowHandle))); - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public int AU3_WinGetPosByHandle(HWND arg0, RECT arg1) { - return LIB.AU3_WinGetPosByHandle(arg0, arg1); - } - - @Override - public void AU3_WinGetTitleByHandle(HWND arg0, LPWSTR arg1, int arg2) { - LIB.AU3_WinGetTitleByHandle(arg0, arg1, arg2); - } - - @Override - public int AU3_StatusbarGetText(WString arg0, WString arg1, int arg2, LPWSTR arg3, int arg4) { - return LIB.AU3_StatusbarGetText(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public void AU3_WinGetClassListByHandle(HWND arg0, LPWSTR arg1, int arg2) { - LIB.AU3_WinGetClassListByHandle(arg0, arg1, arg2); - } - - @Override - public DWORD AU3_WinGetProcess(WString arg0, WString arg1) { - return LIB.AU3_WinGetProcess(arg0, arg1); - } - - @Override - public int AU3_WinGetClientSizeByHandle(HWND arg0, RECT arg1) { - return LIB.AU3_WinGetClientSizeByHandle(arg0, arg1); - } - - @Override - public int AU3_WinWaitCloseByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinWaitCloseByHandle(arg0, arg1); - } - - @Override - public int AU3_WinMenuSelectItemByHandle(HWND arg0, WString arg1, WString arg2, WString arg3, WString arg4, - WString arg5, WString arg6, WString arg7, WString arg8) { - return LIB.AU3_WinMenuSelectItemByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinWaitNotActive.htm - @Override - public int AU3_WinWaitNotActive(WString title, WString text, int timeout) { - return LIB.AU3_WinWaitNotActive(title, text, timeout); - } - - public boolean WinWaitNotActive(String title, String text, int timeout) { - return (LIB.AU3_WinWaitNotActive(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinMenuSelectItem.htms - // NOTE: Autoit documentation only covers 6 submenu text arguments - @Override - public int AU3_WinMenuSelectItem(WString title, WString text, WString submenu1Text, WString submenu2Text, - WString submenu3Text, WString submenu4Text, WString submenu5Text, WString submenu6Text, WString exraArg1, - WString exraArg2) { - return LIB.AU3_WinMenuSelectItem(title, text, submenu1Text, submenu2Text, submenu3Text, submenu4Text, - submenu5Text, submenu6Text, exraArg1, exraArg2); - } - - public boolean WinMenuSelectItem(String title, String text, String submenu1Text, String submenu2Text, - String submenu3Text, String submenu4Text, String submenu5Text, String submenu6Text) { - return (LIB.AU3_WinMenuSelectItem(new WString(title), new WString(text), new WString(submenu1Text), - new WString(submenu2Text), new WString(submenu3Text), new WString(submenu4Text), - new WString(submenu5Text), new WString(submenu6Text), new WString(""), - new WString("")) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinSetTransByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinSetTransByHandle(arg0, arg1); - } - - @Override - public int AU3_WinKillByHandle(HWND arg0) { - return LIB.AU3_WinKillByHandle(arg0); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinWaitClose.htm - @Override - public int AU3_WinWaitClose(WString title, WString text) { - return LIB.AU3_WinWaitClose(title, text); - } - - @Override - public int AU3_WinWaitClose(WString title, WString text, int timeout) { - return LIB.AU3_WinWaitClose(title, text, timeout); - } - - public boolean WinWaitClose(String title, String text, int timeout) { - return (LIB.AU3_WinWaitClose(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3) { - return LIB.AU3_WinMove(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3, int arg4) { - return LIB.AU3_WinMove(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_WinMove(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_WinWait(WString arg0, WString arg1, int arg2) { - return LIB.AU3_WinWait(arg0, arg1, arg2); - } - - @Override - public int AU3_WinWait(WString arg0, WString arg1) { - return LIB.AU3_WinWait(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/MouseGetPos.htm - @Override - public void AU3_MouseGetPos(Pointer arg) { - LIB.AU3_MouseGetPos(arg); - } - - // a two-element int array containing the mouse coordinates - // $_[0] X coordinate - // $_[1] Y coordinate - public int[] MouseGetPos() { - int[] pos = { 0, 0 }; - // https://www.baeldung.com/java-size-of-object - // TODO: examine return value of the AU3 method call - Pointer arg = new Memory(32); - LIB.AU3_MouseGetPos(arg); - pos = arg.getIntArray(0, 2); - return pos; - } - - // an int mouse coordinate - // if dimension=0, the X coordinate - // if dimension=1, the Y coordinate - public int MouseGetPos(int dimension) { - int[] pos = { 0, 0 }; - Pointer arg = new Memory(32); - LIB.AU3_MouseGetPos(arg); - pos = arg.getIntArray(0, 2); - return dimension == 0 ? pos[0] : pos[1]; - } - - // https://www.autoitscript.com/autoit3/docs/functions/MouseClick.htm - @Override - public int AU3_MouseClick(WString button, int x, int y, int clicks, int speed) { - // button: "left","right","middle","main", "menu", "primary", "secindary" - return LIB.AU3_MouseClick(button, x, y, clicks, speed); - } - - public int MouseClick(String button, int x, int y, int clicks, int speed) { - // button: "left","right","middle","main", "menu", "primary", "secindary" - return LIB.AU3_MouseClick(new WString(button), x, y, clicks, speed); - } - - @Override - public int AU3_MouseClick(WString button) { - return LIB.AU3_MouseClick(button); - } - - @Override - public int AU3_ControlMove(WString arg0, WString arg1, WString arg2, int arg3, int arg4) { - return LIB.AU3_ControlMove(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_ControlMove(WString arg0, WString arg1, WString arg2, int arg3, int arg4, int arg5, int arg6) { - return LIB.AU3_ControlMove(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_RunAsWait(WString arg0, WString arg1, WString arg2, int arg3, WString arg4, WString arg5, int arg6) { - return LIB.AU3_RunAsWait(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_RunAsWait(WString arg0, WString arg1, WString arg2, int arg3, WString arg4, WString arg5) { - return LIB.AU3_RunAsWait(arg0, arg1, arg2, arg3, arg4, arg5); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ToolTip.htm - @Override - public void AU3_ToolTip(WString text, int options) { - LIB.AU3_ToolTip(text, options); - } - - public void ToolTip(String text, int options) { - LIB.AU3_ToolTip(new WString(text), options); - } - - @Override - public void AU3_ToolTip(WString text) { - LIB.AU3_ToolTip(text); - } - - public void ToolTip(String text) { - LIB.AU3_ToolTip(new WString(text)); - } - - @Override - public void AU3_ToolTip(WString arg0, int arg1, int arg2) { - LIB.AU3_ToolTip(arg0, arg1, arg2); - } - - // https://www.autoitscript.com/autoit3/docs/functions/Send.htm - @Override - public void AU3_Send(WString keys) { - LIB.AU3_Send(keys); - } - - public void Send(String keys) { - LIB.AU3_Send(new WString(keys)); - } - - @Override - public void AU3_Send(WString keys, int flag) { - LIB.AU3_Send(keys, flag); - } - - public void Send(String keys, Boolean flag) { - LIB.AU3_Send(new WString(keys), flag ? 0 : 1); - } - - @Override - public int AU3_MouseMove(int arg0, int arg1, int arg2) { - return LIB.AU3_MouseMove(arg0, arg1, arg2); - } - - @Override - public int AU3_MouseMove(int arg0, int arg1) { - return LIB.AU3_MouseMove(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessWait.htm - @Override - public int AU3_ProcessWait(WString process) { - return LIB.AU3_ProcessWait(process); - } - - public boolean AU3_ProcessWait(String process) { - return (LIB.AU3_ProcessWait(new WString(process)) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_ProcessWait(WString arg0, int arg1) { - return LIB.AU3_ProcessWait(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/RunWait.htm - @Override - public int AU3_RunWait(WString program, WString workingdir, int show_flag) { - // NOTE: may return nonzero Value as the exitcode of the program - return LIB.AU3_RunWait(program, workingdir, show_flag); - } - - @Override - public int AU3_RunWait(WString program, WString workingdir) { - return LIB.AU3_RunWait(program, workingdir); - } - - public int RunWait(String program, String workingdir) { - return LIB.AU3_RunWait(new WString(program), new WString(workingdir)); - } - - // https://www.autoitscript.com/autoit3/docs/functions/RunAs.htm - @Override - public int AU3_RunAs(WString username, WString domain, WString password, int logon_flag, WString program, - WString workingdir) { - return LIB.AU3_RunAs(username, domain, password, logon_flag, program, workingdir); - } - - // https://www.autoitscript.com/autoit3/docs/functions/RunAs.htm - @Override - public int AU3_RunAs(WString username, WString domain, WString password, int logon_flag, WString program, - WString workingdir, int show_flag) { - return LIB.AU3_RunAs(username, domain, password, logon_flag, program, workingdir, show_flag); - } - - public boolean RunAs(String username, String domain, String password, int logon_flag, String program, - String workingdir, int show_flag) { - return (LIB.AU3_RunAs(new WString(username), new WString(domain), new WString(password), logon_flag, - new WString(program), new WString(workingdir), show_flag) != Constants.AU3_FAILURE); - /* - * RUN_LOGON_NOPROFILE (0) - Interactive logon with no profile. - * RUN_LOGON_PROFILE (1) - Interactive logon with profile. RUN_LOGON_NETWORK (2) - * - Network credentials only. RUN_LOGON_INHERIT (4) - Inherit the calling - * process's environment instead of the user's environment. - */ - } - - private static String fill(int length, String with) { - StringBuilder sb = new StringBuilder(length); - while (sb.length() < length) { - sb.append(with); - } - return sb.toString(); - } - -} +/* + * Copyright 2018-2019 midorlo, sergueik + * + * Licensed 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. + */ +package example; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.sun.jna.Memory; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.sun.jna.WString; + +import com.sun.jna.platform.win32.WTypes.LPWSTR; +import com.sun.jna.platform.win32.WinDef.DWORD; +import com.sun.jna.platform.win32.WinDef.HWND; +import com.sun.jna.platform.win32.WinDef.RECT; + +/** + * @author midorlo + * @author sergueik + */ + +public class AutoItX implements AutoItXLibrary { + + final AutoItXLibrary LIB; + private static AutoItX INSTANCE; + private static int bufSize = 1024; + private static String resultString = fill(bufSize, " "); + + private boolean debug = false; + + public void setDebug(boolean value) { + this.debug = value; + } + + @SuppressWarnings("deprecation") + AutoItX() { + LIB = Native.loadLibrary(Constants.DLL, AutoItXLibrary.class); + LIB.AU3_Init(); + INSTANCE = this; + } + + public static AutoItX getInstance() { + return (null == INSTANCE) ? new AutoItX() : INSTANCE; + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm + // The button to click default is the left button, can be + // left, right, middle, main, menu, primary, secondary + @Override + public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks, int x) { + return LIB.AU3_ControlClick(title, text, controlID, button, clicks, x); + } + + public boolean ControlClick(String title, String text, String controlID, String button, int clicks, int x) { + return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), + clicks, x) == Constants.AU3_SUCCESS); + } + + @Override + public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks) { + return LIB.AU3_ControlClick(title, text, controlID, button, clicks); + } + + public boolean ControlClick(String title, String text, String controlID, String button, int clicks) { + return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), + clicks) == Constants.AU3_SUCCESS); + } + + @Override + public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks, int x, + int y) { + return LIB.AU3_ControlClick(title, text, controlID, button, clicks, x, y); + } + + public boolean ControlClick(String title, String text, String controlID, String button, int clicks, int x, int y) { + return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), + clicks, x, y) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/Run.htm + @Override + public int AU3_Run(WString program, WString workingdir) { + return LIB.AU3_Run(program, workingdir); + } + + public boolean Run(String program, String workingdir) { + return (LIB.AU3_Run(new WString(program), new WString(workingdir)) != Constants.AU3_FAILURE); + } + // https://www.autoitscript.com/autoit3/docs/functions/InputBox.htm + // No API named AU3_InputBox is currently exported + + // https://www.autoitscript.com/autoit3/docs/functions/WinList.htm + // https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm + // No API named AU3_WinList is exported + + @Override + public int AU3_Run(WString program, WString workingdir, int showFlag) { + return LIB.AU3_Run(program, workingdir, showFlag); + } + + public boolean Run(String program, String workingdir, int showFlag) { + // SW_HIDE, SW_MINIMIZE, SW_MAXIMIZE + return (LIB.AU3_Run(new WString(program), new WString(workingdir), showFlag) != Constants.AU3_FAILURE); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlSend.htm + @Override + public int AU3_ControlSend(WString title, WString text, WString controlID, WString data) { + return LIB.AU3_ControlSend(title, text, controlID, data); + } + + public boolean ControlSend(String title, String text, String controlID, String data) { + // data: String of characters to send to the control. + // flag = 0: Changes how "keys" is processed + // AU3_SEND_DEFAULT ($SEND_DEFAULT) (0) = + // special characters + and ! indicate SHIFT and ALT key-presses + // AU3_SEND_RAW ($SEND_RAW) (1) = keys are sent raw + return (LIB.AU3_ControlSend(new WString(title), new WString(text), new WString(controlID), + new WString(data)) == Constants.AU3_SUCCESS); + } + + @Override + public int AU3_ControlSend(WString title, WString text, WString controlID, WString data, int flag) { + return LIB.AU3_ControlSend(title, text, controlID, data, flag); + } + + public boolean ControlSend(String title, String text, String controlID, String data, int flag) { + return (LIB.AU3_ControlSend(new WString(title), new WString(text), new WString(controlID), new WString(data), + flag) == Constants.AU3_SUCCESS); + } + + @Override + public void AU3_Init() { + LIB.AU3_Init(); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ClipPut.htm + @Override + public void AU3_ClipPut(WString value) { + LIB.AU3_ClipPut(value); + } + + public void ClipPut(String value) { + // TODO: boolean + LIB.AU3_ClipPut(new WString(value)); + } + + // https://www.autoitscript.com/autoit3/docs/functions/Sleep.htm + @Override + public void AU3_Sleep(int delay) { + LIB.AU3_Sleep(delay); + } + + public void Sleep(int delay) { + LIB.AU3_Sleep(delay); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinGetHandle.htm + @Override + public HWND AU3_WinGetHandle(WString title, WString text) { + return LIB.AU3_WinGetHandle(title, text); + } + + public HWND WinGetHandle(String title, String text) { + return LIB.AU3_WinGetHandle(new WString(title), new WString(text)); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinGetPos.htm + @Override + public int AU3_WinGetPos(WString title, WString text, RECT rect) { + return LIB.AU3_WinGetPos(title, text, rect); + // NOTE: return value is not compatible with other methods + } + + // 4-element array containing the following information: + // $_[0] = X position + // $_[1] = Y position + // $_[2] = Width + // $_[3] = Height + public int[] WinGetPos(String title, String text) { + RECT rect = new RECT(); + // @FieldOrder(value={"left", "top", "right", "bottom"}) + int[] pos = { 0, 0, 0, 0 }; + // NOTE: the successful call returns 0 + // other AU3 methods return 0 to indicate of a failure + // therefore is not verified + LIB.AU3_WinGetPos(new WString(title), new WString(text), rect); + // https://java-native-access.github.io/jna/4.2.1/com/sun/jna/platform/win32/WinDef.RECT.html + pos[0] = rect.left; + pos[1] = rect.top; + pos[2] = rect.right - rect.left; + pos[3] = rect.bottom - rect.top; + // TODO: the original autoit's + // WinGetPos() returns negative numbers such as -32000 for minimized + // windows, but works fine with (non-minimized) hidden windows. + return pos; + } + + @Override + public void AU3_WinGetText(WString title, WString text, LPWSTR resultPtr, int bufSize) { + LIB.AU3_WinGetText(title, text, resultPtr, bufSize); + } + + public String WinGetText(String title, String text) { + // https://www.programcreek.com/java-api-examples/index.php?api=com.sun.jna.platform.win32.WTypes + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_WinGetText(new WString(title), new WString(text), resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + // https://www.autoitscript.com/autoit3/docs/functions/DriveMapGet.htm + @Override + public void AU3_DriveMapGet(WString device, LPWSTR resultPtr, int bufSize) { + LIB.AU3_DriveMapGet(device, resultPtr, bufSize); + } + + public String DriveMapGet(String device) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + // TODO: handle @error + LIB.AU3_DriveMapGet(new WString(device), resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinGetState.htm + @Override + public int AU3_WinGetState(WString title, WString text) { + return LIB.AU3_WinGetState(title, text); + } + + public String WinGetState(String title, String text) { + int state = LIB.AU3_WinGetState(new WString(title), new WString(text)); + String stateName = ""; + + if (state != Constants.AU3_FAILURE) { + for (int defined_state : Constants.stateNames.keySet()) { + if ((state & defined_state) != 0) { + stateName += Constants.stateNames.get(defined_state); + stateName += "\n"; + } + } + } + return stateName; + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinSetTrans.htm + @Override + public int AU3_WinSetTrans(WString title, WString text, int transparency) { + return LIB.AU3_WinSetTrans(title, text, transparency); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinExists.htm + @Override + public int AU3_WinExists(WString title, WString text) { + return LIB.AU3_WinExists(title, text); + } + + public boolean WinExists(String title, String text) { + // NOTE: LIB.AU3_WinExists will return AU3_SUCCESS even if the window is + // hidden + return (LIB.AU3_WinExists(new WString(title), new WString(text)) != Constants.AU3_FAILURE); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ProcessClose.htm + @Override + public int AU3_ProcessClose(WString process) { + return LIB.AU3_ProcessClose(process); + } + + public boolean ProcessClose(String process) { + // TODO: implement accessing the @error + return (LIB.AU3_ProcessClose(new WString(process)) != Constants.AU3_FAILURE); + } + + // https://www.autoitscript.com/autoit3/docs/functions/DriveMapDel.htm + @Override + public int AU3_DriveMapDel(WString drive) { + return LIB.AU3_DriveMapDel(drive); + } + + public boolean DriveMapDel(String drive) { + return (LIB.AU3_DriveMapDel(new WString(drive)) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/DriveMapAdd.htm + @Override + public void AU3_DriveMapAdd(WString device, WString remoteShare, int flags, WString user, WString password, + LPWSTR arg5, int arg6) { + LIB.AU3_DriveMapAdd(device, remoteShare, flags, user, password, arg5, arg6); + } + + public void DriveMapAdd(String device, String remoteShare, int flags, String user, String password, LPWSTR arg5, + int arg6) { + LIB.AU3_DriveMapAdd(new WString(device), new WString(remoteShare), flags, new WString(user), + new WString(password), arg5, arg6); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinSetOnTop.htm + @Override + public int AU3_WinSetOnTop(WString title, WString text, int flag) { + return LIB.AU3_WinSetOnTop(title, text, flag); + } + + public boolean WinSetOnTop(String title, String text, int flag) { + if (flag == Constants.AU3_WINDOWS_NOONTOP || flag == Constants.AU3_WINDOWS_ONTOP) { + return (LIB.AU3_WinSetOnTop(new WString(title), new WString(text), flag) != Constants.AU3_FAILURE); + } else { + return false; + } + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinClose.htm + @Override + public int AU3_WinClose(WString title, WString text) { + return LIB.AU3_WinClose(title, text); + } + + public boolean WinClose(String title, String text) { + return (LIB.AU3_WinClose(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinSetState.htm + @Override + public int AU3_WinSetState(WString title, WString text, int flag) { + return LIB.AU3_WinSetState(title, text, flag); + } + + public boolean WinSetState(String title, String text, int flag) { + List sw_flags = Arrays.asList(Constants.SW_HIDE, Constants.SW_SHOW, Constants.SW_MINIMIZE, + Constants.SW_MAXIMIZE, Constants.SW_RESTORE); + /* + * TODO: Constants.SW_DISABLE, Constants.SW_ENABLE + */ + return (sw_flags.contains(flag)) + ? (LIB.AU3_WinSetState(new WString(title), new WString(text), flag) == Constants.AU3_SUCCESS) + : false; + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinKill.htm + // https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm + @Override + public int AU3_WinKill(WString title, WString text) { + return LIB.AU3_WinKill(title, text); + } + + public boolean WinKill(String title, String text) { + return (LIB.AU3_WinKill(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlHide.htm + // https://www.autoitscript.com/autoit3/docs/intro/controls.htm + @Override + public int AU3_ControlHide(WString title, WString text, WString controlID) { + return LIB.AU3_ControlHide(title, text, controlID); + } + + public boolean ControlHide(String title, String text, String controlID) { + return (LIB.AU3_ControlHide(new WString(title), new WString(text), + new WString(controlID)) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinActive.htm + @Override + public int AU3_WinActive(WString title, WString text) { + return LIB.AU3_WinActive(title, text); + } + + public boolean WinActive(String title, String text) { + return (LIB.AU3_WinActive(new WString(title), new WString(text)) != Constants.AU3_FAILURE); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlFocus.htm + @Override + public int AU3_ControlFocus(WString title, WString text, WString controlID) { + return LIB.AU3_ControlFocus(title, text, controlID); + } + + public boolean ControlFocus(String title, String text, String controlID) { + return (LIB.AU3_ControlFocus(new WString(title), new WString(text), + new WString(controlID)) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinGetTitle.htm + @Override + public void AU3_WinGetTitle(WString title, WString text, LPWSTR resultPtr, int bufSize) { + LIB.AU3_WinGetTitle(title, text, resultPtr, bufSize); + } + + public String WinGetTitle(String title, String text) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + AU3_WinGetTitle(new WString(title), new WString(text), resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlShow.htm + @Override + public int AU3_ControlShow(WString title, WString text, WString controlID) { + return LIB.AU3_ControlShow(title, text, controlID); + } + + public boolean ControlShow(String title, String text, String controlID) { + return (LIB.AU3_ControlShow(new WString(title), new WString(text), + new WString(controlID)) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ClipGet.htm + @Override + public void AU3_ClipGet(LPWSTR arg0, int arg1) { + LIB.AU3_ClipGet(arg0, arg1); + } + + public String ClipGet() { + resultString = fill(bufSize, " "); + // bufSize = resultString.length() + 1; + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_ClipGet(resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + /* + * TODO: handle error 1 = if clipboard is empty 2 = if contains a non-text + * entry. 3 or 4 = if cannot access the clipboard. + */ + } + + // https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm + @Override + public int AU3_Opt(WString option, int param) { + return LIB.AU3_Opt(option, param); + } + + // You may use Opt() as an alternative to AutoItSetOption(). + public int Opt(String option, int param) { + return LIB.AU3_Opt(new WString(option), param); + } + + @Override + public void AU3_MouseWheel(WString arg0, int arg1) { + LIB.AU3_MouseWheel(arg0, arg1); + } + + @Override + public void AU3_MouseUp(WString arg0) { + LIB.AU3_MouseUp(arg0); + } + + @Override + public int AU3_error() { + return LIB.AU3_error(); + } + + @Override + public void AU3_MouseDown(WString arg0) { + LIB.AU3_MouseDown(arg0); + } + + @Override + public int AU3_Shutdown(int arg0) { + return LIB.AU3_Shutdown(arg0); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinSetTitle.htm + @Override + public int AU3_WinSetTitle(WString title, WString text, WString newTitle) { + return LIB.AU3_WinSetTitle(title, text, newTitle); + } + + public boolean WinSetTitle(String title, String text, String newTitle) { + return (LIB.AU3_WinSetTitle(new WString(title), new WString(text), + new WString(newTitle)) == Constants.AU3_SUCCESS); + } + + @Override + public int AU3_WinSetTitle(WString title, WString text, WString newTitle, WString arg3) { + return LIB.AU3_WinSetTitle(title, text, newTitle, arg3); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinActivate.htm + @Override + public int AU3_WinActivate(WString arg0, WString arg1) { + return LIB.AU3_WinActivate(arg0, arg1); + } + + public boolean WinActivate(String title, String text) { + return (LIB.AU3_WinActivate(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); + } + + @Override + public int AU3_IsAdmin() { + return LIB.AU3_IsAdmin(); + } + + @Override + public void AU3_PixelSearch(RECT arg0, int arg1, int arg2, int arg3, Pointer arg4) { + LIB.AU3_PixelSearch(arg0, arg1, arg2, arg3, arg4); + } + + @Override + public void AU3_ControlCommandByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, LPWSTR arg4, int arg5) { + LIB.AU3_ControlCommandByHandle(arg0, arg1, arg2, arg3, arg4, arg5); + } + + @Override + public int AU3_MouseGetCursor() { + return LIB.AU3_MouseGetCursor(); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlEnable.htm + @Override + public int AU3_ControlEnable(WString title, WString text, WString controlID) { + return LIB.AU3_ControlEnable(title, text, controlID); + } + + public boolean ControlEnable(String title, String text, String controlID) { + return (LIB.AU3_ControlEnable(new WString(title), new WString(text), + new WString(controlID)) == Constants.AU3_SUCCESS); + } + + @Override + public int AU3_ControlShowByHandle(HWND arg0, HWND arg1) { + return LIB.AU3_ControlShowByHandle(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm + @Override + public int AU3_AutoItSetOption(WString option, int param) { + return LIB.AU3_AutoItSetOption(option, param); + } + + public boolean AutoItSetOption(String option, int param) { + return (LIB.AU3_AutoItSetOption(new WString(option), param) == Constants.AU3_SUCCESS); + } + + @Override + public int AU3_ControlEnableByHandle(HWND arg0, HWND arg1) { + return LIB.AU3_ControlEnableByHandle(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlCommand.htm + @Override + public void AU3_ControlCommand(WString title, WString text, WString controlID, WString command, WString option, + LPWSTR resultPtr, int bufSize) { + LIB.AU3_ControlCommand(title, text, controlID, command, option, resultPtr, bufSize); + /* + * Command, Option Return Value "IsVisible", "" Returns 1 if Control is visible, + * 0 otherwise "IsEnabled", "" Returns 1 if Control is enabled, 0 otherwise + * "ShowDropDown", "" Displays the ComboBox dropdown "HideDropDown", "" Hides + * the ComboBox dropdown "AddString", 'string' Adds a string to the end in a + * ListBox or ComboBox "DelString", occurrence Deletes a string according to + * occurrence in a ListBox or ComboBox "FindString", 'string' Returns occurrence + * ref of the exact string in a ListBox or ComboBox "SetCurrentSelection", + * occurrence Sets selection to occurrence ref in a ListBox or ComboBox + * "SelectString", 'string' Sets selection according to string in a ListBox or + * ComboBox "IsChecked", "" Returns 1 if Button is checked, 0 otherwise "Check", + * "" Checks radio or check Button "UnCheck", "" Unchecks radio or check Button + * "GetCurrentLine", "" Returns the line # where the caret is in an Edit + * "GetCurrentCol", "" Returns the column # where the caret is in an Edit + * "GetCurrentSelection", "" Returns name of the currently selected item in a + * ListBox or ComboBox "GetLineCount", "" Returns # of lines in an Edit + * "GetLine", line# Returns text at line # passed of an Edit "GetSelected", "" + * Returns selected text of an Edit "EditPaste", 'string' Pastes the 'string' at + * the Edit's caret position "CurrentTab", "" Returns the current Tab shown of a + * SysTabControl32 "TabRight", "" Moves to the next tab to the right of a + * SysTabControl32 "TabLeft", "" Moves to the next tab to the left of a + * SysTabControl32 "SendCommandID", Command ID Simulates the WM_COMMAND message. + * Usually used for ToolbarWindow32 controls - use the ToolBar tab of Au3Info to + * get the Command ID. + */ + } + + public String ControlCommand(String title, String text, String controlID, String command, String option) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_ControlCommand(new WString(title), new WString(text), new WString(controlID), new WString(command), + new WString(option), resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + @Override + public int AU3_ControlDisable(WString title, WString text, WString controlID) { + return LIB.AU3_ControlDisable(title, text, controlID); + } + + @Override + public int AU3_ControlDisableByHandle(HWND arg0, HWND arg1) { + return LIB.AU3_ControlDisableByHandle(arg0, arg1); + } + + @Override + public int AU3_ControlSetTextByHandle(HWND arg0, HWND arg1, WString arg2) { + return LIB.AU3_ControlSetTextByHandle(arg0, arg1, arg2); + } + + @Override + public void AU3_ControlTreeViewByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, WString arg4, LPWSTR arg5, + int arg6) { + LIB.AU3_ControlTreeViewByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + } + + @Override + public int AU3_ControlHideByHandle(HWND arg0, HWND arg1) { + return LIB.AU3_ControlHideByHandle(arg0, arg1); + } + + @Override + public int AU3_ControlFocusByHandle(HWND arg0, HWND arg1) { + return LIB.AU3_ControlFocusByHandle(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlGetFocus.htm + @Override + public void AU3_ControlGetFocus(WString title, WString text, LPWSTR arg2, int arg3) { + LIB.AU3_ControlGetFocus(title, text, arg2, arg3); + } + + @Override + public void AU3_ControlListView(WString arg0, WString arg1, WString arg2, WString arg3, WString arg4, WString arg5, + LPWSTR arg6, int arg7) { + LIB.AU3_ControlListView(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ProcessExists.htm + // NOTE: returns 0 if the process does not exist, and PID when process exists + @Override + public int AU3_ProcessExists(WString process) { + return LIB.AU3_ProcessExists(process); + } + + public boolean ProcessExists(String process) { + return (LIB.AU3_ProcessExists(new WString(process)) != 0); + } + + @Override + public int AU3_WinSetStateByHandle(HWND arg0, int arg1) { + return LIB.AU3_WinSetStateByHandle(arg0, arg1); + } + + @Override + public int AU3_ProcessSetPriority(WString arg0, int arg1) { + return LIB.AU3_ProcessSetPriority(arg0, arg1); + } + + @Override + public int AU3_PixelGetColor(int arg0, int arg1) { + return LIB.AU3_PixelGetColor(arg0, arg1); + } + + @Override + public void AU3_ControlTreeView(WString arg0, WString arg1, WString arg2, WString arg3, WString arg4, WString arg5, + LPWSTR arg6, int arg7) { + LIB.AU3_ControlTreeView(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinMinimizeAll.htm + @Override + public String AU3_WinMinimizeAll() { + return LIB.AU3_WinMinimizeAll(); + // Send("#m") is a possible alternative. + } + + @Override + public void AU3_ControlGetTextByHandle(HWND arg0, HWND arg1, LPWSTR arg2, int arg3) { + LIB.AU3_ControlGetTextByHandle(arg0, arg1, arg2, arg3); + } + + @Override + public int AU3_ControlSetText(WString arg0, WString arg1, WString arg2, WString arg3) { + return LIB.AU3_ControlSetText(arg0, arg1, arg2, arg3); + } + + @Override + public HWND AU3_ControlGetHandle(HWND arg0, WString arg1) { + return LIB.AU3_ControlGetHandle(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlGetHandle.htm + @Override + public void AU3_ControlGetHandleAsText(WString title, WString text, WString controlID, LPWSTR resultPtr, + int bufSize) { + LIB.AU3_ControlGetHandleAsText(title, text, controlID, resultPtr, bufSize); + } + + public String ControlGetHandleAsText(String title, String text, String controlID) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_ControlGetHandleAsText(new WString(title), new WString(text), new WString(controlID), resultPtr, + bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlGetPos.htm + @Override + public int AU3_ControlGetPos(WString title, WString text, WString controlID, RECT rect) { + return LIB.AU3_ControlGetPos(title, text, controlID, rect); + } + + public boolean ControlGetPos(String title, String text, String controlID, RECT rect) { + return (LIB.AU3_ControlGetPos(new WString(title), new WString(text), new WString(controlID), + rect) == Constants.AU3_SUCCESS); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ControlGetText.htm + @Override + public void AU3_ControlGetText(WString title, WString text, WString controlID, LPWSTR resultPtr, int bufSize) { + LIB.AU3_ControlGetText(title, text, controlID, resultPtr, bufSize); + } + + public String ControlGetText(String title, String text, String controlID) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_ControlGetText(new WString(title), new WString(text), new WString(controlID), resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + @Override + public void AU3_ControlGetFocusByHandle(HWND arg0, LPWSTR arg1, int arg2) { + LIB.AU3_ControlGetFocusByHandle(arg0, arg1, arg2); + } + + @Override + public int AU3_ControlGetPosByHandle(HWND arg0, HWND arg1, RECT arg2) { + return LIB.AU3_ControlGetPosByHandle(arg0, arg1, arg2); + } + + @Override + public void AU3_ControlListViewByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, WString arg4, LPWSTR arg5, + int arg6) { + LIB.AU3_ControlListViewByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + } + + @Override + public int AU3_WinCloseByHandle(HWND arg0) { + return LIB.AU3_WinCloseByHandle(arg0); + } + + @Override + public void AU3_WinMinimizeAllUndo() { + LIB.AU3_WinMinimizeAllUndo(); + } + + // + @Override + public int AU3_ControlSendByHandle(HWND arg0, HWND arg1, WString arg2) { + return LIB.AU3_ControlSendByHandle(arg0, arg1, arg2); + } + + @Override + public int AU3_ControlSendByHandle(HWND arg0, HWND arg1, WString arg2, int arg3) { + return LIB.AU3_ControlSendByHandle(arg0, arg1, arg2, arg3); + } + + @Override + public int AU3_WinWaitActiveByHandle(HWND arg0, int arg1) { + return LIB.AU3_WinWaitActiveByHandle(arg0, arg1); + } + + @Override + public int AU3_WinMoveByHandle(HWND arg0, int arg1, int arg2, int arg3) { + return LIB.AU3_WinMoveByHandle(arg0, arg1, arg2, arg3); + } + + @Override + public int AU3_WinMoveByHandle(HWND arg0, int arg1, int arg2, int arg3, int arg4) { + return LIB.AU3_WinMoveByHandle(arg0, arg1, arg2, arg3, arg4); + } + + @Override + public int AU3_StatusbarGetTextByHandle(HWND arg0, int arg1, LPWSTR arg2, int arg3) { + return LIB.AU3_StatusbarGetTextByHandle(arg0, arg1, arg2, arg3); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinGetClassList.htm + @Override + public void AU3_WinGetClassList(WString title, WString text, LPWSTR resultPtr, int bufSize) { + LIB.AU3_WinGetClassList(title, text, resultPtr, bufSize); + } + + public List WinGetClassList(String title, String text) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_WinGetClassList(new WString(title), new WString(text), resultPtr, bufSize); + resultString = resultPtr.getValue().toString().trim(); + if (debug) { + System.err.println("WinGetClassList: " + resultString); + } + return Arrays.asList(resultString.split("\\n")); + // no fancy regexp like (?:\\n+) appears to work + } + + @Override + public int AU3_WinExistsByHandle(HWND arg0) { + return LIB.AU3_WinExistsByHandle(arg0); + } + + @Override + public int AU3_MouseClickDrag(WString arg0, int arg1, int arg2, int arg3, int arg4, int arg5) { + return LIB.AU3_MouseClickDrag(arg0, arg1, arg2, arg3, arg4, arg5); + } + + @Override + public int AU3_MouseClickDrag(WString arg0, int arg1, int arg2, int arg3, int arg4) { + return LIB.AU3_MouseClickDrag(arg0, arg1, arg2, arg3, arg4); + } + + @Override + public int AU3_WinWaitByHandle(HWND arg0, int arg1) { + return LIB.AU3_WinWaitByHandle(arg0, arg1); + } + + @Override + public int AU3_ControlClickByHandle(HWND arg0, HWND arg1, WString arg2, int arg3, int arg4, int arg5) { + return LIB.AU3_ControlClickByHandle(arg0, arg1, arg2, arg3, arg4, arg5); + } + + @Override + public int AU3_ControlClickByHandle(HWND arg0, HWND arg1, WString arg2, int arg3) { + return LIB.AU3_ControlClickByHandle(arg0, arg1, arg2, arg3); + } + + @Override + public int AU3_WinActivateByHandle(HWND arg0) { + return LIB.AU3_WinActivateByHandle(arg0); + } + + @Override + public int AU3_ControlMoveByHandle(HWND arg0, HWND arg1, int arg2, int arg3) { + return LIB.AU3_ControlMoveByHandle(arg0, arg1, arg2, arg3); + } + + @Override + public int AU3_ControlMoveByHandle(HWND arg0, HWND arg1, int arg2, int arg3, int arg4, int arg5) { + return LIB.AU3_ControlMoveByHandle(arg0, arg1, arg2, arg3, arg4, arg5); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ProcessWaitClose.htm + @Override + public int AU3_ProcessWaitClose(WString process) { + return LIB.AU3_ProcessWaitClose(process); + } + + public boolean ProcessWaitClose(String process) { + return (LIB.AU3_ProcessWaitClose(new WString(process)) != Constants.AU3_FAILURE); + } + + @Override + public int AU3_ProcessWaitClose(WString process, int timeout) { + return LIB.AU3_ProcessWaitClose(process, timeout); + } + + @Override + public UnsignedInt AU3_PixelChecksum(RECT arg0) { + return LIB.AU3_PixelChecksum(arg0); + } + + @Override + public UnsignedInt AU3_PixelChecksum(RECT arg0, int arg1) { + return LIB.AU3_PixelChecksum(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinGetHandle.htm + @Override + public void AU3_WinGetHandleAsText(WString title, WString text, LPWSTR resultPtr, int bufSize) { + LIB.AU3_WinGetHandleAsText(title, text, resultPtr, bufSize); + } + + public String WinGetHandleAsText(String title, String text) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_WinGetHandleAsText(new WString(title), new WString(text), resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + @Override + public int AU3_WinGetCaretPos(Pointer arg0) { + return LIB.AU3_WinGetCaretPos(arg0); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinWaitActive.htm + @Override + public int AU3_WinWaitActive(WString title, WString text, int timeout) { + return LIB.AU3_WinWaitActive(title, text, timeout); + } + + // NOTE: not returning handle to requested window getting active + public boolean WinWaitActive(String title, String text, int timeout) { + return (LIB.AU3_WinWaitActive(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); + } + + @Override + public int AU3_WinWaitActive(WString title, WString text) { + return LIB.AU3_WinWaitActive(title, text); + } + + // NOTE: not returning handle to requested window getting active + public boolean WinWaitActive(String title, String text) { + return (LIB.AU3_WinWaitActive(new WString(title), new WString(text)) != Constants.AU3_FAILURE); + } + + @Override + public int AU3_WinGetStateByHandle(HWND arg0) { + return LIB.AU3_WinGetStateByHandle(arg0); + } + + @Override + public int AU3_WinActiveByHandle(HWND arg0) { + return LIB.AU3_WinActiveByHandle(arg0); + } + + @Override + public int AU3_WinSetOnTopByHandle(HWND arg0, int arg1) { + return LIB.AU3_WinSetOnTopByHandle(arg0, arg1); + } + + @Override + public int AU3_WinSetTitleByHandle(HWND arg0, WString arg1) { + return LIB.AU3_WinSetTitleByHandle(arg0, arg1); + } + + @Override + public DWORD AU3_WinGetProcessByHandle(HWND arg0) { + return LIB.AU3_WinGetProcessByHandle(arg0); + } + + @Override + public int AU3_WinGetClientSize(WString arg0, WString arg1, RECT arg2) { + return LIB.AU3_WinGetClientSize(arg0, arg1, arg2); + } + + @Override + public void AU3_WinGetTextByHandle(HWND hwnd, LPWSTR resultPtr, int bufSize) { + LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); + } + + public String WinGetTextByHandle(HWND hwnd) { + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + public String WinGetTextByHandle(String windowHandle) { + HWND hwnd = new HWND(); + hwnd.setPointer(new Pointer(Long.decode(windowHandle))); + resultString = fill(bufSize, " "); + LPWSTR resultPtr = new LPWSTR(resultString); + LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); + resultString = resultPtr.getValue().toString(); + return resultString.trim(); + } + + @Override + public int AU3_WinGetPosByHandle(HWND arg0, RECT arg1) { + return LIB.AU3_WinGetPosByHandle(arg0, arg1); + } + + @Override + public void AU3_WinGetTitleByHandle(HWND arg0, LPWSTR arg1, int arg2) { + LIB.AU3_WinGetTitleByHandle(arg0, arg1, arg2); + } + + @Override + public int AU3_StatusbarGetText(WString arg0, WString arg1, int arg2, LPWSTR arg3, int arg4) { + return LIB.AU3_StatusbarGetText(arg0, arg1, arg2, arg3, arg4); + } + + @Override + public void AU3_WinGetClassListByHandle(HWND arg0, LPWSTR arg1, int arg2) { + LIB.AU3_WinGetClassListByHandle(arg0, arg1, arg2); + } + + @Override + public DWORD AU3_WinGetProcess(WString arg0, WString arg1) { + return LIB.AU3_WinGetProcess(arg0, arg1); + } + + @Override + public int AU3_WinGetClientSizeByHandle(HWND arg0, RECT arg1) { + return LIB.AU3_WinGetClientSizeByHandle(arg0, arg1); + } + + @Override + public int AU3_WinWaitCloseByHandle(HWND arg0, int arg1) { + return LIB.AU3_WinWaitCloseByHandle(arg0, arg1); + } + + @Override + public int AU3_WinMenuSelectItemByHandle(HWND arg0, WString arg1, WString arg2, WString arg3, WString arg4, + WString arg5, WString arg6, WString arg7, WString arg8) { + return LIB.AU3_WinMenuSelectItemByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinWaitNotActive.htm + @Override + public int AU3_WinWaitNotActive(WString title, WString text, int timeout) { + return LIB.AU3_WinWaitNotActive(title, text, timeout); + } + + public boolean WinWaitNotActive(String title, String text, int timeout) { + return (LIB.AU3_WinWaitNotActive(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinMenuSelectItem.htms + // NOTE: Autoit documentation only covers 6 submenu text arguments + @Override + public int AU3_WinMenuSelectItem(WString title, WString text, WString submenu1Text, WString submenu2Text, + WString submenu3Text, WString submenu4Text, WString submenu5Text, WString submenu6Text, WString exraArg1, + WString exraArg2) { + return LIB.AU3_WinMenuSelectItem(title, text, submenu1Text, submenu2Text, submenu3Text, submenu4Text, + submenu5Text, submenu6Text, exraArg1, exraArg2); + } + + public boolean WinMenuSelectItem(String title, String text, String submenu1Text, String submenu2Text, + String submenu3Text, String submenu4Text, String submenu5Text, String submenu6Text) { + return (LIB.AU3_WinMenuSelectItem(new WString(title), new WString(text), new WString(submenu1Text), + new WString(submenu2Text), new WString(submenu3Text), new WString(submenu4Text), + new WString(submenu5Text), new WString(submenu6Text), new WString(""), + new WString("")) != Constants.AU3_FAILURE); + } + + @Override + public int AU3_WinSetTransByHandle(HWND arg0, int arg1) { + return LIB.AU3_WinSetTransByHandle(arg0, arg1); + } + + @Override + public int AU3_WinKillByHandle(HWND arg0) { + return LIB.AU3_WinKillByHandle(arg0); + } + + // https://www.autoitscript.com/autoit3/docs/functions/WinWaitClose.htm + @Override + public int AU3_WinWaitClose(WString title, WString text) { + return LIB.AU3_WinWaitClose(title, text); + } + + @Override + public int AU3_WinWaitClose(WString title, WString text, int timeout) { + return LIB.AU3_WinWaitClose(title, text, timeout); + } + + public boolean WinWaitClose(String title, String text, int timeout) { + return (LIB.AU3_WinWaitClose(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); + } + + @Override + public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3) { + return LIB.AU3_WinMove(arg0, arg1, arg2, arg3); + } + + @Override + public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3, int arg4) { + return LIB.AU3_WinMove(arg0, arg1, arg2, arg3, arg4); + } + + @Override + public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3, int arg4, int arg5) { + return LIB.AU3_WinMove(arg0, arg1, arg2, arg3, arg4, arg5); + } + + @Override + public int AU3_WinWait(WString arg0, WString arg1, int arg2) { + return LIB.AU3_WinWait(arg0, arg1, arg2); + } + + @Override + public int AU3_WinWait(WString arg0, WString arg1) { + return LIB.AU3_WinWait(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/MouseGetPos.htm + @Override + public void AU3_MouseGetPos(Pointer arg) { + LIB.AU3_MouseGetPos(arg); + } + + // a two-element int array containing the mouse coordinates + // $_[0] X coordinate + // $_[1] Y coordinate + public int[] MouseGetPos() { + int[] pos = { 0, 0 }; + // https://www.baeldung.com/java-size-of-object + // TODO: examine return value of the AU3 method call + Pointer arg = new Memory(32); + LIB.AU3_MouseGetPos(arg); + pos = arg.getIntArray(0, 2); + return pos; + } + + // an int mouse coordinate + // if dimension=0, the X coordinate + // if dimension=1, the Y coordinate + public int MouseGetPos(int dimension) { + int[] pos = { 0, 0 }; + Pointer arg = new Memory(32); + LIB.AU3_MouseGetPos(arg); + pos = arg.getIntArray(0, 2); + return dimension == 0 ? pos[0] : pos[1]; + } + + // https://www.autoitscript.com/autoit3/docs/functions/MouseClick.htm + @Override + public int AU3_MouseClick(WString button, int x, int y, int clicks, int speed) { + // button: "left","right","middle","main", "menu", "primary", "secindary" + return LIB.AU3_MouseClick(button, x, y, clicks, speed); + } + + public int MouseClick(String button, int x, int y, int clicks, int speed) { + // button: "left","right","middle","main", "menu", "primary", "secindary" + return LIB.AU3_MouseClick(new WString(button), x, y, clicks, speed); + } + + @Override + public int AU3_MouseClick(WString button) { + return LIB.AU3_MouseClick(button); + } + + @Override + public int AU3_ControlMove(WString arg0, WString arg1, WString arg2, int arg3, int arg4) { + return LIB.AU3_ControlMove(arg0, arg1, arg2, arg3, arg4); + } + + @Override + public int AU3_ControlMove(WString arg0, WString arg1, WString arg2, int arg3, int arg4, int arg5, int arg6) { + return LIB.AU3_ControlMove(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + } + + @Override + public int AU3_RunAsWait(WString arg0, WString arg1, WString arg2, int arg3, WString arg4, WString arg5, int arg6) { + return LIB.AU3_RunAsWait(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + } + + @Override + public int AU3_RunAsWait(WString arg0, WString arg1, WString arg2, int arg3, WString arg4, WString arg5) { + return LIB.AU3_RunAsWait(arg0, arg1, arg2, arg3, arg4, arg5); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ToolTip.htm + @Override + public void AU3_ToolTip(WString text, int options) { + LIB.AU3_ToolTip(text, options); + } + + public void ToolTip(String text, int options) { + LIB.AU3_ToolTip(new WString(text), options); + } + + @Override + public void AU3_ToolTip(WString text) { + LIB.AU3_ToolTip(text); + } + + public void ToolTip(String text) { + LIB.AU3_ToolTip(new WString(text)); + } + + @Override + public void AU3_ToolTip(WString arg0, int arg1, int arg2) { + LIB.AU3_ToolTip(arg0, arg1, arg2); + } + + // https://www.autoitscript.com/autoit3/docs/functions/Send.htm + @Override + public void AU3_Send(WString keys) { + LIB.AU3_Send(keys); + } + + public void Send(String keys) { + LIB.AU3_Send(new WString(keys)); + } + + @Override + public void AU3_Send(WString keys, int flag) { + LIB.AU3_Send(keys, flag); + } + + public void Send(String keys, Boolean flag) { + LIB.AU3_Send(new WString(keys), flag ? 0 : 1); + } + + @Override + public int AU3_MouseMove(int arg0, int arg1, int arg2) { + return LIB.AU3_MouseMove(arg0, arg1, arg2); + } + + @Override + public int AU3_MouseMove(int arg0, int arg1) { + return LIB.AU3_MouseMove(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/ProcessWait.htm + @Override + public int AU3_ProcessWait(WString process) { + return LIB.AU3_ProcessWait(process); + } + + public boolean AU3_ProcessWait(String process) { + return (LIB.AU3_ProcessWait(new WString(process)) != Constants.AU3_FAILURE); + } + + @Override + public int AU3_ProcessWait(WString arg0, int arg1) { + return LIB.AU3_ProcessWait(arg0, arg1); + } + + // https://www.autoitscript.com/autoit3/docs/functions/RunWait.htm + @Override + public int AU3_RunWait(WString program, WString workingdir, int show_flag) { + // NOTE: may return nonzero Value as the exitcode of the program + return LIB.AU3_RunWait(program, workingdir, show_flag); + } + + @Override + public int AU3_RunWait(WString program, WString workingdir) { + return LIB.AU3_RunWait(program, workingdir); + } + + public int RunWait(String program, String workingdir) { + return LIB.AU3_RunWait(new WString(program), new WString(workingdir)); + } + + // https://www.autoitscript.com/autoit3/docs/functions/RunAs.htm + @Override + public int AU3_RunAs(WString username, WString domain, WString password, int logon_flag, WString program, + WString workingdir) { + return LIB.AU3_RunAs(username, domain, password, logon_flag, program, workingdir); + } + + // https://www.autoitscript.com/autoit3/docs/functions/RunAs.htm + @Override + public int AU3_RunAs(WString username, WString domain, WString password, int logon_flag, WString program, + WString workingdir, int show_flag) { + return LIB.AU3_RunAs(username, domain, password, logon_flag, program, workingdir, show_flag); + } + + public boolean RunAs(String username, String domain, String password, int logon_flag, String program, + String workingdir, int show_flag) { + return (LIB.AU3_RunAs(new WString(username), new WString(domain), new WString(password), logon_flag, + new WString(program), new WString(workingdir), show_flag) != Constants.AU3_FAILURE); + /* + * RUN_LOGON_NOPROFILE (0) - Interactive logon with no profile. + * RUN_LOGON_PROFILE (1) - Interactive logon with profile. RUN_LOGON_NETWORK (2) + * - Network credentials only. RUN_LOGON_INHERIT (4) - Inherit the calling + * process's environment instead of the user's environment. + */ + } + + private static String fill(int length, String with) { + StringBuilder sb = new StringBuilder(length); + while (sb.length() < length) { + sb.append(with); + } + return sb.toString(); + } + +} diff --git a/jna_autoit/src/main/java/example/AutoItXLibrary.java b/jna_autoit/src/main/java/example/AutoItXLibrary.java index 580329dd9..50f694c25 100644 --- a/jna_autoit/src/main/java/example/AutoItXLibrary.java +++ b/jna_autoit/src/main/java/example/AutoItXLibrary.java @@ -1,471 +1,471 @@ -/* - * Copyright 2018 midorlo. - * - * Licensed 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. - */ -package example; - -import static example.Constants.AU3_INTDEFAULT; -import static example.Constants.SW_SHOWNORMAL; - -import com.sun.jna.Library; -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.WTypes.LPWSTR; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.WinDef.RECT; - -import com.sun.jna.Library; -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.WTypes.LPWSTR; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.WinDef.RECT; - -/** - * - * @author midorlo - * @author sergueik - */ -interface AutoItXLibrary extends Library { - - String AU3_WinMinimizeAll(); - - void AU3_Init(); - - int AU3_error(); - - int AU3_AutoItSetOption(WString szOption, int nValue); - - void AU3_ClipGet(LPWSTR szClip, int nBufSize); - - void AU3_ClipPut(WString szClip); - - default int AU3_ControlClick(WString szTitle, WString szText, - WString szControl, WString szButton, int nNumClicks) { - return AU3_ControlClick(szTitle, szText, szControl, szButton, nNumClicks, - AU3_INTDEFAULT, AU3_INTDEFAULT); - } - - default int AU3_ControlClick(WString szTitle, WString szText, - WString szControl, WString szButton, int nNumClicks, int nX) { - return AU3_ControlClick(szTitle, szText, szControl, szButton, nNumClicks, - nX, AU3_INTDEFAULT); - } - - int AU3_ControlClick(WString szTitle, WString szText, WString szControl, - WString szButton, int nNumClicks, int nX, int nY); - - default int AU3_ControlClickByHandle(HWND hWnd, HWND hCtrl, WString szButton, - int nNumClicks) { - return AU3_ControlClickByHandle(hWnd, hCtrl, szButton, nNumClicks, - AU3_INTDEFAULT, AU3_INTDEFAULT); - } - - int AU3_ControlClickByHandle(HWND hWnd, HWND hCtrl, WString szButton, - int nNumClicks, int nX, int nY); - - void AU3_ControlCommand(WString szTitle, WString szText, WString szControl, - WString szCommand, WString szExtra, LPWSTR szResult, int nBufSize); - - void AU3_ControlCommandByHandle(HWND hWnd, HWND hCtrl, WString szCommand, - WString szExtra, LPWSTR szResult, int nBufSize); - - void AU3_ControlListView(WString szTitle, WString szText, WString szControl, - WString szCommand, WString szExtra1, WString szExtra2, LPWSTR szResult, - int nBufSize); - - void AU3_ControlListViewByHandle(HWND hWnd, HWND hCtrl, WString szCommand, - WString szExtra1, WString szExtra2, LPWSTR szResult, int nBufSize); - - int AU3_ControlDisable(WString szTitle, WString szText, WString szControl); - - int AU3_ControlDisableByHandle(HWND hWnd, HWND hCtrl); - - int AU3_ControlEnable(WString szTitle, WString szText, WString szControl); - - int AU3_ControlEnableByHandle(HWND hWnd, HWND hCtrl); - - int AU3_ControlFocus(WString szTitle, WString szText, WString szControl); - - int AU3_ControlFocusByHandle(HWND hWnd, HWND hCtrl); - - void AU3_ControlGetFocus(WString szTitle, WString szText, - LPWSTR szControlWithFocus, int nBufSize); - - void AU3_ControlGetFocusByHandle(HWND hWnd, LPWSTR szControlWithFocus, - int nBufSize); - - HWND AU3_ControlGetHandle(HWND hWnd, WString szControl); - - void AU3_ControlGetHandleAsText(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, WString szControl, - LPWSTR szRetText, int nBufSize); - - int AU3_ControlGetPos(WString szTitle, WString szText, WString szControl, - RECT lpRect); - - int AU3_ControlGetPosByHandle(HWND hWnd, HWND hCtrl, RECT lpRect); - - void AU3_ControlGetText(WString szTitle, WString szText, WString szControl, - LPWSTR szControlText, int nBufSize); - - void AU3_ControlGetTextByHandle(HWND hWnd, HWND hCtrl, LPWSTR szControlText, - int nBufSize); - - int AU3_ControlHide(WString szTitle, WString szText, WString szControl); - - int AU3_ControlHideByHandle(HWND hWnd, HWND hCtrl); - - default int AU3_ControlMove(WString szTitle, WString szText, - WString szControl, int nX, int nY) { - return AU3_ControlMove(szTitle, szText, szControl, nX, nY, -1, -1); - } - - int AU3_ControlMove(WString szTitle, WString szText, WString szControl, - int nX, int nY, int nWidth, int nHeight); - - default int AU3_ControlMoveByHandle(HWND hWnd, HWND hCtrl, int nX, int nY) { - return AU3_ControlMoveByHandle(hWnd, hCtrl, nX, nY, -1, -1); - } - - int AU3_ControlMoveByHandle(HWND hWnd, HWND hCtrl, int nX, int nY, int nWidth, - int nHeight); - - public default int AU3_ControlSend(WString szTitle, WString szText, - WString szControl, WString szSendText) { - return AU3_ControlSend(szTitle, szText, szControl, szSendText, 0); - } - - int AU3_ControlSend(WString szTitle, WString szText, WString szControl, - WString szSendText, int nMode); - - default int AU3_ControlSendByHandle(HWND hWnd, HWND hCtrl, - WString szSendText) { - return AU3_ControlSendByHandle(hWnd, hCtrl, szSendText, 0); - } - - int AU3_ControlSendByHandle(HWND hWnd, HWND hCtrl, WString szSendText, - int nMode); - - int AU3_ControlSetText(WString szTitle, WString szText, WString szControl, - WString szControlText); - - int AU3_ControlSetTextByHandle(HWND hWnd, HWND hCtrl, WString szControlText); - - int AU3_ControlShow(WString szTitle, WString szText, WString szControl); - - int AU3_ControlShowByHandle(HWND hWnd, HWND hCtrl); - - void AU3_ControlTreeView(WString szTitle, WString szText, WString szControl, - WString szCommand, WString szExtra1, WString szExtra2, LPWSTR szResult, - int nBufSize); - - void AU3_ControlTreeViewByHandle(HWND hWnd, HWND hCtrl, WString szCommand, - WString szExtra1, WString szExtra2, LPWSTR szResult, int nBufSize); - - void AU3_DriveMapAdd(WString szDevice, WString szShare, int nFlags, - /*[in,defaultvalue("")]*/ WString szUser, - /*[in,defaultvalue("")]*/ WString szPwd, LPWSTR szResult, int nBufSize); - - int AU3_DriveMapDel(WString szDevice); - - void AU3_DriveMapGet(WString szDevice, LPWSTR szMapping, int nBufSize); - - int AU3_IsAdmin(); - - default int AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/WString szButton) { - return AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/szButton, AU3_INTDEFAULT, - AU3_INTDEFAULT, 1, -1); - } - - int AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/WString szButton, int nX, - int nY, int nClicks, int nSpeed); - - default int AU3_MouseClickDrag(WString szButton, int nX1, int nY1, int nX2, - int nY2) { - return AU3_MouseClickDrag(szButton, nX1, nY1, nX2, nY2, -1); - } - - int AU3_MouseClickDrag(WString szButton, int nX1, int nY1, int nX2, int nY2, - int nSpeed); - - void AU3_MouseDown(/*[in,defaultvalue("LEFT")]*/WString szButton); - - int AU3_MouseGetCursor(); - - void AU3_MouseGetPos(Pointer lpPoint); - - default int AU3_MouseMove(int nX, int nY) { - return AU3_MouseMove(nX, nY, -1); - } - - int AU3_MouseMove(int nX, int nY, int nSpeed); - - void AU3_MouseUp(/*[in,defaultvalue("LEFT")]*/WString szButton); - - void AU3_MouseWheel(WString szDirection, int nClicks); - - int AU3_Opt(WString szOption, int nValue); - - default UnsignedInt AU3_PixelChecksum(RECT lpRect) { - return AU3_PixelChecksum(lpRect, 1); - } - - UnsignedInt AU3_PixelChecksum(RECT lpRect, int nStep); - - int AU3_PixelGetColor(int nX, int nY); - - void AU3_PixelSearch(RECT lpRect, int nCol, /*default 0*/ int nVar, - /*default 1*/ int nStep, Pointer pPointResult); - - int AU3_ProcessClose(WString szProcess); - - int AU3_ProcessExists(WString szProcess); - - int AU3_ProcessSetPriority(WString szProcess, int nPriority); - - default int AU3_ProcessWait(WString szProcess) { - return AU3_ProcessWait(szProcess, 0); - } - - int AU3_ProcessWait(WString szProcess, int nTimeout); - - default int AU3_ProcessWaitClose(WString szProcess) { - return AU3_ProcessWaitClose(szProcess, 0); - } - - int AU3_ProcessWaitClose(WString szProcess, int nTimeout); - - default int AU3_Run(WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_Run(szProgram, szDir, SW_SHOWNORMAL); - } - - int AU3_Run(WString szProgram, /*[in,defaultvalue("")]*/ WString szDir, - int nShowFlag); // = SW_SHOWNORMAL - - default int AU3_RunWait(WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_RunWait(szProgram, /*[in,defaultvalue("")]*/ szDir, - SW_SHOWNORMAL); - } - - int AU3_RunWait(WString szProgram, /*[in,defaultvalue("")]*/ WString szDir, - int nShowFlag); - - default int AU3_RunAs(WString szUser, WString szDomain, WString szPassword, - int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_RunAs(szUser, szDomain, szPassword, nLogonFlag, szProgram, - /*[in,defaultvalue("")]*/ szDir, SW_SHOWNORMAL); - } - - int AU3_RunAs(WString szUser, WString szDomain, WString szPassword, - int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir, int nShowFlag); - - default int AU3_RunAsWait(WString szUser, WString szDomain, - WString szPassword, int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_RunAsWait(szUser, szDomain, szPassword, nLogonFlag, szProgram, - /*[in,defaultvalue("")]*/ szDir, SW_SHOWNORMAL); - } - - int AU3_RunAsWait(WString szUser, WString szDomain, WString szPassword, - int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir, int nShowFlag); - - default void AU3_Send(WString szSendText) { - AU3_Send(szSendText, 0); - } - - void AU3_Send(WString szSendText, int nMode); - - int AU3_Shutdown(int nFlags); - - void AU3_Sleep(int nMilliseconds); - - int AU3_StatusbarGetText(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, - /*[in,defaultvalue(1)]*/ int nPart, LPWSTR szStatusText, int nBufSize); - - int AU3_StatusbarGetTextByHandle(HWND hWnd, - /*[in,defaultvalue(1)]*/ int nPart, LPWSTR szStatusText, int nBufSize); - - default void AU3_ToolTip(WString szTip) { - AU3_ToolTip(szTip, AU3_INTDEFAULT, AU3_INTDEFAULT); - } - - default void AU3_ToolTip(WString szTip, int nX) { - AU3_ToolTip(szTip, nX, AU3_INTDEFAULT); - } - - void AU3_ToolTip(WString szTip, int nX, int nY); - - int AU3_WinActivate(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinActivateByHandle(HWND hWnd); - - int AU3_WinActive(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinActiveByHandle(HWND hWnd); - - int AU3_WinClose(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinCloseByHandle(HWND hWnd); - - int AU3_WinExists(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinExistsByHandle(HWND hWnd); - - int AU3_WinGetCaretPos(Pointer lpPoint); - - void AU3_WinGetClassList(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); - - void AU3_WinGetClassListByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); - - int AU3_WinGetClientSize(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, RECT lpRect); - - int AU3_WinGetClientSizeByHandle(HWND hWnd, RECT lpRect); - - HWND AU3_WinGetHandle(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - void AU3_WinGetHandleAsText(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); - - int AU3_WinGetPos(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - RECT lpRect); - - int AU3_WinGetPosByHandle(HWND hWnd, RECT lpRect); - - DWORD AU3_WinGetProcess(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - DWORD AU3_WinGetProcessByHandle(HWND hWnd); - - int AU3_WinGetState(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinGetStateByHandle(HWND hWnd); - - void AU3_WinGetText(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - LPWSTR szRetText, int nBufSize); - - void AU3_WinGetTextByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); - - void AU3_WinGetTitle(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); - - void AU3_WinGetTitleByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); - - int AU3_WinKill(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinKillByHandle(HWND hWnd); - - int AU3_WinMenuSelectItem(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, WString szItem1, - WString szItem2, WString szItem3, WString szItem4, WString szItem5, - WString szItem6, WString szItem7, WString szItem8); - - int AU3_WinMenuSelectItemByHandle(HWND hWnd, WString szItem1, WString szItem2, - WString szItem3, WString szItem4, WString szItem5, WString szItem6, - WString szItem7, WString szItem8); - - void AU3_WinMinimizeAllUndo(); - - default int AU3_WinMove(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nX, int nY) { - return AU3_WinMove(szTitle, /*[in,defaultvalue("")]*/ szText, nX, nY, -1, - -1); - } - - default int AU3_WinMove(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nX, int nY, int nWidth) { - return AU3_WinMove(szTitle, /*[in,defaultvalue("")]*/ szText, nX, nY, - nWidth, -1); - } - - int AU3_WinMove(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nX, int nY, int nWidth, int nHeight); - - default int AU3_WinMoveByHandle(HWND hWnd, int nX, int nY, int nWidth) { - return AU3_WinMoveByHandle(hWnd, nX, nY, nWidth, -1); - } - - int AU3_WinMoveByHandle(HWND hWnd, int nX, int nY, int nWidth, int nHeight); - - int AU3_WinSetOnTop(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nFlag); - - int AU3_WinSetOnTopByHandle(HWND hWnd, int nFlag); - - int AU3_WinSetState(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nFlags); - - int AU3_WinSetStateByHandle(HWND hWnd, int nFlags); - - int AU3_WinSetTitle(WString szTitle, WString szTitledefaultvalue, - WString szText, WString szNewTitle); - - default int AU3_WinSetTitle(WString szTitle, WString szText, - WString szNewTitle) { - return AU3_WinSetTitle(szTitle, new WString(""), szText, szNewTitle); - } - - int AU3_WinSetTitleByHandle(HWND hWnd, WString szNewTitle); - - int AU3_WinSetTrans(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nTrans); - - int AU3_WinSetTransByHandle(HWND hWnd, int nTrans); - - default int AU3_WinWait(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText) { - return AU3_WinWait(szTitle, /*[in,defaultvalue("")]*/ szText, 0); - } - - int AU3_WinWait(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nTimeout); - - int AU3_WinWaitByHandle(HWND hWnd, int nTimeout); - - default int AU3_WinWaitActive(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText) { - return AU3_WinWaitActive(szTitle, /*[in,defaultvalue("")]*/ szText, 0); - } - - int AU3_WinWaitActive(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nTimeout); - - int AU3_WinWaitActiveByHandle(HWND hWnd, int nTimeout); - - default int AU3_WinWaitClose(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText) { - return AU3_WinWaitClose(szTitle, /*[in,defaultvalue("")]*/ szText, 0); - } - - int AU3_WinWaitClose(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nTimeout); - - int AU3_WinWaitCloseByHandle(HWND hWnd, int nTimeout); - - int AU3_WinWaitNotActive(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nTimeout); -} +/* + * Copyright 2018 midorlo. + * + * Licensed 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. + */ +package example; + +import static example.Constants.AU3_INTDEFAULT; +import static example.Constants.SW_SHOWNORMAL; + +import com.sun.jna.Library; +import com.sun.jna.Pointer; +import com.sun.jna.WString; +import com.sun.jna.platform.win32.WTypes.LPWSTR; +import com.sun.jna.platform.win32.WinDef.DWORD; +import com.sun.jna.platform.win32.WinDef.HWND; +import com.sun.jna.platform.win32.WinDef.RECT; + +import com.sun.jna.Library; +import com.sun.jna.Pointer; +import com.sun.jna.WString; +import com.sun.jna.platform.win32.WTypes.LPWSTR; +import com.sun.jna.platform.win32.WinDef.DWORD; +import com.sun.jna.platform.win32.WinDef.HWND; +import com.sun.jna.platform.win32.WinDef.RECT; + +/** + * + * @author midorlo + * @author sergueik + */ +interface AutoItXLibrary extends Library { + + String AU3_WinMinimizeAll(); + + void AU3_Init(); + + int AU3_error(); + + int AU3_AutoItSetOption(WString szOption, int nValue); + + void AU3_ClipGet(LPWSTR szClip, int nBufSize); + + void AU3_ClipPut(WString szClip); + + default int AU3_ControlClick(WString szTitle, WString szText, + WString szControl, WString szButton, int nNumClicks) { + return AU3_ControlClick(szTitle, szText, szControl, szButton, nNumClicks, + AU3_INTDEFAULT, AU3_INTDEFAULT); + } + + default int AU3_ControlClick(WString szTitle, WString szText, + WString szControl, WString szButton, int nNumClicks, int nX) { + return AU3_ControlClick(szTitle, szText, szControl, szButton, nNumClicks, + nX, AU3_INTDEFAULT); + } + + int AU3_ControlClick(WString szTitle, WString szText, WString szControl, + WString szButton, int nNumClicks, int nX, int nY); + + default int AU3_ControlClickByHandle(HWND hWnd, HWND hCtrl, WString szButton, + int nNumClicks) { + return AU3_ControlClickByHandle(hWnd, hCtrl, szButton, nNumClicks, + AU3_INTDEFAULT, AU3_INTDEFAULT); + } + + int AU3_ControlClickByHandle(HWND hWnd, HWND hCtrl, WString szButton, + int nNumClicks, int nX, int nY); + + void AU3_ControlCommand(WString szTitle, WString szText, WString szControl, + WString szCommand, WString szExtra, LPWSTR szResult, int nBufSize); + + void AU3_ControlCommandByHandle(HWND hWnd, HWND hCtrl, WString szCommand, + WString szExtra, LPWSTR szResult, int nBufSize); + + void AU3_ControlListView(WString szTitle, WString szText, WString szControl, + WString szCommand, WString szExtra1, WString szExtra2, LPWSTR szResult, + int nBufSize); + + void AU3_ControlListViewByHandle(HWND hWnd, HWND hCtrl, WString szCommand, + WString szExtra1, WString szExtra2, LPWSTR szResult, int nBufSize); + + int AU3_ControlDisable(WString szTitle, WString szText, WString szControl); + + int AU3_ControlDisableByHandle(HWND hWnd, HWND hCtrl); + + int AU3_ControlEnable(WString szTitle, WString szText, WString szControl); + + int AU3_ControlEnableByHandle(HWND hWnd, HWND hCtrl); + + int AU3_ControlFocus(WString szTitle, WString szText, WString szControl); + + int AU3_ControlFocusByHandle(HWND hWnd, HWND hCtrl); + + void AU3_ControlGetFocus(WString szTitle, WString szText, + LPWSTR szControlWithFocus, int nBufSize); + + void AU3_ControlGetFocusByHandle(HWND hWnd, LPWSTR szControlWithFocus, + int nBufSize); + + HWND AU3_ControlGetHandle(HWND hWnd, WString szControl); + + void AU3_ControlGetHandleAsText(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, WString szControl, + LPWSTR szRetText, int nBufSize); + + int AU3_ControlGetPos(WString szTitle, WString szText, WString szControl, + RECT lpRect); + + int AU3_ControlGetPosByHandle(HWND hWnd, HWND hCtrl, RECT lpRect); + + void AU3_ControlGetText(WString szTitle, WString szText, WString szControl, + LPWSTR szControlText, int nBufSize); + + void AU3_ControlGetTextByHandle(HWND hWnd, HWND hCtrl, LPWSTR szControlText, + int nBufSize); + + int AU3_ControlHide(WString szTitle, WString szText, WString szControl); + + int AU3_ControlHideByHandle(HWND hWnd, HWND hCtrl); + + default int AU3_ControlMove(WString szTitle, WString szText, + WString szControl, int nX, int nY) { + return AU3_ControlMove(szTitle, szText, szControl, nX, nY, -1, -1); + } + + int AU3_ControlMove(WString szTitle, WString szText, WString szControl, + int nX, int nY, int nWidth, int nHeight); + + default int AU3_ControlMoveByHandle(HWND hWnd, HWND hCtrl, int nX, int nY) { + return AU3_ControlMoveByHandle(hWnd, hCtrl, nX, nY, -1, -1); + } + + int AU3_ControlMoveByHandle(HWND hWnd, HWND hCtrl, int nX, int nY, int nWidth, + int nHeight); + + public default int AU3_ControlSend(WString szTitle, WString szText, + WString szControl, WString szSendText) { + return AU3_ControlSend(szTitle, szText, szControl, szSendText, 0); + } + + int AU3_ControlSend(WString szTitle, WString szText, WString szControl, + WString szSendText, int nMode); + + default int AU3_ControlSendByHandle(HWND hWnd, HWND hCtrl, + WString szSendText) { + return AU3_ControlSendByHandle(hWnd, hCtrl, szSendText, 0); + } + + int AU3_ControlSendByHandle(HWND hWnd, HWND hCtrl, WString szSendText, + int nMode); + + int AU3_ControlSetText(WString szTitle, WString szText, WString szControl, + WString szControlText); + + int AU3_ControlSetTextByHandle(HWND hWnd, HWND hCtrl, WString szControlText); + + int AU3_ControlShow(WString szTitle, WString szText, WString szControl); + + int AU3_ControlShowByHandle(HWND hWnd, HWND hCtrl); + + void AU3_ControlTreeView(WString szTitle, WString szText, WString szControl, + WString szCommand, WString szExtra1, WString szExtra2, LPWSTR szResult, + int nBufSize); + + void AU3_ControlTreeViewByHandle(HWND hWnd, HWND hCtrl, WString szCommand, + WString szExtra1, WString szExtra2, LPWSTR szResult, int nBufSize); + + void AU3_DriveMapAdd(WString szDevice, WString szShare, int nFlags, + /*[in,defaultvalue("")]*/ WString szUser, + /*[in,defaultvalue("")]*/ WString szPwd, LPWSTR szResult, int nBufSize); + + int AU3_DriveMapDel(WString szDevice); + + void AU3_DriveMapGet(WString szDevice, LPWSTR szMapping, int nBufSize); + + int AU3_IsAdmin(); + + default int AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/WString szButton) { + return AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/szButton, AU3_INTDEFAULT, + AU3_INTDEFAULT, 1, -1); + } + + int AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/WString szButton, int nX, + int nY, int nClicks, int nSpeed); + + default int AU3_MouseClickDrag(WString szButton, int nX1, int nY1, int nX2, + int nY2) { + return AU3_MouseClickDrag(szButton, nX1, nY1, nX2, nY2, -1); + } + + int AU3_MouseClickDrag(WString szButton, int nX1, int nY1, int nX2, int nY2, + int nSpeed); + + void AU3_MouseDown(/*[in,defaultvalue("LEFT")]*/WString szButton); + + int AU3_MouseGetCursor(); + + void AU3_MouseGetPos(Pointer lpPoint); + + default int AU3_MouseMove(int nX, int nY) { + return AU3_MouseMove(nX, nY, -1); + } + + int AU3_MouseMove(int nX, int nY, int nSpeed); + + void AU3_MouseUp(/*[in,defaultvalue("LEFT")]*/WString szButton); + + void AU3_MouseWheel(WString szDirection, int nClicks); + + int AU3_Opt(WString szOption, int nValue); + + default UnsignedInt AU3_PixelChecksum(RECT lpRect) { + return AU3_PixelChecksum(lpRect, 1); + } + + UnsignedInt AU3_PixelChecksum(RECT lpRect, int nStep); + + int AU3_PixelGetColor(int nX, int nY); + + void AU3_PixelSearch(RECT lpRect, int nCol, /*default 0*/ int nVar, + /*default 1*/ int nStep, Pointer pPointResult); + + int AU3_ProcessClose(WString szProcess); + + int AU3_ProcessExists(WString szProcess); + + int AU3_ProcessSetPriority(WString szProcess, int nPriority); + + default int AU3_ProcessWait(WString szProcess) { + return AU3_ProcessWait(szProcess, 0); + } + + int AU3_ProcessWait(WString szProcess, int nTimeout); + + default int AU3_ProcessWaitClose(WString szProcess) { + return AU3_ProcessWaitClose(szProcess, 0); + } + + int AU3_ProcessWaitClose(WString szProcess, int nTimeout); + + default int AU3_Run(WString szProgram, + /*[in,defaultvalue("")]*/ WString szDir) { + return AU3_Run(szProgram, szDir, SW_SHOWNORMAL); + } + + int AU3_Run(WString szProgram, /*[in,defaultvalue("")]*/ WString szDir, + int nShowFlag); // = SW_SHOWNORMAL + + default int AU3_RunWait(WString szProgram, + /*[in,defaultvalue("")]*/ WString szDir) { + return AU3_RunWait(szProgram, /*[in,defaultvalue("")]*/ szDir, + SW_SHOWNORMAL); + } + + int AU3_RunWait(WString szProgram, /*[in,defaultvalue("")]*/ WString szDir, + int nShowFlag); + + default int AU3_RunAs(WString szUser, WString szDomain, WString szPassword, + int nLogonFlag, WString szProgram, + /*[in,defaultvalue("")]*/ WString szDir) { + return AU3_RunAs(szUser, szDomain, szPassword, nLogonFlag, szProgram, + /*[in,defaultvalue("")]*/ szDir, SW_SHOWNORMAL); + } + + int AU3_RunAs(WString szUser, WString szDomain, WString szPassword, + int nLogonFlag, WString szProgram, + /*[in,defaultvalue("")]*/ WString szDir, int nShowFlag); + + default int AU3_RunAsWait(WString szUser, WString szDomain, + WString szPassword, int nLogonFlag, WString szProgram, + /*[in,defaultvalue("")]*/ WString szDir) { + return AU3_RunAsWait(szUser, szDomain, szPassword, nLogonFlag, szProgram, + /*[in,defaultvalue("")]*/ szDir, SW_SHOWNORMAL); + } + + int AU3_RunAsWait(WString szUser, WString szDomain, WString szPassword, + int nLogonFlag, WString szProgram, + /*[in,defaultvalue("")]*/ WString szDir, int nShowFlag); + + default void AU3_Send(WString szSendText) { + AU3_Send(szSendText, 0); + } + + void AU3_Send(WString szSendText, int nMode); + + int AU3_Shutdown(int nFlags); + + void AU3_Sleep(int nMilliseconds); + + int AU3_StatusbarGetText(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, + /*[in,defaultvalue(1)]*/ int nPart, LPWSTR szStatusText, int nBufSize); + + int AU3_StatusbarGetTextByHandle(HWND hWnd, + /*[in,defaultvalue(1)]*/ int nPart, LPWSTR szStatusText, int nBufSize); + + default void AU3_ToolTip(WString szTip) { + AU3_ToolTip(szTip, AU3_INTDEFAULT, AU3_INTDEFAULT); + } + + default void AU3_ToolTip(WString szTip, int nX) { + AU3_ToolTip(szTip, nX, AU3_INTDEFAULT); + } + + void AU3_ToolTip(WString szTip, int nX, int nY); + + int AU3_WinActivate(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText); + + int AU3_WinActivateByHandle(HWND hWnd); + + int AU3_WinActive(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); + + int AU3_WinActiveByHandle(HWND hWnd); + + int AU3_WinClose(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); + + int AU3_WinCloseByHandle(HWND hWnd); + + int AU3_WinExists(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); + + int AU3_WinExistsByHandle(HWND hWnd); + + int AU3_WinGetCaretPos(Pointer lpPoint); + + void AU3_WinGetClassList(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); + + void AU3_WinGetClassListByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); + + int AU3_WinGetClientSize(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, RECT lpRect); + + int AU3_WinGetClientSizeByHandle(HWND hWnd, RECT lpRect); + + HWND AU3_WinGetHandle(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText); + + void AU3_WinGetHandleAsText(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); + + int AU3_WinGetPos(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, + RECT lpRect); + + int AU3_WinGetPosByHandle(HWND hWnd, RECT lpRect); + + DWORD AU3_WinGetProcess(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText); + + DWORD AU3_WinGetProcessByHandle(HWND hWnd); + + int AU3_WinGetState(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText); + + int AU3_WinGetStateByHandle(HWND hWnd); + + void AU3_WinGetText(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, + LPWSTR szRetText, int nBufSize); + + void AU3_WinGetTextByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); + + void AU3_WinGetTitle(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); + + void AU3_WinGetTitleByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); + + int AU3_WinKill(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); + + int AU3_WinKillByHandle(HWND hWnd); + + int AU3_WinMenuSelectItem(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, WString szItem1, + WString szItem2, WString szItem3, WString szItem4, WString szItem5, + WString szItem6, WString szItem7, WString szItem8); + + int AU3_WinMenuSelectItemByHandle(HWND hWnd, WString szItem1, WString szItem2, + WString szItem3, WString szItem4, WString szItem5, WString szItem6, + WString szItem7, WString szItem8); + + void AU3_WinMinimizeAllUndo(); + + default int AU3_WinMove(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, int nX, int nY) { + return AU3_WinMove(szTitle, /*[in,defaultvalue("")]*/ szText, nX, nY, -1, + -1); + } + + default int AU3_WinMove(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, int nX, int nY, int nWidth) { + return AU3_WinMove(szTitle, /*[in,defaultvalue("")]*/ szText, nX, nY, + nWidth, -1); + } + + int AU3_WinMove(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, + int nX, int nY, int nWidth, int nHeight); + + default int AU3_WinMoveByHandle(HWND hWnd, int nX, int nY, int nWidth) { + return AU3_WinMoveByHandle(hWnd, nX, nY, nWidth, -1); + } + + int AU3_WinMoveByHandle(HWND hWnd, int nX, int nY, int nWidth, int nHeight); + + int AU3_WinSetOnTop(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, + int nFlag); + + int AU3_WinSetOnTopByHandle(HWND hWnd, int nFlag); + + int AU3_WinSetState(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, + int nFlags); + + int AU3_WinSetStateByHandle(HWND hWnd, int nFlags); + + int AU3_WinSetTitle(WString szTitle, WString szTitledefaultvalue, + WString szText, WString szNewTitle); + + default int AU3_WinSetTitle(WString szTitle, WString szText, + WString szNewTitle) { + return AU3_WinSetTitle(szTitle, new WString(""), szText, szNewTitle); + } + + int AU3_WinSetTitleByHandle(HWND hWnd, WString szNewTitle); + + int AU3_WinSetTrans(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, + int nTrans); + + int AU3_WinSetTransByHandle(HWND hWnd, int nTrans); + + default int AU3_WinWait(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText) { + return AU3_WinWait(szTitle, /*[in,defaultvalue("")]*/ szText, 0); + } + + int AU3_WinWait(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, + int nTimeout); + + int AU3_WinWaitByHandle(HWND hWnd, int nTimeout); + + default int AU3_WinWaitActive(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText) { + return AU3_WinWaitActive(szTitle, /*[in,defaultvalue("")]*/ szText, 0); + } + + int AU3_WinWaitActive(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, int nTimeout); + + int AU3_WinWaitActiveByHandle(HWND hWnd, int nTimeout); + + default int AU3_WinWaitClose(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText) { + return AU3_WinWaitClose(szTitle, /*[in,defaultvalue("")]*/ szText, 0); + } + + int AU3_WinWaitClose(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, int nTimeout); + + int AU3_WinWaitCloseByHandle(HWND hWnd, int nTimeout); + + int AU3_WinWaitNotActive(WString szTitle, + /*[in,defaultvalue("")]*/ WString szText, int nTimeout); +} diff --git a/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java b/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java new file mode 100644 index 000000000..c7c4480d6 --- /dev/null +++ b/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java @@ -0,0 +1,71 @@ +/* + * Copyright 2018 midorlo. + * + * Licensed 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. + */ +package example; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; + +/** + * Util Class which helped me generate the interface. Stays here + * in case I need it again. + * @author midorlo + */ +class AutoItXLibraryGenerator { + + protected static void printJavaMethods() { + Method[] methods = new AutoItX().LIB.getClass().getMethods(); + for (Method method : methods) { + System.out + .println("public " + method.getReturnType() + " " + method.getName() + + "(" + prefixPrintJavaMethods(method.getParameters()) + ") {" + + System.lineSeparator() + + ((method.getReturnType().getSimpleName().equals("void")) ? "" + : "return ") + + " LIB." + method.getName() + "(" + + paramsPrintJavaMethods(method.getParameters()) + ");" + + System.lineSeparator() + "}"); + } + } + + private static String prefixPrintJavaMethods(Parameter[] xx) { + String r = ""; + for (Parameter parameter : xx) { + r += parameter.getType().getSimpleName() + " " + parameter.getName() + + ", "; + } + if (r.length() > 0) { + r = r.substring(0, r.length() - 2); + } + return r; + } + + private static String paramsPrintJavaMethods(Parameter[] xx) { + String r = ""; + for (Parameter parameter : xx) { + r += parameter.getName() + ", "; + } + if (r.length() > 0) { + r = r.substring(0, r.length() - 2); + } + return r; + } + + public static void main(String[] args) { + String libraryPath = System.getProperty("user.dir"); + System.setProperty("java.library.path", libraryPath); + printJavaMethods(); + } +} diff --git a/jna_autoit/src/main/java/example/Constants.java b/jna_autoit/src/main/java/example/Constants.java new file mode 100644 index 000000000..a8565218b --- /dev/null +++ b/jna_autoit/src/main/java/example/Constants.java @@ -0,0 +1,93 @@ +/* + * Copyright 2018-2019 midorlo, sergueik + * + * Licensed 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. + */ +package example; + +import java.util.HashMap; +import java.util.Map; + +/** + * @via https://www.autoitscript.com/forum/topic/72905-c-use-of-the-dll-some-idears-for-you/ + * + * @author midorlo + * @author sergueik + */ +public class Constants { + + public static final int AU3_INTDEFAULT = -2147483647; + // "Default" value for _some_ final int parameters (largest negative number) + public static final int ERROR = 1; + public static final int SW_HIDE = 2; + public static final int SW_MAXIMIZE = 3; + public static final int SW_MINIMIZE = 4; + public static final int SW_RESTORE = 5; + public static final int SW_SHOW = 6; + public static final int SW_SHOWDEFAULT = 7; + public static final int SW_SHOWMAXIMIZED = 8; + public static final int SW_SHOWMINIMIZED = 9; + public static final int SW_SHOWMINNOACTIVE = 10; + public static final int SW_SHOWNA = 11; + public static final int SW_SHOWNOACTIVATE = 12; + public static final int SW_SHOWNORMAL = 13; + public static final int VERSION = 109; + + public static final int RUN_LOGON_NOPROFILE = 0; + public static final int RUN_LOGON_PROFILE = 1; + public static final int RUN_LOGON_NETWORK = 2; + public static final int RUN_LOGON_INHERIT = 4; + + // The AutoIt v3 functions return values are unusual + // for a Java program + // e.g. + // https://www.autoitscript.com/autoit3/docs/functions/WinClose.htm + // https://www.autoitscript.com/autoit3/docs/functions/WinKill.htm + // etc. illustrate the pattern: + // Success: 1. + // Failure: 0 if the window is not found, + // or can not be activated + // some functions only return success value of 1. + + // https://www.autoitscript.com/autoit3/docs/appendix/AutoItConstants.htm + // https://github.com/310ken1/AutoItSciTEj/blob/master/language/au3/Include/AutoItConstants.au3 + // TODO: rename constants used in this class + public static final int AU3_SUCCESS = 1; + public static final int AU3_FAILURE = 0; + + public static final int AU3_WINDOWS_NOONTOP = 0; + public static final int AU3_WINDOWS_ONTOP = 1; + + public static final int WIN_STATE_EXISTS = 1; + public static final int WIN_STATE_VISIBLE = 2; + public static final int WIN_STATE_ENABLED = 4; + public static final int WIN_STATE_ACTIVE = 8; + public static final int WIN_STATE_MINIMIZED = 16; + public static final int WIN_STATE_MAXIMIZED = 32; + + public static final Map stateNames = new HashMap<>(); + static { + stateNames.put(WIN_STATE_EXISTS, "Window exists"); + stateNames.put(WIN_STATE_VISIBLE, "Window is visible"); + stateNames.put(WIN_STATE_ENABLED, "Window is enabled"); + stateNames.put(WIN_STATE_ACTIVE, "Window is active"); + stateNames.put(WIN_STATE_MINIMIZED, "Window is minimized"); + stateNames.put(WIN_STATE_MAXIMIZED, "Window is maximized"); + } + + public static final int AU3_SEND_DEFAULT = 0; + public static final int AU3_SEND_RAW = 1; + + public static final String DLL = (System.getProperty("os.arch") + .equals("amd64") ? "AutoItX3_x64.dll" : "AutoItX3.dll"); +} diff --git a/jna_autoit/src/main/java/example/UnsignedInt.java b/jna_autoit/src/main/java/example/UnsignedInt.java new file mode 100644 index 000000000..1facd08c8 --- /dev/null +++ b/jna_autoit/src/main/java/example/UnsignedInt.java @@ -0,0 +1,29 @@ +/* + * Copyright 2018 midorlo. + * + * Licensed 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. + */ +package example; + +import com.sun.jna.IntegerType; + +/** + * @author midorlo + * @author sergueik + */ +@SuppressWarnings("serial") +public class UnsignedInt extends IntegerType { + public UnsignedInt() { + super(4, true); + } +} \ No newline at end of file diff --git a/jna_autoit/src/main/resources/AutoItX3.Assembly.dll b/jna_autoit/src/main/resources/AutoItX3.Assembly.dll new file mode 100755 index 0000000000000000000000000000000000000000..1dba8004248bf2620d74848d5547370c00b899cd GIT binary patch literal 42664 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 H2=7X&FS$EaF2mzHDHMj=1LKZK4^XN>~< zO9S=RsGNTVI!=Q$s_tI}Xrv$&^8`Jl%4B|?pgFoGf2MJQ7HPzvX`G-H8u4cuC+QiD z_%n@@^qe3S^Ax?R$|U9~I;m^&Id+Q9X~bi8iaybZ$LwADQX?L-cj=}^JZ7iqXN`Ew zPLmNUBjLwmc7|*k@tB>V(t?zhvou$giI%hUtggvg&eB$mSj$=3qY-O)k6zb^wY*11 zG-569(ZR*>rNBRZwZWUN0z*9JBB|DXNe2>fpZ{x<^u8-Y8GKm`iI8eCm$ zxLCaN0j7o67_qTp`-vS2I}FdvxsFrpc(IdVN8));5bl7Nz}CS1dXTrTv5uw%IE*}6 zj<=$1!tWHjPwYB68t|BrPoD&=K+S6bf5844u)(s9Y=N&^Y*aEZ1ovZg0{;LL73k%~ z*5-9uw;d$RATaA_R3Nt+8yIO_N8~dj>WnsALJY zJC&8@YlVH|xP5ke)RSetTgLxc&59WMrA?({i*smCp z9_-5ia6Tfo^=h8WZbLl63KltIe^B!!3<9S9?d_Y-=0!v2VorVb5 zXle-?N;g9y@PcFQVY6sGYzaD#`cvuok{$6}HxQddjvtHo zBMf{VMAHnX^yL(OHkeP0T=8?kuQ4`&SzyV7|2obWZhHvKW=p>K`O@|(n9nQ)!W2j= zFJm?pc-aiDZ$k`UOHD8qYdCznC0zK9U@BN+#g7FaYe@u?Vs*lQz~U5sHkc5fTrh_$ zxx#D!6Yi4-rj%En@f+gj34aLuBA*bH&eInWqK&4D^Eu4sybWeyQn{(%IncLAm1RqI9=)1DMpHJYn*{K)=*K z1b$agJ{ahiQud)A{LeuJ@S$017Dy>GtG&H^W>fiKn~!Mrku2aN3m?&s(w@QL!iR$| z4@pDlM{a`)~&Vvu-!ski-L*Rc4 z&IfPz&KI8jc<-y=149agDFB1jv=KLh|6J__2+K<-QJq zKNOM=X0>;|FziF2_yzDQ`m)8S`fZ@gel|ZDXZV}_!o?5wWBuV^N_oW!6AOQoms5Nv ze2l8p$%T)ZEPNh(jG^#(!sKf!V~A4B1Su_mpJXeLQuf!tml3mx5}Rm)#k{qN65+$O zFFH|r*)J9r3WblAI!izx2*4tDVREH3Py9Ua7y)7Og~kHug$WlX91QY>#cCsrQ%ap+a9#+LtL+B*rbMnp$P*?H zep4e~{CxOpi~?y}AWQ)mUyCi6uRgY5$y!_9MZ|)C0G9dKU{>f9-wD1)KrU=kBUhL_ z_-l+j@$=#PTJoiSzAy#aN-rTC*%l&wg>cMpFb`P5g^7jVBOq3Mr?$K|$OS*b$d&rJ z!slr#*HiKHQKzZ3Kx!5UQy}$iC1q4ga?Nn@!{IlzhL_~tW3`nW!I$!K!eZr-nz>S% z3kI`Vm^}F32jms{nAOrMUuxzHU!bkbrBc#+DUM((CHca~nWcRh2Qc3U#0nED^<%+6 ziTFxIHZ1f=X+Hc?UisSRz6!)I0FPN6%8V^k^n`Mpa9AjT{XQUE z_*khEt9{XcQjCT$xzZ|E`y4G#+U5zvKJ-Y0d|~pz;93TYby)ZU__!`eX+a^g+S^uI z*51;hu(T)ybHyiI{BYsJ!Qd=_#aSS{Q+TKLWn{$96+Tz$=fUpq$`d|M_-D62Vqc`mHGaR+N6>qhH};wUvIsqhG1x)Rx;i!DAexX0F7^ zlhQnilP7$>F!^9G8k&)D5Whf53nY%MlIW?#8f=wB4}6S?@UieQ1GUekPO0gXnoi+! zwdGbpUKTv9_rm|I_*Rw=zPaR!Zz1{Nn?e4#3on6h*97qWIlgHgMAh*ZK5_7V6by%9d8j>IRxQTSB02|n>` ziccY%(INDH1W(D1;a&L?)C!*_wZ^A7ZSd(yTYREHR9e1>Qq{X2{QJd@5}P14UrOH< z|E$<^VlRkwuM_Q42N7EM@GC(b#V^i`^xRnlPZAz``{qE6* z`Le16u}-o7jr#NNA+pM%_&DEPk9*cfe0lUvh`oEO@9#m+-6PyfsXEH)h~GSi{DA2^;gFV#^70?=_3JEzaC&Znu=aiszCjN{aJ$s(+_* zZ|zCxfkZ%kC8fC@7~ulww^c^cdFyw*Fm?M?)(>b7*)mB_vd3B<R(zw^f-3<3g%dxq{KKeFC)P&y%bq#zMtv387Xkp-5Q5Sv-TvrTS zC)l<|I}5HCY}=r$Lu>=zRcQx*AbK$H9g`UNL(zkQt7b>| z!_k9*?`^QXAKyK);CmWuN1`8tMu|*=~bU3wA4Pw?nCc_w|;*-wBNdb})~_e+fzr>|~yR|1vZhct4Hp zE6`}c?uPBFcqi7tE{E;w&}hMXTx<{E-Bp7Q!dkHR;lI`M7OVwtGi`u>SnN@Ls}sAT zXTiJ!y%xM*#P%5U8hH1I?YsEw!h+or+tbi%;GLPR@XtcEfp=ZD!+#&D4ZOdy6aIO; z2Z+BtAofFKV8J^fY(GK<27N5{GPGOh6R}s2fkB_bTIedY8}u2h1%DUl0Q|3D@z)CI z4ftP+{RY`s=$hCY$i|?XV*i6YEOblkcgVw_?_n+U1F|vbM_3E}gq@#3Kf_w^w}no@ z|6S~#$jm~2i2Vzh8Tjy(t;KjBydl=hI1k1Oi?z&@SDS8oix1Rw-npf@CDOGY&(3ig%wh42crb|7_ps= zK=55)E!5QrhTjbqtD;d7es{6GjZiSXV6plcW#Gq&9cYvTGf37P z>St7ee?KhNK%*M`QLtG3jOy?c#3mUv!6b?uW7GyeR_p^tUGPq^`mjQa4? zV6oyE{FkLNVX^KRjo@dConSa2-ZT=jTZ1{z+%NS zTEU+MYoXaj8~6{4ony2E^N85FMhy6QVjnX)f?q6liNSx(YAGyMHlr*2Ww2Pyj9B<9 z#jY}XfO!%YtC`UY{!?O~G5Ua6D|Wrn5Bxf@8w~!tR~uomY8eCJZ-KSY^TuHKFTi5e zGKRw6CiX>RIGCMccNzDA-z|2JF%tYsVqZ4m!S98|s%0d?e+3pRm5~hpby%!d2LDa1 zgJRz_oM7G%d&n3E{w=ZZ7^&d%#U3-#!5@dU& z2^ ziM?UW1%FfQe~eu4x5R#DECByKEY>1}|NhsHuonEKti|wug~eKAEP?;K*guWO!Tcfi zFXIXDWMONytN`yN*4y$V7#~=yKbEK9`@>@8v8;g~0E=CgMgD@A*ix2tU`mP&wQNA0 z(qhY6o&{e>?}s7L&m5 ze$>{Vq1lrCy2c2!ELv}5P^n<%@YA|idQwhGa$AbY$xe^W9ughVH+^DqX5851l$401 zloX0hn~**(d1TDM=w9hLS;>RPCMT!p$`QJaTNCP)KEYMlvvJ21XX3a{nek(&YjSpB z$c{OgS?QUcbq8ipOjcHMrqmnkOp8g(c1}nx%5|RP%*xJk<6^U7l2V;%Zn5IV=426o6H z8lRR_you_=95~$r^h)Mthsl$&DQ;}~M7I>En=?tq+H9f+)xAkks!MuePL@Yx#dUIK z#V4c`iPkyIlhMKAvg5OJvJ&Dm2e2sDfc4Kwi^&=s?<~d@ty8>4p`sLLhB-4ZC>bV? zqdy=sKCMtWV`p|svRgT8a>sqr2Bc>cPDV5+96b2FoN3Nf=al4_l$3#KN$GbeGL@i# zimuZK?wgsOn4Fd6R-&X!Jvd{z;}WxWe)a+wS1BiTPWF+DShA`-K) z5V_*G>P^BuQC3EBa+35kggD9&@rQ~(RQx!p!DY%Df;&OwCFEphL-3?XnjA@!qG)oI zH0YpcZlPTkJ0w!Yk5nBfG*qD>QL0R}AF2?3>E>vPil_uCTh5Ve9@vS_G(AB$z8ZV( zRC&zdcyO7l95K^5T)y7prR)NteSk$?07k0R=IARjjic9*p?q(b&ODfM$ZdG*7 zbMvB%TOA3mOQkK(I&Q(gxgIWP$wG)zG>+Mh>q>E=UX+noW<36g0sm4%YcAJHj9R)m zd}mdYY3&xW>R<>PMP_?lNwdk^T4V|#I+dsFL}ya=SQ?w`95Xgsstp!`ds7~F)=d>N zsa;j3L0a-eIVN1SxAwWN>6^bZ;xknrec9m};)ubOK9iEtQ{%BDWMFBV$frk2`k3@I zIiwkx>0>hEQ~6Y+EL@d@Bs zIXy=m%mLcxI;L;_PFL%-`ZXv%B}WC-%Q&~tE~`=HOe#+oDKJ4Ar)FWu8;fXw)$ljWG1@`%q(-#c)%lK({SL@ zGvbmnCpfVk;4^-ZGs}r>l&eYC9A}aXnS(MYIWr5_ui^z=oGHo03U#-gobhAQ(zCLi ziCNSsIU#4v7~Y?`Vki!OxSSWZtinU0#X?*Lf@iv`1tCM+KRG3Sl6YCJaM;apmfQ|S z3CD5zgr-6d3Hr8yrVGF*0&Ajtp-+LEHmncLgh&6FRxSQ)Qs%ORCsc@LSphc zldxyOPNa8EN{XvMLh%+F8=mZFtiEciFgVkho!lqk0ZdBOn`{^44n$gXP0rSL9|CdD z!85YLg~B@wjSKH9G&V0UCgeLS%s{!fk#W#IQjqn=gjgBPYJB@(`WOiJYJlp# zKsPG_^u2=FRNW`w(D7YChxkl0lCEVh1&e>9J`XAjmBm*3vXClY zZNHVTHumr(N&fAznJ-FlWOPs%0lwby(Lgm*R0Y@m-8|be<0s-=qQ2?QG|`8a9nB3r zwu{;EX=AWGH(M8O>-B(fKiHqUklOX=_1u%@N!vF&Q%wlnR7K_>n0>LS892bWvr=r4 zVD1zZ-S~6$!fihM9!}iQficA0D|bkeIfhU z=MdRa@Z4fFJ_8}!0C(Hnd-JD!Kc&^)p0U+aKZ$+ia{c&e z*D~Vv()`2Mru;bLM#$3Z*3Vi#IJkYkVcTN|Zyo%}-ZH=J-uUxJpZ#<>p?3H0J9S#~ zW6b#tx6UqEo?PkevVTT3Tin~I`Pt7UkG^!W>ZUc`VHP7Or~;m4soU$oqK{w5Z&R1f zJs<5lAj2Ea;)DFc@JOBp`1xVB;BF818Tc7svEe=ni)DJ|WW&nOkUVQK=U$6S;b|J5 zR(@u07##BQ!w>7JZ27wYhGzvH*&;nuDa@#(*@tUI#>b*QenH$_v4lJW73+zgc)9mf ztO7qPyK4n+j|x-{Z}MO&2NeockE!_KnqS$%Jp9dKTsts(FjGAT0db4;jL$O2hcAhl z*#T&blSiLM{Bf}*C1*1Uf5(a`5Y3DAX? zQyy|Zza}0kJcr!4t@frE3trXuI5@$)n@3`@8M9`jIz|Pf(DbFIoM{ zmk;u5>CwCA7#O!113jjm!{<5Aq2=}m*Rx@<`G2Q|o?<?A+^tD<<|f4fP=2HVtz_`L}7bE*u12v-OFhx1WF8m=l*D zKO7br0zO^zAq{qm$NSg6jfN3br=A~=sGNL$#YVK)VZP14$O7p(Ej>?#yG%>Zqv+$g z#@}n7_j364QH<7CXI>WdQMlIuwbl!JNxqnB z?R<&)Tm8Jm^7P?t2+kiK0)8~}PlkY-A_8Ak%a`W>eB1L+0G{q1%0F6Up-%Yy4p6Yp8e3V|bDY!6xN94%eA5b=gr-K5I)LtSt4FW)(B2Xpy@8#mhDB8q}RM>z7SGCj@1Dv~eXsBhkt^GMs!J%+|s-Veu_=MqnN)N$RU zHN_~IQ=T`U zh~l=3#BJE$hVUgX4uO>op~{zcJ8ASHqdz9$)t0jZLEnSZw@J<)`yFP&QLLu?pkF4Q*DZr=~ zKAymTgpa)CSw!JXY>cXd@p+`4H&Xbw1B;QAMtaV;9%%6GEuVrs9{QPvoGd|pdjev<$_ACYO@X|5 zLEd~PK@|-uqpE~qYGmQI1ka_ydS)l#U3M%-s)+Dr8&xlS&K>qBYqM9~r9vKzgFe$NVvnI`2GVh6HkIisQmlJHN;cw)uCdzGl7gCoYz_V&cCihHrtHzvU0Lq6V%@Mc(M*MxF4F-*S(~`{iBm?l(U<{vZ_Ot|NeWng)|-O* zJ@Fj|GfswRos5x*mzXFn5-&{p<7{%!ma}2aVTghEKTx+Xz7@gWAW);x34LYZ&3Vo( zLu#A3-&f) zOVy#FCt{6}NIc>hc<+R>8iVn~>Mf&ElncY#=utRMkhKK^52)4+5mw{P^Pw^$!1gM{k5xQMl2adA($36b< z=l_}!IH>+R;5c3W_w)bY2<)hgq%9V5%&NTB$5wAnw>dur8orjbvnnqE^{B-#B7+@) zKDJSFx*5q{R*T_HjuAfo^?mRW+N@?4!@9P&qo<>s8x!oXdExs4*7cSdFRfZT%l5EimUWq9me+%8@!y5U zCqUgQJ>XmC%vbH|Sl*j8>;y;DI*k%g(=#&6QPsz5ptVG3xvuyR&&Q|4Ime`h^-oXF z4(k{b)-bGpbY!TbB-ii{^>@`UNiTQOQMFuPWK&1e$R-Z?8CEVZs<9h%42vw`uyHJ( zP)mo-krj}-1P*Zp4ojQRFe^UN;fUZOuh6<~Mf?gX%i}v15f|4jCaOtOsO%c;m}S&( zPYy%vHOmObp)vd|v+y4LqmK-%nO7}td;Ygg-wb~#?So%B{7`+t+?yTOH9FXC#ntj% z-&@{$-t&hO3--j8dF0lGr>0i=-2-iL}}u zFS=E#^3C&UUzYB*t77uGhr18HZrz^H{OypZIxgzJx9y&7Pd8Zc*P`qj7R)PS!z?2S zBQnYngwd@MY#4u8t(Yc0jw+06Tgy61`}kpcdVBkNc@=s#M=37GcZL44`Z;{?%YyF} zNRuFIS!?OwmS4WGY)N**<(913TUSTKwyUsZfTJ2Wsc9|mC_AI{;+s9DKNr!t*0x@K ze@$Gq;Nwp}sj;7o}HESbBLr49!;cM&8sjV9&W~SV(NyE(O2oyOIxm}obgkzYagpW0em52ELfcsjv<)z^=` z`F5hU#8-2N_>k|cp@*JZ7Ioor>0WE!uX*{%N3Yy;e%ifra>HJ+k4+jK6|`gQ!5#B< zEc$kY&(9-5y0xpB^-8O_hx^YsadTIhqb2dl+A(hqF^ZKg3{%v&42y8Qfy z(F5&Q$8>Fd?SYM-EGzha)4`di`>*V`>73=|)?atO@$M_hXPV89>+#T-2N$;g(YNxB z?N*-;e@^K#FLU*^-fIr+*f(IqzTPX|DUEgME38ZJs&y%#!%rs<`aN)T?yECjDeEy@ z|J8MZ*Qn->NGwb(qFY2p^BU!FG{a$T+QbprY?vd#ZH?;M!CdEjL;X8AGgGnhjEzr? ztm>$YNrV;g_K#A`a<4m-|Lt0}YexOXKXyJm`19eNyAL}R@^Q$fw<>Mh9N|B^Pr_@{ z7r)`yR4?k6?XPue*zQ+r_=3<{-zD@2jQwRo@yj;5FXQ?j+&Rtji@mhKLGd908Y4G4zPyeS$?wsGg zY5Cdkf#vq^fAOo)dn^5s<^0ZXhjY+x5%-rIU24~_n}2=rl5gzJ6?zydJ*3EDK zq<#3yUi%*PuYNA#yQS|OFZV}J>$}T+{%V{!biv{py*B3V`!Xaj+qZTx|xi_GN-j(2C|Y9@xGVjlsL7c&`yl zO4iu;s4>yJ&|r1Qb~G=HWXx%Bw^hh9f@6?cSNb@5xi275|8fCwtwwyotP*Oq;5ND) zyVb1C9ZemL*G8>%%!#=3lIN*U*1k{^d@Hf-+@^V|qmk+Sb$*w_*o}9L%$Ch8u z+3NP$Ur=NrzwJt2bW0&?U1q)D!1vnJIG1HvStjGBEgfsjtUv$Tx{F%9ef5&DrR;_u zr*+uW+4t7@hgYN*&w$Tiu0^zJKgs=j#*8UpevPher-i4Y^oq-^Rl~ zU#nOlv-t}(z6!nk!l&ab1Cr(*d4BjyH-7)AQTt!Yw+yxTFWdQN_Y0-N6F&T?Z>{Cu zzQ6y6Cohc*wC@|W{LRxe&wG2RKE`VYzZ){`xzo??DY@~D097Y3a=^YN6+rK3Mybz#R#b7p?Eb@V4oYJC2{^TzAX4IfczMgFo~ z*WMU7?whNJ=624X{@b|Nm&R8PJ^pl!n6+PbT0iOCr`pu~Wl#A7zin;x;;zV9r4~D8 zm0Dmi495fi&E?EeY#nvmYp$L7uA@TXe$VC=8Q`|lv|yA4XMPGv%4af35x|dC|7Fw+FQj3+umX zNV8QjR~kgbI{H8H)~*9VlQRx3NOLBI-x`%R>aADDcBnDybgBIdJ}t9yXztCrk47gR z9{9$!#0r1B6FDIG*R$VUKlH=yiYMm$dhxrpHwV>NRrSs1o?X=9F-MQ8(nvkJi6_J#GINizXZ&@Y#vh7irSy)cFUVtI_x=-vbBh&fb;# z$Bc^ad@~Gv|N`ilP%nJV5Vt5t5DVh0&PYGSq z7J}Q7ndhuC&pKwli}_o)7qWQW=7wZM!O7|ar;=Ba-}k+bpPDqieYe`-<$Sl4s(5yB z!{f8FJ6VE^p%;Ck_{~V7@1h?mABs;BnmeK+n?y!OHfz#2BC0vAx!8glYZEudJ4U)) ze7pCJtn8?W1q;{N(5}7ugt^@b^oZyY5sB+ImwJVUyOj)xiwVOQ9KvFfCg4GTa+2H} zz&IRH4INQyX9YZfeaP3?hn&&-kkFU2uMfR?|6!jxWpmwU7vCKXcawAX`;|zXFQUcn zt_5$rXJyCZRr%sKEKzc^)Z7sj)f_iF_~DI63k-}2|LbG%x4V$-xsU&{|M#iS7fdta zh6P`I<=5-w9=-JV!3~Z5-`X~9>M=*<=#EddJ^MjuK+v_p`%53qKR4f2CS&BSBx7q* z!v?1h<>!|V>|#s4uk)y}Sq-vhEjsqviiazo`_F;%J}r)Z^p|g~leJoOs533Fpx)Sk zy;0-(?CX4`>cFqB_X>PGxz!U7w+!qs>cYI(wcSSi*5S$AgHdUZ{x*Hp!XKag^UGT& zFD+a$@js>ZwXc$}Fy+rhoturbeDwL*-xtL93mNzO`$x~ca;WQ&LpwT*>sWDj`0BT} z^_{&t-TT|rArE-Jv*(Y|pUs>X-Fxryuu{*KOK$hg-aW?#7d(1s?9InY6};Y!3G_U=8s1`cy0Vgt+KC#?de`*C$hBq=I&42m$c)l z-BrJ!W?jEn6H~vZ$LT9Oky>LfdVQK2`SWG3r&5A;J(m&F^S9pJN*!f~n(M4Qbw@Yt@;Dcl`8oeDiieqd%S8 z^5>khtIGXY_R}}ZzWV#N%AX!<(4bYh(my|4cYi|LO7HzNy;+)LUAY$?Zgt+a>)}P0 zbNAJJugou_3pP&o9-k1i>HEy|&+GquzINwrzdqjf)6vHpZ0xw>o6~#JOASuweYE2O zpD_uON1j>sSfka;Zsz$?zvg*$J`G>rAhq|wnJ?9^Tj$8E^o}i>XDn%UBBfWYAO37S zdv)G7Urqe1$=5XwEl$4~HE8A8Cx(arHu=>0udlt|;>Nop00*B)2CH2e$1KYq zYPBoDp9ql=nR~de)nl~&3y*>#9a!IrtZq>)H2m)_t$+6{Xv;(;?MgY%<(s;vz^-1?!oZc`4dnfvti>xUM0z0%>Et5?@` zPYEdZ)}}Z1ofv+rYNy;qf0p>T`jF7;y^g*;rbOizcin0{VafVqzNyXLUfZ>frOd|1 zmgG%-`uw%QYwAB(*~TI;(D_p<&a8{`mNe zML*YT{>Qkr?USnwo^X8lB5R)p&s}=BZ)l&xA1>JU^GD8}^RBI)>ZtSklp(JU-CsI$ z>CC||PssmZhX0H-n_Agse&v|?dC_$ZPlE3LsOPq)U01afws*9}`ESLlNdIybyw^uM zc=Gs(>>i0L9+?>5>U^WCKfD&be(AK5)t;W8a-+eH?-L$vnsvHt z(_8!R|7Q1$m6LuyGhy;qSE?_&TeTj~Ac`1Ia6+itZ9QjM}d9Gt!9;dks$|KUBM!G_>jZ360VTXB9*={X^j zUu_jSW8y-;E3s!DNN7~;{$H1m{Uo>U6V0FTIo~$_Se>DPSs(8>T2LowcA3LBhA%i{ z9raG^Ci{=hRzDs)YG3mCn)&gAo4t@-`orwYEw5)bidg;IyRRPjp$-0ybM#lU>TiqN z)Us^W!jEEt!df2Oy?I^1i+vu8h#FNe_}D({(y?PdZ(e6q&Wq1X{A)?+8{5KSf8W}^ zOt;gP$oLBP?_F_Y>%^CnR!uoD@{Q0NPbK^om~wf5vuvK%#k7LikB^^l*!jq;a%v^$ z;AmfL9SG)=S|0g&JG`(Pal1I*_HpiQPO%>CFCFZ=<GJlplytA~MbRxfA6oR;zQHM5 zelNBBo4CUbKdY6pZ&~7RAI6OxGpOzCy{DQ~Ka@ZA&yyG5jN5YjvH1lz@9VPgiI1iX zu~%$V<>M37EN1byol?)o*;hRD-56`tGUw+n-+lJuo^?0&tdx~C;rnt=zFBQb(A9>1 zTm36H_^b8v1A~H>Jk<2sp~11QUx{e=;HU+MV)}*FTyyfLsBz1T=brqsL3Fj2t!kf{ z)Ba?u26HCm$2Thd%JoYF(?5Cmy0@*@YxWN^Po7Qan_TtU(iO8KFYJ2hovuULjf|XS z$;B!52tNfF_g}r@Spqz7V~RWmxQY8H^G*=nDyZ)ktz-S4Ycf9lJ_&;5Qa zX6yM!+qNlZpHuHhT;5D)@ZqWPj+txS0{ovb@fbEvFlg*GXzVg*Y-bUf<1zX7s_)9Y zy4$PM)g7|0Ts$u9kxm4fD&bcMs#J{&hH_Z;WE_s{S5tuKmO4}Eq?viX+N>vxY&b=st6Ujc<% z2K|TgA0?N6-M7YjX2D$d=Xs06?>}Bz@MQJ>(|gZ83)%mELDHV!6PsHygZ3YAb3Nhu zgEd-a#T9|&DG$CqX7X6c9=*RZ_H)DK?P<2QR;R?ZAKm+$IbBOc#OTg}*AM?CNIB&3 txA8q_d%jb0TcU2*9$xJf*|ql9dQWN}oHuhpd3T7>{iR-(7o0&2KL86peii@# literal 0 HcmV?d00001 diff --git a/jna_autoit/src/main/resources/AutoItX3.dll b/jna_autoit/src/main/resources/AutoItX3.dll new file mode 100755 index 0000000000000000000000000000000000000000..f7b8257cd96c877df6951037e6d79e65e73784a2 GIT binary patch literal 465080 zcmeFadwdgB`UgB|({_N+1Z^>Dm4Zd9q85YNTEKEii%K!2kW!$4iZvT=2niOYwU|~J z#<;jEUUp@L^|D@9bU~^pmWvb=1@VT$Dyyicrmh7Miz4%WpL1p=nHF~WvAqAhpO+6! z&Yb65p8I*uC38wAE|iibNwVWl(`u;pLz97+1Flu^Ub$}vah)=duI6N?BCs-J@TsZ?3-?xe%<*!dv?#!n=bZ@ zyDDkyrCG+`qkDhLO2)HO`a0`m{{30j{rr1J)@$aOuFYxb`n|Jf?vA?@EKz$k%`n-}f+LkJ{-}>xC zBX5_~uWt{VLy~g9o&8BXJF5iTav|v>jv+;9fKntd1OJR~$(P2N`g~a$f$^_M)T0Vi z2mk1+=$ce%Z%;`YG$U2AQxjWLr5U3Ms{cEfDm4+7*=f?q3yjPof9IE{Qcv-Jz;ilB zHJ+82IzMz>O$ZtOY!o7d`r*4%`D{s=cK$6hXIu;LApA*1C_qG=X)Tyd-<3nTl{O1q_$T!?ho~3gU*yB<)Zm-q`G2hk^b~81#Uz|Hkpb~L3wvjT0H~#el|WU zS&HCWeAeDbjDpEHhH5e(jRgt7Ajm>kqZAh5`By6$nEh$tv z7c~O4)JMl@gi_!WO1JU!tAkL0EjSS+&dfvZ$2`{`9L(4+2GSYq&i;~AroP7(O}0so zFF_5$oxY_&9@SbxwWh3lwde&jR(l{x3XG;~g*Uc&^Jae_0}8C}VShxUN@`_fnq5*; zBhzGjws4zQH%wVKUTyQMd(=`{wav@dH0{pt3DjvN&^L<3>`JO8p>Wk&yM*%PsNmT# zqT)>|uBNND!gX~g7Pf?(qZFI^o}Zn@>niR@t(>H$hUJ3%P^#jNB`Nt+r%ck@C@c3@ zsGo8Sm8yfR9q6mIGUTP6q>hypzwFtjI#tC1zoOhnpN*U9vVxAvpnZ~>He9va6#KyB zcM2aQ(A@9Us)K48YSgQ3fFsi`HL3%#P3+Y4XgM71fsV;6h0f;npD>SGsrJ1^Q!|Z)H=CQ3#UXjYO!K= zJ^F8G4((O%rf$kTI}~pR)b1QEAEor5+VaTHuMa$U2n=uxR6Cq6Zb|-BEj<`nW7kSM z01tnzuA4M<3Y3BP3#;NB3nsCL4-(H@U|63-hMf?tav2P}0j+{zu+(Y9;O&h&=GZ;W zv0@>1$HR@A!skF$9|oO5Rb5)xL3#=`U9weIQ&JIS@WU|~Ft+#;8+c4gV}FM4|bVe>lACV%6$ zx>HlQ{^d39ugNG}M!c?d42v||3*Vmm9kdbB<1P-W+Spvqcg%Mh&G}i6{Zpo46Lse@t$XwN8hbH4Ak}rjOX&18>fxb4|!Pd8d z4ESQw6Y%RZ2-mY;%RE?ScSSmG4?}Ni9oi*9S3c9+W+rrDI;n5lkvat-N?G-XE`Zz_TBgs7$phx5?}#vb_?!XH$atH2nyAm9&D} z?6XgRo3^jW{%fjBvAnS;tNDxl*-{Jpg3Yj&h~8gDHe}r8>s06w8X!v#DT=efGK0sdn{1%Ltj= zlA2ns4QeXWGKH_)!XjTl-hj-HTKz4RViA!yX?XppeYE2CZeD( zqaxR}Ns*z_?90^JwrH^(ZYwBLK_AOA%YSASqM1wnH>irz}`!Xl{trZAS=$?T#85LwKX7nY4*ZY zm**|Tdyve^yIJ)D^X;nFRjzoKsopHV;%!#FIS{~d)tg(Uc$-x303cVdc-OO3bWUm3 zghWGgIPJn6t+nXHvm@$V7|bsBDOEewAJt!#s;x@Z>q^x|rRqa=?g`0~TDlqh+V9P< zwRjh10}ZA0;rUfxh3p%=Ux9%c!K8^n>5R3&X983-d2Mw3&atq&@G>pD9cng?OT^jm z5BRo%s?DJRQSWwN&=yRZ;46ni*r{cX)Jxot5})7TeqbKeEe|kWc`#LmhjuocLzOio`XUka zZUw44*+t+)11k1JURl(;ySl}@Tj~MO))p@V&Fy~Vv`h9D@4h>eof7N8h3jniCtxVw zUaeHMi_-fvn^US_7h-lp4Ze;7s<#OvdZe! zqi2+bHbB=t>`6W!kK2jw8wKx2341x2T6RUfJAF~_^C+^Og}@MKZm)u>=R+7Wp65O0 zqh+;pD_e{y94sTv4}&9)YoRpQcMd_luY;;IU_qkbmALB*Z)Dejq)6?DQe~(ckkK*+ zqd3>cUodu-9$c_)>J-nrlh~+#gK`9qT<^;ea**b!>!8#J)n7x&C9!VEND3tflco~k zp#p!@o1s)?_=4Rno-=5JX>tF-8G;A3UCSh7Fz$pdP`w9DQ}ls926M8?F%AK78YZ>O z(LyyBt&7wiln8H(UxfEm;QoRIIe!(;PWqgWR1DG?UoN z5MLN!Vnxu=c|;gOW1_k}n1oSND%U=N$Yd=K-&$rHAR<3H0^=`%TnQjJNmWutAawNk z$^+B;NG=~LF;tq0nVN%0MeHI6HSH2Db2qZJ+w9tHkUc3oPjCeWkiIKAjRl_Osd{`B zX&W5p7dl1YT`D6$QM@0jpTW&2rJH?Y$HMu|AOC|--3xD9ri|aE{-T6gi+4LL6ON2R zBWTMhaJl4|xIK>F&gSojg;edVtc)csvyoF#;6mVKt73c|ZXCxd|mg~)bmnK$Z{`tfdHs-#_N z>AtdPnJbzxJX*@wT}HRR@)kC#VHWaY;DlxkMah{CG&nH#xppbn!GWCV6rb>ux3XsND-gLo9Q#b_r{N^}w4=F&r@lV=S}niI&(3ise}s``8Rb-Ixo2UJ!9H`zKL~ z)iChF5^`<$+T?(vW-4Fhq3PXFDbxe~aPJ>EQ{tq70<4kP`*x3=#)tZ#G**v25C-Y9 zHyW0v@|i7WY^u#);nCo5v0ou6wFfa%d)gK1Lt#edXcSb#E+sY6p@lD3hN`K2!DOvV zYV^vXz5uD10*Ak=pi$OO^M%akxnByG(<03_Ya@`wiD)R49<-?+W5r<%h_8%2R}rX3 z&%tDBBbbD+S}F>-KgIx;xeRUbzC#VDTd$@^$Gd_y)|=`<5f0GGh8HDTrz3~Q1xKLf z^dQy)EX0%~67#ezPD_l_0#Yyn=(LO_T0XEe(U}xP{2=883n?}trM?R(ccboI1}Rrk zJ&&4lhX!GWQy_=V!vf>KF>%7$ z(zo=Lu6_`d*d9uHGt^Ilk}9*W=qZ&(X+#CI49xwxTIx{8%TQw)5_(muN!5k6uq(1Q zDY7PMO!x;6)-e!;I9F2ssm+mHhl*m~gU!6oo|e=Z5Ry6^vw6EZTo%)Mb+`jIrVe*0 z#Q)>sLQec^} zo64cKDmutY!z!ys9YHf`b%d-IWh2xCrx5V5v);5(K+BeXh91k=pYVlwwYnXCA^dKn z#Xe7?y{oxR+UyKAjj&S3AohZbN>yzbXt7daXV+2PmQ)AkNXBX*B0Lz)e${7J^OLtV zrDS5xv8^uM`HExc4b6R%*Ay4-ox4}qDfmV9rS2&ysFg!L5LCX37=m^Cmb#q6bs_F% zux_7EMqp>tzZAT&EBV4>*|Cr>hkD}E9!i6=!CHPdd=2w zcdK6LwkhKeLVmPTZDrp`t*38zzuRg`cN3^QAzW$R!rdy)4=Yx3QrSJ~P5m^J}<=wG{1 zBdb@+N+}br)2)=a)nQpmNmg{2-A83FM%kc?-Gmkt?{32JBm`pW<=M1VLhF(jBEDakG<-B;H~z1^;+feSr`L5_u``{wS6^?)|2_W6k5F;Gmh1Np{c@LCP; zQcJOb)P}WR#9a!Of2-Q&{Ys2--rI``z{`7gLRl5RiyVD1oW5f!4Hoe=B)?b#WQWL- z#=H7!$>7SE449>oqz;-FIZKLVs$*o>26|zifx%eFaH_NIjr+sjlF^YV!L=)w#C{|j z@@9y^;FEb@Qd0^##(suNwJ!woITx_j>yry^cZX97W@d$)SR01Ywuz=(5=>=nY#&;} z5)W3QqTUX~fHX5?e<6x6OXX7~(g_SXpGGdTg?mOz>^?Sx2xv!mc$+)unD-5J&VKj; zy0W!W0rLGM<#vcHL$$wz?o#>=x5rWx7`aOwk)dQPi+TZcVcXTGGfgH|Z9^M%ldU>g zYBLt=Ct>B2ZT=ih@(s=I(J^**<8vEEFFby&Pbd4XrZ_E_HLj4Zq2Hr(i7#OMHx-a+wV)Tg=CnfVH&pcm~t7CaR-Pu_L=X zB5ea`-@`%C*n7&{92Z;tI{f%-IXXIL0DB4(Qg}m~v+;9qJ&=u22>Ds;W#pG>p`2{} zFCX9eZ1J}sdpioaf8KG*4z>c1ht`FP5I00>WLx+G+H#R1HICG9k}CP2lj#WGJo_7( z)zS>LTgV=?#cY0d>1vzQx{F4y_?w3M z=uQE?_{+gxF1v}QXr&oc#HV&+eK2?t;_PW~uk{-0b+FOvTQJ+M#4h{BLhMF7qEEk0 ztg~?_xdsrNAGwngd>Ov&>Xz_ntctws=o}aN&hX(Q%ZK#^W``ceTDUias z>M(cYx_ua`+c1oy5<&s2yZNvHN3$Mw5?Y9sw#826!#h?V=3#9e#b~*RPFDc9ll@_Z zO)4(@dF~SU9FuT33oOZCBcz?Zg_h|1Mtp1GeOeeRb6Hs0c#WGn0CUg_M%PPT<3@;# zfXF!WHEtiss1O;MuW=nkMzP4SU$`TN7htjRR=YNkJ@lof84&@d6SPU!k{W>hB49?i1I5I^GqG^(%p`<` zeg~!-YjHRuVGceL{bFYeV`@R2Jo`cfs;iKLm;uAQL%kBC@vCY#r8|bFZ4{$sG?f(A z$uqad60iI%g6~MREU^}f52o_j zEp0E-F@<6WCeY#1s6)aWzHlSZ#_k?8|L3nN%zcXc5d=i)aO$R`GSmkq0V3UNb|qmO z)Ly~PLr_n_{S9cFl_|D7o0$Om2Q zTtc3oi$T;O>xT_I%k;wrf`-9FgU}Hn1`@zo9KRqn@X$FopDFv9dO+yKxI>jp0mA8f;}3_FQ8Y|ios zyeR?Pv6=c6;H9tQNEd>T6C)dKfkFy5D1)6zM`oIukQ95)SWoSM6K;=OcTmFO?R68e z8#Z7k&ZT+x)sq~4oC~j}Z{(x512|k|AhRH$HyA4pS=h?MH)F?y4yi@4P`;xa3-eMo z;`1sjhb*U!I>cN_*k7cWLlu50v*sMHk6KcEu|GNzaW`x0Q8T_CC23yf`hu-oC(Q+Fb!&_*h zmY1LfK6tjV{CMsH-fkP~cU0}hP#PGwvDYwUV@#)ZM@!YjM*Fh|rNV)iaA0*+hS1(Gxg|v?ni(WQa z{d-iQtg}p1gn_l*P+;Rb88pcly>U(4kqCT36xO9w1=Qx-Ke;SAEM|g;*ToGflW$+R_jKq}a zCSb(TSMoSwWz0pBGW5>;FCtvSN+SZX63wTAJ6fKf2PRm?CPY2W)yl}aL+rih^cru8 zgqtM;NfF4#aTFZ3ACAK=pp=0>w}~2%M>+=_&Sh`IEs-J+Gphvy5&9E5S0Dn9BhUHh z@Uf9a933~iSfG>3&NC3a0Ttr$HD}#13!a8kL-20Xqe1*9!lP7H(yl(?xE#geB2NYa zTG-7Yd%@p0q!m#Pg(!FHJlEF5|~0u%HYWTFmEt~OvJ$+x8S@N>lg;B z{zZCk+Rb)AbcVQzA%badSjsF%8R8chBKY+e3wRO02@I*5suTa1Af62DglF`;ZX)4k zC8(q`#BDM}H!!Zf+`wcqFb6j{Z*IoxOGB^VNpbvatN*nxwp(a@@DiGHd zd*@Gvnq;wA7RXva43ePhv#}BYuI935AY-*QTLmA4u?`|*9lW1{LNZpjVXS?h)@xu% zN4Ik{DU3C)0LM;m7QAc%y}Abc9u7g*fGoBYML>g2Ydf}9g$87?dn}NT0ZE{B!PPqE zZ$Nx%ZI%j^NTAh+6QG@Fz36XxjR7Jdvmlxjw04m#_x+unC&`war|B?}cHmF={yaEk zgI0?Ra1ptnSGa(e$akB1Epd8r1+p0sgA-Xk_S1Bou75yj)!G~t z?jV5^#W=kwI3XKSKldrUMn92ovuS8ja3Z_2mLCHr&V>3Ua6*^*Bk(Pz-9JZO$mGH= zm?#A&57+86y#P(_s{2JaVcLlc{h!opWQl~EO+=GN(EVfJ zLN*jLfeUe4mxvLjJ}f2oV{)P$GbO{j-D81#%ppP_Zn8jL2PAT?551w737pXNL4l_+_2JLta7`|J*B;l0c^1f44iWlry#?|L zAPHQ!K-f_Pe9Wd|m4L}Zqt%LOA-&0qDrTSUUmUiiTrnfMmL;o_I0$8HvMB>_8K zMC5}KF`H^&c7x6Ki z@F*A96&cuFVqh2k_wnRgp%puwZ-0j)NyMzRQpd~_$Ly&kdfsA@aI+oXo0uI3zAc4U zJ1pPk5ps#xrTcYE76~2^-(&+j?J*8?vmtTpj)T4>Td~vmHXCjy5wp;E9kX8rI)vHH z0wI}QXJGbt+hO>2?317XtS*6ZI%*O4f<)Bz1a#DfK%{DI298Q3PK>tVWT+T#%!$#8 zzvwld7YR4}E@t=_afptlp2v>>5Yvw+OXEu*3w%GQ_}HfuQk2CTyf7;+)kLXPbd@ z$6{R#E;eyKq81$ebon>%&Olk8F8j%|m;=GTzB85?XtFTd0(%QE+Kwg2WDDduKoW+6 z?$>kNbD2|DYG_fepeL90F$k+drT^1Z`aeg5{koF2l8oOZEj0oC#TH0gD-kB>__wn^9R= z0o@+J>Pc()!Vs-_Y{7o9P$C{HXk|KbuRxD!4peL`&Q!3`%#gqELAM=Z0}WboMFR3i zd!6Nf>@*F4A{vYaO**3=gU^7w(dk)6e%qu+!{%=SJr@}Cd;j@6GXzz9z=VBp3Zu646#QQ++PAYaeW>FiY#O3n`3oE$^>I+q+0*5p0`RQ-0T3h zk9Dn%YtS)Aly5@h3E1h(z7T#TaiHpNV75}Qh%h_Hz^t!<+0-~@M~pp=-mmw!VixCH z3L$4seGZWmG9BViyW>-z-4@6WKq9qSTIf<^LcHDrU&Y}#-C-_;Jz;_W8E~O-+-B~+ zipwRJJ*l$+9C1IS=Q%~f%}P;8msNZvq?4?Uo+Bp$p{}yJ8y>}+0=1LFF}d+AHld9v z@y8a(yMRP$-JBa@BJ_#{{sM=CTjo00gBExc@C0tujL|87NKh_=8{Hq&^K2sFW|yIo z&W-q5Nhg1t$c@BtLM)dgE`y~2A%h#1Ww5W|jST(BVs{I?^`)VYuv0Cj##wAVS(&+L zv&dKq!GC-4>sMGt%Xo#hNTQ zr*Ud%Nhpi$C(AUc`Tk!PYF1S0nExy=cY~VX1A5-oA|bQKP)Vnzv)?lp*^ho4zYYi` zP!qRbFA=2M?*R6Vz#B{L6oXwP@P@Sbc)I@zjw4h@XFc$K`HyBJS=AW~oDcm$$N49bkeMfr^KtOv2Viyv&XzFX zQ#c^Y7<1Zaj)}~^7u+LHKFvU?!a#G;7bZuK19p?F*y$X758fbgjEP*SV^$u=Y{UI} z-Wwv}X1`)*S=Z4cjxqM5UQbyA=Rcdrng0*jP3T{}i1x25l+*D8Mfx>#W)41aWD%#xXAfqV3`7ZU zN3?X~**H~s@NE3N>7P-ci1WK2@$c;{1ISp;@BL3E_8DxslODB@d7Ij@`ZLlNp+_%R zAWv|J(4#+EAPWE~LlanRZ9a!HIF~)Fa}^BkL6p!wT9Qb(SrIDeQs+*Uq<(M1f0X*s zo666y%1$KiCPOtz-0^9g#J4SwHGm|j@C9eIol~gvx1e5@PW09y^#3sCorg4axEnC2)k;ncf64~tQPfT;^ z9EX~2_vlB(=inv`UCI>)P>KYRJW9)AzejhVPu7o_EX?Eh$m|hSs0lR2AyAW9vPihu zFjUet<~Vq{w5~WlO5V*}6Nr6m!Ex1jI*vaHd}v$`D0<#hk#MucsPx}(JbIfX*J|)l zAHMhyVA^B}x-;C)#pF6n$aw;LWAI%fu+L?e=xhb{&(7!A=dz_D;bvcaWMY5B*y!l7 ze-h^33HwVeI4bDQz`lljg^B$wfCx!&_xOx~{T!X)z`pGs9s93D!p-^~SM0xq;dH`& zt_8<;K8$03jRo=&hX|Lyg#4XJ*F%8B>GJ!T85BJxWI(?11cS0}24y9vmgxBP16FiS z851_{EBE7fC|Sk$$o9j;2OyD)Kl-M#VfpxW;E$hZVvf$F<+G(0G}}LjlXi~<@-c@9 z(r&UqUgr=I6+K60Y!dxf4iQmNfu+uT4iQmN9}DDW4iP7csw}OI10;ck6|8lDt_YI_ zyNHEb8uh#lBH?CsRGX^vFuszK$A4RVEIix@JF=)pKC|Na{I)m`M_4HM1BVD6&LeX) zIaLEloVE%->uJzdkKhh+CE9+(h>v70`%Wa>EEm-b+Tybdh|mv}%-E#*E)Eg; zak8aOfJ20SXqGx-I7H~j5DR1wAPGFIV4Kd-`88PR0`c(0h@SV9NVwVVt#Ka4_2ZaV z+MaNLZFRFh6>oO>cFRJf_S(&RE%gF%E@$Uvz~|%O4;H%Qg`| z!`UB4)IH76>p}bgCsx>bXV{iW79`8;mwCJeH_J!MhQ7z6m18IEAdJf-P3&1Vo7Ovk z{gZ6ZBHKzDnDr-gCr+!=LgfV(SRG(O$9TXq`~sba^92vdXZ>2I=j{~*$d9sx%h9vMdIw$0wI}AFfe=Yo&V0+qnG*QM9hT1v#rkM z5fLB)gE&_2)asb76$v+!;#eIAerdLQw!Kf1XHC{+kW~+7afnNg+%yJFPs^9+a z{5pEeACQ2Vu8EE0L`|!9p}V*yK52pN+hoziMMB=W?2wK$@V^y<3XebnBH?CFq0)bw z_8h&uZ-miypf`9nr>*9h+7p#;lp)AJ2~{E=@sHbdW<4tsZpPLh z2D4+=uNR;+T~XTz>q|uKg(4k|yMS6(yU2X2i;n#=Td%Q4B;4!*Al}(73~B%0b?i*S zkm5Y9WBoAoG^v0b=Ni4gw$9{MSIz!E>e#=@A(}ci2Q9~krF3$jCaelDQ^)RxlQnQ7 z9orS=oN=?$>vPyn0>8e#Oy^DSI9AFmJ+EFQ+-!C8Vfc0I zo+1L@*p*>_0cME|3!JH=F#)3N>M3H)T|C9snR<;Dk#MsVAl}(i=y>Pw^}}Xb5#n1c z6?}GxN6U}K@GKUHFg&n#py>wQdVrZjZeF+60qn&$6D^q!0VeE^fT1Kmp)tV67WC)1 zy4meuyk)G-p`VNOG^sOxIJEaxy+*4@)$P~-`=oD zW#Jh*k9R}$yGrG@)dqE@R3^{RYm|#bF1sI13Z08f<(PfT1ZYQBq0EApNEAwbKV2w3 zT{Yla*4?7#y(SWF*73S&#YgllM?c$I4fz|G>1;oVe26)8{T1EC*?x%yb~j)sX>8Nf z^yRqX6+eQBGVo6pXy>wDZstI&f5q`XqSrop{0~9G2L5q%Kbbt8*Hu|vkmqc$BOoNN z;9zseKbw?oTt$U4c$r-YQ$?BamNHN9GHzam-smpM478M~=Vh{ZnTO3XJuPJ>^D@~e z6RHtyd{184#APst=Ma2?fWK>jXK{Eg!SeRnM2qbHY6FBl4>dQ880Iw8JE)amNKvKG9*buN+lNfgB;GKs7vWA3w$<* zb1CXlO0&TI9L}YvOX*v(bd%PL0Z)+9(t)}}iiAW+O8>Y)&wExR5dUMhT$fVLk)(9= zYXpCX>2fKRmEkAVj}+>?4HmuO;GWU#t>~5}wMRMucJy5qTDrW>=yFq#_bsz#k#Ms^ zEB|wsNAEQ@!Yi4&XiomWf|2Rl0S@*gIWAK&kD_bi1et1q+y#jBDDe#z_%$4!c$D}` z3w$`>2{M286rJOvb&f;kZ~jitdqpJNY~L%U%sU??J_gHt4Nk!1hOo>!SRGAR$dmk; ze1yq~KcH)4Ienf5QUge&7B>#yh`HD)yV?Suz~MM_jpcZ;UpCAF&j&n#6YEaasUEH? z0ywcEpyxd=68Qbs3X>D@%@i?CAH$*DWiT{@6BrHk_4#*TmbzXHU{SI~eLuy)8qhtS zV9k8mS#%o553W-e8F024sCHb>fik-|j&tYO;uvr~cw++2LVC@xO(8w({{S4v_rv8D zd>3Zv_3O?FLT3Hq_;!x!j)BJvCS&4j@;DhNn>@bBg7fPyTX6ox;PD2*Pr|vtz&X#r`DRqo z_2M}2cu*qFg2x>&6hn{SATMC@*kQ%@3IpHXaeS5OI*;o`0-G2wnfM+D9yh?myYl!k zpltH^YVram&J)mmf?lLwq~mvu;3x6;qiglN%_1SQ?s1%t1CO`DWK5g|j~{?_89aW8 zEXu_9>17strwr0@ds*<4@a=Eln`PiT5tWXgugFfs*VN-epltH^H?k@d=Y20)aQ@h( z<9tZqM>yYljh+_}37I{GN=MM+V;D_u1VSc{#qq(n1djU7wGZ9JXH;KXV1ob?(r~ad zERa(KWyW0Vpp#RP%W`zigR+ON*7NQY2{+sPcayT?pz(izaV1cukB%?E6isQ|LiT4$ zqZ-{OXndQ%+0AAM&XY90nx;$RGm(&)JC1W_jXwryd=BGEz?oj2bcw)Gm&V!`5~WdL zfjtG7A&o_3rDha#FCc3sV~Z zB1<);vHf|AG#u$V=fBhu1UpC@LS_q4>G;`(4+wRV#xnv(T^fVXUEDS{SzvC! z3~8iUAcvl_NaMnuoQhl~>pBI>?wF$I%@heYUgBj^b{uSDHq0=AGF=+?!)Q%ul#`{J z(zrt4Y($QO1kP?YPH>)Vqoqoh#%hs}*}-Q`oR5QTtc4jS;7qo0s=!f~##87nE{#G9 zYyn_~H0F>!o3=3nkObS9=+HTTyWl+8#`lx;yxk(mI*UYtG-$Y$GOGLuW8quU!3qB5q zE6KHXV%opR=1tb*p*MqReJqgPR?>d|i>|eQsnjuEBoc1+!BdF`ED!gKs-s^l`7`X+ zMA-OA%H3qlCd#$wPW&Xr!EUrbuH_KEN6*GuAeVE9SYpVxKrSGNzW8vu1(FGfun%sw z{rBp!T?o2a>0`;M8eJ1K55#nET~cW)!+XcYwDp>CToPB$+RFm9o-tF zl#_2US#|{=38egxtYbV*h>*NwONE}dS|r@;;1dZ{;BEG9kG5KV9X~bmvpJ7)MOKC! z#81y~vBMBM@|7VHK3h^k$fMT`D?_sJ%znlNDvix^x@}0I_axh5-CI(qRt^@g)t)!v z-N>u!ciCNUK8?I5@lU-dfIM7^j_auCMrO^IC5lBh*bDc}WK)}{?J4V)QdPewjn`Pm zPE>p21?Jsx9og6{4x{qzGh5XyQ>U~Z!h4D774BX+P>-`B0eY#lPnESYNBn1iq8CrI z(PrVESr@89alJ`jAc0Fznrpn2aO0llt?Vf*^CQQTh}t$}^iz9I2VU$K-1C6P69EUd zco}pz?V^z{;EluY7hEy)Lz^29z1EBh?I5rV z2%(cEJgZw9w}n&H%q4hxGVbHiZq2}Ti>GL}x_tO{`^q$27uKP+qjlbL9ujCGRRxk| zaNYZG=ONYPtNr?t?tkFEWH5aoR0d4#4;gcLSQLY}-$UnqGVCCM&GXutAujXY%ntgo zrLt(kA*lC{%8JSOh5{*XOhck^o3r61ynFk#U0^s{&ZX#Ve2lI;XrzL^z(FpT^1xP8 zF1QMK{%t6sHd2$ZS z@5ar)f#+(KgRZn5KzfxTLRHczpU>`MvQcsY>z?XU(cvji zRzEp}FrA&YI)$9-1iEjw3A0b>+_k~I`)7$x4& z-NtzHZ;#dKppQFV85|+s8%yDy8y7**<-+@B2~P7V#k@ARh133uXk!~1^X&IU8yU5_ zf6L|HL{lpe%IDV}$yu$q~i_v_dI zL?)YYBVSTDOTXJA1NXoc4wtdNGR#pp+!4kd%|+`x%{1>NnTBy(LawGs^{sSsun`!H{3x#(+@O(C)#Zetpafv?n=M~3!uG?#@W(? zicPP%Uex5*G@Jwu?jm@tgWqL`akUq}2(H!x@IkNJvBOl?pHYl*Er0wYbUC+76>{JI?4sRh^9;TP(DIE-fGg9n-7dUB$%uA6h^ z{(0|7FeqTSuE_>d#XS;`41yU?vv@TFT`2N2_-dpm!J%#PH7pQ64pk?fmThSzLRbv-JleIi{ z7M@YCxU#T)?nlU8M1ce@&s;|rf`d!waY@uY z$i!DY|C-V|8sDe^v~i(rv0Q{pW!WbW@gN$Ufl9`PE2#hk?EryR>i#5Y^;`s`o=tw-tS)Z4od|7BxF~1|aKLmz#Toi`b`mQ1=`!1R*^Y#=A&xIz zb)KAsz1h3R*}>7v-@sI!u5jl@mX2vX>Qyxb&B(m=1Ke}N%JZNP#HQaQtOgJeX(Z@ z;m}+N^7#%8(y#sc@6|f)OriGRw=3{PSC`<{pA=wHN$!A7pjJ7*=0*k=qQWuu+Cp61c<%dX?9PEusN`)?$Ec|NGLppDGFArK zF#gGsWE)ENJINRY)bwg4V-)m<*hyCk=}I&`F-~w0=HQOveY8p(qamocCOW1YCm;6e!+h z)YO^C@obu3^%~s`y-pdrAd@B{^T)rcc$d#FT~%Gs$Jwx#2FD>ZNY(#>TLb?EuEBiD z0}pJ62fdi>g_82iQHK_$hA+i^%Afd@)WnZK5enj^50?|JKK>LfeVSd%RnFP)IGW$! zea*I@bd{PKJZoZgp(}iG!=`ZR2Jb3cY_?DPBzRV3b)g(enP0UkmQ5W5ZMd-HX*AhK zZv$&666&K?v6`xuE_be!A{}>x?ZcGP<&losaNgxegwLt3ea#lm3Dg50wkpc8p)_Ih z5ynqqNG4hWJAg@loGp{XJ*ofxmAE_`4{p&hds;8dz>3!A@u9wtcU;hzuXvYGD@~NQ z@!a(H4@3_1asK|Vcr4Q{j(T4YX8YJ{;De8iqc{#1M6J(=G~3l*74H)T6Xd!q6+el2 zy-XX_1P{(bKGpj~s9Q;4jXZaEWQ!Kjw9u3aboR?ZxVn5;JuJN)ic#sSATrW9W}&fa z?UI6_p>(?4ngpk$7Pf@<3Lz2$i5zz*OZ6@X*A|R_wY47@xr)bbS*yB9N%gplwe(Td zyG*HChP#4s-RCmy6SVL$EpsvSqkIE)7aHw2A9%#X{&_E%J^zd%dUW2aOXZVBP4 zuf&kE4N+*jxm)4h_JaA2Aa#$NX+>C6TGgHI#pf6$Nem6>0B5QuERqwzdUUV`*8tR zOG-WRo(Dxi`EdeIsD8WwUrllmCXXjpKYlOe1$$LL{s1LfQs(1p8H%^0EJSKKPd$uO z6H?WWKZ=xRzc%P6Y84@*(3Md4;>aQUOoovyy;^nrL>1k@RB3F-gL)v^c<>8E&2Q|+lTTT^4_}C#@ySMjbZGkg%i(bl zGb1Y+rLs%{-yrzzO{7Mx=Kzc${U31KqAj`>DNV226F}!m-c^Lj&W7j6PqA*!2J8t- zqeh7d(Rn{zhEk2V-A-@8$D{?&_egV+XOr`ZH8#(-5&b%4etZBBi2nkL|SltUvgVOGSV@wKDx+B=qJv8!9k%fI75-qFr`e}A5^E8Q(`TNRnL!~T#|*6}2h*p5c>oo* zI~!gGNjg1rmrv_o>6usep&`t3hya+|jfn9{Ku-fMnpYaBdCZ9L8MOO?_Es#NnoNCe zKJ0gU<^FZHQ1>SC1g$u_B|YNVbnaS(vrlb*|4`v3=RG*3A>qDu=RMd5kmel{EcWXt zoePxIM$Y0*U@^y9;m^>Clf*Ly&%fx!fBYFncE7*O#~!^0KSbXYS?^E}H14STo!auq zxoe#(AE+g2-tS1}P3T&=Hqwzd_smE~L0wj)qli9=>v~3-AB%LP+~%zRt|I2B|L&4l zTK#ut1XdTwxAt17gnCTQRT|E?aQE4DZ5Gvf1Ue~U=1cigmW;ttdk5n1j+@x z|4@OB_FzJLfX-@mD^Rc0BQ%5mK^uhO*F3r?JK(6h!47_d#>Y-pxjkts$l#FKflREU z(FNV52d7SK=Y`e6xo%UauVWW3`}Ao z!9!#(O(t?89gdJY($PEQh;;M|rA0b?Ay>>5pdc)k&f}|CTGhG$$(k*J-ci*ido~=z zi{la?2rAevuMC+(13)vpce_h8^(RDe=b_oV*nm%qdN@x5HSxSE@lrAdneTo zc>-gm6wb4Db7CNiHZO#tJ-!4*Vkt}MYeNc^x9Lxyj8tT{o%H%*#3emMB9l7j%G|h# zX5pLWZQ`@=HDWyks3_qMb{|EA>7H%QmA2}_t;Pu2AHu|)>$P(5tVsw|stdO}8<#*J zh~sH&!nLib6dcc1@#PNVwql-5>1#z+H$4j@QmRk!!r-VLT#dS2Iep$5DI2SFRr344 zM$2u{jEchdoss9zJe+VQe(`XG!A@X3yh~bD9lJB z$%$|?R*k#sy_m4ckptc4V(jc*cU9y-&(IZ-1KA<3j?s~En04-d>p%P$?-6>G!Xu5T zlX&c9?AkX??*~8j?Nx>!Tdy?aOhZ;VVpH59@8~-@Cj)*HKhlH6r=ih}!unrY=VKxVFaPmZchdFJ+(|ZF4u{Zbec}U|p6s%zH|H7x`XVOiA zbPkn}6=}Y5Fp9`i-vLVF2(JkesPyR#;@5s7b0+xMWk1pF(OBvj zjT;t5=ZwSO1QN|aG(yj<&!TsnO_##g<8_2NQfM01+(zf*2U6in{kY1W?qL{-zft%b z&AM~OIvd|7oG0hx>%I99N;_byFywBLjwELzwjf{%p&rQR?h$M!-k^=aMA+LDfnl9a z2$CiJD1?V~8L7bQ3e~B&_6%6K#e~Jr{)h+^ZJ)z;Fe>OxXgTaok=Gkj4=!Rqo2WN~ z9|~~xeF8ZP$&H|{boRYU&>-zMXA{>?hvJArr=w8op8@6U$P|4M2Y7dM&l*C?qzPbh zE^tX}@n(=R2ek?`70_3%d)Lz(bs6FuOi)Rm%1s>J)UkRGK+)j~$O+y-LJb#Juxsit z5a5-Ul@#F84+UTY8F(dR1-qK&tkB6h-3c>i1Ab|y8^}+lZc z1OzX#*fk`+WymULC8()xMBI)S4?y5Fr{ZJK^c*+gmE3IuPG&M+d?>ke>Il{YlR8j2zYEDIPru4?Fi+RV;6rTdjQWMIUnP8s2AGG z7v#iJR@1Z$n7c{z@WVu;dT-8+{lHL6$R~L=v!xToNbaIblGSt!N0E+hb5DtMbg%0k z>F9~=iH_`W4}JVmQe!*$2;Jn!hQ|$GVR+oPXcgWoN1p8X0#O5E$O8zTku38eVCwa~ zpu{;pjdY-q0AN@e1{P<-HzW`}ti){bQ<_q6PqrBVKIz@{DQ%J-L?uv=F!fEJ`K4z^ zEKSY&X*Wuc4}Jhu;!WLWHZ>3V#Qj3vN_YmX)~Z{AQm7CCo|>jK?nC3EV!2OTAWMpS zA*KreP|2XAq?rZo0lQ;)P;wnBHX9jSRHuU473BWY_^|10JVQfKA%;nqb)YqUMP&m; z{}d_rtrYy{VG6di;J?kt5iE6-tEX*;)aZpQn5gd~74c%bwjBvib8wo^uSDCBMr_GH zJMc-fRBZ6MgGrc_h_r(}@g3pV`WaY(-5)Bof*QjR@F6J$=nZ#gccM`1vnYZ^?98o{ zza8em=xH-A6&+(Md~a5FzE9U0LBaUKsk4#R#`wzP<4DXqAc2(G>DZqpoS4=MPS6|? z511q3Gx7#~N}-o&K8BRP9DGj31`hRvMHgqojldG>0+{F$$qD9z_KWwr=5Hty>Y?{M7d=z(0fnd8*0Ksi;l*t0k9);rXkOds?uooF$IEXTn=la3 zb_1=GsGli|m*ZJ!e4T$b^UwA8#2x5#A_pt-r^Zf1K!_lmD*D()2ECds(?Of?w`y86 zO4()V7R{F-l)RV>f*)HEar>LJtXKiD8C$^JSqyEoW+5Akdin-1PQgpTv&0@FV(-Sy zXmyfvRnL=dgJP(l9*CO08Dh$U{`8=gi!ua#CnvLk8L>!oKMg zN@06Q7R|-(2=<#IlGVzJoltPxrCO6D#b>_MDG2=>pg?bk+Q%yHpxu@X@-<>-_=aes zs5uxlE31{|UV7A<7(%M~CToO1@bR zUO$n20W~uYF|`dY=eqEzQnjyw7LsVUAL4qN_Ofebm|aG&`-EyGwWV0L!})reTQgBY zy~+_Cropp1?@7j^meaVpNpb~yOi;I=EPDmN#c;lYpt@L&y&Fu{b5F*vdMRgBFh$R) zxzHy4bBY{$CMfGU+fWnRX{sCBjCO4J=ajQ8vuW8Wxf$M)*8cgPcS95^gF$&SV7NpH zr&fS(1sWIbsC7JS%CjSKASG;9)39E4Ad;&bay>VMz z87={@>L^y#50 zu|Ir8_%$*z@4;8=v3F9fj7mbfrO57rf@opPCMWCN(?J+qxsL4?WKKgS^@`~SI=&1Y z{~An!7nUZXw=}e_jm(qpT#g51r7Vj$2>md8wipR&ITW z5rW8zHBt5MI4qW?N+h~S$JyZ_(bDZo75?vP@$QBQC3eLHP?XYrQSWxY4|$kXHJeW=_{g*e+46uaKkP$&(}|EIz&QdSBOf35g6u&y7T^W$)?nM zb4G$N+TBA?HM-0gW8g;)cO>=bkG_8oljjtgcX}*r=7{2Odmbc)m&F5FJ9gG@nFGd_ zI*?=cW51do-{1sYg^(Euy#Gfe+^petiXP(U7Py!Q|G1b)XhKYbaGGuJ&7h6m-)o2n zFJPhfv*;rFPxpHd00G1&V35UH@DP_kZ=eyU%@D+sYdC#w_7LXXoPhg8LS~!iaFHc) z|JhI?_lfyit}=YSVE(+e>1I&HR|fE;mge%%%=r28P~wP%B(_vTE)4AaMwL9QQ9 z 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

Z!R8+fKHqDJn~m+| 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

}@;)3yf3g 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 Yw5r#vfF;C@n-gB#juSGrQl{tr4}0MjTmS$7 literal 0 HcmV?d00001 diff --git a/jna_autoit/src/main/resources/AutoItX3_x64.dll b/jna_autoit/src/main/resources/AutoItX3_x64.dll new file mode 100755 index 0000000000000000000000000000000000000000..437d74cd80d8e3e3bb8f76e28a4a634b6942558b GIT binary patch literal 524472 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

cc~-#2I|F=U{hW#CkqYW^ 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 literal 0 HcmV?d00001 From aff89bcb493b173dc56d957414577f6559b9b24f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 28 Feb 2024 01:48:00 +0100 Subject: [PATCH 078/171] removed the file --- utils/install.pptx | Bin 114514 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 utils/install.pptx diff --git a/utils/install.pptx b/utils/install.pptx deleted file mode 100644 index 06cb0f3e04f456d6e0e04587d14cca55b73821b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114514 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

cc~-#2I|F=U{hW#CkqYW^ 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 From a9086a074613095f5ca8950114022137123a553d Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 5 Mar 2024 00:20:07 +0100 Subject: [PATCH 079/171] intermediate revision - bumped commons-compress version per dependabot and fixed the java version in the "pom.xml" in yaml_config_extend --- driver-binary-downloader-maven-plugin/pom.xml | 2 +- yaml_config_extend/pom.xml | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/driver-binary-downloader-maven-plugin/pom.xml b/driver-binary-downloader-maven-plugin/pom.xml index cf024a948..386ff4358 100644 --- a/driver-binary-downloader-maven-plugin/pom.xml +++ b/driver-binary-downloader-maven-plugin/pom.xml @@ -67,7 +67,7 @@ org.apache.commons commons-compress - 1.19 + 1.26.0 org.slf4j diff --git a/yaml_config_extend/pom.xml b/yaml_config_extend/pom.xml index f00fd4eca..80c63226e 100644 --- a/yaml_config_extend/pom.xml +++ b/yaml_config_extend/pom.xml @@ -7,7 +7,9 @@ yamlconfig_extend serialize application configuration in YAML file and support classpath-style dotted notation. + 1.8 1.3 + 3.6.1 4.13.1 2.0 1.0.1 @@ -36,4 +38,29 @@ test + + src/main/java + src/test/java + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + + From c2905cd5629a63aaa2410f67ce7dad7891af5580 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 10 Mar 2024 23:48:24 -0400 Subject: [PATCH 080/171] bumped the dependency version of guava per dependabot, removed few unused dependencies, TODDO - replace assertj with hamster in assertions --- javagrok/pom.xml | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/javagrok/pom.xml b/javagrok/pom.xml index b25078d96..764ce3abe 100644 --- a/javagrok/pom.xml +++ b/javagrok/pom.xml @@ -3,21 +3,19 @@ 4.0.0 example javagrok - 0.2.0-SNAPSHOT + 0.3.0-SNAPSHOT jar UTF-8 - 0.8.0-SNAPSHOT - 2.0 4.2 1.3 2.7 3.3.1 2.8.9 - 24.0-jre + 29.0-jre 3.9.1 1.3 1.8 @@ -34,25 +32,6 @@ 2.0 - - example - commandline-parser - ${commandline-parser.version} - - - com.google.guava - guava - - - org.json - json - - - com.google.code.gson - gson - - - org.assertj assertj-core @@ -90,12 +69,7 @@ guava ${guava.version} - - commons-configuration - commons-configuration - ${commons-configuration.version} - - + org.apache.commons commons-collections4 ${commons-collections4.version} From 97cdb83e456d21c90821f6c06322fb24845e5dea Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 10 Mar 2024 23:55:10 -0400 Subject: [PATCH 081/171] bumped commons-io dependency version per dependabot --- authenticate_using/pom.xml | 4 ++-- protractor/test_examples/maven/junit/pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/authenticate_using/pom.xml b/authenticate_using/pom.xml index 85109ae98..d27681683 100644 --- a/authenticate_using/pom.xml +++ b/authenticate_using/pom.xml @@ -11,7 +11,7 @@ UTF-8 4.13.1 - 2.53.0 + 2.17.13.0 2.0.2 1.7 @@ -54,7 +54,7 @@ commons-io commons-io - 2.4 + 2.7 org.apache.commons diff --git a/protractor/test_examples/maven/junit/pom.xml b/protractor/test_examples/maven/junit/pom.xml index 536bdc6eb..0594c480e 100644 --- a/protractor/test_examples/maven/junit/pom.xml +++ b/protractor/test_examples/maven/junit/pom.xml @@ -27,7 +27,7 @@ commons-io commons-io - 2.4 + 2.7 org.apache.commons From 51be4275dae78f76da5fe309ed46691caaa74a1b Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 19 Mar 2024 00:32:44 +0100 Subject: [PATCH 082/171] intermediate revision - late submission of the "webfolderio/ui4j" mirror which was not added earlier --- ui4j_test/README.md | 7 + ui4j_test/pom.xml | 148 + .../com/mycompany/app/EscapeXPathTest.java | 409 +++ .../mycompany/app/JqueryBarRatingTest.java | 373 ++ .../com/mycompany/app/PlunkerTest.java | 301 ++ .../alttest/com/mycompany/app/SuvianTest.java | 3101 +++++++++++++++++ .../com/mycompany/app/TripAdvisorTest.java | 767 ++++ .../mycompany/app/HubConfigurator.java.txt | 64 + .../main/java/com/mycompany/app/JSWaiter.java | 142 + .../com/mycompany/app/fireFoxBrowseStart.java | 196 ++ .../resources/chrome_automation_extension.png | Bin 0 -> 629 bytes ui4j_test/src/main/resources/chropath.png | Bin 0 -> 738 bytes .../com/mycompany/app/EscapeXPathTest.java | 385 ++ .../mycompany/app/JqueryBarRatingTest.java | 321 ++ .../java/com/mycompany/app/PlunkerTest.java | 493 +++ .../com/mycompany/app/Select2WrapperTest.java | 662 ++++ .../java/com/mycompany/app/SuvianTest.java | 3099 ++++++++++++++++ .../com/mycompany/app/TripAdvisorTest.java | 768 ++++ .../resources/cssSelectorOfElement.js | 32 + .../cssSelectorOfElementAlternative.js | 32 + ui4j_test/src/test.BAK/resources/dnd.js | 54 + ui4j_test/src/test.BAK/resources/getStyle.js | 36 + ui4j_test/src/test.BAK/resources/getText.js | 31 + ui4j_test/src/test.BAK/resources/highlight.js | 30 + .../src/test.BAK/resources/simulateClick.js | 105 + .../test.BAK/resources/simulateDragDrop.js | 72 + .../test.BAK/resources/simulateDragDrop2.js | 19 + .../simulateRightMouseButtonClick.js | 13 + ui4j_test/src/test.BAK/resources/test.htm | 58 + .../src/test.BAK/resources/xpathOfElement.js | 28 + .../test/java/com/mycompany/app/BaseTest.java | 416 +++ .../app/ChromeExtensionSikuliTest.java | 93 + .../com/mycompany/app/DatePickerTest.java | 138 + .../app/DragAndDropKendoUIGridTest.java | 151 + .../com/mycompany/app/EscapeXPathTest.java | 372 ++ .../java/com/mycompany/app/GmailTest.java | 398 +++ .../mycompany/app/JqueryBarRatingTest.java | 373 ++ .../com/mycompany/app/JqueryScrollTest.java | 225 ++ .../mycompany/app/LabelInputFinderTest.java | 158 + .../java/com/mycompany/app/PlunkerTest.java | 402 +++ .../com/mycompany/app/Select2WrapperTest.java | 641 ++++ .../java/com/mycompany/app/SessionTest.java | 221 ++ .../java/com/mycompany/app/SuvianTest.java | 2949 ++++++++++++++++ .../com/mycompany/app/TripAdvisorTest.java | 766 ++++ .../app/XMLHttpRequestAsyncTest.java | 658 ++++ .../test/resources/cssSelectorOfElement.js | 32 + .../cssSelectorOfElementAlternative.js | 32 + ui4j_test/src/test/resources/dnd.js | 54 + ui4j_test/src/test/resources/getStyle.js | 36 + ui4j_test/src/test/resources/getText.js | 31 + ui4j_test/src/test/resources/highlight.js | 30 + ui4j_test/src/test/resources/simulateClick.js | 105 + .../src/test/resources/simulateDragDrop.js | 72 + .../src/test/resources/simulateDragDrop2.js | 19 + .../simulateRightMouseButtonClick.js | 13 + ui4j_test/src/test/resources/test.htm | 58 + .../src/test/resources/xpathOfElement.js | 28 + 57 files changed, 20217 insertions(+) create mode 100644 ui4j_test/README.md create mode 100644 ui4j_test/pom.xml create mode 100644 ui4j_test/src/alttest/com/mycompany/app/EscapeXPathTest.java create mode 100644 ui4j_test/src/alttest/com/mycompany/app/JqueryBarRatingTest.java create mode 100644 ui4j_test/src/alttest/com/mycompany/app/PlunkerTest.java create mode 100644 ui4j_test/src/alttest/com/mycompany/app/SuvianTest.java create mode 100644 ui4j_test/src/alttest/com/mycompany/app/TripAdvisorTest.java create mode 100644 ui4j_test/src/main/java/com/mycompany/app/HubConfigurator.java.txt create mode 100644 ui4j_test/src/main/java/com/mycompany/app/JSWaiter.java create mode 100644 ui4j_test/src/main/java/com/mycompany/app/fireFoxBrowseStart.java create mode 100644 ui4j_test/src/main/resources/chrome_automation_extension.png create mode 100644 ui4j_test/src/main/resources/chropath.png create mode 100644 ui4j_test/src/test.BAK/java/com/mycompany/app/EscapeXPathTest.java create mode 100644 ui4j_test/src/test.BAK/java/com/mycompany/app/JqueryBarRatingTest.java create mode 100644 ui4j_test/src/test.BAK/java/com/mycompany/app/PlunkerTest.java create mode 100644 ui4j_test/src/test.BAK/java/com/mycompany/app/Select2WrapperTest.java create mode 100644 ui4j_test/src/test.BAK/java/com/mycompany/app/SuvianTest.java create mode 100644 ui4j_test/src/test.BAK/java/com/mycompany/app/TripAdvisorTest.java create mode 100644 ui4j_test/src/test.BAK/resources/cssSelectorOfElement.js create mode 100644 ui4j_test/src/test.BAK/resources/cssSelectorOfElementAlternative.js create mode 100644 ui4j_test/src/test.BAK/resources/dnd.js create mode 100644 ui4j_test/src/test.BAK/resources/getStyle.js create mode 100644 ui4j_test/src/test.BAK/resources/getText.js create mode 100644 ui4j_test/src/test.BAK/resources/highlight.js create mode 100644 ui4j_test/src/test.BAK/resources/simulateClick.js create mode 100644 ui4j_test/src/test.BAK/resources/simulateDragDrop.js create mode 100644 ui4j_test/src/test.BAK/resources/simulateDragDrop2.js create mode 100644 ui4j_test/src/test.BAK/resources/simulateRightMouseButtonClick.js create mode 100644 ui4j_test/src/test.BAK/resources/test.htm create mode 100644 ui4j_test/src/test.BAK/resources/xpathOfElement.js create mode 100644 ui4j_test/src/test/java/com/mycompany/app/BaseTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/ChromeExtensionSikuliTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/DatePickerTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/DragAndDropKendoUIGridTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/EscapeXPathTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/GmailTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/JqueryBarRatingTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/JqueryScrollTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/LabelInputFinderTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/PlunkerTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/Select2WrapperTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/SessionTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/SuvianTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/TripAdvisorTest.java create mode 100644 ui4j_test/src/test/java/com/mycompany/app/XMLHttpRequestAsyncTest.java create mode 100644 ui4j_test/src/test/resources/cssSelectorOfElement.js create mode 100644 ui4j_test/src/test/resources/cssSelectorOfElementAlternative.js create mode 100644 ui4j_test/src/test/resources/dnd.js create mode 100644 ui4j_test/src/test/resources/getStyle.js create mode 100644 ui4j_test/src/test/resources/getText.js create mode 100644 ui4j_test/src/test/resources/highlight.js create mode 100644 ui4j_test/src/test/resources/simulateClick.js create mode 100644 ui4j_test/src/test/resources/simulateDragDrop.js create mode 100644 ui4j_test/src/test/resources/simulateDragDrop2.js create mode 100644 ui4j_test/src/test/resources/simulateRightMouseButtonClick.js create mode 100644 ui4j_test/src/test/resources/test.htm create mode 100644 ui4j_test/src/test/resources/xpathOfElement.js diff --git a/ui4j_test/README.md b/ui4j_test/README.md new file mode 100644 index 000000000..38175a3cd --- /dev/null +++ b/ui4j_test/README.md @@ -0,0 +1,7 @@ +### Info +The project practices is a mirror of [webfolderio/ui4j](https://github.com/webfolderio/ui4j) Selenium alternative using + * [http://suvian.in/selenium](http://suvian.in/selenium) + * [http://www.way2automation.com](http://www.way2automation.com) + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/ui4j_test/pom.xml b/ui4j_test/pom.xml new file mode 100644 index 000000000..7a6944579 --- /dev/null +++ b/ui4j_test/pom.xml @@ -0,0 +1,148 @@ + + + 4.0.0 + sample + cdp4j_test + jar + 1.3-SNAPSHOT + app + http://maven.apache.org + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + UTF-8 + UTF-8 + 1.3 + 2.7 + 3.0.1 + 1.8 + 4.12 + 2.17.1 + 3.6.0 + 1.8 + 1.8 + 6.9.10 + 2.20 + 2.1.5 + + + + io.webfolder + cdp4j + ${cdp4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + junit + junit + ${junit.version} + + + org.json + json + 20080701 + + + org.testng + testng + ${testng.version} + + + junit + junit + + + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + -Xlint:-processing + true + true + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + false + + true + + + + unit-tests + test + + test + + + false + + ${browser.name} + + + + + + + + diff --git a/ui4j_test/src/alttest/com/mycompany/app/EscapeXPathTest.java b/ui4j_test/src/alttest/com/mycompany/app/EscapeXPathTest.java new file mode 100644 index 000000000..b82e981b1 --- /dev/null +++ b/ui4j_test/src/alttest/com/mycompany/app/EscapeXPathTest.java @@ -0,0 +1,409 @@ +package com.mycompany.app; + +import java.io.IOException; +import java.io.InputStream; +import java.io.IOException; + +import java.lang.RuntimeException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.concurrent.TimeUnit; +import java.util.Enumeration; +import java.util.Formatter; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import static java.lang.Boolean.*; +import static java.lang.Float.*; +import java.lang.Float; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.testng.internal.Nullable; +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class EscapeXPathTest { + + private static WebDriver driver; + public static WebDriverWait wait; + public static Actions actions; + private static long implicit_wait_interval = 3; + private static int flexible_wait_interval = 5; + private static long wait_polling_interval = 500; + private static long highlight_interval = 100; + + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final Logger log = LogManager.getLogger(EscapeXPathTest.class); + + private static Pattern pattern; + private static Matcher matcher; + + @BeforeSuite + @SuppressWarnings("deprecation") + public static void setUp() { + System.setProperty("webdriver.gecko.driver", + new File("c:/java/selenium/geckodriver.exe").getAbsolutePath()); + System.setProperty("webdriver.firefox.bin", + new File("c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + wait = new WebDriverWait(driver, flexible_wait_interval); + wait.pollingEvery(wait_polling_interval, TimeUnit.MILLISECONDS); + driver.manage().timeouts().implicitlyWait(implicit_wait_interval, + TimeUnit.SECONDS); + } + + @AfterSuite + public static void tearDown() throws Exception { + driver.close(); + driver.quit(); + if (verificationErrors.length() != 0) { + throw new Exception(verificationErrors.toString()); + } + } + + @BeforeMethod + public void loadPage() { + driver.navigate().to(getPageContent("test.htm")); + } + + @Test(enabled = true) + public void test1() { + ArrayList texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + + System.err.println( + String.format("test1 (1): %s => %s ", text, escapeXPath(text))); + System.err.println( + String.format("test1 (2): %s => %s ", text, escapeXPath2(text))); + /* System.err.println( + String.format("test1 (2): %s => %s ", text, escapeXPath3(text))); + */ + try { + List elements1 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath(text)))); + assertTrue(elements1.size() > 0); + highlight(elements1.get(0)); + List elements2 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath2(text)))); + assertTrue(elements2.size() > 0); + highlight(elements2.get(0)); + /* List elements3 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath3(text)))); + assertTrue(elements3.size() > 0); + highlight(elements3.get(0)); + */ + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + + } catch (InvalidSelectorException e) { + // ignore + // InvalidSelectorError: + // Unable to locate an element with the xpath expression + // //*[contains(text(), '""Burj"" ''Khalifa'')] because of the following + // error: + // SyntaxError: The expression is not a legal expression. + System.err.println("Test1 Ignored: " + e.toString()); + } + } + } + + // origin: + // https://saucelabs.com/resources/articles/selenium-tips-css-selectors + // NOTE: all failing + @Test(enabled = false) + public void test2() { + ArrayList texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + System.err.println(String.format("test2: %s", text)); + + try { + List elements = driver.findElements( + By.cssSelector(String.format("th:contains('%s')", text))); + assertTrue(elements.size() > 0); + highlight(elements.get(0)); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + + } catch (InvalidSelectorException e) { + // ignore + // InvalidSelectorError: + // Unable to locate an element with the xpath expression + // //*[contains(text(), '""Burj"" ''Khalifa'')] because of the following + // error: + // SyntaxError: The expression is not a legal expression. + System.err.println("Test2 Ignored: " + e.toString()); + } + } + } + + @Test(enabled = true) + public void test3() { + ArrayList texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + System.err.println(String.format("test3: %s", text)); + + Optional element = driver + .findElements(By.cssSelector("th[scope='row']")).stream() + .filter(o -> { + String t = o.getText(); + // System.err.println("in stream filter (3): Text = " + t); + return (Boolean) (t.contains(text)); + }).findFirst(); + + assertTrue(element.isPresent()); + highlight(element.get()); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + + } + } + + // https://sqa.stackexchange.com/questions/362/a-way-to-match-on-text-using-css-locators + // requires jQuery + public static WebElement findByText(WebDriver driver, + String cssSelectorParent, String text) { + WebElement parent = driver.findElement(By.cssSelector(cssSelectorParent)); + Object element = ((JavascriptExecutor) driver).executeScript(String.format( + "var x = $(arguments[0]).find(\":contains('%s')\"); return x;", text), + parent); + return (WebElement) element; + } + + public static Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); // a.k.a. (JavascriptExecutor) driver; + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + public static void highlight(WebElement element) { + if (wait == null) { + wait = new WebDriverWait(driver, flexible_wait_interval); + wait.pollingEvery(wait_polling_interval, TimeUnit.MILLISECONDS); + } + try { + wait.until(ExpectedConditions.visibilityOf(element)); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + public static void highlight(By locator) throws InterruptedException { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } + + // origin: + // https://stackoverflow.com/questions/642125/encoding-xpath-expressions-with-both-single-and-double-quotes + // alternative: use java.text.Normalizer + // alternative: use built-in xpath translate function e.g. + // "//*[contains(translate(@name,'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu'),'converted')]" + // possibly a better way yet is to use streams to query XML node texts in a + // way that allows one to compare the value of interest directly. + // not relying on possibly fragile XPath composition, but the purpose is the + // same + /** + * Escapes the quote characters inside the text condition in an XPath expression. + * Because there is no escape character in XPath string values, this method is not really escapes passed string, but + * breaks it into pars and uses XPath concat function. + * + * @param value String to escape. + * @return Escaped value. + */ + + public static String escapeXPath(@Nullable String string) { + if (string == null) { + return null; + } else if (string.contains("'")) { + StringBuilder sb = new StringBuilder(); + sb.append("concat('"); + + for (int i = 0; i < string.length(); i++) { + char ch = string.charAt(i); + if ('\'' == ch) { + sb.append("',\"").append(ch).append("\",'"); + } else { + sb.append(ch); + } + } + + sb.append("')"); + return sb.toString(); + } else { + return "'" + string + "'"; + } + } + + // shorter version of escapeXPath + public static String escapeXPath2(@Nullable String value) { + if (!value.contains("'")) + return '\'' + value + '\''; + else if (!value.contains("\"")) + return '"' + value + '"'; + else + return "concat('" + value.replace("'", "',\"'\",'") + "')"; + } + + // one can escape quotes and apostrophes in XPath 2.0 by doubling them, but + // there is no way of doing it in XPath 1.0. + // NOTE: does not work + public static String escapeXPath3(@Nullable String value) { + return "'" + value.replace("'", "''").replace("\"", "\"\""); + } + + // alternative: use built-in xpath translate function e.g. + // "//*[contains(translate(@name,'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu'),'converted')]" + // other XPath 2.0 Solutions + // "//*/text()[contains(lower-case(.),'test')]" + // "//*/text()[matches(.,'test', 'i')]" + // "//*/text()[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'test')] + + protected static String getPageContent(String pagename) { + try { + URI uri = EscapeXPathTest.class.getClassLoader().getResource(pagename) + .toURI(); + System.err.println("Testing local file: " + uri.toString()); + return uri.toString(); + } catch (URISyntaxException e) { // NOTE: multi-catch statement is not + // supported in -source 1.6 + throw new RuntimeException(e); + } + } + +} diff --git a/ui4j_test/src/alttest/com/mycompany/app/JqueryBarRatingTest.java b/ui4j_test/src/alttest/com/mycompany/app/JqueryBarRatingTest.java new file mode 100644 index 000000000..8deeb6db6 --- /dev/null +++ b/ui4j_test/src/alttest/com/mycompany/app/JqueryBarRatingTest.java @@ -0,0 +1,373 @@ +package com.mycompany.app; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import java.util.concurrent.TimeUnit; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.IOException; +import java.io.InputStream; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.hamcrest.CoreMatchers; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class JqueryBarRatingTest { + + private WebDriver driver; + private WebDriverWait wait; + static Actions actions; + private Predicate hasClass; + private Predicate hasAttr; + private Predicate hasText; + private int flexibleWait = 5; + private int implicitWait = 1; + private long pollingInterval = 500; + private String baseUrl = "http://antenna.io/demo/jquery-bar-rating/examples/"; + private static final String browser = "firefox"; + private static String osName; + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + @SuppressWarnings("deprecation") + @BeforeSuite + public void beforeSuiteMethod() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + HashMap chromePrefs = new HashMap(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + options.addArguments("allow-running-insecure-content"); + options.addArguments("allow-insecure-localhost"); + options.addArguments("enable-local-file-accesses"); + options.addArguments("disable-notifications"); + // options.addArguments("start-maximized"); + options.addArguments("browser.download.folderList=2"); + options.addArguments( + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf"); + options.addArguments("browser.download.dir=" + downloadFilepath); + // options.addArguments("user-data-dir=/path/to/your/custom/profile"); + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + // https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + } + + @AfterSuite + public void afterSuiteMethod() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void loadPage() { + driver.get(baseUrl); + } + + @AfterMethod + public void resetBrowser() { + driver.get("about:blank"); + } + + @Test(enabled = true) + public void test1() { + // Arrange + WebElement bar = wait.until((WebDriver d) -> { + WebElement element = null; + try { + element = d.findElement(By.cssSelector( + "section.section-examples div.examples div.box-example-square div.box-body div.br-theme-bars-square")); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }); + // Act + // NOTE: relative xpath selector + assertTrue( + bar.findElements(By.xpath("//a[@data-rating-value]")).size() > 7); + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + // TODO: test that result set elements are unique ? + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + // + ratings.keySet().stream().forEach(o -> { + System.err.println("Mouse over rating: " + o); + WebElement r = ratings.get(o); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + }); + // Assert + } + + @Test(enabled = true) + public void test2() { + // Arrange + + wait.until(ExpectedConditions.or( + // NOTE: Boolean + ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed")), + ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed")))); + + WebElement bar = wait.until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed"))); + + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + // Act + ratings.keySet().stream().forEach(o -> { + WebElement r = ratings.get(o); + assertThat(r, notNullValue()); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + // Assert + WebElement comment = bar.findElement(By.xpath( + ".//*[contains(@class, 'br-current-rating') and contains(@class ,'br-selected')]")); + assertThat(comment.getText(), equalTo(o)); + System.err.println("Mouse over rating: " + o); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + }); + } + + @Test(enabled = true) + public void test3() { + // Arrange + // custom Expected Condition static Helper class + WebElement bar = wait.until(Helper.oneOfElementsLocatedVisible( + By.xpath( + "//section[contains(@class, 'section-examples')]//div[contains(@class, 'box-example-movie')]//div[contains(@class, 'br-widget')]"), + By.cssSelector( + "section.section-examples div.box-example-movie div.br-widget"))); + // Act + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + ratings.keySet().stream().forEach(o -> { + WebElement r = ratings.get(o); + assertThat(r, notNullValue()); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + r.click(); + // Assert + WebElement comment = bar + .findElement(By.xpath(".//*[contains(@class, 'br-current-rating')]")); + assertThat(comment.getText(), equalTo(o)); + System.err.println("Mouse over rating: " + o); + // NOTE: there is a hidden select sibling element. The selected option + // does not appear to be updated + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + final String script = "var result = $(\"section.section-examples div.box-example-movie div.br-theme-bars-movie select#example-movie option[selected='selected']\");return result.val();"; + if (driver instanceof JavascriptExecutor) { + Object result = ((JavascriptExecutor) driver).executeScript(script); + System.err.println("Select option value: " + result.toString()); + } + }); + } + + private void highlight(WebElement element) { + highlight(element, 100); + } + + private void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + "arguments[0].style.border='3px solid yellow'", element); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border=''", element); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + public static class Helper { + // for complex expected Condition, based on + // http://stackoverflow.com/questions/14840884/wait-untilexpectedconditions-visibilityof-element1-or-element2 + + public static ExpectedCondition oneOfElementsLocatedVisible( + By... bys) { + return new ExpectedCondition() { + @Override + public WebElement apply(WebDriver driver) { + for (By by : Arrays.asList(bys)) { + WebElement element; + try { + System.err.println("Locator : " + by.toString()); + element = driver.findElement(by); + } catch (Exception e) { + continue; + } + if (element.isDisplayed()) + return element; + } + return null; + } + }; + } + } +} diff --git a/ui4j_test/src/alttest/com/mycompany/app/PlunkerTest.java b/ui4j_test/src/alttest/com/mycompany/app/PlunkerTest.java new file mode 100644 index 000000000..b85cf7e1f --- /dev/null +++ b/ui4j_test/src/alttest/com/mycompany/app/PlunkerTest.java @@ -0,0 +1,301 @@ +package com.mycompany.app; + +import java.io.IOException; +import java.io.InputStream; +import java.io.IOException; + +import java.lang.RuntimeException; +import java.net.MalformedURLException; +import java.net.URL; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.concurrent.TimeUnit; +import java.util.Enumeration; +import java.util.Formatter; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import static java.lang.Boolean.*; +import static java.lang.Float.*; +import java.lang.Float; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class PlunkerTest { + + private static WebDriver driver; + public static WebDriverWait wait; + public static Actions actions; + private static int flexibleWait = 5; + private static int implicitWait = 1; + private static long pollingInterval = 500; + private static String baseURL = "https://embed.plnkr.co/"; + private static String projectId = "ggL5oAvGgucDA5HCYk7K"; + + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final Logger log = LogManager.getLogger(TripAdvisorTest.class); + private static String osName; + + private static Pattern pattern; + private static Matcher matcher; + private static final String browser = "chrome"; + + @BeforeSuite + @SuppressWarnings("deprecation") + public static void setUp() { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + // origin: + // https://sqa.stackexchange.com/questions/26275/how-to-disable-chrome-save-your-password-selenium-java + // http://learn-automation.com/disable-chrome-notifications-selenium-webdriver/ + + HashMap prefs = new HashMap<>(); + prefs.put("profile.default_content_settings.popups", 0); + // Put this into prefs map to switch off browser notification + prefs.put("profile.default_content_setting_values.notifications", 2); + // Put this into prefs map to switch off save password notification + prefs.put("credentials_enable_service", false); + prefs.put("profile.password_manager_enabled", false); + String downloadPath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + prefs.put("download.default_directory", downloadPath); + prefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", prefs); + + for (String optionAgrument : (new String[] { + "--allow-running-insecure-content", "--allow-insecure-localhost", + "--enable-local-file-accesses", "--disable-notifications", + /* "start-maximized" , */ + "--browser.download.folderList=2", "--disable-web-security", + "--no-proxy-server", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("--browser.download.dir=%s", downloadPath) + /* "--user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities.setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + driver.get(baseURL); + driver.manage().timeouts().implicitlyWait(implicitWait, TimeUnit.SECONDS); + } + + @AfterSuite + public static void tearDown() throws Exception { + driver.close(); + driver.quit(); + if (verificationErrors.length() != 0) { + throw new Exception(verificationErrors.toString()); + } + } + + @BeforeMethod + public void loadBaseURL() { + driver.get(baseURL); + } + + @Test(enabled = true) + public void testEditor() { + driver.get(String.format("https://plnkr.co/edit/%s/?p=info", projectId)); + // "?p=preview" + WebElement runButton = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("body > nav button i.icon-play"))); + assertThat(runButton, notNullValue()); + highlight(runButton); + runButton.click(); + WebElement previewIframe = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("iframe[name='plunkerPreviewTarget']"))); + assertThat(previewIframe, notNullValue()); + } + + @Test(enabled = false) + public void testEmbed() { + driver.get("https://embed.plnkr.co/" + projectId); + } + + @Test(enabled = false) + public void testFullScreeen() { + driver.get("https://embed.plnkr.co/" + projectId); + } + + public static String getBaseURL() { + System.err.println("Get base URL: " + driver.getCurrentUrl()); + log.info("Get base URL: {}", driver.getCurrentUrl()); + String currentURL = driver.getCurrentUrl(); + String protocol = null; + String domain = null; + + try { + URL url = new URL(currentURL); + protocol = url.getProtocol(); + domain = url.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // System.err.println("Returning: " + protocol + "://" + domain); + return protocol + "://" + domain; + } + + public static void scrollIntoView(By locator) { + log.info("Scrolling into view: {}", locator); + ((JavascriptExecutor) driver).executeScript( + "arguments[0].scrollIntoView(true);", driver.findElement(locator)); + } + + public static void highlight(By locator, long highlight_interval) + throws InterruptedException { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + try { + Thread.sleep(highlight_interval); + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + executeScript("arguments[0].style.border=''", element); + } + + private void highlight(WebElement element) { + highlight(element, 100); + } + + private void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + "arguments[0].style.border='3px solid yellow'", element); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border=''", element); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + private static Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } +} diff --git a/ui4j_test/src/alttest/com/mycompany/app/SuvianTest.java b/ui4j_test/src/alttest/com/mycompany/app/SuvianTest.java new file mode 100644 index 000000000..757559b8b --- /dev/null +++ b/ui4j_test/src/alttest/com/mycompany/app/SuvianTest.java @@ -0,0 +1,3101 @@ +package com.mycompany.app; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class SuvianTest { + + private WebDriver driver; + private WebDriverWait wait; + private static Actions actions; + private static Alert alert; + private int flexibleWait = 5; + private int implicitWait = 1; + private long pollingInterval = 500; + private static String baseURL = "about:blank"; + private static final StringBuffer verificationErrors = new StringBuffer(); + private static String defaultScript = null; + private static final String browser = "chrome"; + private static String osName; + + @BeforeSuite + @SuppressWarnings("deprecation") + public void beforeSuite() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + HashMap chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + + for (String optionAgrument : (new String[] { + "allow-running-insecure-content", "allow-insecure-localhost", + "enable-local-file-accesses", "disable-notifications", + /* "start-maximized" , */ + "browser.download.folderList=2", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("browser.download.dir=%s", downloadFilepath) + /* "user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + /* + System.setProperty("webdriver.chrome.driver", + "c:/java/selenium/chromedriver.exe"); + driver = new ChromeDriver(); + */ + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + actions = new Actions(driver); + } + + @AfterSuite + public void afterSuite() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void BeforeMethod() { + driver.get(baseURL); + } + + @AfterMethod + public void AfterMethod(ITestResult result) { + if (verificationErrors.length() != 0) { + throw new RuntimeException(String.format("Error in the method %s : %s", + result.getMethod().getMethodName(), verificationErrors.toString())); + } + driver.get("about:blank"); + } + + // Firebug console validation: + // $x("") + // $$("") + @Test(enabled = false) + public void test0_1() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + // Wait page to load + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + + element.click(); + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + + // Assert + // 1. Expected Condition uses enclosing element + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + String t = d.findElement(By.className("intro-message")).getText(); + Boolean result = t.contains("Link Successfully clicked"); + System.err.println( + "in apply: Text = " + t + "\nresult = " + result.toString()); + return result; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // 3. Alternative wait, functional style, with Optional + // http://www.nurkiewicz.com/2013/08/optional-in-java-8-cheat-sheet.html + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Optional e = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> { + String t = o.getText(); + System.err.println("in stream filter (3): Text = " + t); + return (Boolean) (t.contains("Navigate Back")); + }).findFirst(); + return (e.isPresent()) ? e.get() : (WebElement) null; + } + }); + System.err + .println("element check: " + checkElement.getAttribute("innerHTML")); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // http://stackoverflow.com/questions/12858972/how-can-i-ask-the-selenium-webdriver-to-wait-for-few-seconds-in-java + // http://stackoverflow.com/questions/31102351/selenium-java-lambda-implementation-for-explicit-waits + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")); + // longer version + Stream elementsStream = elements.stream(); + elements = elementsStream.filter(o -> { + String t = o.getText(); + System.err.println("(in filter) Text: " + t); + return (Boolean) (t.equalsIgnoreCase("Link Successfully clicked")); + }).collect(Collectors.toList()); + + // shorter version + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> "Link Successfully clicked".equalsIgnoreCase(o.getText())) + .collect(Collectors.toList()); + + assertThat(elements.size(), equalTo(1)); + + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> o.getText().equalsIgnoreCase("Link Successfully clicked")) + .collect(Collectors.toList()); + assertThat(elements.size(), equalTo(1)); + + element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Link Successfully clicked"), + element.getText()); + } + + @Test(enabled = false) + public void test0_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + highlight(element); + element.click(); + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + // 2. Alternative Iterator, uses Regex methods + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + Iterator i = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .iterator(); + WebElement result = null; + Pattern pattern = Pattern.compile( + "(?:" + Pattern.quote("Navigate Back") + ")", + Pattern.CASE_INSENSITIVE); + while (i.hasNext()) { + WebElement e = i.next(); + String t = e.getText(); + // System.err.println("in apply iterator (2): Text = " + t); + Matcher matcher = pattern.matcher(t); + if (matcher.find()) { + result = e; + break; + } + } + return result; + } + }); + assertThat(checkElement, notNullValue()); + + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + } + + @Test(enabled = false) + public void test0_3() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + element.click(); + // 2. Expected condition with Iterator, uses String methods + try { + element = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Iterator elementsIterator = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .iterator(); + WebElement result = null; + while (elementsIterator.hasNext()) { + WebElement e = elementsIterator.next(); + String t = e.getText(); + System.err.println("in apply iterator (1): Text = " + t); + if (t.contains("Navigate Back")) { + result = e; + break; + } + } + return result; + } + }); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Act + element.click(); + } + + @Test(enabled = false) + public void test0_4() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + } + + @Test(enabled = false) + public void test0_5() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + String simulateRightMouseButtonClick = getScriptContent( + "simulateRightMouseButtonClick.js"); + System.err.println("Simulate (1) right mouse click on element"); + executeScript(simulateRightMouseButtonClick, element); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + String simulateClick = getScriptContent("simulateClick.js"); + System.err.println("Simulate (2) right mouse click on element"); + executeScript(simulateClick, element, "contextmenu"); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + System.err.println("Simulate (3) right mouse click on element"); + actions.moveToElement(element).build().perform(); + actions.keyDown(Keys.CONTROL).contextClick().keyUp(Keys.CONTROL).build() + .perform(); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + } + + // http://software-testing.ru/forum/index.php?/topic/17746-podskazhite-po-xpath/ + @Test(enabled = false) + public void test0_8() { + + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + String elementText = "Click Here"; + WebElement element = null; + try { + element = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver _driver) { + int cnt = 4; + String[] xpaths = new String[] { "//a[text() = '%s']", + "//a[normalize-space(.) = '%s']", + "//a[normalize-space(text()) = '%s']", + "//*[normalize-space(text()) = '%s']", + "//a[contains(normalize-space(.), '%s')]", + // NOTE: way too permissive for a selector + "//*[contains(normalize-space(.), '%s')]" }; + String xpath = String.format(xpaths[cnt], elementText); + System.err.println("Locator: xpath " + xpath); + Optional _element = _driver.findElements(By.xpath(xpath)) + .stream().filter(o -> { + String t = o.getText(); + System.err.println("In filter: " + o.getTagName() + ' ' + + (t.length() > 20 ? t.substring(0, 20) : t)); + Pattern pattern = Pattern.compile( + "^ *" + Pattern.quote(elementText), + Pattern.CASE_INSENSITIVE); + return pattern.matcher(t).find(); + // quicker, less precise + // return (Boolean) (__element.getText().contains(elementText)); + }).findFirst(); + return (_element.isPresent()) ? _element.get() : (WebElement) null; + } + }); + System.err.println("Element: " + element.getAttribute("innerHTML")); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // Act + highlight(element); + highlightNew(element, 1000); + assertTrue(element.getText().equalsIgnoreCase(elementText), + element.getText()); + } + + @Test(enabled = false) + public void test1() { + + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + element.click(); + try { // Wait page to load + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + // Inspect enclosing element to confirm the page loaded + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + return (Boolean) d.findElement(By.className("intro-message")) + .getText().contains("Link Successfully clicked"); + } + }); + } catch (Exception e) { + } + + // Assert + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> o.getText().equalsIgnoreCase("Link Successfully clicked")) + .collect(Collectors.toList()); + assertThat(elements.size(), equalTo(1)); + element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Link Successfully clicked"), + element.getText()); + elements.forEach(System.out::println); // output : ?? + } + + @Test(enabled = false) + public void test4() { + // Arrange + driver.get("http://suvian.in/selenium/1.4gender_dropdown.html"); + wait.until( // Wait page to load + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message select")))); + // Act + WebElement element = driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message select")); + Select select = new Select(element); + String optionString = "Male"; + // create predicate driven case-insensitive option search + Predicate hasText = o -> o.getText() + .matches("(?i:" + optionString.toLowerCase() + ")"); + List options = select.getOptions().stream().filter(hasText) + .collect(Collectors.toList()); + // Assert + assertThat(options.size(), equalTo(1)); + element = options.get(0); + assertTrue(element.getText().equals(optionString), element.getText()); + } + + @Test(enabled = false) + public void test5_1() { + // Arrange + driver.get("http://suvian.in/selenium/1.5married_radio.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + String label = "yes"; + String elementContents = driver + .findElement(By.xpath( + "//div[@class='intro-header']/div[@class='container']/div[@class='row']/div[@class='col-lg-12']/div[@class='intro-message']/form")) + .getAttribute("outerHTML"); + + String line = new ArrayList( + Arrays.asList(elementContents.split("
"))).stream() + .filter(o -> o.toLowerCase().indexOf(label) > -1).findFirst().get(); + Matcher matcher = Pattern.compile("value=\\\"([^\"]*)\\\"").matcher(line); // Pattern.quote + // ? + String checkboxValue = null; + if (matcher.find()) { + checkboxValue = matcher.group(1); + System.err.println("checkbox value = " + checkboxValue); + } else { + System.err.println("checkbox value not found"); + } + WebElement checkBoxElement = null; + if (checkboxValue != null) { + checkBoxElement = driver.findElement(By.xpath(String.format( + "//div[@class='intro-header']/div[@class='container']/div[@class='row']/div[@class='col-lg-12']/div[@class='intro-message']/form/input[@name='married' and @value='%s']", + checkboxValue))); + } + // Act + assertThat(checkBoxElement, notNullValue()); + highlight(checkBoxElement); + checkBoxElement.sendKeys(Keys.SPACE); + // Assert + // NOTE: behaves differently in C# + assertTrue(checkBoxElement.isSelected()); + } + + @Test(enabled = false) + public void test5_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.5married_radio.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + String label = "no"; + WebElement formElement = driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message form")); + String elementContents = formElement.getAttribute("outerHTML"); + + String line = new ArrayList( + Arrays.asList(elementContents.split("
"))).stream() + .filter(o -> o.toLowerCase().indexOf(label) > -1).findFirst().get(); + Matcher matcher = Pattern.compile("value=\\\"([^\"]*)\\\"").matcher(line); + String checkboxValue = null; + if (matcher.find()) { + checkboxValue = matcher.group(1); + System.err.println("checkbox value = " + checkboxValue); + } else { + System.err.println("checkbox value not found"); + } + WebElement checkBoxElement = null; + if (checkboxValue != null) { + checkBoxElement = formElement.findElement(By.cssSelector( + String.format("input[name='married'][value='%s']", checkboxValue))); + } + // Act + assertThat(checkBoxElement, notNullValue()); + highlight(checkBoxElement); + checkBoxElement.click(); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // ignore + } + // Assert + assertTrue(checkBoxElement.isSelected()); + } + + @Test(enabled = false) + public void test6_1() { + // Arrange + ArrayList hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing")); + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + System.err + .println("element check: " + checkElement.getAttribute("innerHTML")); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // Act + WebElement formElement = driver.findElement(By.cssSelector("input[id]")) + .findElement(By.xpath("..")); + assertThat(formElement, notNullValue()); + highlight(formElement); + List inputElements = formElement + .findElements(By.cssSelector("label[for]")).stream() + .filter(o -> hobbies.contains(o.getText())) + .collect(Collectors.toList()); + // C#: dataMap = elements.ToDictionary(x => x.GetAttribute("for"), x => + // x.Text); + Map dataMap = inputElements.stream().collect( + Collectors.toMap(o -> o.getText(), o -> o.getAttribute("for"))); + ArrayList checkboxes = new ArrayList<>(); + for (String hobby : hobbies) { + try { + System.err.println("finding: " + dataMap.get(hobby)); + checkboxes.add(formElement.findElement( + // will throw exception + By.cssSelector(String.format("input#%s", dataMap.get(hobby))))); + } catch (InvalidSelectorException e) { + System.err.println("ignored: " + e.toString()); + } + try { + checkboxes.add(formElement.findElement( + // will not throw exception + By.xpath(String.format("input[@id='%s']", dataMap.get(hobby))))); + } catch (Exception e) { + System.err.println("ignored: " + e.toString()); + } + + } + checkboxes.stream().forEach(o -> { + highlight(o); + o.click(); + }); + + // Assert + + assertTrue( + formElement.findElements(By.cssSelector("input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + // NOTE: this test is broken + // label follows the check box therefore + // the following-sibling to find the check box by its label does not seem to + // be appropriate + // - see the test6_3 for the solution + // however preceding-sibling always finds the check box #1 + @Test(enabled = false) + public void test6_2() { + // Arrange + ArrayList hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing", "Sports")); + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + assertThat(checkElement, notNullValue()); + // Act + List elements = checkElement + .findElements(By.xpath("..//label[@for]")).stream() + .filter(o -> hobbies.contains(o.getText())) + .collect(Collectors.toList()); + assertTrue(elements.size() > 0); + List checkBoxes = elements.stream() + .map(o -> o.findElement(By.xpath("preceding-sibling::input"))) + .collect(Collectors.toList()); + assertTrue(checkBoxes.size() > 0); + + checkBoxes.stream().forEach(o -> { + highlight(o); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + + } + o.click(); + }); + // Assert + assertTrue( + driver + .findElements(By.cssSelector( + ".container .intro-message input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + // reverse usage of following-sibling to locate check box by its label + @Test(enabled = false) + public void test6_3() { + // Arrange + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + ArrayList hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing", "Sports")); + WebElement checkElement = null; + try { + checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + assertThat(checkElement, notNullValue()); + // Act + List checkBoxes = checkElement + .findElements(By.xpath("..//input[@type = 'checkbox']")).stream() + .filter(o -> { + WebElement label = o + .findElement(By.xpath("following-sibling::label")); + if (hobbies.contains(label.getText())) { + System.err.println(String.format("checkbox element %s: '%s'", + o.getAttribute("id"), label.getText())); + return true; + } else { + return false; + } + }).collect(Collectors.toList()); + + assertTrue(checkBoxes.size() > 0); + checkBoxes.stream().forEach(o -> { + highlight(o); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + + } + o.click(); + }); + // Assert + assertTrue( + driver + .findElements(By.cssSelector( + ".container .intro-message input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + @Test(enabled = false) + public void test10() { + // Arrange + driver.get("http://suvian.in/selenium/1.10selectElementFromDD.html"); + WebElement buttonDropDown = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.dropdown button.dropbtn")))); + assertThat(buttonDropDown, notNullValue()); + + // Act + buttonDropDown.click(); + wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.dropdown div#myDropdown")))); + List optionElements = driver + .findElements(By.cssSelector( + ".container .row .intro-message div.dropdown div#myDropdown")) + .stream().filter(o -> o.getText().contains("Option 2")) + .collect(Collectors.toList()); + assertTrue(optionElements.size() > 0); + final String currentHandle = driver.getWindowHandle(); + final String text = "Congratulations.. You Selected option 2. Close this browser tab and proceed to end of Level 1."; + optionElements.get(0).click(); + + // Assert + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Boolean result = false; + System.err.println("Inspecting driver Window handles"); + Set windowHandles = d.getWindowHandles(); + if (windowHandles.size() > 1) { + System.err.println("Found " + (windowHandles.size() - 1) + + " additional tabs opened"); + } else { + System.out.println("No other tabs found"); + return false; + } + Iterator windowHandleIterator = windowHandles.iterator(); + while (windowHandleIterator.hasNext()) { + String handle = windowHandleIterator.next(); + if (!handle.equals(currentHandle)) { + System.err.println("Switch to: " + handle); + driver.switchTo().window(handle); + String t = d.getPageSource(); + System.err.println(String.format("Page source: %s", + t.substring( + org.apache.commons.lang3.StringUtils.indexOf(t, ""), + t.length() - 1))); + if (t.contains(text)) { + System.err.println("Found text: " + text); + + result = true; + } + if (result) { + System.err.println("Close the browser tab: " + handle); + d.close(); + } + System.err.println("Switch to the main window."); + driver.switchTo().window(currentHandle); + driver.switchTo().defaultContent(); + } + } + return result; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + // throw new RuntimeException(e.toString()); + } + } + + @Test(enabled = false) + public void test12_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.2browserPopUp.html"); + WebElement button = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button.btn-warning")))); + assertThat(button, notNullValue()); + final String parentHandle = driver.getWindowHandle(); + + // Act + button.click(); + + // Assert + try { // Wait for the new browser widow to get shown + String popupHandle = wait.until(new ExpectedCondition() { + @Override + public String apply(WebDriver d) { + Boolean result = false; + System.err.println("Inspecting driver Window handles"); + Set windowHandles = d.getWindowHandles(); + if (windowHandles.size() > 1) { + windowHandles.remove(parentHandle); + String s = (String) (windowHandles.toArray())[0]; + System.err.println("Found popup window handle: " + s); + return s; + } else { + System.out.println("No popup found"); + return null; + } + } + }); + // Act + driver.switchTo().window(popupHandle); + System.out.println("Popup Title: " + driver.getTitle()); + driver.close(); + System.out.println("Closed popup"); + driver.switchTo().window(parentHandle); + System.out.println("switched to parent window: " + parentHandle); + driver.switchTo().defaultContent(); + System.out.println("switched to default content."); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + + // Assert + try { + assertThat(driver.getWindowHandles().size(), is(1)); + } catch (AssertionError e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + } + + @Test(enabled = false) + public void test12_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.2browserPopUp.html"); + wait.until(ExpectedConditions.textToBePresentInElement( + driver.findElement(By + .cssSelector(".container .row .intro-message button.btn-warning")), + "Click Me")); + + WebElement button = driver.findElement( + By.cssSelector(".container .row .intro-message button.btn-warning")); + assertThat(button, notNullValue()); + final String parentHandle = driver.getWindowHandle(); + + // Act + button.click(); + while (true) { // Wait for the new browser widow to get shown and close it + List popupHandles = driver.getWindowHandles().stream() + .filter(((Predicate) (o -> o.equalsIgnoreCase(parentHandle))) + .negate()) + .collect(Collectors.toList()); + if (popupHandles.size() > 0) { + driver.switchTo().window(popupHandles.get(0)); + System.out.println("Popup Title: " + driver.getTitle()); + driver.close(); + System.out.println("Closed popup"); + driver.switchTo().window(parentHandle); + System.out.println("switched to parent window: " + parentHandle); + driver.switchTo().defaultContent(); + System.out.println("switched to default content."); + break; + } else { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + } + // Assert + try { + assertThat(driver.getWindowHandles().size(), is(1)); + } catch (AssertionError e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + } + + // This test appears to find the button even though it is inside iframe + // without frame switch + @Test(enabled = false) + public void test13_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt( + By.cssSelector(".container .row .intro-message iframe"))); + + // Act + WebElement buttonElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("h3 button")))); + + assertThat(buttonElement, notNullValue()); + // Assert + + WebElement currentElement = buttonElement; + for (int cnt = 0; cnt != 4; cnt++) { + try { + WebElement containerElement = currentElement + .findElement(By.xpath("..")); + String elementHTML = containerElement.getAttribute("outerHTML"); + System.err.println("Parent element: " + (elementHTML.length() > 120 + ? elementHTML.substring(0, 120) + "..." : elementHTML)); + currentElement = containerElement; + } catch (InvalidSelectorException e) { + // InvalidSelectorError: The result of the xpath expression ".." is: + // [object HTMLDocument]. It should be an element. + // ignore - reached top level + break; + } + } + buttonElement.click(); + // Assert + try { + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + // confirm alert + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + // This test does switch frame fefore find the button in the iframed document + @Test(enabled = false) + public void test13_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + WebElement frameElement = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector(".container .row .intro-message iframe"))); + assertThat(frameElement, notNullValue()); + String frameElementDocument = frameElement.getAttribute("outerHTML"); + + System.err + .println("Switching to frame:\n" + (frameElementDocument.length() > 80 + ? frameElementDocument.substring(0, 80) + "..." + : frameElementDocument)); + + driver.switchTo().frame(frameElement); + System.err.println("Inside the frame"); + try { + frameElement.getTagName(); + } catch (org.openqa.selenium.StaleElementReferenceException e) { + // Element belongs to a different frame than the current one + System.err.println("Exception (expected, ignored): " + e.toString()); + } + WebElement rootElement = driver.findElement(By.xpath("/*")); + String documentText = rootElement.getAttribute("outerHTML"); + System.err.println("Root element:\n" + (documentText.length() > 80 + ? documentText.substring(0, 80) + "..." : documentText)); + String pageSource = driver.getPageSource(); + System.err.println("Page source:\n" + (pageSource.length() > 80 + ? pageSource.substring(0, 80) + "..." : pageSource)); + + // Act + WebElement buttonElement = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector("h3 button[onclick = 'myFunction()']")))); + + assertThat(buttonElement, notNullValue()); + buttonElement.click(); + // Assert + + try { + // confirm alert + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + @Test(enabled = false) + public void test13_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt( + By.cssSelector(".container .row .intro-message iframe"))); + + // Act + WebElement buttonElement = driver + .findElement(By.xpath("//button[@onclick = 'myFunction()']")); + assertThat(buttonElement, notNullValue()); + // Assert + + buttonElement.click(); + // Assert + try { + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + // confirm alert + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + @Test(enabled = false) + public void test14_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.4mouseHover.html"); + + WebElement elementWithTooltip = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(elementWithTooltip, notNullValue()); + // the link title attribute is present regardless of tooltip shown or not + // Assert + assertThat(elementWithTooltip.getAttribute("title"), + equalTo("This is a tooltip.")); + // Act + actions.moveToElement(elementWithTooltip).build().perform(); + // Assert + assertThat(elementWithTooltip.getAttribute("title"), + equalTo("This is a tooltip.")); + // How to discover whether core HTML tool tip is displayed ? + + } + + // https://docs.google.com/a/jazzteam.org/document/d/1PdfKMDfoqFIlF4tN1jKrOf1iZ1rqESy2xVMIj3uuV3g/pub#h.qkrwckq52qpd + + // http://sqa.stackexchange.com/questions/14247/how-can-i-get-the-value-of-the-tooltip + @Test(enabled = false) + public void test14_2() { + // Arrange + driver.get("http://yuilibrary.com/yui/docs/charts/charts-pie.html"); + + WebElement elementWithTooltip = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//*[contains(@class,'yui3-svgSvgPieSlice')][@fill = '#66007f']")))); + assertThat(elementWithTooltip, notNullValue()); + + WebElement chartTitle = driver + .findElement(By.cssSelector("div#doc div.content h1")); + // Act + actions.moveToElement(chartTitle).build().perform(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + // the tooltip element is present on the page regardless of mouse position, + // but is not visible. + assertThat((int) driver + .findElements(By.cssSelector("div[class $= 'chart-tooltip']")).stream() + .filter(o -> { + return (Boolean) (o.getAttribute("style") + .indexOf("visibility: hidden;") == -1); + }).count(), is(0)); + + // Act + actions.moveToElement(elementWithTooltip).build().perform(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + List tooltips = driver + .findElements(By.xpath("//div[contains(@id, '_tooltip')]")); + assertThat(tooltips.size(), is(1)); + // TODO: visibility check + assertThat(tooltips.get(0).getText(), containsString("day: Monday")); + } + + @Test(enabled = false) + public void test15_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.5resize.html"); + WebElement textAreaElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 textarea")))); + assertThat(textAreaElement, notNullValue()); + System.err.println( + "Text area original width: " + textAreaElement.getSize().width); + System.err.println( + "Text area original height: " + textAreaElement.getSize().height); + WebElement lineElement = driver.findElement( + By.cssSelector(".container .row .intro-message h3 hr.intro-divider")); + assertThat(lineElement, notNullValue()); + System.err.println("Line element width: " + lineElement.getSize().width); + // Act + int distance = (lineElement.getSize().width + - textAreaElement.getSize().width); + highlight(textAreaElement); + int xOffset = textAreaElement.getSize().getWidth() - 1; + int yOffset = textAreaElement.getSize().getHeight() - 1; + System.err + .println(String.format("Click and hold at (%d,%d)", xOffset, yOffset)); + + actions.moveToElement(textAreaElement, xOffset, yOffset).clickAndHold() + .moveByOffset(distance, 0); + actions.release().build().perform(); + // Assert + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + System.err.println( + "Text area new width: " + textAreaElement.getSize().getWidth()); + System.err.println( + "Text area new height: " + textAreaElement.getSize().getHeight()); + } + + @Test(enabled = false) + public void test15_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + String cssSelector = ".container .row .intro-message h3 a"; + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertTrue(element.getText().equalsIgnoreCase("click here"), + element.getText()); + + // Act + highlight(element); + + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates coords = ((Locatable) element).getCoordinates(); + System.err.println(String.format("Mouse click at: (%-4d, %-4d)", + coords.inViewPort().x, coords.inViewPort().y)); + mouse.click(coords); + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + + // Assert + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + return d.findElement(By.className("intro-message")).getText() + .contains("Link Successfully clicked"); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + } + + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.interactions.Mouse + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.interactions.internal.Coordinates + // http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium/selenium-api/2.40.0/org/openqa/selenium/interactions/Mouse.java#Mouse.mouseMove%28org.openqa.selenium.interactions.internal.Coordinates%2Clong%2Clong%29 + @Test(enabled = false) + public void test15_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.5resize.html"); + WebElement textAreaElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 textarea")))); + assertThat(textAreaElement, notNullValue()); + System.err.println(textAreaElement.getSize().width); + System.err.println(textAreaElement.getSize().height); + WebElement lineElement = driver.findElement( + By.cssSelector(".container .row .intro-message h3 hr.intro-divider")); + assertThat(lineElement, notNullValue()); + // Act + int distance = (lineElement.getSize().width + - textAreaElement.getSize().width) / 2; + highlight(textAreaElement); + int xOffset = textAreaElement.getSize().getWidth() - 1; + int yOffset = textAreaElement.getSize().getHeight() - 1; + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Locatable locatable = (Locatable) textAreaElement; + Coordinates coords = locatable.getCoordinates(); + System.err.println(String.format("Mouse down at: (%d,%d)", + coords.inViewPort().x, coords.inViewPort().y)); + mouse.mouseMove(coords, xOffset, yOffset); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + mouse.mouseDown(coords); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + mouse.mouseUp(coords); + mouse.click(coords); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + + @Test(enabled = false) + public void test16_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + + WebElement book2 = driver.findElement(By.xpath( + "//div[@class='intro-message']/ul/li[ contains(text(), 'Book 2')]")); + assertThat(book2.getText(), containsString("Book 2")); + + // Act + int count = 0; + Enumeration chapters = Collections + .enumeration(book2.findElements(By.cssSelector("ul li"))); + + while (chapters.hasMoreElements()) { + WebElement currentChapter = chapters.nextElement(); + count++; + try { + highlight(currentChapter); + currentChapter.click(); + } catch (WebDriverException e) { + System.err + .println(String.format("Exception (ignored):\n%s", e.toString())); + // Element is not clickable + } + } + // Assert + assertThat(count, is(7)); + System.err.println(count); + + WebElement resultElement = driver + .findElement(By.cssSelector("input#chapbook2")); + resultElement.clear(); + resultElement.sendKeys(String.format("%d", count)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + + @Test(enabled = false) + public void test16_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + // Act + + List elements = driver + .findElements( + By.cssSelector(".container .row .intro-message ul#books li")) + .stream().filter(o -> { + return (Boolean) (o.getText().indexOf("Book") > -1); + }).map(o -> o.findElements(By.cssSelector("ul li"))) + .collect(ArrayList::new, List::addAll, List::addAll); + // http://stackoverflow.com/questions/25147094/turn-a-list-of-lists-into-a-list-using-lambdas + + // Assert + assertThat(elements.size(), is(15)); + System.err.println("Total:" + elements.size()); + WebElement resultElement = driver + .findElement(By.cssSelector("input#chapall")); + resultElement.clear(); + resultElement.sendKeys(String.format("%d", elements.size())); + } + + @Test(enabled = false) + public void test16_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + + // Act + driver + .findElements( + By.cssSelector(".container .row .intro-message ul#books li")) + .stream().filter(o -> { + CharSequence text = "Book"; + return (Boolean) !(o.getText().contains(text)); + }).forEach(o -> { + try { + highlight(o); + o.click(); + } catch (WebDriverException e) { + System.err.println( + String.format("Exception (ignored):\n%s", e.toString())); + // Element is not clickable + } + }); + } + + @Test(enabled = false) + public void test17() { + // Arrange + driver.get("http://suvian.in/selenium/2.7waitUntil.html"); + + WebElement clickElement = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(clickElement, notNullValue()); + assertThat(clickElement.getText(), containsString("Click Me")); + // Act + long startTime = System.currentTimeMillis(); + clickElement.click(); + // Assert + long retryInterval = 1000; + long maxRetry = 30; + long checkRetryDelay = 0; + while (true) { + try { + // confirm alert + driver.switchTo().alert().accept(); + break; + } catch (NoAlertPresentException e) { + // check if waited long enough already + checkRetryDelay = System.currentTimeMillis() - startTime; + if (Math.ceil(checkRetryDelay / retryInterval) > maxRetry + 1) { + System.err.format("Alert not present after %d second\n", + checkRetryDelay); + throw new RuntimeException(); + } + try { + System.err.print(String.format("Sleep %4.2f sec ...", + Math.ceil(retryInterval / 1000))); + Thread.sleep(retryInterval); + } catch (InterruptedException e2) { + System.err.println("Unexpected Interrupted Exception: " + + e.getStackTrace().toString()); + throw new RuntimeException(e.toString()); + } + } catch (Exception e) { + System.err + .println("Unexpected exception: " + e.getStackTrace().toString()); + throw new RuntimeException(e.toString()); + } + } + + long delaySecond = (checkRetryDelay / 1000) % 60; + long delayMinute = (checkRetryDelay / (1000 * 60)) % 60; + long delayHour = (checkRetryDelay / (1000 * 60 * 60)) % 24; + String delayTime = String.format("%02d:%02d:%02d", delayHour, delayMinute, + delaySecond); + System.err.format("Alert was confirmed at %s\n", delayTime); + } + + @Test(enabled = false) + public void test18_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message button#button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.w3-progress-container div#myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + + // Act + button1.click(); + // Brute force wait until button2 gets enabled - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + String t = button2.getAttribute("disabled"); + return (t == null); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Assert + } + + @Test(enabled = false) + public void test18_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + WebElement progressBarContainer = progressBar.findElement(By.xpath("..")); + int denom = Integer.parseInt( + styleOfElement(progressBarContainer, "width").replace("px", "")); + // Act + button1.click(); + + // Evaluate the progressBar width to reach 100% - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Pattern p = Pattern.compile("([0-9.]+)px", + Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + float percentage = Float.parseFloat( + p.matcher(styleOfElement(progressBar, "width")).replaceAll("$1")) + / denom; + System.err.println("Progress Bar: " + percentage); + return (percentage >= .97); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Assert + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + System.err.println( + "Button2 attribute check (1) : " + button2.getAttribute("outerHTML")); + button2.click(); + try { + // confirm alert + driver.switchTo().alert().accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + // NOTE: latency + System.err.println( + "Button2 attribute check (2) : " + button2.getAttribute("outerHTML")); + } + + @Test(enabled = false) + public void test18_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + // html body div.intro-header div.container div.row div.col-lg-12 + // div.intro-message button.w3-btn.w3-dark-grey + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + WebElement progressBarContainer = progressBar.findElement(By.xpath("..")); + int denom = Integer.parseInt( + styleOfElement(progressBarContainer, "width").replace("px", "")); + // Act + button1.click(); + + // Evaluate the progressBar width to reach 100% + // Use Javascript to evaluate the disabled property of the DOM element + // that will be changing from true to false - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Boolean disabled = Boolean.parseBoolean( + executeScript("return arguments[0].disabled", button2) + .toString()); + return !disabled; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + System.err.println( + "Button2 attribute check (3) : " + button2.getAttribute("outerHTML")); + } + + @Test(enabled = false) + public void test19_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.9greenColorBlock.html"); + + WebElement greenBoxElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message table div.greenbox")))); + // Act + + // Assert + assertThat(greenBoxElement, notNullValue()); + // TODO: computed style of that element + + actions.moveToElement(greenBoxElement).build().perform(); + greenBoxElement.click(); + try { + // confirm alert + alert = driver.switchTo().alert(); + String alert_text = alert.getText(); + assertThat(alert_text, containsString("You clicked on Green")); + + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + + } + + @Test(enabled = false) + public void test19_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.9greenColorBlock.html"); + + WebElement greenBoxElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message table div.greenbox")))); + // Act + + // Assert + assertThat(greenBoxElement, notNullValue()); + // simplified script for computed style an element does not work + String script = "var element = arguments[0];window.document.defaultView.getComputedStyle(element,null).getPropertyValue(arguments[1]);"; + + Object computedStyle = ((JavascriptExecutor) driver).executeScript(script, + greenBoxElement, "background-color"); + try { + System.err + .println("Red Box background color: " + computedStyle.toString()); + } catch (NullPointerException e) { + System.err.println("Script does not return the value : " + e.toString()); + } + String style = styleOfElement(greenBoxElement); + System.err.println("style:\n" + style); + + String backgroundColorAttribute = styleOfElement(greenBoxElement, + "background-color"); + String heightAttribute = styleOfElement(greenBoxElement, "height"); + String widthAttribute = styleOfElement(greenBoxElement, "width"); + + System.err + .println("backgroundColorAttribute:\n" + backgroundColorAttribute); + + Pattern pattern = Pattern.compile("\\(\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)\\)"); + Matcher matcher = pattern.matcher(backgroundColorAttribute); + int red = 0, green = 0, blue = 0; + + if (matcher.find()) { + red = Integer.parseInt(matcher.group(1).toString()); + green = Integer.parseInt(matcher.group(2).toString()); + blue = Integer.parseInt(matcher.group(3).toString()); + assertTrue(red == 0); + } + pattern = Pattern + .compile("\\(\\s*(?\\d+),\\s*(?\\d+),\\s*(?\\d+)\\)"); + matcher = pattern.matcher(backgroundColorAttribute); + if (matcher.find()) { + red = Integer.parseInt(matcher.group("red").toString()); + green = Integer.parseInt(matcher.group("green").toString()); + blue = Integer.parseInt(matcher.group("blue").toString()); + assertTrue(green >= 128); + } + System.err.println("green:" + green); + + System.err.println("heightAttribute:\n" + heightAttribute); + System.err.println("widthAttribute:\n" + widthAttribute); + // assertThat(greenBoxElement.getAttribute("background-color"), + // equalTo("red")); + + } + + // Few failing attempts. Warning: Timing out with Firefox + + // Attempt #1 + @Test(enabled = false) + public void test20_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + actions.clickAndHold(draggableElement).moveToElement(dropElement).release() + .build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #2 + @Test(enabled = false) + public void test20_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + actions.dragAndDrop(draggableElement, dropElement).build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #3 + @Test(enabled = false) + public void test20_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Point source_location = draggableElement.getLocation(); + highlight(draggableElement); + Point target_location = dropElement.getLocation(); + actions.dragAndDropBy(draggableElement, 0, + target_location.y - source_location.y).build().perform(); + actions.release().build(); + actions.perform(); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #4 + @Test(enabled = false) + public void test20_4() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + System.err.println(String.format("Mouse down at: (%-4d, %-4d)", + source_coords.inViewPort().x, source_coords.inViewPort().y)); + mouse.mouseDown(source_coords); + + mouse.mouseMove(source_coords, 0, + target_coords.inViewPort().y - source_coords.inViewPort().y); + System.err.println(String.format("Mouse up at: (%-4d, %-4d)", + target_coords.inViewPort().x + 10, target_coords.inViewPort().y + 10)); + mouse.mouseUp(target_coords); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #5 + @Test(enabled = false) + public void test20_5() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + String simulateDragDropScript = getScriptContent("simulateDragDrop.js"); + System.err.println(String.format("Simulate drag an drop by: (%-4d, %-4d)", + target_coords.inViewPort().x, target_coords.inViewPort().y)); + + executeScript(simulateDragDropScript, draggableElement, + target_coords.inViewPort().x, target_coords.inViewPort().y); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // https://github.com/tourdedave/elemental-selenium-tips + @Test(enabled = false) + public void test20_6() { + // Arrange + driver.get("http://the-internet.herokuapp.com/drag_and_drop"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#column-a")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), containsString("A")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#column-b")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("B")); + + // Act + String dragDropScript = String.format( + "%s\n$('#column-a').simulateDragDrop({ dropTarget: '#column-b'});", + getScriptContent("dnd.js")); + ((JavascriptExecutor) driver).executeScript(dragDropScript); + + // Assert + assertThat(dropElement.getText(), containsString("B")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_7() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + String dragDropScript = String.format( + "%s\n$('#drag1').simulateDragDrop({ dropTarget: '#div1'});", + getScriptContent("dnd.js")); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript); + + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_8() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + String dragDropScript = String.format("%s\n%s", getScriptContent("dnd.js"), + "var dragElememt = $(arguments[0]); var dropTargetSelector = arguments[1]; dragElememt.simulateDragDrop({ dropTarget: dropTargetSelector});"); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript, + String.format("#%s", draggableElement.getAttribute("id")), + String.format("#%s", dropElement.getAttribute("id"))); + + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_9() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + dragdrop(By.id("drag1"), By.id("div1")); + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + } + + // NOTE: this test is failing + @Test(enabled = false) + public void test21() { + // Arrange + driver.get("http://suvian.in/selenium/3.1fileupload.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + // Act + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("3.1fileupload_validate.html")); + } catch (UnreachableBrowserException e) { + } + // Assert + } + + @Test(enabled = false) + public void test22_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + // Act + + // Act + String dragDropScript = String.format("%s\n%s", getScriptContent("dnd.js"), + "var dragElememt = $(arguments[0]); var dropTargetSelector = arguments[1]; dragElememt.simulateDragDrop({ dropTarget: dropTargetSelector});"); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript, + String.format("#%s", draggableElement.getAttribute("id")), + String.format("#%s", dropElement.getAttribute("id"))); + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + } + + // Few failing attempts + // Attempt #1 + @Test(enabled = false) + public void test22_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Act + actions.clickAndHold(draggableElement).moveToElement(dropElement).release() + .build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + + } + + // Attempt #2 + @Test(enabled = false) + public void test22_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Act + actions.dragAndDrop(draggableElement, dropElement).build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + + } + + // Few failing attempts. Warning: Timing out with Firefox + @Test(enabled = false) + public void test22_4() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Attempt #3 + Point source_location = draggableElement.getLocation(); + highlight(draggableElement); + Point target_location = dropElement.getLocation(); + actions.dragAndDropBy(draggableElement, 0, + target_location.y - source_location.y).build().perform(); + actions.release().build(); + actions.perform(); + + // Attempt #4 + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + System.err.println(String.format("Mouse down at: (%-4d, %-4d)", + source_coords.inViewPort().x, source_coords.inViewPort().y)); + mouse.mouseDown(source_coords); + + mouse.mouseMove(source_coords, 0, target_location.y - source_location.y); + System.err.println(String.format("Mouse up at: (%-4d, %-4d)", + target_coords.inViewPort().x + 10, target_coords.inViewPort().y + 10)); + mouse.mouseUp(target_coords); + + // Assert + } + + // only loads first 25 lines of code + @Test(enabled = false) + public void test23_1() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + List codeLines = codeElement + .findElements(By.cssSelector("pre[role='presentation']")); + + // Assert + assertTrue(codeLines.size() > 0); + System.err.println(String.format("%d Lines of code:", codeLines.size())); + List code = codeLines.stream().map(e -> { + executeScript("arguments[0].scrollIntoView(true);", e); + highlight(e); + return e.getText(); + }).collect(Collectors.toList()); + + code.stream().forEach(e -> System.err.println(e)); + } + + // loads all code + @Test(enabled = false) + public void test23_2() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + WebElement codeLine = codeElement + .findElement(By.cssSelector("pre[role='presentation']:nth-of-type(1)")); + + // Assert + assertThat(codeLine, notNullValue()); + while (true) { + try { + List codeLinesFollowing = codeLine + .findElements(By.xpath("following-sibling::pre")); + if (codeLinesFollowing.size() == 0) { + System.err + .println(String.format("Last line: '%s'", codeLine.getText())); + break; + } + WebElement nextCodeLine = codeLinesFollowing.get(0); + executeScript("arguments[0].scrollIntoView(true);", nextCodeLine); + highlight(codeLine); + System.err.println(codeLine.getText()); + codeLine = nextCodeLine; + } catch (Exception e) { + e.printStackTrace(); + break; + } + } + } + + // only loads first 35 lines of code + @Test(enabled = false) + public void test23_3() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + // brute force ? + int cnt = 0; + while (true) { + cnt++; + try { + WebElement codeLine = codeElement.findElement(By.cssSelector( + String.format("pre[role='presentation']:nth-of-type(%d)", cnt))); + assertThat(codeLine, notNullValue()); + executeScript("arguments[0].scrollIntoView(true);", codeLine); + highlight(codeLine); + System.err.println(codeLine.getText()); + } catch (NoSuchElementException e) { + // e.printStackTrace(); + break; + } + } + // Assert + } + + @Test(enabled = false) + public void test25_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + + assertThat(link, notNullValue()); + assertThat(link.getText(), containsString("Generate Scorecard")); + link.click(); + + // Wait page to update + + try { + wait.until(SuvianTest::hasScoreMethod); + } catch (UnreachableBrowserException e) { + } + // Assert + List rowElements = driver.findElements( + By.cssSelector(".container .row .intro-message table tbody tr")); + Map playerScores = rowElements.stream() + .collect(Collectors.toMap( + o -> o.findElement(By.cssSelector("td:nth-of-type(1)")).getText() + .trim(), + o -> Integer.parseInt( + o.findElement(By.cssSelector("td:nth-of-type(2)")).getText()))); + List> playerScoresList = new LinkedList<>( + playerScores.entrySet()); + Collections.sort(playerScoresList, + new Comparator>() { + @Override + public int compare(Map.Entry first, + Map.Entry second) { + return (second.getValue()).compareTo(first.getValue()); + } + }); + + String bestScoringPlayerName = playerScoresList.get(0).getKey(); + WebElement playerNameInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("form.form-inline input#score[name='topscorer']")))); + playerNameInput.clear(); + playerNameInput.sendKeys(bestScoringPlayerName); + System.err.println(bestScoringPlayerName); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + + static boolean hasScoreMethod(WebDriver driver) { + return driver + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0; + } + + // This test was developed with Selenium Driver 2.53 and needs update to work + // with Selenium 3.x.x + /* + @Test(enabled = false) + public void test25_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + + assertThat(link, notNullValue()); + assertThat(link.getText(), containsString("Generate Scorecard")); + link.click(); + + // Wait page to update + com.google.common.base.Predicate hasScore = d -> { + return (boolean) (d + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0); + }; + try { + wait.until(hasScore); + } catch (UnreachableBrowserException e) { + } + // Assert + List scores = driver + .findElements(By.cssSelector( + ".container .row .intro-message table tbody tr td:nth-of-type(2) p[id]")) + .stream().map(e -> Integer.parseInt(e.getText().trim())) + .collect(Collectors.toList()); + Collections.sort(scores, Collections.reverseOrder()); + int maxScore = scores.get(0); + int minScore = scores.get(scores.size() - 1); + assertTrue(maxScore >= minScore); + + List players = driver + .findElements(By.cssSelector( + ".container .row .intro-message table tbody tr td:nth-of-type(1)")) + .stream().filter(o -> { + WebElement s = o.findElement(By.xpath("following-sibling::td")); + return (Boolean) (Integer.parseInt(s.getText()) == maxScore); + }).map(e -> e.getText()).collect(Collectors.toList()); + System.err.println(players.get(0)); + WebElement playerNameInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("form.form-inline input#score[name='topscorer']")))); + playerNameInput.clear(); + playerNameInput.sendKeys(StringUtils.join(players, ",")); + Integer scoreSachin = Integer.parseInt(driver + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim()); + WebElement scoreInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By + .cssSelector("form.form-inline input#score[name='sachinruns']")))); + scoreInput.clear(); + scoreInput.sendKeys(String.format("%d", scoreSachin)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + */ + + // This test was developed with Selenium Driver 2.53 and needs update to work + // with Selenium 3.x.x + /* + @Test(enabled = false) + public void test25_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(link, notNullValue()); + + // Act + link.click(); + + // Wait page to update + try { + wait.until((com.google.common.base.Predicate) (d -> d + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0)); + } catch (UnreachableBrowserException e) { + } + Map playerScores = driver + .findElements( + By.cssSelector(".container .row .intro-message table tbody tr")) + .stream() + .collect(Collectors.toMap( + o -> o.findElement(By.xpath("td[1]")).getText().trim(), + o -> Integer.parseInt(o.findElement(By.xpath("td[2]")).getText()))); + // Assert + LinkedHashMap playerScoresList = sortByValue(playerScores); + + // TODO : finish + for (String key : playerScoresList.keySet()) { + System.out.println(key + ":\t" + playerScoresList.get(key)); + } + } + + // sorting example from + // http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java + public static > LinkedHashMap sortByValue( + Map map) { + return map.entrySet().stream() + .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (e1, e2) -> e1, LinkedHashMap::new)); + } + */ + + @Test(enabled = false) + public void test26() { + // Arrange + driver.get("http://suvian.in/selenium/3.6copyTextFromTextField.html"); + WebElement sourceElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message form textarea[name='field_one']")))); + assertThat(sourceElement, notNullValue()); + WebElement targetElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//div[@class = 'container']//div[@class = 'row']//div[@class = 'intro-message']//form/textarea[@name='field_two']")))); + assertThat(targetElement, notNullValue()); + + // Act + String text = sourceElement.getText(); + executeScript("arguments[0].removeAttribute('readonly');", sourceElement); + // arguments[0].removeAttribute('readonly',0) + sourceElement.clear(); + targetElement.sendKeys((CharSequence) text); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + String textValue = executeScript("return arguments[0].value;", + targetElement).toString(); + assertThat(textValue, containsString(text)); + System.err.println("value = " + textValue); + + assertThat(targetElement.getAttribute("value"), containsString(text)); + // Assert + try { + assertThat(targetElement.getText(), containsString(text)); + } catch (AssertionError e) { + System.err.println("Exception(ignoredd): " + e.toString()); + // new textArea value is not possible to retrieve with getText() + } + } + + @Test(enabled = false) + public void test27_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement inputElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//div[@class='intro-message']/ul[@id='tst']/li[.='India']/input[@type='radio' and @name='country']")))); + assertThat(inputElement, notNullValue()); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + String script = "var radios = document.getElementsByTagName('input');\n" + + "var checkedRadioItemNumber = 1; for (var cnt = 0; cnt < radios.length; cnt++) {\n" + + "if (radios[cnt].type === 'radio' && radios[cnt].checked) {\n" + + "checkedRadioItemNumber = cnt; }\n}\n" + + "var value = radios[checkedRadioItemNumber].value;" + + "return (checkedRadioItemNumber + 1).toString();"; + String checkedRadioItemNumber = executeScript(script).toString(); + System.err.println("Checked is Radio item #" + checkedRadioItemNumber); + WebElement itemElement = driver.findElement(By.xpath( + String.format("//ul[@id='tst']/li[%s]", checkedRadioItemNumber))); + assertThat(itemElement, notNullValue()); + System.err.println("Result : " + itemElement.getText()); + } + + @Test(enabled = false) + public void test27_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement itemList = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message ul#tst")))); + assertThat(itemList, notNullValue()); + // Act + + WebElement inputElement = itemList.findElements(By.tagName("li")).stream() + .filter(o -> o.getText().contains((CharSequence) "India")) + .map(o -> o + .findElement(By.xpath("input[@type='radio' and @name='country']"))) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + // https://docs.google.com/a/jazzteam.org/document/d/1PdfKMDfoqFIlF4tN1jKrOf1iZ1rqESy2xVMIj3uuV3g/pub + @Test(enabled = false) + public void test27_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement itemList = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message ul#tst")))); + assertThat(itemList, notNullValue()); + // Act + WebElement inputElement = itemList + .findElements(By.xpath( + "li[contains(text(), 'India')]//input[@type='radio' and @name='country']")) + .stream() + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + @Test(enabled = false) + public void test27_4() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + // Act + WebElement inputElement = driver + .findElements(By.xpath( + "//li[contains(text(), 'India')]//input[@type='radio' and @name='country']")) + .stream() + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + @Test(enabled = false) + public void test28_1() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + WebElement linkElement = driver.findElement(By.xpath( + "//table[@summary='Sample Table']/tbody/tr/td[text()='Taipei']/../descendant::a[@href='#']")); + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + @Test(enabled = false) + public void test28_2() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + WebElement linkElement = driver.findElement(By.xpath( + "//table[@summary='Sample Table']/tbody/tr[td/text()='Taipei']/descendant::a[@href='#']")); + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + @Test(enabled = false) + public void test28_3() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + Optional trylinkElement = driver + .findElements(By.xpath("//table[@summary='Sample Table']/tbody/tr")) + .stream() + .filter( + o -> o.findElements(By.xpath("td[text()='Taipei']")).size() != 0) + .map(o -> o.findElement(By.xpath("td/a[@href='#']"))).findFirst(); + WebElement linkElement = (trylinkElement.isPresent()) ? trylinkElement.get() + : null; + assertThat(linkElement, notNullValue()); + highlight(linkElement); + + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + /* + +

+ +
+
+ + "//li/section[span/text()='Credit Card']/../following-sibling::section/span[@name='edit']" + */ + + @Test(enabled = false) + public void test30() { + // Arrange + driver.get("http://suvian.in/selenium/3.10select1stFriday.html"); + + WebElement calendarElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message h4 input[name='calendar']")))); + int xOffset = calendarElement.getSize().getWidth() - 5; + int yOffset = calendarElement.getSize().getHeight() - 5; + System.err.println(String.format("Hover at (%d, %d)", xOffset, yOffset)); + + actions.moveToElement(calendarElement, xOffset, yOffset); + actions.build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + calendarElement.sendKeys("01/21/2017"); + actions.moveToElement(calendarElement, xOffset, yOffset).click().build() + .perform(); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // NOTE: unable to locate individual calendar dates elements with Selenium + // WebDriver + driver.findElements(By.xpath("//*[contains(@class,'calendar')]")).stream() + .forEach(o -> { + System.err.println(o.getAttribute("outerHTML")); + }); + try { + for (int i = 0; i != 8; i++) { + calendarElement.sendKeys(Keys.ARROW_RIGHT); + Thread.sleep(100); + } + } catch (InterruptedException e) { + } + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + } + // Assert + } + + // bad practice ? + // too much navigation and excessively detailed - possibly auto-generated - + // locators + // http://automated-testing.info/t/webdriver-java-ne-rabotaet-metod-click/13838/16 + @Test(enabled = false) + public void test31_1() { + // Arrange + driver.get( + "https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru"); + // Act + WebElement element = driver.findElement(By.xpath( + "//strong[text()='Пол']/following-sibling::div/div[@role='listbox'][1]")); + assertThat(element, notNullValue()); + highlight(element); + element.click(); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + } + element = wait.until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[text()='Мужской']/parent::div[@role='option']")))); + highlight(element); + element.click(); + + } + + // somewhat refactored + @Test(enabled = false) + public void test31_2() { + // Arrange + driver.get( + "https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru"); + // Act + + List elements = driver.findElements(By.xpath( + "//div/label[strong/text()='Пол']/div[@id='Gender']/div[@role='listbox']")); + assertThat(elements.get(0), notNullValue()); + WebElement element = elements.get(0); + highlight(element); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + } + element.click(); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + } + + element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.xpath("//div[@role='option'][div/text()='Мужской']")))); + highlight(element); + element.click(); + } + + // + @Test(enabled = false) + public void test32_1() { + // Arrange + driver.get( + "https://market.yandex.ru/catalog/54913/list?hid=90566&track=fr_ctlg&lr=0&local-offers-first=0&deliveryincluded=0&onstock=1"); + actions.moveToElement( + wait.until(ExpectedConditions.visibilityOf(driver.findElement(By + .xpath("//div[@class='n-filter-panel-aside__content']/div[4]"))))); + + // Act + List elements = driver.findElements(By.xpath( + "//div[@class='n-filter-panel-aside__content']/div[4]//span[@class='checkbox__box']/input[@type='checkbox']")); + assertTrue(elements.size() > 0); + assertThat(elements.get(0), notNullValue()); + for (WebElement element : elements) { + System.err + .println("Selecting the checkbox:\n" + element.getAttribute("id")); + actions.moveToElement(element); + element.sendKeys(Keys.SPACE); + try { + highlight(element, 100); + } catch (Exception e) { + System.err.println("highlight() Exception " + e.getMessage()); + // Exception Expected condition failed: waiting for visibility of + // element + } + try { + highlightNew(element, 100); + } catch (Exception e) { + System.err.println("highlightNew() Exception: " + e.getMessage()); + // Exception unknown command: session/.../element/.../rect + } + try { + element.click(); + } catch (Exception e) { + System.err.println("click() Exception: " + e.getMessage()); + // Element ... is not clickable at point ... Other element would receive + // the click + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + } + + @Test(enabled = false) + public void test32_2() { + // Arrange + driver.get( + "https://market.yandex.ru/catalog/54913/list?hid=90566&track=fr_ctlg&lr=0&local-offers-first=0&deliveryincluded=0&onstock=1"); + actions.moveToElement( + wait.until(ExpectedConditions.visibilityOf(driver.findElement(By + .xpath("//div[@class='n-filter-panel-aside__content']/div[4]"))))); + + // Act + List elements = driver.findElements(By.xpath( + "//div[@class='n-filter-panel-aside__content']/div[4]//span[span/@class='checkbox__box']/label[@class='checkbox__label']")); + System.err.println("Elements size=" + elements.size()); + assertThat(elements.get(0), notNullValue()); + for (WebElement element : elements) { + actions.moveToElement(element); + highlight(element); + System.err.println("Click on label:" + element.getAttribute("for")); + element.click(); + try { + element.sendKeys(Keys.SPACE); + } catch (Exception e) { + // unknown error: cannot focus element + System.err.println("sendKeys() Exception " + e.getMessage()); + } + } + } + + // + @Test(enabled = true) + public void test33_1() { + // Arrange + driver.get("https://datatables.net/examples/api/form.html"); + String table_id = "example"; + + WebElement table_element; + try { + table_element = wait.until( + ExpectedConditions.visibilityOfElementLocated(By.id(table_id))); + } catch (RuntimeException timeoutException) { + return; + } + String text_input_css_selector = "input[id='row-5-age']"; + WebElement text_input_element = table_element + .findElement(By.cssSelector(text_input_css_selector)); + actions.moveToElement(text_input_element).build().perform(); + String cell_text = "Software Developer"; + text_input_element.clear(); + // https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/Keys.html + text_input_element.sendKeys(Keys.chord(Keys.BACK_SPACE, Keys.BACK_SPACE, + Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE)); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + text_input_element.sendKeys(Keys.chord("20", org.openqa.selenium.Keys.TAB, + cell_text, org.openqa.selenium.Keys.ENTER)); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + } + + @Test(enabled = true) + public void test33_2() { + + // Go to base url + driver.get("https://datatables.net/examples/api/highlight.html"); + + // Maximize Window + driver.manage().window().maximize(); + + String table_id = "example"; + WebElement table_element; + + try { + wait.until( + ExpectedConditions.visibilityOfElementLocated(By.id(table_id))); + } catch (RuntimeException timeoutException) { + return; + } + // http://stackoverflow.com/questions/6198947/how-to-get-text-from-each-cell-of-an-html-table + String script = "var table_row_locator = 'div#example_wrapper table#example tbody tr';\n" + + "var rows = document.querySelectorAll(table_row_locator);\n" + + "var result = [];\n" + + "for (row_cnt = 0; row_cnt != rows.length; row_cnt++) {\n" + + "var row = rows[row_cnt];\n" + "if (row instanceof Element) {\n" + + "var cols = row.querySelectorAll('td');\n" + + "var check_col_num = 1;\n" + "var data_col_num = 0;\n" + + "if (cols[check_col_num].innerHTML.match(/^Software.*/ig)) {\n" + + "result.push(cols[data_col_num].innerHTML);\n" + "}\n" + "}\n" + "}\n" + + "return result.join();\n"; + + System.out.println( + String.format("Script: '%s'\nResult: '%s'", script, storeEval(script))); + + // NOTE: Works in IDE, does not work with WebDriver + script = String.format("(function() { %s })();", script); + System.out.println( + String.format("Script: '%s'\nResult: '%s'", script, storeEval(script))); + + table_element = driver.findElement(By.id(table_id)); + // NOTE: no leading slash in XPath + List rows = table_element.findElements(By.xpath("tbody/tr")); + System.out.println("NUMBER OF ROWS IN THIS TABLE = " + rows.size()); + int row_num, cell_num, max_rows; + max_rows = 3; + row_num = 1; + String row_role_attribute = "row"; + for (WebElement row : rows) { + if (row_num > max_rows) { + break; + } + assertTrue( + // String.format("Unexpected title '%s'", row.getAttribute("role")), + row.getAttribute("role").matches(row_role_attribute)); + cell_num = 1; + List cells = row.findElements(By.xpath("td")); + String checkColumn = cells.get(cell_num).getText(); + // System.out.println(checkColumn); + if (checkColumn.matches("Software.*")) { + // System.out.println("NUMBER OF COLUMNS=" + cells.size()); + cell_num = 1; + for (WebElement cell : cells) { + // Hover over cell + actions.moveToElement(cell).build().perform(); + highlight(cell); + System.out.println(String.format("row # %d, col # %d text='%s'", + row_num, cell_num, cell.getText())); + cell_num++; + } + row_num++; + } + } + } + + // Utils + + private String storeEval(String script) { + String result = null; + if (driver instanceof JavascriptExecutor) { + System.out.println("running the script"); + result = (String) ((JavascriptExecutor) driver).executeScript(script); + } + return result; + } + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + private void highlightNew(WebElement element, long highlight_interval) { + Rectangle elementRect = element.getRect(); + String highlightScript = getScriptContent("highlight.js"); + // append calling + + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format( + "%s\nhighlight_create(arguments[0],arguments[1],arguments[2],arguments[3]);", + highlightScript), + elementRect.y, elementRect.x, elementRect.width, + elementRect.height); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format("%s\nhighlight_remove();", highlightScript)); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + + } + + private boolean areElementsPresent(WebElement parentWebElement, + By byLocator) { + return parentWebElement.findElements(byLocator).size() == 1; + // usage: + // assertTrue(areElementsPresent(driver.findElements(By.cssSelector("li[class*= + // product]")).get(0), By.cssSelector("[class*=sticker]"))); + } + + public boolean isGreaterThen(String a, String b) { + return a.compareTo(b) < 0; + // usage: + // List rows = + // table.findElements(By.cssSelector("td:nth-of-type(5)>a")); + // + // for (int i = 0; i prefs = new HashMap<>(); + prefs.put("profile.default_content_settings.popups", 0); + // Put this into prefs map to switch off browser notification + prefs.put("profile.default_content_setting_values.notifications", 2); + // Put this into prefs map to switch off save password notification + prefs.put("credentials_enable_service", false); + prefs.put("profile.password_manager_enabled", false); + String downloadPath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + prefs.put("download.default_directory", downloadPath); + prefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", prefs); + + for (String optionAgrument : (new String[] { + "--allow-running-insecure-content", "--allow-insecure-localhost", + "--enable-local-file-accesses", "--disable-notifications", + /* "start-maximized" , */ + "--browser.download.folderList=2", "--disable-web-security", + "--no-proxy-server", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("--browser.download.dir=%s", downloadPath) + /* "--user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + + } else if (browser.equals("firefox")) { + // TODO: Observed user agent problem with firefox - mobile version of + // tripadvisor is rendered + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + wait = new WebDriverWait(driver, flexible_wait_interval); + wait.pollingEvery(wait_polling_interval, TimeUnit.MILLISECONDS); + driver.get(baseURL); + driver.manage().timeouts().implicitlyWait(implicit_wait_interval, + TimeUnit.SECONDS); + } + + @AfterSuite + public static void tearDown() throws Exception { + driver.close(); + driver.quit(); + if (verificationErrors.length() != 0) { + throw new Exception(verificationErrors.toString()); + } + } + + @BeforeMethod + public void loadBaseURL() { + driver.get(baseURL); + } + + @Test(enabled = true) + public void test1() { + assertEquals("Hotels", findElement("link_text", "Hotels").getText()); + } + + @Test(enabled = true) + public void test2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = xpathOfElement(element); + assertEquals("//div[@id=\"HEAD\"]/div/div[2]/ul/li/span/a", selector); + element = findElement("xpath", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test3_1() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElement(element); + System.err.println("test 2: CssSelector: " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + // without class attributes: + // "div#HEAD > div > div:nth-of-type(2) > ul > li > span > a" + try { + element = findElement("css_selector", selector); + highlight(element); + } catch (NullPointerException e) { + verificationErrors.append("test 2: " + e.toString()); + } + } + + @Test(enabled = true) + public void test3_2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElement(element); + System.err.println("test 2: CssSelector: " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test4_1() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + System.err.println("test 3: Css Selector (alternative) : " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + // without class attributes: + // "div#HEAD > div > div:nth-of-type(2) > ul > li > span > a" + try { + element = findElement("css_selector", selector); + highlight(element); + } catch (NullPointerException e) { + verificationErrors.append("test 3: " + e.toString()); + } + } + + @Test(enabled = true) + public void test4_2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + System.err.println("test 3: Css Selector (alternative) : " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test5() { + WebElement element = findElement("css_selector", "input#mainSearch"); + assertEquals("input#mainSearch", cssSelectorOfElement(element)); + assertEquals("input#mainSearch", cssSelectorOfElementAlternative(element)); + highlight(element); + } + + @Test(enabled = true) + public void test6() { + WebElement element = findElement("css_selector", "span#rdoFlights") + .findElement(By.cssSelector("div span.label")); + assertEquals("span#rdoFlights > div.header > span.label", + cssSelectorOfElement(element)); + highlight(element); + } + + @Test(enabled = true) + public void test7() { + WebElement element = findElement("id", "searchbox"); + assertEquals("input#searchbox", cssSelectorOfElement(element)); + highlight(element); + } + + @Test(enabled = true) + public void test8() { + WebElement element = findElement("id", "searchbox") + .findElement(By.xpath("..")); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + // System.err.println("test 7: selector (alternative):\n" + selector); + assertEquals( + "form#PTPT_HAC_FORM > div.metaFormWrapper > div.metaFormLine.flex > label.ptptLabelWrap", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + // @Ignore + @SuppressWarnings("static-access") + @Test(enabled = true) + public void test9() { + + WebElement element = findElement("link_text", "Hotels"); + assertThat(element, notNullValue()); + highlight(element); + String style = styleOfElement(element); + System.err.println("style:\n" + style); + String colorAttribute = styleOfElement(element, "color"); + String heightAttribute = styleOfElement(element, "height"); + String widthAttribute = styleOfElement(element, "width"); + + // assertions of certain CSS attributes + try { + assertTrue(colorAttribute.equals("rgb(255, 255, 255)")); + } catch (AssertionError e) { + // slurp + } + // pattern = Pattern.compile("\\((\\d+),"); + matcher = Pattern.compile("\\((\\d+),").matcher(colorAttribute); + if (matcher.find()) { + int red = Integer.parseInt(matcher.group(1).toString()); + assertTrue(red > 254); + } + System.err.println("color:" + colorAttribute); + + try { + assertTrue(widthAttribute.equals("36.6667px")); // fragile ! + } catch (AssertionError e) { + // slurp + } + pattern = Pattern.compile("([\\d\\.]+)px"); + matcher = pattern.matcher(widthAttribute); + if (matcher.find()) { + Float mask = new Float("20.75f"); + Float width = mask.parseFloat(matcher.group(1).toString()); + assertTrue(width > 36.5); + } + System.err.println("width:" + widthAttribute); + + System.err.println("examine height attribute: " + heightAttribute); + // broken after 431eac6a3baa + // assertTrue(height.equals("12px")); + // print css values + // System.err.println("height:" + heightAttribute); + } + + // Utils + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + private String cssSelectorOfElement(WebElement element) { + return (String) executeScript(getScriptContent("cssSelectorOfElement.js"), + element); + } + + private String styleOfElement(WebElement element, Object... arguments) { + return (String) executeScript(getScriptContent("getStyle.js"), element, + arguments); + } + + private String cssSelectorOfElementAlternative(WebElement element) { + return (String) executeScript( + getScriptContent("cssSelectorOfElementAlternative.js"), element); + } + + private void highlight(WebElement element) { + highlight(element, highlight_interval); + } + + private static void highlight(WebElement element, long highlight) { + try { + wait.until(ExpectedConditions.visibilityOf(element)); + executeScript("arguments[0].style.border='3px solid yellow'", + new Object[] { element }); + Thread.sleep(highlight); + executeScript("arguments[0].style.border=''", new Object[] { element }); + + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + private String xpathOfElement(WebElement element) { + return (String) executeScript(getScriptContent("xpathOfElement.js"), + new Object[] { element }); + } + + public static Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); // a.k.a. (JavascriptExecutor) driver; + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + private List findElements(String selectorKind, + String selectorValue, WebElement parent) { + SearchContext finder; + String parent_css_selector = null; + String parent_xpath = null; + + List elements = null; + Hashtable selectorStrategies = new Hashtable(); + selectorStrategies.put("css_selector", true); + selectorStrategies.put("xpath", true); + + if (selectorKind == null || !selectorStrategies.containsKey(selectorKind) + || !selectorStrategies.get(selectorKind)) { + return null; + } + if (parent != null) { + parent_css_selector = cssSelectorOfElement(parent); + parent_xpath = xpathOfElement(parent); + finder = parent; + } else { + finder = driver; + } + + if (selectorKind == "css_selector") { + String extended_css_selector = String.format("%s %s", + parent_css_selector, selectorValue); + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.cssSelector(extended_css_selector))); + } catch (RuntimeException timeoutException) { + return null; + } + elements = finder.findElements(By.cssSelector(selectorValue)); + } + if (selectorKind == "xpath") { + String extended_xpath = String.format("%s/%s", parent_xpath, + selectorValue); + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.xpath(extended_xpath))); + } catch (RuntimeException timeoutException) { + return null; + } + elements = finder.findElements(By.xpath(selectorValue)); + } + return elements; + } + + private List findElements(String selectorKind, + String selectorValue) { + return findElements(selectorKind, selectorValue, null); + } + + private WebElement findElement(String selectorKind, String selectorValue) { + WebElement element = null; + Hashtable selectorStrategies = new Hashtable(); + selectorStrategies.put("id", true); + selectorStrategies.put("css_selector", true); + selectorStrategies.put("xpath", true); + selectorStrategies.put("partial_link_text", false); + selectorStrategies.put("link_text", true); + selectorStrategies.put("classname", false); + + if (selectorKind == null || !selectorStrategies.containsKey(selectorKind) + || !selectorStrategies.get(selectorKind)) { + return null; + } + if (selectorKind == "id") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.id(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.id(selectorValue)); + } + if (selectorKind == "classname") { + + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.className(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.className(selectorValue)); + } + if (selectorKind == "link_text") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.linkText(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.linkText(selectorValue)); + } + if (selectorKind == "css_selector") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.cssSelector(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.cssSelector(selectorValue)); + } + if (selectorKind == "xpath") { + + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.xpath(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.xpath(selectorValue)); + } + return element; + } + + protected static String getScriptContent(String scriptName) { + try { + final InputStream stream = TripAdvisorTest.class.getClassLoader() + .getResourceAsStream(scriptName); + final byte[] bytes = new byte[stream.available()]; + stream.read(bytes); + return new String(bytes, "UTF-8"); + } catch (IOException e) { + throw new RuntimeException("Cannot load file: " + scriptName); + } + } + + public static void waitForElementVisible(By locator) { + log.info("Waiting for element visible for locator: {}", locator); + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + } + + public static void waitForElementVisible(By locator, long timeout) { + log.info("Waiting for element visible for locator: {}", locator); + WebDriverWait wait = new WebDriverWait(driver, timeout); + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + } + + public static void waitForElementPresent(By locator) { + log.info("Waiting for element present for locator: {}", locator); + wait.until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + public static void waitForElementPresent(By locator, long timeout) { + log.info("Waiting for element present for locator: {}", locator); + WebDriverWait wait = new WebDriverWait(driver, timeout); + wait.until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + public static void waitForPageLoad() { + log.info("Wait for page load via JS..."); + String state = ""; + int counter = 0; + + do { + try { + state = (String) ((JavascriptExecutor) driver) + .executeScript("return document.readyState"); + Thread.sleep(1000); + } catch (Exception e) { + e.printStackTrace(); + } + counter++; + log.info(("Browser state is: " + state)); + } while (!state.equalsIgnoreCase("complete") && counter < 20); + + } + + public static boolean isAttributePresent(By locator, String attribute) { + log.info("Is Attribute Present for locator: {}, attribute: {}", locator, + attribute); + return driver.findElement(locator).getAttribute(attribute) != null; + } + + public static void selectDropdownByIndex(By locator, int index) { + log.info("Select Dropdown for locator: {} and index: {}", locator, index); + try { + Select select = new Select(driver.findElement(locator)); + select.selectByIndex(index); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static String getBaseURL() { + // TODO: somehow browser is set to mobile + // if the next line is commented + System.err.println("Get base URL: " + driver.getCurrentUrl()); + log.info("Get base URL: {}", driver.getCurrentUrl()); + String currentURL = driver.getCurrentUrl(); + String protocol = null; + String domain = null; + + try { + URL url = new URL(currentURL); + protocol = url.getProtocol(); + domain = url.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // System.err.println("Returning: " + protocol + "://" + domain); + return protocol + "://" + domain; + } + + public static void clickJS(By locator) { + log.info("Clicking on locator via JS: {}", locator); + wait.until( + ExpectedConditions.elementToBeClickable(driver.findElement(locator))); + ((JavascriptExecutor) driver).executeScript("arguments[0].click();", + driver.findElement(locator)); + } + + public static void scrollIntoView(By locator) { + log.info("Scrolling into view: {}", locator); + ((JavascriptExecutor) driver).executeScript( + "arguments[0].scrollIntoView(true);", driver.findElement(locator)); + } + + public static void mouseOver(By locator) { + log.info("Mouse over: {}", locator); + actions.moveToElement(driver.findElement(locator)).build().perform(); + } + + public static void click(By locator) { + log.info("Clicking: {}", locator); + driver.findElement(locator).click(); + } + + public static void clear(By locator) { + log.info("Clearing input: {}", locator); + driver.findElement(locator).clear(); + } + + public static void sendKeys(By locator, String text) { + log.info("Typing \"{}\" into locator: {}", text, locator); + driver.findElement(locator).sendKeys(text); + } + + public static String getText(By locator) { + String text = driver.findElement(locator).getText(); + log.info("The string at {} is: {}", locator, text); + return text; + } + + public static String getAttributeValue(By locator, String attribute) { + String value = driver.findElement(locator).getAttribute(attribute); + log.info("The attribute \"{}\" value of {} is: {}", attribute, locator, + value); + return value; + } + + public static boolean isElementVisible(By locator) { + try { + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + log.info("Element {} is visible", locator); + return true; + } catch (Exception e) { + log.info("Element {} is not visible", locator); + return false; + } + } + + // custom wait while Login Lightbox is visible + + public static void waitWhileElementIsVisible(By locator) { + final By locatorFinal = locator; + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver o) { + return (o.findElements(locatorFinal).size() == 0); + } + }); + } + + public static boolean isElementNotVisible(By locator) { + try { + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + log.info("Element {} is visible", locator); + return false; + } catch (Exception e) { + log.info("Element {} is not visible", locator); + return true; + } + } + + public static String getBodyText() { + log.info("Getting boby text"); + return driver.findElement(By.tagName("body")).getText(); + } + + public static void highlight(By locator) throws InterruptedException { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } +} diff --git a/ui4j_test/src/main/java/com/mycompany/app/HubConfigurator.java.txt b/ui4j_test/src/main/java/com/mycompany/app/HubConfigurator.java.txt new file mode 100644 index 000000000..2e2320445 --- /dev/null +++ b/ui4j_test/src/main/java/com/mycompany/app/HubConfigurator.java.txt @@ -0,0 +1,64 @@ +package com.mycompany.app; + +import org.openqa.grid.common.GridRole; +import org.openqa.grid.common.RegistrationRequest; +import org.openqa.grid.internal.utils.GridHubConfiguration; +import org.openqa.grid.internal.utils.SelfRegisteringRemote; +import org.openqa.grid.selenium.proxy.DefaultRemoteProxy; +import org.openqa.grid.web.Hub; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.server.SeleniumServer; + +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +// origin: https://groups.google.com/forum/#!topic/selenium-users/JDBr7LRPulw +// http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.grid.internal.utils.GridHubConfigurations +public class HubConfigurator { + public static void main(String[] args) throws Exception { + String strIP = "localhost"; + + GridHubConfiguration config = new GridHubConfiguration(); + config.setTimeout(30000000); + config.setPort(4444); + config.setHost(strIP); + + Hub hub = new Hub(config); + hub.start(); + RegistrationRequest req = new RegistrationRequest(); + req.setRole(GridRole.NODE); + Map nodeConfiguration = new HashMap<>(); + nodeConfiguration.put(RegistrationRequest.PROXY_CLASS, + DefaultRemoteProxy.class.getName()); + + nodeConfiguration.put(RegistrationRequest.MAX_SESSION, 5); + nodeConfiguration.put(RegistrationRequest.PORT, 5555); + nodeConfiguration.put(RegistrationRequest.HOST, 4444); + nodeConfiguration.put(RegistrationRequest.AUTO_REGISTER, true); + nodeConfiguration.put(RegistrationRequest.REGISTER_CYCLE, 5000); + nodeConfiguration.put(RegistrationRequest.HUB_HOST, "localhost"); + nodeConfiguration.put(RegistrationRequest.HUB_PORT, 4444); + nodeConfiguration.put("remoteHost", "http://" + strIP + ":5555"); + nodeConfiguration.put("url", "http://" + strIP + ":5555"); + + nodeConfiguration.put("role", "node"); + nodeConfiguration.put("hub", "http://localhost:4444/grid/register"); + URL remoteURL = new URL("http://" + strIP + ":5555"); + nodeConfiguration.put(RegistrationRequest.REMOTE_HOST, + remoteURL.toExternalForm()); + + req.setConfiguration(nodeConfiguration); + DesiredCapabilities capabilities2 = DesiredCapabilities.chrome(); + capabilities2.setCapability("browserName", "chrome"); + capabilities2.setCapability("platform", "MAC"); + capabilities2.setCapability("ensureCleanSession", "true"); + capabilities2.setCapability("maxInstances", 5); + req.addDesiredCapability(capabilities2); + SelfRegisteringRemote remote = new SelfRegisteringRemote(req); + remote.setRemoteServer(new SeleniumServer(req.getConfiguration())); + remote.startRemoteServer(); + remote.startRegistrationProcess(); + Thread.currentThread().join(); + } +} \ No newline at end of file diff --git a/ui4j_test/src/main/java/com/mycompany/app/JSWaiter.java b/ui4j_test/src/main/java/com/mycompany/app/JSWaiter.java new file mode 100644 index 000000000..2f04140bd --- /dev/null +++ b/ui4j_test/src/main/java/com/mycompany/app/JSWaiter.java @@ -0,0 +1,142 @@ +package com.mycompany.app; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.WebDriverWait; + +// based on: https://github.com/TsvetomirSlavov/JavaScriptForSeleniumMyCollection + +public class JSWaiter { + + private WebDriver driver; + private WebDriverWait wait; + private JavascriptExecutor javascriptExecutor; + + private Object executeScript(String script, Object... arguments) { + return this.javascriptExecutor.executeScript(script, arguments); + } + + // Get the driver + public void setDriver(WebDriver driver) { + this.driver = driver; + this.wait = new WebDriverWait(this.driver, 10); + if (driver instanceof JavascriptExecutor) { + this.javascriptExecutor = JavascriptExecutor.class.cast(driver); // a.k.a. + // (JavascriptExecutor) + // driver; + } else { + throw new RuntimeException("Script execution failed."); + } + } + + public void waitForJQueryLoad() { + + ExpectedCondition jQueryLoad = driver -> ((Long) ((JavascriptExecutor) driver) + .executeScript("return jQuery.active") == 0); + + // Get JQuery is Ready + if (!((Boolean) executeScript("return jQuery.active==0"))) { + System.out.println("JQuery is NOT Ready!"); + // Wait for jQuery to load + this.wait.until(jQueryLoad); + } else { + System.out.println("JQuery is Ready!"); + } + } + + public void waitForAngularLoad() { + + ExpectedCondition angularLoad = driver -> Boolean + .valueOf(((JavascriptExecutor) driver) + .executeScript( + "return angular.element(document).injector().get('$http').pendingRequests.length === 0") + .toString()); + + boolean angularReady = Boolean.valueOf(executeScript( + "return angular.element(document).injector().get('$http').pendingRequests.length === 0") + .toString()); + + if (!angularReady) { + System.out.println("ANGULAR is NOT Ready!"); + this.wait.until(angularLoad); + } else { + System.out.println("ANGULAR is Ready!"); + } + } + + public void waitUntilJSReady() { + ExpectedCondition jsLoad = driver -> ((JavascriptExecutor) driver) + .executeScript("return document.readyState").toString() + .equals("complete"); + + boolean jsReady = (Boolean) executeScript("return document.readyState") + .toString().equals("complete"); + + if (!jsReady) { + System.out.println("JS in NOT Ready!"); + wait.until(jsLoad); + } else { + System.out.println("JS is Ready!"); + } + } + + public void waitUntilJQueryReady() { + // First check that JQuery is defined on the page. If it is, then wait AJAX + Boolean jQueryDefined = (Boolean) executeScript( + "return typeof jQuery != 'undefined'"); + if (jQueryDefined == true) { + sleep(20); + + waitForJQueryLoad(); + waitUntilJSReady(); + + sleep(20); + } else { + System.out.println("jQuery is not defined on this site!"); + } + } + + // Wait Until Angular and JS Ready + public void waitUntilAngularReady() { + Boolean angularUnDefined = (Boolean) executeScript( + "return window.angular === undefined"); + if (!angularUnDefined) { + Boolean angularInjectorUnDefined = (Boolean) executeScript( + "return angular.element(document).injector() === undefined"); + if (!angularInjectorUnDefined) { + // Pre Wait for stability (Optional) + sleep(20); + + // Wait Angular Load + waitForAngularLoad(); + + // Wait JS Load + waitUntilJSReady(); + + // Post Wait for stability (Optional) + sleep(20); + } else { + System.out.println("Angular injector is not defined on this site!"); + } + } else { + System.out.println("Angular is not defined on this site!"); + } + } + + // Wait Until JQuery Angular and JS is ready + public void waitJQueryAngular() { + waitUntilJQueryReady(); + waitUntilAngularReady(); + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/ui4j_test/src/main/java/com/mycompany/app/fireFoxBrowseStart.java b/ui4j_test/src/main/java/com/mycompany/app/fireFoxBrowseStart.java new file mode 100644 index 000000000..b94b4b012 --- /dev/null +++ b/ui4j_test/src/main/java/com/mycompany/app/fireFoxBrowseStart.java @@ -0,0 +1,196 @@ +package com.mycompany.app; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import java.util.concurrent.TimeUnit; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.IOException; +import java.io.InputStream; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.hamcrest.CoreMatchers; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class fireFoxBrowseStart { + private static WebDriver driver; + private static WebDriverWait wait; + private static Actions actions; + private static Predicate hasClass; + private static Predicate hasAttr; + private static Predicate hasText; + private static int flexibleWait = 5; + private static int implicitWait = 1; + private static long pollingInterval = 500; + private static String baseUrl = "http://antenna.io/demo/jquery-bar-rating/examples/"; + private static String osName; + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + public static void main(String[] args) throws Exception { + getOsName(); + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System.setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") + ? new File("c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + driver = new FirefoxDriver(); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + actions = new Actions(driver); + resetBrowser(); + loadPage(); + test(); + afterSuiteMethod(); + } + + public static void afterSuiteMethod() throws Exception { + driver.quit(); + } + + public static void loadPage() { + driver.get(baseUrl); + } + + public static void resetBrowser() { + driver.get("about:blank"); + } + + public static void test() { + // Arrange + // Act + WebElement bar = driver.findElement(By.cssSelector( + "section.section-examples div.examples div.box-example-square div.box-body div.br-theme-bars-square")); + assertTrue( + bar.findElements(By.xpath("//a[@data-rating-value]")).size() > 7); + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); // NOTE: relative + // xpath selector + assertTrue(ratingElements.size() > 0); + // TODO: test that result set elements are unique ? + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + // + ratings.keySet().stream().forEach(o -> { + System.err.println("Mouse over rating: " + o); + WebElement r = ratings.get(o); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + }); + // Assert + } + + private static void highlight(WebElement element) { + highlight(element, 100); + } + + private static void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + "arguments[0].style.border='3px solid yellow'", element); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border=''", element); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } +} \ No newline at end of file diff --git a/ui4j_test/src/main/resources/chrome_automation_extension.png b/ui4j_test/src/main/resources/chrome_automation_extension.png new file mode 100644 index 0000000000000000000000000000000000000000..63fa91a0e44d9a20c7561690947226582393a949 GIT binary patch literal 629 zcmV-*0*d{KP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&0t!h)K~z{r?Uu=k z!axv)=l$QseZzzM0(x-44HXqc6qkbrQExT;1r^$ujv3G-137$jI;m9ssjjZhk6{=T zG(u5s2}QZZQPkyfVb15X7O`<_XBWrH|I5_zc%NG6uz?A zY;w?SHcPo&&P3+AQNSGU!w>wa{&l<+g|CJ4OeXU}I-PzJA=mOu>~If$zAj3FVvNON z6pcoiNF+k>c>KxM6Hy{4nN0H7@AqjwpEHZaf_l9krBW%=-m^?WP@zzu)9FNq!+{GK zg}z)aS)2$4Ul)ZeAq%*NX1HFjDUnF{LWF{HgwR z{5ey|41l2he(znT-qjQe89VHHy_(Nd;o##nL1;297W+c07$nEv2kl>7stx~%amV)qTCXSa)&{`*&6Yp%|*QN P00000NkvXXu0mjfN}(HZ literal 0 HcmV?d00001 diff --git a/ui4j_test/src/main/resources/chropath.png b/ui4j_test/src/main/resources/chropath.png new file mode 100644 index 0000000000000000000000000000000000000000..c8591b3eabb21b4afc76db2d8b44945477e8321c GIT binary patch literal 738 zcmV<80v-K{P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&0(VJ7K~zXf?UT!E z6Hye03qp&o)rD1?Mk9GY8eJ$t6kI6iqFq?gv>V%+#5Q$dwImBs6thU8hOVQ<{sDqT zK?F4_D#eXy6VNPEgC?1o4EP`|`FZb+2~IN;V+ab8fsZ?!nR~uDXU^>qMG=3CwyY(z zWi6p4vO=LyMeccpe_xqU5Wy3KpZ9_wRH=M@WzFaFSV|<2OePUuT&!DNQs zTrM{(RvYvN18zkkEUqN1k>vyt!4KbY`TaLsqU*y21pF6qWpSM90#D)>6t7T3bB1W&r9;iAzPW6 zNID+@4?Y23imTv@D-c$Isq<4%^{QdESfMwX5Db<@9LGs=D4{6pBC=S%1b|q`l_OJk z%IQRps+WmqRX(2|xm-@NzaFw}+)3KFfwXboi&Y$Y3mkbaz;U!6Tf4WwX5Wp$!4u^+ zlK(Y5?UU@UM{Q*s84xlQU9ZanvhE&-%?AgdQEi9G(udhQv&fQ(obXPv3XLW+Jmcd? zr_+)=a@5GOyod|&ukgGp!ug7W_V967)IBiU?1)CA)%WOOz8(m`>-Az}bPV_B=UKeD zLrpe$hEGDL*#Rw?z-aU~i_@w5-H0n8kwRs-m?AmWpYtk+G-9 zRu-9=fpcgGr$ texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + + System.err.println( + String.format("test1 (1): %s => %s ", text, escapeXPath(text))); + System.err.println( + String.format("test1 (2): %s => %s ", text, escapeXPath2(text))); + /* System.err.println( + String.format("test1 (2): %s => %s ", text, escapeXPath3(text))); + */ + try { + List elements1 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath(text)))); + assertTrue(elements1.size() > 0); + highlight(elements1.get(0)); + List elements2 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath2(text)))); + assertTrue(elements2.size() > 0); + highlight(elements2.get(0)); + /* List elements3 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath3(text)))); + assertTrue(elements3.size() > 0); + highlight(elements3.get(0)); + */ + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + + } catch (InvalidSelectorException e) { + // ignore + // InvalidSelectorError: + // Unable to locate an element with the xpath expression + // //*[contains(text(), '""Burj"" ''Khalifa'')] because of the following + // error: + // SyntaxError: The expression is not a legal expression. + System.err.println("Test1 Ignored: " + e.toString()); + } + } + } + + // origin: + // https://saucelabs.com/resources/articles/selenium-tips-css-selectors + // NOTE: all failing + @Test(enabled = false) + public void test2() { + ArrayList texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + System.err.println(String.format("test2: %s", text)); + + try { + List elements = driver.findElements( + By.cssSelector(String.format("th:contains('%s')", text))); + assertTrue(elements.size() > 0); + highlight(elements.get(0)); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + + } catch (InvalidSelectorException e) { + // ignore + // InvalidSelectorError: + // Unable to locate an element with the xpath expression + // //*[contains(text(), '""Burj"" ''Khalifa'')] because of the following + // error: + // SyntaxError: The expression is not a legal expression. + System.err.println("Test2 Ignored: " + e.toString()); + } + } + } + + @Test(enabled = true) + public void test3() { + ArrayList texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + System.err.println(String.format("test3: %s", text)); + + Optional element = driver + .findElements(By.cssSelector("th[scope='row']")).stream() + .filter(o -> { + String t = o.getText(); + // System.err.println("in stream filter (3): Text = " + t); + return (Boolean) (t.contains(text)); + }).findFirst(); + + assertTrue(element.isPresent()); + highlight(element.get()); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + + } + } + + // https://sqa.stackexchange.com/questions/362/a-way-to-match-on-text-using-css-locators + // requires jQuery + public static WebElement findByText(WebDriver driver, + String cssSelectorParent, String text) { + WebElement parent = driver.findElement(By.cssSelector(cssSelectorParent)); + Object element = ((JavascriptExecutor) driver).executeScript(String.format( + "var x = $(arguments[0]).find(\":contains('%s')\"); return x;", text), + parent); + return (WebElement) element; + } + + public static Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); // a.k.a. (JavascriptExecutor) driver; + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + public static void highlight(WebElement element) { + if (wait == null) { + wait = new WebDriverWait(driver, flexible_wait_interval); + wait.pollingEvery(wait_polling_interval, TimeUnit.MILLISECONDS); + } + try { + wait.until(ExpectedConditions.visibilityOf(element)); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + public static void highlight(By locator) throws InterruptedException { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } + + // origin: https://groups.google.com/forum/#!topic/selenium-users/sTWcaVbnU6c + + public static String toHexStr(byte b) { + String str = "0x" + String.format("%02x", b); + return str; + } + + private static String replaceSpecials() { + // http://utf8-chartable.de/unicode-utf8-table.pl?start=8064&names=-&utf8=0x + String pageSource = ""; + pageSource = driver.getPageSource(); + byte[] allBytes = null; + try { + allBytes = pageSource.getBytes("UTF-8"); + } catch (UnsupportedEncodingException ex) { + ex.printStackTrace(); + } + + String translate = ""; + for (int i = 0; i < allBytes.length; i++) { + // newBytes[i + offset] = allBytes[i]; + + if (allBytes[i] == ((byte) 0xE2)) { + // System.out.println(String.format("0xE2%s%s " , toHexStr(allBytes[i + + // 1]), " " + toHexStr(allBytes[i + 2]))); + switch (allBytes[i + 2]) { + case (byte) 0x98: // opening single quote + case (byte) 0x99: // closing single quote + translate += "'"; + i += 2; + break; + case (byte) 0x94: // dash, also 0xe292, 0xe293 + translate += "-"; + i += 2; + break; + case (byte) 0x9c: // opening double quote + case (byte) 0x9d: // closing double quote + translate += "\""; + i += 2; + break; + } + } else { + translate += (char) allBytes[i]; + } + } + + // pageSource = translate; + return translate; + } + + // origin: + // https://stackoverflow.com/questions/642125/encoding-xpath-expressions-with-both-single-and-double-quotes + // alternative: use java.text.Normalizer + // alternative: use built-in xpath translate function e.g. + // "//*[contains(translate(@name,'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu'),'converted')]" + // possibly a better way yet is to use streams to query XML node texts in a + // way that allows one to compare the value of interest directly. + // not relying on possibly fragile XPath composition, but the purpose is the + // same + /** + * Escapes the quote characters inside the text condition in an XPath expression. + * Because there is no escape character in XPath string values, this method is not really escapes passed string, but + * breaks it into pars and uses XPath concat function. + * + * @param value String to escape. + * @return Escaped value. + */ + + public static String escapeXPath(@Nullable String string) { + if (string == null) { + return null; + } else if (string.contains("'")) { + StringBuilder sb = new StringBuilder(); + sb.append("concat('"); + + for (int i = 0; i < string.length(); i++) { + char ch = string.charAt(i); + if ('\'' == ch) { + sb.append("',\"").append(ch).append("\",'"); + } else { + sb.append(ch); + } + } + + sb.append("')"); + return sb.toString(); + } else { + return "'" + string + "'"; + } + } + + // shorter version of escapeXPath + public static String escapeXPath2(@Nullable String value) { + if (!value.contains("'")) + return '\'' + value + '\''; + else if (!value.contains("\"")) + return '"' + value + '"'; + else + return "concat('" + value.replace("'", "',\"'\",'") + "')"; + } + + // one can escape quotes and apostrophes in XPath 2.0 by doubling them, but + // there is no way of doing it in XPath 1.0. + // NOTE: does not work + public static String escapeXPath3(@Nullable String value) { + return "'" + value.replace("'", "''").replace("\"", "\"\""); + } + + // alternative: use built-in xpath translate function e.g. + // "//*[contains(translate(@name,'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu'),'converted')]" + // other XPath 2.0 Solutions + // "//*/text()[contains(lower-case(.),'test')]" + // "//*/text()[matches(.,'test', 'i')]" + // "//*/text()[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'test')] + + protected static String getPageContent(String pagename) { + try { + URI uri = EscapeXPathTest.class.getClassLoader().getResource(pagename) + .toURI(); + System.err.println("Testing local file: " + uri.toString()); + return uri.toString(); + } catch (URISyntaxException e) { // NOTE: multi-catch statement is not + // supported in -source 1.6 + throw new RuntimeException(e); + } + } + +} diff --git a/ui4j_test/src/test.BAK/java/com/mycompany/app/JqueryBarRatingTest.java b/ui4j_test/src/test.BAK/java/com/mycompany/app/JqueryBarRatingTest.java new file mode 100644 index 000000000..e366e0766 --- /dev/null +++ b/ui4j_test/src/test.BAK/java/com/mycompany/app/JqueryBarRatingTest.java @@ -0,0 +1,321 @@ +package com.mycompany.app; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.testng.Assert.assertTrue; + +import java.io.File; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import java.util.concurrent.TimeUnit; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +public class JqueryBarRatingTest { + + private WebDriver driver; + private WebDriverWait wait; + static Actions actions; + private Predicate hasClass; + private Predicate hasAttr; + private Predicate hasText; + private int flexibleWait = 5; + private int implicitWait = 1; + private long pollingInterval = 500; + private String baseUrl = "http://antenna.io/demo/jquery-bar-rating/examples/"; + private static final String browser = "firefox"; + private static String osName; + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + @SuppressWarnings("deprecation") + @BeforeSuite + public void beforeSuiteMethod() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + HashMap chromePrefs = new HashMap(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + options.addArguments("allow-running-insecure-content"); + options.addArguments("allow-insecure-localhost"); + options.addArguments("enable-local-file-accesses"); + options.addArguments("disable-notifications"); + // options.addArguments("start-maximized"); + options.addArguments("browser.download.folderList=2"); + options.addArguments( + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf"); + options.addArguments("browser.download.dir=" + downloadFilepath); + // options.addArguments("user-data-dir=/path/to/your/custom/profile"); + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + // https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + } + + @AfterSuite + public void afterSuiteMethod() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void loadPage() { + driver.get(baseUrl); + } + + @AfterMethod + public void resetBrowser() { + driver.get("about:blank"); + } + + @Test(enabled = true) + public void test1() { + // Arrange + WebElement bar = wait.until((WebDriver d) -> { + WebElement element = null; + try { + element = d.findElement(By.cssSelector( + "section.section-examples div.examples div.box-example-square div.box-body div.br-theme-bars-square")); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }); + // Act + // NOTE: relative xpath selector + assertTrue( + bar.findElements(By.xpath("//a[@data-rating-value]")).size() > 7); + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + // TODO: test that result set elements are unique ? + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + // + ratings.keySet().stream().forEach(o -> { + System.err.println("Mouse over rating: " + o); + WebElement r = ratings.get(o); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + }); + // Assert + } + + @Test(enabled = true) + public void test2() { + // Arrange + + wait.until(ExpectedConditions.or( + // NOTE: Boolean + ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed")), + ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed")))); + + WebElement bar = wait.until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed"))); + + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + // Act + ratings.keySet().stream().forEach(o -> { + WebElement r = ratings.get(o); + assertThat(r, notNullValue()); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + // Assert + WebElement comment = bar.findElement(By.xpath( + ".//*[contains(@class, 'br-current-rating') and contains(@class ,'br-selected')]")); + assertThat(comment.getText(), equalTo(o)); + System.err.println("Mouse over rating: " + o); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + }); + } + + @Test(enabled = true) + public void test3() { + // Arrange + // custom Expected Condition static Helper class + WebElement bar = wait.until(Helper.oneOfElementsLocatedVisible( + By.xpath( + "//section[contains(@class, 'section-examples')]//div[contains(@class, 'box-example-movie')]//div[contains(@class, 'br-widget')]"), + By.cssSelector( + "section.section-examples div.box-example-movie div.br-widget"))); + // Act + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + ratings.keySet().stream().forEach(o -> { + WebElement r = ratings.get(o); + assertThat(r, notNullValue()); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + r.click(); + // Assert + WebElement comment = bar + .findElement(By.xpath(".//*[contains(@class, 'br-current-rating')]")); + assertThat(comment.getText(), equalTo(o)); + System.err.println("Mouse over rating: " + o); + // NOTE: there is a hidden select sibling element. The selected option + // does not appear to be updated + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + final String script = "var result = $(\"section.section-examples div.box-example-movie div.br-theme-bars-movie select#example-movie option[selected='selected']\");return result.val();"; + if (driver instanceof JavascriptExecutor) { + Object result = ((JavascriptExecutor) driver).executeScript(script); + System.err.println("Select option value: " + result.toString()); + } + }); + } + + private void highlight(WebElement element) { + highlight(element, 100); + } + + private void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + "arguments[0].style.border='3px solid yellow'", element); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border=''", element); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + public static class Helper { + // for complex expected Condition, based on + // http://stackoverflow.com/questions/14840884/wait-untilexpectedconditions-visibilityof-element1-or-element2 + + public static ExpectedCondition oneOfElementsLocatedVisible( + By... bys) { + return new ExpectedCondition() { + @Override + public WebElement apply(WebDriver driver) { + for (By by : Arrays.asList(bys)) { + WebElement element; + try { + System.err.println("Locator : " + by.toString()); + element = driver.findElement(by); + } catch (Exception e) { + continue; + } + if (element.isDisplayed()) + return element; + } + return null; + } + }; + } + } +} diff --git a/ui4j_test/src/test.BAK/java/com/mycompany/app/PlunkerTest.java b/ui4j_test/src/test.BAK/java/com/mycompany/app/PlunkerTest.java new file mode 100644 index 000000000..3141d9609 --- /dev/null +++ b/ui4j_test/src/test.BAK/java/com/mycompany/app/PlunkerTest.java @@ -0,0 +1,493 @@ +package com.mycompany.app; + +import java.io.IOException; +import java.io.InputStream; +import java.io.IOException; + +import java.lang.RuntimeException; +import java.net.MalformedURLException; +import java.net.URL; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.concurrent.TimeUnit; +import java.util.Enumeration; +import java.util.Formatter; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.NoSuchWindowException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import static java.lang.Boolean.*; +import static java.lang.Float.*; +import java.lang.Float; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; +// import static org.hamcrest.CoreMatchers.matchesPattern; +// https://stackoverflow.com/questions/8505153/assert-regex-matches-in-junit +// https://piotrga.wordpress.com/2009/03/27/hamcrest-regex-matcher/ + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class PlunkerTest { + + private static WebDriver driver; + public static WebDriverWait wait; + public static Actions actions; + private static int flexibleWait = 5; + private static int implicitWait = 1; + private static long pollingInterval = 500; + private static String baseURL = "https://embed.plnkr.co/"; + private static String projectId = "ggL5oAvGgucDA5HCYk7K"; + + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final Logger log = LogManager.getLogger(PlunkerTest.class); + private static String osName; + + private static Pattern pattern; + private static Matcher matcher; + private static final String browser = "chrome"; + + private static Set windowHandles; + + @BeforeSuite + @SuppressWarnings("deprecation") + public static void setUp() { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + // origin: + // https://sqa.stackexchange.com/questions/26275/how-to-disable-chrome-save-your-password-selenium-java + // http://learn-automation.com/disable-chrome-notifications-selenium-webdriver/ + + HashMap prefs = new HashMap<>(); + prefs.put("profile.default_content_settings.popups", 0); + // Put this into prefs map to switch off browser notification + prefs.put("profile.default_content_setting_values.notifications", 2); + // Put this into prefs map to switch off save password notification + prefs.put("credentials_enable_service", false); + prefs.put("profile.password_manager_enabled", false); + String downloadPath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + prefs.put("download.default_directory", downloadPath); + prefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", prefs); + + for (String optionAgrument : (new String[] { + "--allow-running-insecure-content", "--allow-insecure-localhost", + "--enable-local-file-accesses", "--disable-notifications", + "--disable-save-password-bubble", + /* "start-maximized" , */ + "--browser.download.folderList=2", "--disable-web-security", + "--no-proxy-server", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("--browser.download.dir=%s", downloadPath) + /* "--user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities.setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + driver.get(baseURL); + driver.manage().timeouts().implicitlyWait(implicitWait, TimeUnit.SECONDS); + } + + @AfterSuite + public static void tearDown() throws Exception { + try { + driver.close(); + } catch (NoSuchWindowException e) { + + } + driver.quit(); + if (verificationErrors.length() != 0) { + throw new Exception(verificationErrors.toString()); + } + } + + @BeforeMethod + public void loadBaseURL() { + driver.get(baseURL); + } + + @Test(enabled = false) + public void testEditorPreview() { + driver.get(String.format("https://plnkr.co/edit/%s/?p=info", projectId)); + + List iframes = driver.findElements(By.cssSelector("iframe")); + HashMap iframesMap = new HashMap<>(); + for (WebElement iframe : iframes) { + String key = String.format("id: \'%s\", name: \"%s\"", + iframe.getAttribute("id"), iframe.getAttribute("name")); + System.err.println(String.format("Found iframe %s", key)); + iframesMap.put(key, iframe); + } + + WebElement runButton = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("body > nav button i.icon-play"))); + assertThat(runButton, notNullValue()); + highlight(runButton); + runButton.click(); + iframes = driver.findElements(By.cssSelector("iframe")); + for (WebElement iframe : iframes) { + String key = String.format("id: \'%s\", name: \"%s\"", + iframe.getAttribute("id"), iframe.getAttribute("name")); + if (!iframesMap.containsKey(key)) { + System.err.println(String.format("Found new iframe %s", key)); + } + } + WebElement previewIframe = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("iframe[name='plunkerPreviewTarget']"))); + assertThat(previewIframe, notNullValue()); + // System.err.println(driver.getCurrentUrl()); + assertTrue(driver.getCurrentUrl().matches("^.*\\?p=preview$")); + // driver.findElement(By.linkText("urlLink")).sendKeys(Keys.chord(Keys.CONTROL,Keys.RETURN)); + } + + @Test(enabled = false) + public void testEmbed() { + driver.get("https://embed.plnkr.co/" + projectId); + WebElement closeButton = wait + .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector( + "body div.plunker-ide-workspace button.plunker-ops-close"))); + highlight(closeButton); + closeButton.click(); + // button.plunker-sidebar-selector.plunker-selector-tree is better handled + // via Protractor + } + + @Test(enabled = false) + public void testFullScreeen() { + projectId = "WFJYrM"; + driver.get(String.format("https://plnkr.co/edit/%s/?p=info", projectId)); + WebElement runButton = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("body > nav button i.icon-play"))); + assertThat(runButton, notNullValue()); + highlight(runButton); + runButton.click(); + WebElement previewIframe = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("iframe[name='plunkerPreviewTarget']"))); + assertThat(previewIframe, notNullValue()); + WebDriver iframe = driver.switchTo().frame(previewIframe); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + // System.err.println(iframe.getPageSource()); + // the fullscreen button is not in the preview frame + driver.switchTo().defaultContent(); + WebElement fullScreenButton = null; + try { + fullScreenButton = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Optional e = d + .findElements(By.cssSelector("button#expand-preview")).stream() + .filter(o -> { + String t = o.getAttribute("title"); + return (Boolean) (t + .contains("Launch the preview in a separate window")); + }).findFirst(); + return (e.isPresent()) ? e.get() : (WebElement) null; + } + }); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + assertThat(fullScreenButton, notNullValue()); + // confirm it opens in a new tab. + // fullScreenButton.click(); + // alternatively, enforce open in a new tab: + String openinLinkNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN); + fullScreenButton.sendKeys(openinLinkNewTab); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + // confirm it opens in a new tab. + String currentHandle = null; + try { + currentHandle = driver.getWindowHandle(); + // System.err.println("Thread: Current Window handle: " + currentHandle); + } catch (NoSuchWindowException e) { + + } + windowHandles = driver.getWindowHandles(); + assertThat(windowHandles.size(), equalTo(2)); + + Iterator windowHandleIterator = windowHandles.iterator(); + while (windowHandleIterator.hasNext()) { + String handle = windowHandleIterator.next(); + if (!handle.equals(currentHandle)) { + driver.switchTo().window(handle); + assertThat(getBaseURL(), equalTo("https://run.plnkr.co")); + // System.err.println(getBaseURL()); + driver.switchTo().defaultContent(); + } + } + } + + @Test(enabled = true) + public void testFullScreeenInNewWindow() { + projectId = "WFJYrM"; + driver.get(String.format("https://plnkr.co/edit/%s/?p=info", projectId)); + WebElement runButton = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("body > nav button i.icon-play"))); + assertThat(runButton, notNullValue()); + highlight(runButton); + runButton.click(); + WebElement previewIframe = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("iframe[name='plunkerPreviewTarget']"))); + assertThat(previewIframe, notNullValue()); + WebDriver iframe = driver.switchTo().frame(previewIframe); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + // System.err.println(iframe.getPageSource()); + // the fullscreen button is not in the preview frame + driver.switchTo().defaultContent(); + WebElement fullScreenButton = null; + try { + fullScreenButton = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Optional e = d + .findElements(By.cssSelector("button#expand-preview")).stream() + .filter(o -> { + String t = o.getAttribute("title"); + return (Boolean) (t + .contains("Launch the preview in a separate window")); + }).findFirst(); + return (e.isPresent()) ? e.get() : (WebElement) null; + } + }); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + assertThat(fullScreenButton, notNullValue()); + String currentHandle = null; + try { + currentHandle = driver.getWindowHandle(); + // System.err.println("Thread: Current Window handle: " + currentHandle); + } catch (NoSuchWindowException e) { + + } + // open fullscreen view in a new browser window. + String openinLinkNewBrowserWindow = Keys.chord(Keys.SHIFT, Keys.RETURN); + fullScreenButton.sendKeys(openinLinkNewBrowserWindow); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + // confirm it opens in a new browser window. + windowHandles = driver.getWindowHandles(); + assertThat(windowHandles.size(), equalTo(2)); + + Iterator windowHandleIterator = windowHandles.iterator(); + while (windowHandleIterator.hasNext()) { + String handle = windowHandleIterator.next(); + if (!handle.equals(currentHandle)) { + driver.switchTo().window(handle); + assertThat(getBaseURL(), equalTo("https://run.plnkr.co")); + // System.err.println(getBaseURL()); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + driver.close(); + // System.err.println("After close"); + try { + driver.switchTo().defaultContent(); + System.err.println("After defaultcontext"); + } catch (NoSuchWindowException e) { + } + } + } + } + + public static String getBaseURL() { + System.err.println("Get base URL: " + driver.getCurrentUrl()); + log.info("Get base URL: {}", driver.getCurrentUrl()); + String currentURL = driver.getCurrentUrl(); + String protocol = null; + String domain = null; + + try { + URL url = new URL(currentURL); + protocol = url.getProtocol(); + domain = url.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // System.err.println("Returning: " + protocol + "://" + domain); + return protocol + "://" + domain; + } + + public static void scrollIntoView(By locator) { + log.info("Scrolling into view: {}", locator); + ((JavascriptExecutor) driver).executeScript( + "arguments[0].scrollIntoView(true);", driver.findElement(locator)); + } + + public static void highlight(By locator, long highlight_interval) { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + try { + Thread.sleep(highlight_interval); + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + executeScript("arguments[0].style.border=''", element); + } + + private void highlight(WebElement element) { + highlight(element, 100); + } + + private void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + "arguments[0].style.border='3px solid yellow'", element); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border=''", element); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + private static Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } +} diff --git a/ui4j_test/src/test.BAK/java/com/mycompany/app/Select2WrapperTest.java b/ui4j_test/src/test.BAK/java/com/mycompany/app/Select2WrapperTest.java new file mode 100644 index 000000000..88072a3f9 --- /dev/null +++ b/ui4j_test/src/test.BAK/java/com/mycompany/app/Select2WrapperTest.java @@ -0,0 +1,662 @@ +package com.mycompany.app; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +/* + * This class tests the Select 2 Element https://select2.github.io/examples.html + * intended to create a custom class implementing subset of ISelect interface + * influenced by [selenium select2 wrapper project by sskorol](https://github.com/sskorol/sslect2-wrapper) + * https://qa-automation-notes.blogspot.com/2015/11/webdriver-vs-select2.html +*/ + +public class Select2WrapperTest { + + private WebDriver driver; + private WebDriverWait wait; + private static Actions actions; + private int flexibleWait = 5; + private long pollingInterval = 500; + private static String baseURL = "https://select2.github.io/examples.html"; + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final String browser = "chrome"; + private static String osName; + + private static final String selectOptionScript = "var selector = arguments[0]; var o_val = arguments[1]; var s2_obj = $(selector).select2(); option = s2_obj.val(o_val); option.trigger('select');"; + private static final String querySelectedValueScript = "var selector = arguments[0]; var s2_obj = $(selector).select2(); return s2_obj.val();"; + private static final String selectByVisibleTextScript = "var selector = arguments[0]; var s2_obj = $(selector).select2(); var text = arguments[1]; var found_opt = s2_obj.find('option:contains(\"' + text + '\")').val(); return found_opt"; + private static final String selectMultiOptionClearScript = "var selector = arguments[0]; $(selector).select2().val(null).trigger('change');"; + + @Test(enabled = false) + public void selectByOptionValueTest() { + String selectOption = "FL"; + + // Arrange + wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("select.js-states")))); + // Act + + executeScript(selectOptionScript, "select.js-states", selectOption); + // TODO: appears without running the second script the result is not updated + String result = (String) executeScript(querySelectedValueScript, + "select.js-states"); + System.err.println("Selected via Javascript: " + result); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + + // Assert + // TODO: Update the Expectation condition with Iterator and String methods + WebElement selectionElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + "span.selection span.select2-selection span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getText()); + } + + @Test(enabled = false) + public void selectByVisibleOptionTextTest() { + // Arrange + wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("select.js-states")))); + // Act + String result = (String) executeScript(selectByVisibleTextScript, + "select.js-states", "Florida"); + System.err.println("Selected via Javascript: " + result); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + // Assert + // TODO: Update the Expectation condition with Iterator and String methods + WebElement selectionElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + "span.selection span.select2-selection span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getText()); + } + + // multiple + @Test(enabled = false) + public void selectBySelectWrapperObjectMultipleOptionsTest() { + // Arrange + Select2 element = new Select2(driver, + "select.js-example-basic-multiple.js-states"); + // Act + highlight(element.getWrappedElement()); + // Assert + assertThat(element, notNullValue()); + // Act + Map stateMap = new HashMap<>(); + stateMap.put("Florida", "FL"); + stateMap.put("Washington", "WA"); + Iterator stateiIterator = stateMap.keySet().iterator(); + while (stateiIterator.hasNext()) { + String stateFullName = stateiIterator.next(); + String result = element.selectByVisibleText(stateFullName); + // Assert + assertTrue(result.equals(stateMap.get(stateFullName)), + String.format("State %s code should be %s but was %s", stateFullName, + stateMap.get(stateFullName), result)); + System.err.println("Result: " + result); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + } + } + + @Test(enabled = false) + public void selectBySelectWrapperObjectTest() { + // Arrange + Select2 element = new Select2(driver, "select.js-states"); + // Act + highlight(element.getWrappedElement()); + // Assert + assertThat(element, notNullValue()); + // Act + Map stateMap = new HashMap<>(); + stateMap.put("Florida", "FL"); + stateMap.put("Washington", "WA"); + Iterator stateiIterator = stateMap.keySet().iterator(); + while (stateiIterator.hasNext()) { + String stateFullName = stateiIterator.next(); + String result = element.selectByVisibleText(stateFullName); + // Assert + assertTrue(result.equals(stateMap.get(stateFullName)), + String.format("State %s code should be %s but was %s", stateFullName, + stateMap.get(stateFullName), result)); + System.err.println("Result: " + result); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + } + } + + @Test(enabled = false) + public void select2VisualVerifyTest1() { + String selectOption = "FL"; + String select2Selector = "select.js-example-basic-single.js-states"; + + // Arrange + wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector(select2Selector)))); + // Act + executeScript(selectOptionScript, select2Selector, selectOption); + String result = (String) executeScript(querySelectedValueScript, + select2Selector); + // Assert + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected via Javascript: " + result); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + // Act + WebElement arrowElement = driver + .findElement(By.cssSelector("span.select2-selection__arrow")); + highlight(arrowElement); + arrowElement.click(); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + List options = resultsElement + .findElements(By.cssSelector("li.select2-results__option")); + // available options + // options.stream().forEach(o -> + // System.err.println(o.getText())); + WebElement highlightedOption = options.stream() + .filter(o -> o.getAttribute("class").contains("highlighted")) + .findFirst().get(); + System.err.println( + "Selected options visible text: " + highlightedOption.getText()); + highlight(highlightedOption); + highlightedOption.click(); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + // Assert + WebElement selectionElement = wait + .until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector("span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection rendered: " + selectionElement.getText()); + } + + @Test(enabled = true) + public void select2VisualVerifyTest2() { + List selectOptions = new ArrayList<>( + Arrays.asList(new String[] { "FL", "NC", "MN" })); + String select2Selector = "select.js-example-basic-multiple.js-states"; + + String divText = "Multiple select boxes"; + + // Arrange + WebElement selectElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector(select2Selector)))); + List divElements = driver.findElements(By.xpath(String + .format("//h2[@id = 'multiple'][contains(text(), '%s')]", divText))); + assertTrue(divElements.size() > 0); + WebElement divElement = divElements.get(0); + actions.moveToElement(divElement).build().perform(); + highlight(divElement); + + WebElement spanElement = selectElement + .findElement(By.xpath("following-sibling::span")); + actions.moveToElement(spanElement).build().perform(); + highlight(spanElement); + + // Act + for (String selectOption : selectOptions) { + executeScript(selectOptionScript, select2Selector, selectOption); + @SuppressWarnings("unchecked") + ArrayList results = (ArrayList) executeScript( + querySelectedValueScript, select2Selector); + System.err.println("size = " + results.size()); + String result = results.get(0); + // Assert + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected via Javascript: " + result); + } + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + // Act + // following-sibling js-example-basic-multiple js-states + WebElement arrowElement = driver + .findElement(By.cssSelector("span.select2-selection--multiple")); + highlight(arrowElement); + arrowElement.click(); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + List options = resultsElement + .findElements(By.cssSelector("li.select2-results__option")); + // available options + // options.stream().forEach(o -> + // System.err.println(o.getText())); + WebElement highlightedOption = options.stream() + .filter(o -> o.getAttribute("class").contains("highlighted")) + .findFirst().get(); + System.err.println( + "Selected options visible text: " + highlightedOption.getText()); + highlight(highlightedOption); + // highlightedOption.click(); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + // Assert + WebElement selectionElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + "span.select2-selection--multiple ul.select2-selection__rendered li.select2-selection__choice")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection rendered: " + selectionElement.getText()); + } + + // TODO: refactor + @Test(enabled = false) + public void select2VisualActionVerify2Test() { + String selectOption = "FL"; + + // Arrange + wait.until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("select.js-example-basic-single.js-states")))); + // Act + String result = (String) executeScript(selectByVisibleTextScript, + "select.js-states", "Florida"); + System.err.println("Selected via Javascript: " + result); + // Assert + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected via Javascript: " + result); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + // Act + WebElement arrowElement = driver + .findElement(By.cssSelector("span.select2-selection__arrow")); + highlight(arrowElement); + arrowElement.click(); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + + WebElement highlightedOption = resultsElement + .findElements(By.cssSelector("li.select2-results__option")).stream() + .filter(o -> o.getAttribute("class").contains("highlighted")) + .findFirst().get(); + System.err.println("Selected Text: " + highlightedOption.getText()); + highlight(highlightedOption); + highlightedOption.click(); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + // Assert + WebElement selectionElement = wait + .until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector("span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getText()); + } + + @Test(enabled = false) + public void select2VisualActionSelectTest() { + String selectOption = "MN"; + + // Arrange + WebElement select2 = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("select.js-example-theme-single.js-states")))); + actions.moveToElement(select2).build().perform(); + // Act + WebElement arrowElement = driver.findElement( + By.cssSelector("div.s2-example span.select2-selection__arrow")); + highlight(arrowElement); + arrowElement.click(); + // TODO: convert to flexible + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + System.err.println(resultsElement.getAttribute("innerHTML")); + // TODO: scroll somehow + // TODO: filter out role="group" + WebElement selectedOption = resultsElement + .findElements(By.cssSelector("li.select2-results__option")).stream() + .filter(o -> o.getAttribute("role").matches("treeitem")).filter(o -> { + String text = o.getText(); + System.err.println(String.format("Option text: \"%s\"", text)); + actions.moveToElement(o).build().perform(); + if (text.contains("Minnesota")) { + return true; + } else { + return false; + } + }).findFirst().get(); + System.err.println("Selected Visible Text: " + selectedOption.getText()); + highlight(selectedOption); + actions.moveToElement(selectedOption).click().build().perform(); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Assert + String result = (String) executeScript(querySelectedValueScript, + "select.js-example-theme-single.js-states"); + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected: " + result); + // Assert + WebElement selectionElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By + .cssSelector("div.s2-example span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getAttribute("title")); + } + + @BeforeSuite + @SuppressWarnings("deprecation") + public void beforeSuite() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + HashMap chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + + for (String optionAgrument : (new String[] { + "allow-running-insecure-content", "allow-insecure-localhost", + "enable-local-file-accesses", "disable-notifications", + /* "start-maximized" , */ + "browser.download.folderList=2", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("browser.download.dir=%s", downloadFilepath) + /* "user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + /* + System.setProperty("webdriver.chrome.driver", + "c:/java/selenium/chromedriver.exe"); + driver = new ChromeDriver(); + */ + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + actions = new Actions(driver); + } + + @AfterSuite + public void afterSuite() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void BeforeMethod() { + driver.get(baseURL); + } + + @AfterMethod + public void AfterMethod(ITestResult result) { + if (verificationErrors.length() != 0) { + throw new RuntimeException(String.format("Error in the method %s : %s", + result.getMethod().getMethodName(), verificationErrors.toString())); + } + driver.get("about:blank"); + } + + // utilities + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + private void highlightNew(WebElement element, long highlight_interval) { + Rectangle elementRect = element.getRect(); + String highlightScript = getScriptContent("highlight.js"); + // append calling + + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format( + "%s\nhighlight_create(arguments[0],arguments[1],arguments[2],arguments[3]);", + highlightScript), + elementRect.y, elementRect.x, elementRect.width, + elementRect.height); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format("%s\nhighlight_remove();", highlightScript)); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + + } + + private void highlight(WebElement element) { + highlight(element, 100); + } + + private void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + private Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + protected static String getScriptContent(String scriptName) { + try { + final InputStream stream = Select2WrapperTest.class.getClassLoader() + .getResourceAsStream(scriptName); + final byte[] bytes = new byte[stream.available()]; + stream.read(bytes); + return new String(bytes, "UTF-8"); + } catch (IOException e) { + throw new RuntimeException(scriptName); + } + } + + // inspired by: + // https://github.com/sskorol/select2-wrapper/blob/master/src/main/java/com/tools/qaa/elements/Select2.java + // https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/ui/Select.java + public static class Select2 { + + private WebDriver driver = null; + private WebElement element; + private WebDriverWait wait; + private boolean isMulti = false; + private String elementCssSelector; + private int flexibleWait = 5; + private long pollingInterval = 500; + + public WebElement getWrappedElement() { + return this.element; + } + + public Select2(WebDriver driver, String elementCssSelector) { + this.elementCssSelector = elementCssSelector; + this.driver = driver; + this.wait = new WebDriverWait(driver, this.flexibleWait); + this.wait.pollingEvery(this.pollingInterval, TimeUnit.MILLISECONDS); + this.element = wait.until(ExpectedConditions.visibilityOf( + driver.findElement(By.cssSelector(this.elementCssSelector)))); + } + + public String selectByVisibleText(final String text) { + String selectByVisibleTextScript = "var s2_obj = $('" + + this.elementCssSelector + + "').select2(); var text = arguments[0] ; var found_opt = s2_obj.find('option:contains(\"' + text + '\")').val(); return found_opt"; + wait.until(ExpectedConditions.visibilityOf( + driver.findElement(By.cssSelector(this.elementCssSelector)))); + String optionValue = (String) executeScript(selectByVisibleTextScript, + text); + return optionValue; + } + + public String getSelectedText() { + wait.until(ExpectedConditions.visibilityOf( + driver.findElement(By.cssSelector(this.elementCssSelector)))); + // TODO: + return (String) executeScript( + "return $('" + this.elementCssSelector + "').select2('data').text;"); + } + + private Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + } +} diff --git a/ui4j_test/src/test.BAK/java/com/mycompany/app/SuvianTest.java b/ui4j_test/src/test.BAK/java/com/mycompany/app/SuvianTest.java new file mode 100644 index 000000000..fda94e86b --- /dev/null +++ b/ui4j_test/src/test.BAK/java/com/mycompany/app/SuvianTest.java @@ -0,0 +1,3099 @@ +package com.mycompany.app; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class SuvianTest { + + private WebDriver driver; + private WebDriverWait wait; + private static Actions actions; + private static Alert alert; + private int flexibleWait = 5; + private int implicitWait = 1; + private long pollingInterval = 500; + private static String baseURL = "about:blank"; + private static final StringBuffer verificationErrors = new StringBuffer(); + private static String defaultScript = null; + private static final String browser = "chrome"; + private static String osName; + + @BeforeSuite + @SuppressWarnings("deprecation") + public void beforeSuite() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + Map chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + + for (String optionAgrument : (new String[] { + "allow-running-insecure-content", "allow-insecure-localhost", + "enable-local-file-accesses", "disable-notifications", + /* "start-maximized" , */ + "browser.download.folderList=2", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("browser.download.dir=%s", downloadFilepath) + /* "user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + /* + System.setProperty("webdriver.chrome.driver", + "c:/java/selenium/chromedriver.exe"); + driver = new ChromeDriver(); + */ + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + actions = new Actions(driver); + } + + @AfterSuite + public void afterSuite() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void BeforeMethod() { + driver.get(baseURL); + } + + @AfterMethod + public void AfterMethod(ITestResult result) { + if (verificationErrors.length() != 0) { + throw new RuntimeException(String.format("Error in the method %s : %s", + result.getMethod().getMethodName(), verificationErrors.toString())); + } + driver.get("about:blank"); + } + + // Firebug console validation: + // $x("") + // $$("") + @Test(enabled = false) + public void test0_1() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + // Wait page to load + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + + element.click(); + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + + // Assert + // 1. Expected Condition uses enclosing element + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + String t = d.findElement(By.className("intro-message")).getText(); + Boolean result = t.contains("Link Successfully clicked"); + System.err.println( + "in apply: Text = " + t + "\nresult = " + result.toString()); + return result; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // 3. Alternative wait, functional style, with Optional + // http://www.nurkiewicz.com/2013/08/optional-in-java-8-cheat-sheet.html + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Optional e = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> { + String t = o.getText(); + System.err.println("in stream filter (3): Text = " + t); + return (Boolean) (t.contains("Navigate Back")); + }).findFirst(); + return (e.isPresent()) ? e.get() : (WebElement) null; + } + }); + System.err + .println("element check: " + checkElement.getAttribute("innerHTML")); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // http://stackoverflow.com/questions/12858972/how-can-i-ask-the-selenium-webdriver-to-wait-for-few-seconds-in-java + // http://stackoverflow.com/questions/31102351/selenium-java-lambda-implementation-for-explicit-waits + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")); + // longer version + Stream elementsStream = elements.stream(); + elements = elementsStream.filter(o -> { + String t = o.getText(); + System.err.println("(in filter) Text: " + t); + return (Boolean) (t.equalsIgnoreCase("Link Successfully clicked")); + }).collect(Collectors.toList()); + + // shorter version + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> "Link Successfully clicked".equalsIgnoreCase(o.getText())) + .collect(Collectors.toList()); + + assertThat(elements.size(), equalTo(1)); + + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> o.getText().equalsIgnoreCase("Link Successfully clicked")) + .collect(Collectors.toList()); + assertThat(elements.size(), equalTo(1)); + + element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Link Successfully clicked"), + element.getText()); + } + + @Test(enabled = false) + public void test0_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + highlight(element); + element.click(); + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + // 2. Alternative Iterator, uses Regex methods + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + Iterator i = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .iterator(); + WebElement result = null; + Pattern pattern = Pattern.compile( + "(?:" + Pattern.quote("Navigate Back") + ")", + Pattern.CASE_INSENSITIVE); + while (i.hasNext()) { + WebElement e = i.next(); + String t = e.getText(); + // System.err.println("in apply iterator (2): Text = " + t); + Matcher matcher = pattern.matcher(t); + if (matcher.find()) { + result = e; + break; + } + } + return result; + } + }); + assertThat(checkElement, notNullValue()); + + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + } + + @Test(enabled = false) + public void test0_3() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + element.click(); + // 2. Expected condition with Iterator, uses String methods + try { + element = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Iterator elementsIterator = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .iterator(); + WebElement result = null; + while (elementsIterator.hasNext()) { + WebElement e = elementsIterator.next(); + String t = e.getText(); + System.err.println("in apply iterator (1): Text = " + t); + if (t.contains("Navigate Back")) { + result = e; + break; + } + } + return result; + } + }); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Act + element.click(); + } + + @Test(enabled = false) + public void test0_4() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + } + + @Test(enabled = false) + public void test0_5() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + String simulateRightMouseButtonClick = getScriptContent( + "simulateRightMouseButtonClick.js"); + System.err.println("Simulate (1) right mouse click on element"); + executeScript(simulateRightMouseButtonClick, element); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + String simulateClick = getScriptContent("simulateClick.js"); + System.err.println("Simulate (2) right mouse click on element"); + executeScript(simulateClick, element, "contextmenu"); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + System.err.println("Simulate (3) right mouse click on element"); + actions.moveToElement(element).build().perform(); + actions.keyDown(Keys.CONTROL).contextClick().keyUp(Keys.CONTROL).build() + .perform(); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + } + + // http://software-testing.ru/forum/index.php?/topic/17746-podskazhite-po-xpath/ + @Test(enabled = false) + public void test0_8() { + + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + String elementText = "Click Here"; + WebElement element = null; + try { + element = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver _driver) { + int cnt = 4; + String[] xpaths = new String[] { "//a[text() = '%s']", + "//a[normalize-space(.) = '%s']", + "//a[normalize-space(text()) = '%s']", + "//*[normalize-space(text()) = '%s']", + "//a[contains(normalize-space(.), '%s')]", + // NOTE: way too permissive for a selector + "//*[contains(normalize-space(.), '%s')]" }; + String xpath = String.format(xpaths[cnt], elementText); + System.err.println("Locator: xpath " + xpath); + Optional _element = _driver.findElements(By.xpath(xpath)) + .stream().filter(o -> { + String t = o.getText(); + System.err.println("In filter: " + o.getTagName() + ' ' + + (t.length() > 20 ? t.substring(0, 20) : t)); + Pattern pattern = Pattern.compile( + "^ *" + Pattern.quote(elementText), + Pattern.CASE_INSENSITIVE); + return pattern.matcher(t).find(); + // quicker, less precise + // return (Boolean) (__element.getText().contains(elementText)); + }).findFirst(); + return (_element.isPresent()) ? _element.get() : (WebElement) null; + } + }); + System.err.println("Element: " + element.getAttribute("innerHTML")); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // Act + highlight(element); + highlightNew(element, 1000); + assertTrue(element.getText().equalsIgnoreCase(elementText), + element.getText()); + } + + @Test(enabled = false) + public void test1() { + + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + element.click(); + try { // Wait page to load + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + // Inspect enclosing element to confirm the page loaded + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + return (Boolean) d.findElement(By.className("intro-message")) + .getText().contains("Link Successfully clicked"); + } + }); + } catch (Exception e) { + } + + // Assert + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> o.getText().equalsIgnoreCase("Link Successfully clicked")) + .collect(Collectors.toList()); + assertThat(elements.size(), equalTo(1)); + element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Link Successfully clicked"), + element.getText()); + elements.forEach(System.out::println); // output : ?? + } + + @Test(enabled = false) + public void test4() { + // Arrange + driver.get("http://suvian.in/selenium/1.4gender_dropdown.html"); + wait.until( // Wait page to load + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message select")))); + // Act + WebElement element = driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message select")); + Select select = new Select(element); + String optionString = "Male"; + // create predicate driven case-insensitive option search + Predicate hasText = o -> o.getText() + .matches("(?i:" + optionString.toLowerCase() + ")"); + List options = select.getOptions().stream().filter(hasText) + .collect(Collectors.toList()); + // Assert + assertThat(options.size(), equalTo(1)); + element = options.get(0); + assertTrue(element.getText().equals(optionString), element.getText()); + } + + @Test(enabled = false) + public void test5_1() { + // Arrange + driver.get("http://suvian.in/selenium/1.5married_radio.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + String label = "yes"; + String elementContents = driver + .findElement(By.xpath( + "//div[@class='intro-header']/div[@class='container']/div[@class='row']/div[@class='col-lg-12']/div[@class='intro-message']/form")) + .getAttribute("outerHTML"); + + String line = new ArrayList( + Arrays.asList(elementContents.split("
"))).stream() + .filter(o -> o.toLowerCase().indexOf(label) > -1).findFirst().get(); + Matcher matcher = Pattern.compile("value=\\\"([^\"]*)\\\"").matcher(line); // Pattern.quote + // ? + String checkboxValue = null; + if (matcher.find()) { + checkboxValue = matcher.group(1); + System.err.println("checkbox value = " + checkboxValue); + } else { + System.err.println("checkbox value not found"); + } + WebElement checkBoxElement = null; + if (checkboxValue != null) { + checkBoxElement = driver.findElement(By.xpath(String.format( + "//div[@class='intro-header']/div[@class='container']/div[@class='row']/div[@class='col-lg-12']/div[@class='intro-message']/form/input[@name='married' and @value='%s']", + checkboxValue))); + } + // Act + assertThat(checkBoxElement, notNullValue()); + highlight(checkBoxElement); + checkBoxElement.sendKeys(Keys.SPACE); + // Assert + // NOTE: behaves differently in C# + assertTrue(checkBoxElement.isSelected()); + } + + @Test(enabled = false) + public void test5_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.5married_radio.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + String label = "no"; + WebElement formElement = driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message form")); + String elementContents = formElement.getAttribute("outerHTML"); + + String line = new ArrayList( + Arrays.asList(elementContents.split("
"))).stream() + .filter(o -> o.toLowerCase().indexOf(label) > -1).findFirst().get(); + Matcher matcher = Pattern.compile("value=\\\"([^\"]*)\\\"").matcher(line); + String checkboxValue = null; + if (matcher.find()) { + checkboxValue = matcher.group(1); + System.err.println("checkbox value = " + checkboxValue); + } else { + System.err.println("checkbox value not found"); + } + WebElement checkBoxElement = null; + if (checkboxValue != null) { + checkBoxElement = formElement.findElement(By.cssSelector( + String.format("input[name='married'][value='%s']", checkboxValue))); + } + // Act + assertThat(checkBoxElement, notNullValue()); + highlight(checkBoxElement); + checkBoxElement.click(); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // ignore + } + // Assert + assertTrue(checkBoxElement.isSelected()); + } + + @Test(enabled = false) + public void test6_1() { + // Arrange + List hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing")); + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + System.err + .println("element check: " + checkElement.getAttribute("innerHTML")); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // Act + WebElement formElement = driver.findElement(By.cssSelector("input[id]")) + .findElement(By.xpath("..")); + assertThat(formElement, notNullValue()); + highlight(formElement); + List inputElements = formElement + .findElements(By.cssSelector("label[for]")).stream() + .filter(o -> hobbies.contains(o.getText())) + .collect(Collectors.toList()); + // C#: dataMap = elements.ToDictionary(x => x.GetAttribute("for"), x => + // x.Text); + Map dataMap = inputElements.stream().collect( + Collectors.toMap(o -> o.getText(), o -> o.getAttribute("for"))); + List checkboxes = new ArrayList<>(); + for (String hobby : hobbies) { + try { + System.err.println("finding: " + dataMap.get(hobby)); + checkboxes.add(formElement.findElement( + // will throw exception + By.cssSelector(String.format("input#%s", dataMap.get(hobby))))); + } catch (InvalidSelectorException e) { + System.err.println("ignored: " + e.toString()); + } + try { + checkboxes.add(formElement.findElement( + // will not throw exception + By.xpath(String.format("input[@id='%s']", dataMap.get(hobby))))); + } catch (Exception e) { + System.err.println("ignored: " + e.toString()); + } + + } + checkboxes.stream().forEach(o -> { + highlight(o); + o.click(); + }); + + // Assert + + assertTrue( + formElement.findElements(By.cssSelector("input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + // NOTE: this test is broken + // label follows the check box therefore + // the following-sibling to find the check box by its label does not seem to + // be appropriate + // - see the test6_3 for the solution + // however preceding-sibling always finds the check box #1 + @Test(enabled = false) + public void test6_2() { + // Arrange + List hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing", "Sports")); + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + assertThat(checkElement, notNullValue()); + // Act + List elements = checkElement + .findElements(By.xpath("..//label[@for]")).stream() + .filter(o -> hobbies.contains(o.getText())) + .collect(Collectors.toList()); + assertTrue(elements.size() > 0); + List checkBoxes = elements.stream() + .map(o -> o.findElement(By.xpath("preceding-sibling::input"))) + .collect(Collectors.toList()); + assertTrue(checkBoxes.size() > 0); + + checkBoxes.stream().forEach(o -> { + highlight(o); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + + } + o.click(); + }); + // Assert + assertTrue( + driver + .findElements(By.cssSelector( + ".container .intro-message input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + // reverse usage of following-sibling to locate check box by its label + @Test(enabled = false) + public void test6_3() { + // Arrange + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + List hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing", "Sports")); + WebElement checkElement = null; + try { + checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + assertThat(checkElement, notNullValue()); + // Act + List checkBoxes = checkElement + .findElements(By.xpath("..//input[@type = 'checkbox']")).stream() + .filter(o -> { + WebElement label = o + .findElement(By.xpath("following-sibling::label")); + if (hobbies.contains(label.getText())) { + System.err.println(String.format("checkbox element %s: '%s'", + o.getAttribute("id"), label.getText())); + return true; + } else { + return false; + } + }).collect(Collectors.toList()); + + assertTrue(checkBoxes.size() > 0); + checkBoxes.stream().forEach(o -> { + highlight(o); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + + } + o.click(); + }); + // Assert + assertTrue( + driver + .findElements(By.cssSelector( + ".container .intro-message input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + @Test(enabled = false) + public void test10() { + // Arrange + driver.get("http://suvian.in/selenium/1.10selectElementFromDD.html"); + WebElement buttonDropDown = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.dropdown button.dropbtn")))); + assertThat(buttonDropDown, notNullValue()); + + // Act + buttonDropDown.click(); + wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.dropdown div#myDropdown")))); + List optionElements = driver + .findElements(By.cssSelector( + ".container .row .intro-message div.dropdown div#myDropdown")) + .stream().filter(o -> o.getText().contains("Option 2")) + .collect(Collectors.toList()); + assertTrue(optionElements.size() > 0); + final String currentHandle = driver.getWindowHandle(); + final String text = "Congratulations.. You Selected option 2. Close this browser tab and proceed to end of Level 1."; + optionElements.get(0).click(); + + // Assert + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Boolean result = false; + System.err.println("Inspecting driver Window handles"); + Set windowHandles = d.getWindowHandles(); + if (windowHandles.size() > 1) { + System.err.println("Found " + (windowHandles.size() - 1) + + " additional tabs opened"); + } else { + System.out.println("No other tabs found"); + return false; + } + Iterator windowHandleIterator = windowHandles.iterator(); + while (windowHandleIterator.hasNext()) { + String handle = windowHandleIterator.next(); + if (!handle.equals(currentHandle)) { + System.err.println("Switch to: " + handle); + driver.switchTo().window(handle); + String t = d.getPageSource(); + System.err.println(String.format("Page source: %s", + t.substring( + org.apache.commons.lang3.StringUtils.indexOf(t, ""), + t.length() - 1))); + if (t.contains(text)) { + System.err.println("Found text: " + text); + + result = true; + } + if (result) { + System.err.println("Close the browser tab: " + handle); + d.close(); + } + System.err.println("Switch to the main window."); + driver.switchTo().window(currentHandle); + driver.switchTo().defaultContent(); + } + } + return result; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + // throw new RuntimeException(e.toString()); + } + } + + @Test(enabled = false) + public void test12_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.2browserPopUp.html"); + WebElement button = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button.btn-warning")))); + assertThat(button, notNullValue()); + final String parentHandle = driver.getWindowHandle(); + + // Act + button.click(); + + // Assert + try { // Wait for the new browser widow to get shown + String popupHandle = wait.until(new ExpectedCondition() { + @Override + public String apply(WebDriver d) { + Boolean result = false; + System.err.println("Inspecting driver Window handles"); + Set windowHandles = d.getWindowHandles(); + if (windowHandles.size() > 1) { + windowHandles.remove(parentHandle); + String s = (String) (windowHandles.toArray())[0]; + System.err.println("Found popup window handle: " + s); + return s; + } else { + System.out.println("No popup found"); + return null; + } + } + }); + // Act + driver.switchTo().window(popupHandle); + System.out.println("Popup Title: " + driver.getTitle()); + driver.close(); + System.out.println("Closed popup"); + driver.switchTo().window(parentHandle); + System.out.println("switched to parent window: " + parentHandle); + driver.switchTo().defaultContent(); + System.out.println("switched to default content."); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + + // Assert + try { + assertThat(driver.getWindowHandles().size(), is(1)); + } catch (AssertionError e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + } + + @Test(enabled = false) + public void test12_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.2browserPopUp.html"); + wait.until(ExpectedConditions.textToBePresentInElement( + driver.findElement(By + .cssSelector(".container .row .intro-message button.btn-warning")), + "Click Me")); + + WebElement button = driver.findElement( + By.cssSelector(".container .row .intro-message button.btn-warning")); + assertThat(button, notNullValue()); + final String parentHandle = driver.getWindowHandle(); + + // Act + button.click(); + while (true) { // Wait for the new browser widow to get shown and close it + List popupHandles = driver.getWindowHandles().stream() + .filter(((Predicate) (o -> o.equalsIgnoreCase(parentHandle))) + .negate()) + .collect(Collectors.toList()); + if (popupHandles.size() > 0) { + driver.switchTo().window(popupHandles.get(0)); + System.out.println("Popup Title: " + driver.getTitle()); + driver.close(); + System.out.println("Closed popup"); + driver.switchTo().window(parentHandle); + System.out.println("switched to parent window: " + parentHandle); + driver.switchTo().defaultContent(); + System.out.println("switched to default content."); + break; + } else { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + } + // Assert + try { + assertThat(driver.getWindowHandles().size(), is(1)); + } catch (AssertionError e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + } + + // This test appears to find the button even though it is inside iframe + // without frame switch + @Test(enabled = false) + public void test13_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt( + By.cssSelector(".container .row .intro-message iframe"))); + + // Act + WebElement buttonElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("h3 button")))); + + assertThat(buttonElement, notNullValue()); + // Assert + + WebElement currentElement = buttonElement; + for (int cnt = 0; cnt != 4; cnt++) { + try { + WebElement containerElement = currentElement + .findElement(By.xpath("..")); + String elementHTML = containerElement.getAttribute("outerHTML"); + System.err.println("Parent element: " + (elementHTML.length() > 120 + ? elementHTML.substring(0, 120) + "..." : elementHTML)); + currentElement = containerElement; + } catch (InvalidSelectorException e) { + // InvalidSelectorError: The result of the xpath expression ".." is: + // [object HTMLDocument]. It should be an element. + // ignore - reached top level + break; + } + } + buttonElement.click(); + // Assert + try { + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + // confirm alert + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + // This test does switch frame fefore find the button in the iframed document + @Test(enabled = false) + public void test13_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + WebElement frameElement = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector(".container .row .intro-message iframe"))); + assertThat(frameElement, notNullValue()); + String frameElementDocument = frameElement.getAttribute("outerHTML"); + + System.err + .println("Switching to frame:\n" + (frameElementDocument.length() > 80 + ? frameElementDocument.substring(0, 80) + "..." + : frameElementDocument)); + + driver.switchTo().frame(frameElement); + System.err.println("Inside the frame"); + try { + frameElement.getTagName(); + } catch (org.openqa.selenium.StaleElementReferenceException e) { + // Element belongs to a different frame than the current one + System.err.println("Exception (expected, ignored): " + e.toString()); + } + WebElement rootElement = driver.findElement(By.xpath("/*")); + String documentText = rootElement.getAttribute("outerHTML"); + System.err.println("Root element:\n" + (documentText.length() > 80 + ? documentText.substring(0, 80) + "..." : documentText)); + String pageSource = driver.getPageSource(); + System.err.println("Page source:\n" + (pageSource.length() > 80 + ? pageSource.substring(0, 80) + "..." : pageSource)); + + // Act + WebElement buttonElement = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector("h3 button[onclick = 'myFunction()']")))); + + assertThat(buttonElement, notNullValue()); + buttonElement.click(); + // Assert + + try { + // confirm alert + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + @Test(enabled = false) + public void test13_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt( + By.cssSelector(".container .row .intro-message iframe"))); + + // Act + WebElement buttonElement = driver + .findElement(By.xpath("//button[@onclick = 'myFunction()']")); + assertThat(buttonElement, notNullValue()); + // Assert + + buttonElement.click(); + // Assert + try { + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + // confirm alert + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + @Test(enabled = false) + public void test14_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.4mouseHover.html"); + + WebElement elementWithTooltip = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(elementWithTooltip, notNullValue()); + // the link title attribute is present regardless of tooltip shown or not + // Assert + assertThat(elementWithTooltip.getAttribute("title"), + equalTo("This is a tooltip.")); + // Act + actions.moveToElement(elementWithTooltip).build().perform(); + // Assert + assertThat(elementWithTooltip.getAttribute("title"), + equalTo("This is a tooltip.")); + // How to discover whether core HTML tool tip is displayed ? + + } + + // https://docs.google.com/a/jazzteam.org/document/d/1PdfKMDfoqFIlF4tN1jKrOf1iZ1rqESy2xVMIj3uuV3g/pub#h.qkrwckq52qpd + + // http://sqa.stackexchange.com/questions/14247/how-can-i-get-the-value-of-the-tooltip + @Test(enabled = false) + public void test14_2() { + // Arrange + driver.get("http://yuilibrary.com/yui/docs/charts/charts-pie.html"); + + WebElement elementWithTooltip = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//*[contains(@class,'yui3-svgSvgPieSlice')][@fill = '#66007f']")))); + assertThat(elementWithTooltip, notNullValue()); + + WebElement chartTitle = driver + .findElement(By.cssSelector("div#doc div.content h1")); + // Act + actions.moveToElement(chartTitle).build().perform(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + // the tooltip element is present on the page regardless of mouse position, + // but is not visible. + assertThat((int) driver + .findElements(By.cssSelector("div[class $= 'chart-tooltip']")).stream() + .filter(o -> { + return (Boolean) (o.getAttribute("style") + .indexOf("visibility: hidden;") == -1); + }).count(), is(0)); + + // Act + actions.moveToElement(elementWithTooltip).build().perform(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + List tooltips = driver + .findElements(By.xpath("//div[contains(@id, '_tooltip')]")); + assertThat(tooltips.size(), is(1)); + // TODO: visibility check + assertThat(tooltips.get(0).getText(), containsString("day: Monday")); + } + + @Test(enabled = false) + public void test15_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.5resize.html"); + WebElement textAreaElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 textarea")))); + assertThat(textAreaElement, notNullValue()); + System.err.println( + "Text area original width: " + textAreaElement.getSize().width); + System.err.println( + "Text area original height: " + textAreaElement.getSize().height); + WebElement lineElement = driver.findElement( + By.cssSelector(".container .row .intro-message h3 hr.intro-divider")); + assertThat(lineElement, notNullValue()); + System.err.println("Line element width: " + lineElement.getSize().width); + // Act + int distance = (lineElement.getSize().width + - textAreaElement.getSize().width); + highlight(textAreaElement); + int xOffset = textAreaElement.getSize().getWidth() - 1; + int yOffset = textAreaElement.getSize().getHeight() - 1; + System.err + .println(String.format("Click and hold at (%d,%d)", xOffset, yOffset)); + + actions.moveToElement(textAreaElement, xOffset, yOffset).clickAndHold() + .moveByOffset(distance, 0); + actions.release().build().perform(); + // Assert + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + System.err.println( + "Text area new width: " + textAreaElement.getSize().getWidth()); + System.err.println( + "Text area new height: " + textAreaElement.getSize().getHeight()); + } + + @Test(enabled = false) + public void test15_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + String cssSelector = ".container .row .intro-message h3 a"; + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertTrue(element.getText().equalsIgnoreCase("click here"), + element.getText()); + + // Act + highlight(element); + + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates coords = ((Locatable) element).getCoordinates(); + System.err.println(String.format("Mouse click at: (%-4d, %-4d)", + coords.inViewPort().x, coords.inViewPort().y)); + mouse.click(coords); + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + + // Assert + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + return d.findElement(By.className("intro-message")).getText() + .contains("Link Successfully clicked"); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + } + + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.interactions.Mouse + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.interactions.internal.Coordinates + // http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium/selenium-api/2.40.0/org/openqa/selenium/interactions/Mouse.java#Mouse.mouseMove%28org.openqa.selenium.interactions.internal.Coordinates%2Clong%2Clong%29 + @Test(enabled = false) + public void test15_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.5resize.html"); + WebElement textAreaElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 textarea")))); + assertThat(textAreaElement, notNullValue()); + System.err.println(textAreaElement.getSize().width); + System.err.println(textAreaElement.getSize().height); + WebElement lineElement = driver.findElement( + By.cssSelector(".container .row .intro-message h3 hr.intro-divider")); + assertThat(lineElement, notNullValue()); + // Act + int distance = (lineElement.getSize().width + - textAreaElement.getSize().width) / 2; + highlight(textAreaElement); + int xOffset = textAreaElement.getSize().getWidth() - 1; + int yOffset = textAreaElement.getSize().getHeight() - 1; + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Locatable locatable = (Locatable) textAreaElement; + Coordinates coords = locatable.getCoordinates(); + System.err.println(String.format("Mouse down at: (%d,%d)", + coords.inViewPort().x, coords.inViewPort().y)); + mouse.mouseMove(coords, xOffset, yOffset); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + mouse.mouseDown(coords); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + mouse.mouseUp(coords); + mouse.click(coords); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + + @Test(enabled = false) + public void test16_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + + WebElement book2 = driver.findElement(By.xpath( + "//div[@class='intro-message']/ul/li[ contains(text(), 'Book 2')]")); + assertThat(book2.getText(), containsString("Book 2")); + + // Act + int count = 0; + Enumeration chapters = Collections + .enumeration(book2.findElements(By.cssSelector("ul li"))); + + while (chapters.hasMoreElements()) { + WebElement currentChapter = chapters.nextElement(); + count++; + try { + highlight(currentChapter); + currentChapter.click(); + } catch (WebDriverException e) { + System.err + .println(String.format("Exception (ignored):\n%s", e.toString())); + // Element is not clickable + } + } + // Assert + assertThat(count, is(7)); + System.err.println(count); + + WebElement resultElement = driver + .findElement(By.cssSelector("input#chapbook2")); + resultElement.clear(); + resultElement.sendKeys(String.format("%d", count)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + + @Test(enabled = false) + public void test16_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + // Act + + List elements = driver + .findElements( + By.cssSelector(".container .row .intro-message ul#books li")) + .stream().filter(o -> { + return (Boolean) (o.getText().indexOf("Book") > -1); + }).map(o -> o.findElements(By.cssSelector("ul li"))) + .collect(ArrayList::new, List::addAll, List::addAll); + // http://stackoverflow.com/questions/25147094/turn-a-list-of-lists-into-a-list-using-lambdas + + // Assert + assertThat(elements.size(), is(15)); + System.err.println("Total:" + elements.size()); + WebElement resultElement = driver + .findElement(By.cssSelector("input#chapall")); + resultElement.clear(); + resultElement.sendKeys(String.format("%d", elements.size())); + } + + @Test(enabled = false) + public void test16_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + + // Act + driver + .findElements( + By.cssSelector(".container .row .intro-message ul#books li")) + .stream().filter(o -> { + CharSequence text = "Book"; + return (Boolean) !(o.getText().contains(text)); + }).forEach(o -> { + try { + highlight(o); + o.click(); + } catch (WebDriverException e) { + System.err.println( + String.format("Exception (ignored):\n%s", e.toString())); + // Element is not clickable + } + }); + } + + @Test(enabled = false) + public void test17() { + // Arrange + driver.get("http://suvian.in/selenium/2.7waitUntil.html"); + + WebElement clickElement = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(clickElement, notNullValue()); + assertThat(clickElement.getText(), containsString("Click Me")); + // Act + long startTime = System.currentTimeMillis(); + clickElement.click(); + // Assert + long retryInterval = 1000; + long maxRetry = 30; + long checkRetryDelay = 0; + while (true) { + try { + // confirm alert + driver.switchTo().alert().accept(); + break; + } catch (NoAlertPresentException e) { + // check if waited long enough already + checkRetryDelay = System.currentTimeMillis() - startTime; + if (Math.ceil(checkRetryDelay / retryInterval) > maxRetry + 1) { + System.err.format("Alert not present after %d second\n", + checkRetryDelay); + throw new RuntimeException(); + } + try { + System.err.print(String.format("Sleep %4.2f sec ...", + Math.ceil(retryInterval / 1000))); + Thread.sleep(retryInterval); + } catch (InterruptedException e2) { + System.err.println("Unexpected Interrupted Exception: " + + e.getStackTrace().toString()); + throw new RuntimeException(e.toString()); + } + } catch (Exception e) { + System.err + .println("Unexpected exception: " + e.getStackTrace().toString()); + throw new RuntimeException(e.toString()); + } + } + + long delaySecond = (checkRetryDelay / 1000) % 60; + long delayMinute = (checkRetryDelay / (1000 * 60)) % 60; + long delayHour = (checkRetryDelay / (1000 * 60 * 60)) % 24; + String delayTime = String.format("%02d:%02d:%02d", delayHour, delayMinute, + delaySecond); + System.err.format("Alert was confirmed at %s\n", delayTime); + } + + @Test(enabled = false) + public void test18_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message button#button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.w3-progress-container div#myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + + // Act + button1.click(); + // Brute force wait until button2 gets enabled - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + String t = button2.getAttribute("disabled"); + return (t == null); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Assert + } + + @Test(enabled = false) + public void test18_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + WebElement progressBarContainer = progressBar.findElement(By.xpath("..")); + int denom = Integer.parseInt( + styleOfElement(progressBarContainer, "width").replace("px", "")); + // Act + button1.click(); + + // Evaluate the progressBar width to reach 100% - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Pattern p = Pattern.compile("([0-9.]+)px", + Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + float percentage = Float.parseFloat( + p.matcher(styleOfElement(progressBar, "width")).replaceAll("$1")) + / denom; + System.err.println("Progress Bar: " + percentage); + return (percentage >= .97); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Assert + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + System.err.println( + "Button2 attribute check (1) : " + button2.getAttribute("outerHTML")); + button2.click(); + try { + // confirm alert + driver.switchTo().alert().accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + // NOTE: latency + System.err.println( + "Button2 attribute check (2) : " + button2.getAttribute("outerHTML")); + } + + @Test(enabled = false) + public void test18_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + // html body div.intro-header div.container div.row div.col-lg-12 + // div.intro-message button.w3-btn.w3-dark-grey + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + WebElement progressBarContainer = progressBar.findElement(By.xpath("..")); + int denom = Integer.parseInt( + styleOfElement(progressBarContainer, "width").replace("px", "")); + // Act + button1.click(); + + // Evaluate the progressBar width to reach 100% + // Use Javascript to evaluate the disabled property of the DOM element + // that will be changing from true to false - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Boolean disabled = Boolean.parseBoolean( + executeScript("return arguments[0].disabled", button2) + .toString()); + return !disabled; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + System.err.println( + "Button2 attribute check (3) : " + button2.getAttribute("outerHTML")); + } + + @Test(enabled = false) + public void test19_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.9greenColorBlock.html"); + + WebElement greenBoxElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message table div.greenbox")))); + // Act + + // Assert + assertThat(greenBoxElement, notNullValue()); + // TODO: computed style of that element + + actions.moveToElement(greenBoxElement).build().perform(); + greenBoxElement.click(); + try { + // confirm alert + alert = driver.switchTo().alert(); + String alert_text = alert.getText(); + assertThat(alert_text, containsString("You clicked on Green")); + + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + + } + + @Test(enabled = false) + public void test19_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.9greenColorBlock.html"); + + WebElement greenBoxElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message table div.greenbox")))); + // Act + + // Assert + assertThat(greenBoxElement, notNullValue()); + // simplified script for computed style an element does not work + String script = "var element = arguments[0];window.document.defaultView.getComputedStyle(element,null).getPropertyValue(arguments[1]);"; + + Object computedStyle = ((JavascriptExecutor) driver).executeScript(script, + greenBoxElement, "background-color"); + try { + System.err + .println("Red Box background color: " + computedStyle.toString()); + } catch (NullPointerException e) { + System.err.println("Script does not return the value : " + e.toString()); + } + String style = styleOfElement(greenBoxElement); + System.err.println("style:\n" + style); + + String backgroundColorAttribute = styleOfElement(greenBoxElement, + "background-color"); + String heightAttribute = styleOfElement(greenBoxElement, "height"); + String widthAttribute = styleOfElement(greenBoxElement, "width"); + + System.err + .println("backgroundColorAttribute:\n" + backgroundColorAttribute); + + Pattern pattern = Pattern.compile("\\(\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)\\)"); + Matcher matcher = pattern.matcher(backgroundColorAttribute); + int red = 0, green = 0, blue = 0; + + if (matcher.find()) { + red = Integer.parseInt(matcher.group(1).toString()); + green = Integer.parseInt(matcher.group(2).toString()); + blue = Integer.parseInt(matcher.group(3).toString()); + assertTrue(red == 0); + } + pattern = Pattern + .compile("\\(\\s*(?\\d+),\\s*(?\\d+),\\s*(?\\d+)\\)"); + matcher = pattern.matcher(backgroundColorAttribute); + if (matcher.find()) { + red = Integer.parseInt(matcher.group("red").toString()); + green = Integer.parseInt(matcher.group("green").toString()); + blue = Integer.parseInt(matcher.group("blue").toString()); + assertTrue(green >= 128); + } + System.err.println("green:" + green); + + System.err.println("heightAttribute:\n" + heightAttribute); + System.err.println("widthAttribute:\n" + widthAttribute); + // assertThat(greenBoxElement.getAttribute("background-color"), + // equalTo("red")); + + } + + // Few failing attempts. Warning: Timing out with Firefox + + // Attempt #1 + @Test(enabled = false) + public void test20_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + actions.clickAndHold(draggableElement).moveToElement(dropElement).release() + .build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #2 + @Test(enabled = false) + public void test20_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + actions.dragAndDrop(draggableElement, dropElement).build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #3 + @Test(enabled = false) + public void test20_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Point source_location = draggableElement.getLocation(); + highlight(draggableElement); + Point target_location = dropElement.getLocation(); + actions.dragAndDropBy(draggableElement, 0, + target_location.y - source_location.y).build().perform(); + actions.release().build(); + actions.perform(); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #4 + @Test(enabled = false) + public void test20_4() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + System.err.println(String.format("Mouse down at: (%-4d, %-4d)", + source_coords.inViewPort().x, source_coords.inViewPort().y)); + mouse.mouseDown(source_coords); + + mouse.mouseMove(source_coords, 0, + target_coords.inViewPort().y - source_coords.inViewPort().y); + System.err.println(String.format("Mouse up at: (%-4d, %-4d)", + target_coords.inViewPort().x + 10, target_coords.inViewPort().y + 10)); + mouse.mouseUp(target_coords); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #5 + @Test(enabled = false) + public void test20_5() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + String simulateDragDropScript = getScriptContent("simulateDragDrop.js"); + System.err.println(String.format("Simulate drag an drop by: (%-4d, %-4d)", + target_coords.inViewPort().x, target_coords.inViewPort().y)); + + executeScript(simulateDragDropScript, draggableElement, + target_coords.inViewPort().x, target_coords.inViewPort().y); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // https://github.com/tourdedave/elemental-selenium-tips + @Test(enabled = false) + public void test20_6() { + // Arrange + driver.get("http://the-internet.herokuapp.com/drag_and_drop"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#column-a")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), containsString("A")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#column-b")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("B")); + + // Act + String dragDropScript = String.format( + "%s\n$('#column-a').simulateDragDrop({ dropTarget: '#column-b'});", + getScriptContent("dnd.js")); + ((JavascriptExecutor) driver).executeScript(dragDropScript); + + // Assert + assertThat(dropElement.getText(), containsString("B")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_7() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + String dragDropScript = String.format( + "%s\n$('#drag1').simulateDragDrop({ dropTarget: '#div1'});", + getScriptContent("dnd.js")); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript); + + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_8() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + String dragDropScript = String.format("%s\n%s", getScriptContent("dnd.js"), + "var dragElememt = $(arguments[0]); var dropTargetSelector = arguments[1]; dragElememt.simulateDragDrop({ dropTarget: dropTargetSelector});"); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript, + String.format("#%s", draggableElement.getAttribute("id")), + String.format("#%s", dropElement.getAttribute("id"))); + + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_9() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + dragdrop(By.id("drag1"), By.id("div1")); + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + } + + // NOTE: this test is failing + @Test(enabled = false) + public void test21() { + // Arrange + driver.get("http://suvian.in/selenium/3.1fileupload.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + // Act + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("3.1fileupload_validate.html")); + } catch (UnreachableBrowserException e) { + } + // Assert + } + + @Test(enabled = false) + public void test22_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + // Act + + // Act + String dragDropScript = String.format("%s\n%s", getScriptContent("dnd.js"), + "var dragElememt = $(arguments[0]); var dropTargetSelector = arguments[1]; dragElememt.simulateDragDrop({ dropTarget: dropTargetSelector});"); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript, + String.format("#%s", draggableElement.getAttribute("id")), + String.format("#%s", dropElement.getAttribute("id"))); + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + } + + // Few failing attempts + // Attempt #1 + @Test(enabled = false) + public void test22_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Act + actions.clickAndHold(draggableElement).moveToElement(dropElement).release() + .build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + + } + + // Attempt #2 + @Test(enabled = false) + public void test22_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Act + actions.dragAndDrop(draggableElement, dropElement).build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + + } + + // Few failing attempts. Warning: Timing out with Firefox + @Test(enabled = false) + public void test22_4() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Attempt #3 + Point source_location = draggableElement.getLocation(); + highlight(draggableElement); + Point target_location = dropElement.getLocation(); + actions.dragAndDropBy(draggableElement, 0, + target_location.y - source_location.y).build().perform(); + actions.release().build(); + actions.perform(); + + // Attempt #4 + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + System.err.println(String.format("Mouse down at: (%-4d, %-4d)", + source_coords.inViewPort().x, source_coords.inViewPort().y)); + mouse.mouseDown(source_coords); + + mouse.mouseMove(source_coords, 0, target_location.y - source_location.y); + System.err.println(String.format("Mouse up at: (%-4d, %-4d)", + target_coords.inViewPort().x + 10, target_coords.inViewPort().y + 10)); + mouse.mouseUp(target_coords); + + // Assert + } + + // only loads first 25 lines of code + @Test(enabled = false) + public void test23_1() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + List codeLines = codeElement + .findElements(By.cssSelector("pre[role='presentation']")); + + // Assert + assertTrue(codeLines.size() > 0); + System.err.println(String.format("%d Lines of code:", codeLines.size())); + List code = codeLines.stream().map(e -> { + executeScript("arguments[0].scrollIntoView(true);", e); + highlight(e); + return e.getText(); + }).collect(Collectors.toList()); + + code.stream().forEach(e -> System.err.println(e)); + } + + // loads all code + @Test(enabled = false) + public void test23_2() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + WebElement codeLine = codeElement + .findElement(By.cssSelector("pre[role='presentation']:nth-of-type(1)")); + + // Assert + assertThat(codeLine, notNullValue()); + while (true) { + try { + List codeLinesFollowing = codeLine + .findElements(By.xpath("following-sibling::pre")); + if (codeLinesFollowing.size() == 0) { + System.err + .println(String.format("Last line: '%s'", codeLine.getText())); + break; + } + WebElement nextCodeLine = codeLinesFollowing.get(0); + executeScript("arguments[0].scrollIntoView(true);", nextCodeLine); + highlight(codeLine); + System.err.println(codeLine.getText()); + codeLine = nextCodeLine; + } catch (Exception e) { + e.printStackTrace(); + break; + } + } + } + + // only loads first 35 lines of code + @Test(enabled = false) + public void test23_3() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + // brute force ? + int cnt = 0; + while (true) { + cnt++; + try { + WebElement codeLine = codeElement.findElement(By.cssSelector( + String.format("pre[role='presentation']:nth-of-type(%d)", cnt))); + assertThat(codeLine, notNullValue()); + executeScript("arguments[0].scrollIntoView(true);", codeLine); + highlight(codeLine); + System.err.println(codeLine.getText()); + } catch (NoSuchElementException e) { + // e.printStackTrace(); + break; + } + } + // Assert + } + + @Test(enabled = false) + public void test25_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + + assertThat(link, notNullValue()); + assertThat(link.getText(), containsString("Generate Scorecard")); + link.click(); + + // Wait page to update + + try { + wait.until(SuvianTest::hasScoreMethod); + } catch (UnreachableBrowserException e) { + } + // Assert + List rowElements = driver.findElements( + By.cssSelector(".container .row .intro-message table tbody tr")); + Map playerScores = rowElements.stream() + .collect(Collectors.toMap( + o -> o.findElement(By.cssSelector("td:nth-of-type(1)")).getText() + .trim(), + o -> Integer.parseInt( + o.findElement(By.cssSelector("td:nth-of-type(2)")).getText()))); + List> playerScoresList = new LinkedList<>( + playerScores.entrySet()); + Collections.sort(playerScoresList, + new Comparator>() { + @Override + public int compare(Map.Entry first, + Map.Entry second) { + return (second.getValue()).compareTo(first.getValue()); + } + }); + + String bestScoringPlayerName = playerScoresList.get(0).getKey(); + WebElement playerNameInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("form.form-inline input#score[name='topscorer']")))); + playerNameInput.clear(); + playerNameInput.sendKeys(bestScoringPlayerName); + System.err.println(bestScoringPlayerName); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + + static boolean hasScoreMethod(WebDriver driver) { + return driver + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0; + } + + // This test was developed with Selenium Driver 2.53 and needs update to work + // with Selenium 3.x.x + /* + @Test(enabled = false) + public void test25_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + + assertThat(link, notNullValue()); + assertThat(link.getText(), containsString("Generate Scorecard")); + link.click(); + + // Wait page to update + com.google.common.base.Predicate hasScore = d -> { + return (boolean) (d + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0); + }; + try { + wait.until(hasScore); + } catch (UnreachableBrowserException e) { + } + // Assert + List scores = driver + .findElements(By.cssSelector( + ".container .row .intro-message table tbody tr td:nth-of-type(2) p[id]")) + .stream().map(e -> Integer.parseInt(e.getText().trim())) + .collect(Collectors.toList()); + Collections.sort(scores, Collections.reverseOrder()); + int maxScore = scores.get(0); + int minScore = scores.get(scores.size() - 1); + assertTrue(maxScore >= minScore); + + List players = driver + .findElements(By.cssSelector( + ".container .row .intro-message table tbody tr td:nth-of-type(1)")) + .stream().filter(o -> { + WebElement s = o.findElement(By.xpath("following-sibling::td")); + return (Boolean) (Integer.parseInt(s.getText()) == maxScore); + }).map(e -> e.getText()).collect(Collectors.toList()); + System.err.println(players.get(0)); + WebElement playerNameInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("form.form-inline input#score[name='topscorer']")))); + playerNameInput.clear(); + playerNameInput.sendKeys(StringUtils.join(players, ",")); + Integer scoreSachin = Integer.parseInt(driver + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim()); + WebElement scoreInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By + .cssSelector("form.form-inline input#score[name='sachinruns']")))); + scoreInput.clear(); + scoreInput.sendKeys(String.format("%d", scoreSachin)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + */ + + // This test was developed with Selenium Driver 2.53 and needs update to work + // with Selenium 3.x.x + /* + @Test(enabled = false) + public void test25_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(link, notNullValue()); + + // Act + link.click(); + + // Wait page to update + try { + wait.until((com.google.common.base.Predicate) (d -> d + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0)); + } catch (UnreachableBrowserException e) { + } + Map playerScores = driver + .findElements( + By.cssSelector(".container .row .intro-message table tbody tr")) + .stream() + .collect(Collectors.toMap( + o -> o.findElement(By.xpath("td[1]")).getText().trim(), + o -> Integer.parseInt(o.findElement(By.xpath("td[2]")).getText()))); + // Assert + LinkedHashMap playerScoresList = sortByValue(playerScores); + + // TODO : finish + for (String key : playerScoresList.keySet()) { + System.out.println(key + ":\t" + playerScoresList.get(key)); + } + } + + // sorting example from + // http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java + public static > LinkedHashMap sortByValue( + Map map) { + return map.entrySet().stream() + .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (e1, e2) -> e1, LinkedHashMap::new)); + } + */ + + @Test(enabled = false) + public void test26() { + // Arrange + driver.get("http://suvian.in/selenium/3.6copyTextFromTextField.html"); + WebElement sourceElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message form textarea[name='field_one']")))); + assertThat(sourceElement, notNullValue()); + WebElement targetElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//div[@class = 'container']//div[@class = 'row']//div[@class = 'intro-message']//form/textarea[@name='field_two']")))); + assertThat(targetElement, notNullValue()); + + // Act + String text = sourceElement.getText(); + executeScript("arguments[0].removeAttribute('readonly');", sourceElement); + // arguments[0].removeAttribute('readonly',0) + sourceElement.clear(); + targetElement.sendKeys((CharSequence) text); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + String textValue = executeScript("return arguments[0].value;", + targetElement).toString(); + assertThat(textValue, containsString(text)); + System.err.println("value = " + textValue); + + assertThat(targetElement.getAttribute("value"), containsString(text)); + // Assert + try { + assertThat(targetElement.getText(), containsString(text)); + } catch (AssertionError e) { + System.err.println("Exception(ignoredd): " + e.toString()); + // new textArea value is not possible to retrieve with getText() + } + } + + @Test(enabled = false) + public void test27_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement inputElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//div[@class='intro-message']/ul[@id='tst']/li[.='India']/input[@type='radio' and @name='country']")))); + assertThat(inputElement, notNullValue()); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + String script = "var radios = document.getElementsByTagName('input');\n" + + "var checkedRadioItemNumber = 1; for (var cnt = 0; cnt < radios.length; cnt++) {\n" + + "if (radios[cnt].type === 'radio' && radios[cnt].checked) {\n" + + "checkedRadioItemNumber = cnt; }\n}\n" + + "var value = radios[checkedRadioItemNumber].value;" + + "return (checkedRadioItemNumber + 1).toString();"; + String checkedRadioItemNumber = executeScript(script).toString(); + System.err.println("Checked is Radio item #" + checkedRadioItemNumber); + WebElement itemElement = driver.findElement(By.xpath( + String.format("//ul[@id='tst']/li[%s]", checkedRadioItemNumber))); + assertThat(itemElement, notNullValue()); + System.err.println("Result : " + itemElement.getText()); + } + + @Test(enabled = false) + public void test27_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement itemList = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message ul#tst")))); + assertThat(itemList, notNullValue()); + // Act + + WebElement inputElement = itemList.findElements(By.tagName("li")).stream() + .filter(o -> o.getText().contains((CharSequence) "India")) + .map(o -> o + .findElement(By.xpath("input[@type='radio' and @name='country']"))) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + // https://docs.google.com/a/jazzteam.org/document/d/1PdfKMDfoqFIlF4tN1jKrOf1iZ1rqESy2xVMIj3uuV3g/pub + @Test(enabled = false) + public void test27_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement itemList = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message ul#tst")))); + assertThat(itemList, notNullValue()); + // Act + WebElement inputElement = itemList + .findElements(By.xpath( + "li[contains(text(), 'India')]//input[@type='radio' and @name='country']")) + .stream() + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + @Test(enabled = false) + public void test27_4() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + // Act + WebElement inputElement = driver + .findElements(By.xpath( + "//li[contains(text(), 'India')]//input[@type='radio' and @name='country']")) + .stream() + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + @Test(enabled = false) + public void test28_1() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + WebElement linkElement = driver.findElement(By.xpath( + "//table[@summary='Sample Table']/tbody/tr/td[text()='Taipei']/../descendant::a[@href='#']")); + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + @Test(enabled = false) + public void test28_2() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + WebElement linkElement = driver.findElement(By.xpath( + "//table[@summary='Sample Table']/tbody/tr[td/text()='Taipei']/descendant::a[@href='#']")); + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + @Test(enabled = false) + public void test28_3() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + Optional trylinkElement = driver + .findElements(By.xpath("//table[@summary='Sample Table']/tbody/tr")) + .stream() + .filter( + o -> o.findElements(By.xpath("td[text()='Taipei']")).size() != 0) + .map(o -> o.findElement(By.xpath("td/a[@href='#']"))).findFirst(); + WebElement linkElement = (trylinkElement.isPresent()) ? trylinkElement.get() + : null; + assertThat(linkElement, notNullValue()); + highlight(linkElement); + + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + /* + +
+ +
+
+ + "//li/section[span/text()='Credit Card']/../following-sibling::section/span[@name='edit']" + */ + + @Test(enabled = false) + public void test30() { + // Arrange + driver.get("http://suvian.in/selenium/3.10select1stFriday.html"); + + WebElement calendarElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message h4 input[name='calendar']")))); + int xOffset = calendarElement.getSize().getWidth() - 5; + int yOffset = calendarElement.getSize().getHeight() - 5; + System.err.println(String.format("Hover at (%d, %d)", xOffset, yOffset)); + + actions.moveToElement(calendarElement, xOffset, yOffset); + actions.build().perform(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + calendarElement.sendKeys("01/21/2017"); + actions.moveToElement(calendarElement, xOffset, yOffset).click().build() + .perform(); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + // NOTE: unable to locate individual calendar dates elements with Selenium + // WebDriver + driver.findElements(By.xpath("//*[contains(@class,'calendar')]")).stream() + .forEach(o -> { + System.err.println(o.getAttribute("outerHTML")); + }); + try { + for (int i = 0; i != 8; i++) { + calendarElement.sendKeys(Keys.ARROW_RIGHT); + Thread.sleep(100); + } + } catch (InterruptedException e) { + } + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + } + // Assert + } + + // bad practice ? + // too much navigation and excessively detailed - possibly auto-generated - + // locators + // http://automated-testing.info/t/webdriver-java-ne-rabotaet-metod-click/13838/16 + @Test(enabled = false) + public void test31_1() { + // Arrange + driver.get( + "https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru"); + // Act + WebElement element = driver.findElement(By.xpath( + "//strong[text()='Пол']/following-sibling::div/div[@role='listbox'][1]")); + assertThat(element, notNullValue()); + highlight(element); + element.click(); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + } + element = wait.until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[text()='Мужской']/parent::div[@role='option']")))); + highlight(element); + element.click(); + + } + + // somewhat refactored + @Test(enabled = false) + public void test31_2() { + // Arrange + driver.get( + "https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru"); + // Act + + List elements = driver.findElements(By.xpath( + "//div/label[strong/text()='Пол']/div[@id='Gender']/div[@role='listbox']")); + assertThat(elements.get(0), notNullValue()); + WebElement element = elements.get(0); + highlight(element); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + } + element.click(); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + } + + element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.xpath("//div[@role='option'][div/text()='Мужской']")))); + highlight(element); + element.click(); + } + + // + @Test(enabled = false) + public void test32_1() { + // Arrange + driver.get( + "https://market.yandex.ru/catalog/54913/list?hid=90566&track=fr_ctlg&lr=0&local-offers-first=0&deliveryincluded=0&onstock=1"); + actions.moveToElement( + wait.until(ExpectedConditions.visibilityOf(driver.findElement(By + .xpath("//div[@class='n-filter-panel-aside__content']/div[4]"))))); + + // Act + List elements = driver.findElements(By.xpath( + "//div[@class='n-filter-panel-aside__content']/div[4]//span[@class='checkbox__box']/input[@type='checkbox']")); + assertTrue(elements.size() > 0); + assertThat(elements.get(0), notNullValue()); + for (WebElement element : elements) { + System.err + .println("Selecting the checkbox:\n" + element.getAttribute("id")); + actions.moveToElement(element); + element.sendKeys(Keys.SPACE); + try { + highlight(element, 100); + } catch (Exception e) { + System.err.println("highlight() Exception " + e.getMessage()); + // Exception Expected condition failed: waiting for visibility of + // element + } + try { + highlightNew(element, 100); + } catch (Exception e) { + System.err.println("highlightNew() Exception: " + e.getMessage()); + // Exception unknown command: session/.../element/.../rect + } + try { + element.click(); + } catch (Exception e) { + System.err.println("click() Exception: " + e.getMessage()); + // Element ... is not clickable at point ... Other element would receive + // the click + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + } + + @Test(enabled = false) + public void test32_2() { + // Arrange + driver.get( + "https://market.yandex.ru/catalog/54913/list?hid=90566&track=fr_ctlg&lr=0&local-offers-first=0&deliveryincluded=0&onstock=1"); + actions.moveToElement( + wait.until(ExpectedConditions.visibilityOf(driver.findElement(By + .xpath("//div[@class='n-filter-panel-aside__content']/div[4]"))))); + + // Act + List elements = driver.findElements(By.xpath( + "//div[@class='n-filter-panel-aside__content']/div[4]//span[span/@class='checkbox__box']/label[@class='checkbox__label']")); + System.err.println("Elements size=" + elements.size()); + assertThat(elements.get(0), notNullValue()); + for (WebElement element : elements) { + actions.moveToElement(element); + highlight(element); + System.err.println("Click on label:" + element.getAttribute("for")); + element.click(); + try { + element.sendKeys(Keys.SPACE); + } catch (Exception e) { + // unknown error: cannot focus element + System.err.println("sendKeys() Exception " + e.getMessage()); + } + } + } + + // + @Test(enabled = true) + public void test33_1() { + // Arrange + driver.get("https://datatables.net/examples/api/form.html"); + String table_id = "example"; + + WebElement table_element; + try { + table_element = wait.until( + ExpectedConditions.visibilityOfElementLocated(By.id(table_id))); + } catch (RuntimeException timeoutException) { + return; + } + String text_input_css_selector = "input[id='row-5-age']"; + WebElement text_input_element = table_element + .findElement(By.cssSelector(text_input_css_selector)); + actions.moveToElement(text_input_element).build().perform(); + String cell_text = "Software Developer"; + text_input_element.clear(); + // https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/Keys.html + text_input_element.sendKeys(Keys.chord(Keys.BACK_SPACE, Keys.BACK_SPACE, + Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE)); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + text_input_element.sendKeys(Keys.chord("20", org.openqa.selenium.Keys.TAB, + cell_text, org.openqa.selenium.Keys.ENTER)); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + } + + @Test(enabled = true) + public void test33_2() { + + // Go to base url + driver.get("https://datatables.net/examples/api/highlight.html"); + + // Maximize Window + driver.manage().window().maximize(); + + String table_id = "example"; + WebElement table_element; + + try { + wait.until( + ExpectedConditions.visibilityOfElementLocated(By.id(table_id))); + } catch (RuntimeException timeoutException) { + return; + } + // http://stackoverflow.com/questions/6198947/how-to-get-text-from-each-cell-of-an-html-table + String script = "var table_row_locator = 'div#example_wrapper table#example tbody tr';\n" + + "var rows = document.querySelectorAll(table_row_locator);\n" + + "var result = [];\n" + + "for (row_cnt = 0; row_cnt != rows.length; row_cnt++) {\n" + + "var row = rows[row_cnt];\n" + "if (row instanceof Element) {\n" + + "var cols = row.querySelectorAll('td');\n" + + "var check_col_num = 1;\n" + "var data_col_num = 0;\n" + + "if (cols[check_col_num].innerHTML.match(/^Software.*/ig)) {\n" + + "result.push(cols[data_col_num].innerHTML);\n" + "}\n" + "}\n" + "}\n" + + "return result.join();\n"; + + System.out.println( + String.format("Script: '%s'\nResult: '%s'", script, storeEval(script))); + + // NOTE: Works in IDE, does not work with WebDriver + script = String.format("(function() { %s })();", script); + System.out.println( + String.format("Script: '%s'\nResult: '%s'", script, storeEval(script))); + + table_element = driver.findElement(By.id(table_id)); + // NOTE: no leading slash in XPath + List rows = table_element.findElements(By.xpath("tbody/tr")); + System.out.println("NUMBER OF ROWS IN THIS TABLE = " + rows.size()); + int row_num, cell_num, max_rows; + max_rows = 3; + row_num = 1; + String row_role_attribute = "row"; + for (WebElement row : rows) { + if (row_num > max_rows) { + break; + } + assertTrue( + // String.format("Unexpected title '%s'", row.getAttribute("role")), + row.getAttribute("role").matches(row_role_attribute)); + cell_num = 1; + List cells = row.findElements(By.xpath("td")); + String checkColumn = cells.get(cell_num).getText(); + // System.out.println(checkColumn); + if (checkColumn.matches("Software.*")) { + // System.out.println("NUMBER OF COLUMNS=" + cells.size()); + cell_num = 1; + for (WebElement cell : cells) { + // Hover over cell + actions.moveToElement(cell).build().perform(); + highlight(cell); + System.out.println(String.format("row # %d, col # %d text='%s'", + row_num, cell_num, cell.getText())); + cell_num++; + } + row_num++; + } + } + } + + // Utils + + private String storeEval(String script) { + String result = null; + if (driver instanceof JavascriptExecutor) { + System.out.println("running the script"); + result = (String) ((JavascriptExecutor) driver).executeScript(script); + } + return result; + } + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + private void highlightNew(WebElement element, long highlight_interval) { + Rectangle elementRect = element.getRect(); + String highlightScript = getScriptContent("highlight.js"); + // append calling + + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format( + "%s\nhighlight_create(arguments[0],arguments[1],arguments[2],arguments[3]);", + highlightScript), + elementRect.y, elementRect.x, elementRect.width, + elementRect.height); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format("%s\nhighlight_remove();", highlightScript)); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + + } + + private boolean areElementsPresent(WebElement parentWebElement, By byLocator) { + return parentWebElement.findElements(byLocator).size() == 1; + // usage: + // assertTrue(areElementsPresent(driver.findElements(By.cssSelector("li[class*= product]")).get(0), By.cssSelector("[class*=sticker]"))); + } + + public boolean isGreaterThen(String a, String b) + { + return a.compareTo(b) < 0; + // usage: + // List rows = table.findElements(By.cssSelector("td:nth-of-type(5)>a")); + // + // for (int i = 0; i prefs = new HashMap<>(); + prefs.put("profile.default_content_settings.popups", 0); + // Put this into prefs map to switch off browser notification + prefs.put("profile.default_content_setting_values.notifications", 2); + // Put this into prefs map to switch off save password notification + prefs.put("credentials_enable_service", false); + prefs.put("profile.password_manager_enabled", false); + String downloadPath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + prefs.put("download.default_directory", downloadPath); + prefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", prefs); + + for (String optionAgrument : (new String[] { + "--allow-running-insecure-content", "--allow-insecure-localhost", + "--enable-local-file-accesses", "--disable-notifications", + "--disable-save-password-bubble", + /* "start-maximized" , */ + "--browser.download.folderList=2", "--disable-web-security", + "--no-proxy-server", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("--browser.download.dir=%s", downloadPath) + /* "--user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + + } else if (browser.equals("firefox")) { + // TODO: Observed user agent problem with firefox - mobile version of + // tripadvisor is rendered + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + wait = new WebDriverWait(driver, flexible_wait_interval); + wait.pollingEvery(wait_polling_interval, TimeUnit.MILLISECONDS); + driver.get(baseURL); + driver.manage().timeouts().implicitlyWait(implicit_wait_interval, + TimeUnit.SECONDS); + } + + @AfterSuite + public static void tearDown() throws Exception { + driver.close(); + driver.quit(); + if (verificationErrors.length() != 0) { + throw new Exception(verificationErrors.toString()); + } + } + + @BeforeMethod + public void loadBaseURL() { + driver.get(baseURL); + } + + @Test(enabled = true) + public void test1() { + assertEquals("Hotels", findElement("link_text", "Hotels").getText()); + } + + @Test(enabled = true) + public void test2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = xpathOfElement(element); + assertEquals("//div[@id=\"HEAD\"]/div/div[2]/ul/li/span/a", selector); + element = findElement("xpath", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test3_1() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElement(element); + System.err.println("test 2: CssSelector: " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + // without class attributes: + // "div#HEAD > div > div:nth-of-type(2) > ul > li > span > a" + try { + element = findElement("css_selector", selector); + highlight(element); + } catch (NullPointerException e) { + verificationErrors.append("test 2: " + e.toString()); + } + } + + @Test(enabled = true) + public void test3_2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElement(element); + System.err.println("test 2: CssSelector: " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test4_1() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + System.err.println("test 3: Css Selector (alternative) : " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + // without class attributes: + // "div#HEAD > div > div:nth-of-type(2) > ul > li > span > a" + try { + element = findElement("css_selector", selector); + highlight(element); + } catch (NullPointerException e) { + verificationErrors.append("test 3: " + e.toString()); + } + } + + @Test(enabled = true) + public void test4_2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + System.err.println("test 3: Css Selector (alternative) : " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test5() { + WebElement element = findElement("css_selector", "input#mainSearch"); + assertEquals("input#mainSearch", cssSelectorOfElement(element)); + assertEquals("input#mainSearch", cssSelectorOfElementAlternative(element)); + highlight(element); + } + + @Test(enabled = true) + public void test6() { + WebElement element = findElement("css_selector", "span#rdoFlights") + .findElement(By.cssSelector("div span.label")); + assertEquals("span#rdoFlights > div.header > span.label", + cssSelectorOfElement(element)); + highlight(element); + } + + @Test(enabled = true) + public void test7() { + WebElement element = findElement("id", "searchbox"); + assertEquals("input#searchbox", cssSelectorOfElement(element)); + highlight(element); + } + + @Test(enabled = true) + public void test8() { + WebElement element = findElement("id", "searchbox") + .findElement(By.xpath("..")); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + // System.err.println("test 7: selector (alternative):\n" + selector); + assertEquals( + "form#PTPT_HAC_FORM > div.metaFormWrapper > div.metaFormLine.flex > label.ptptLabelWrap", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + // @Ignore + @SuppressWarnings("static-access") + @Test(enabled = true) + public void test9() { + + WebElement element = findElement("link_text", "Hotels"); + assertThat(element, notNullValue()); + highlight(element); + String style = styleOfElement(element); + System.err.println("style:\n" + style); + String colorAttribute = styleOfElement(element, "color"); + String heightAttribute = styleOfElement(element, "height"); + String widthAttribute = styleOfElement(element, "width"); + + // assertions of certain CSS attributes + try { + assertTrue(colorAttribute.equals("rgb(255, 255, 255)")); + } catch (AssertionError e) { + // slurp + } + // pattern = Pattern.compile("\\((\\d+),"); + matcher = Pattern.compile("\\((\\d+),").matcher(colorAttribute); + if (matcher.find()) { + int red = Integer.parseInt(matcher.group(1).toString()); + assertTrue(red > 254); + } + System.err.println("color:" + colorAttribute); + + try { + assertTrue(widthAttribute.equals("36.6667px")); // fragile ! + } catch (AssertionError e) { + // slurp + } + pattern = Pattern.compile("([\\d\\.]+)px"); + matcher = pattern.matcher(widthAttribute); + if (matcher.find()) { + Float mask = new Float("20.75f"); + Float width = mask.parseFloat(matcher.group(1).toString()); + assertTrue(width > 36.5); + } + System.err.println("width:" + widthAttribute); + + System.err.println("examine height attribute: " + heightAttribute); + // broken after 431eac6a3baa + // assertTrue(height.equals("12px")); + // print css values + // System.err.println("height:" + heightAttribute); + } + + // Utils + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + private String cssSelectorOfElement(WebElement element) { + return (String) executeScript(getScriptContent("cssSelectorOfElement.js"), + element); + } + + private String styleOfElement(WebElement element, Object... arguments) { + return (String) executeScript(getScriptContent("getStyle.js"), element, + arguments); + } + + private String cssSelectorOfElementAlternative(WebElement element) { + return (String) executeScript( + getScriptContent("cssSelectorOfElementAlternative.js"), element); + } + + private void highlight(WebElement element) { + highlight(element, highlight_interval); + } + + private static void highlight(WebElement element, long highlight) { + try { + wait.until(ExpectedConditions.visibilityOf(element)); + executeScript("arguments[0].style.border='3px solid yellow'", + new Object[] { element }); + Thread.sleep(highlight); + executeScript("arguments[0].style.border=''", new Object[] { element }); + + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + private String xpathOfElement(WebElement element) { + return (String) executeScript(getScriptContent("xpathOfElement.js"), + new Object[] { element }); + } + + public static Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); // a.k.a. (JavascriptExecutor) driver; + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + private List findElements(String selectorKind, + String selectorValue, WebElement parent) { + SearchContext finder; + String parent_css_selector = null; + String parent_xpath = null; + + List elements = null; + Hashtable selectorStrategies = new Hashtable(); + selectorStrategies.put("css_selector", true); + selectorStrategies.put("xpath", true); + + if (selectorKind == null || !selectorStrategies.containsKey(selectorKind) + || !selectorStrategies.get(selectorKind)) { + return null; + } + if (parent != null) { + parent_css_selector = cssSelectorOfElement(parent); + parent_xpath = xpathOfElement(parent); + finder = parent; + } else { + finder = driver; + } + + if (selectorKind == "css_selector") { + String extended_css_selector = String.format("%s %s", + parent_css_selector, selectorValue); + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.cssSelector(extended_css_selector))); + } catch (RuntimeException timeoutException) { + return null; + } + elements = finder.findElements(By.cssSelector(selectorValue)); + } + if (selectorKind == "xpath") { + String extended_xpath = String.format("%s/%s", parent_xpath, + selectorValue); + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.xpath(extended_xpath))); + } catch (RuntimeException timeoutException) { + return null; + } + elements = finder.findElements(By.xpath(selectorValue)); + } + return elements; + } + + private List findElements(String selectorKind, + String selectorValue) { + return findElements(selectorKind, selectorValue, null); + } + + private WebElement findElement(String selectorKind, String selectorValue) { + WebElement element = null; + Hashtable selectorStrategies = new Hashtable(); + selectorStrategies.put("id", true); + selectorStrategies.put("css_selector", true); + selectorStrategies.put("xpath", true); + selectorStrategies.put("partial_link_text", false); + selectorStrategies.put("link_text", true); + selectorStrategies.put("classname", false); + + if (selectorKind == null || !selectorStrategies.containsKey(selectorKind) + || !selectorStrategies.get(selectorKind)) { + return null; + } + if (selectorKind == "id") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.id(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.id(selectorValue)); + } + if (selectorKind == "classname") { + + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.className(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.className(selectorValue)); + } + if (selectorKind == "link_text") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.linkText(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.linkText(selectorValue)); + } + if (selectorKind == "css_selector") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.cssSelector(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.cssSelector(selectorValue)); + } + if (selectorKind == "xpath") { + + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.xpath(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.xpath(selectorValue)); + } + return element; + } + + protected static String getScriptContent(String scriptName) { + try { + final InputStream stream = TripAdvisorTest.class.getClassLoader() + .getResourceAsStream(scriptName); + final byte[] bytes = new byte[stream.available()]; + stream.read(bytes); + return new String(bytes, "UTF-8"); + } catch (IOException e) { + throw new RuntimeException("Cannot load file: " + scriptName); + } + } + + public static void waitForElementVisible(By locator) { + log.info("Waiting for element visible for locator: {}", locator); + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + } + + public static void waitForElementVisible(By locator, long timeout) { + log.info("Waiting for element visible for locator: {}", locator); + WebDriverWait wait = new WebDriverWait(driver, timeout); + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + } + + public static void waitForElementPresent(By locator) { + log.info("Waiting for element present for locator: {}", locator); + wait.until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + public static void waitForElementPresent(By locator, long timeout) { + log.info("Waiting for element present for locator: {}", locator); + WebDriverWait wait = new WebDriverWait(driver, timeout); + wait.until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + public static void waitForPageLoad() { + log.info("Wait for page load via JS..."); + String state = ""; + int counter = 0; + + do { + try { + state = (String) ((JavascriptExecutor) driver) + .executeScript("return document.readyState"); + Thread.sleep(1000); + } catch (Exception e) { + e.printStackTrace(); + } + counter++; + log.info(("Browser state is: " + state)); + } while (!state.equalsIgnoreCase("complete") && counter < 20); + + } + + public static boolean isAttributePresent(By locator, String attribute) { + log.info("Is Attribute Present for locator: {}, attribute: {}", locator, + attribute); + return driver.findElement(locator).getAttribute(attribute) != null; + } + + public static void selectDropdownByIndex(By locator, int index) { + log.info("Select Dropdown for locator: {} and index: {}", locator, index); + try { + Select select = new Select(driver.findElement(locator)); + select.selectByIndex(index); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static String getBaseURL() { + // TODO: somehow browser is set to mobile + // if the next line is commented + System.err.println("Get base URL: " + driver.getCurrentUrl()); + log.info("Get base URL: {}", driver.getCurrentUrl()); + String currentURL = driver.getCurrentUrl(); + String protocol = null; + String domain = null; + + try { + URL url = new URL(currentURL); + protocol = url.getProtocol(); + domain = url.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // System.err.println("Returning: " + protocol + "://" + domain); + return protocol + "://" + domain; + } + + public static void clickJS(By locator) { + log.info("Clicking on locator via JS: {}", locator); + wait.until( + ExpectedConditions.elementToBeClickable(driver.findElement(locator))); + ((JavascriptExecutor) driver).executeScript("arguments[0].click();", + driver.findElement(locator)); + } + + public static void scrollIntoView(By locator) { + log.info("Scrolling into view: {}", locator); + ((JavascriptExecutor) driver).executeScript( + "arguments[0].scrollIntoView(true);", driver.findElement(locator)); + } + + public static void mouseOver(By locator) { + log.info("Mouse over: {}", locator); + actions.moveToElement(driver.findElement(locator)).build().perform(); + } + + public static void click(By locator) { + log.info("Clicking: {}", locator); + driver.findElement(locator).click(); + } + + public static void clear(By locator) { + log.info("Clearing input: {}", locator); + driver.findElement(locator).clear(); + } + + public static void sendKeys(By locator, String text) { + log.info("Typing \"{}\" into locator: {}", text, locator); + driver.findElement(locator).sendKeys(text); + } + + public static String getText(By locator) { + String text = driver.findElement(locator).getText(); + log.info("The string at {} is: {}", locator, text); + return text; + } + + public static String getAttributeValue(By locator, String attribute) { + String value = driver.findElement(locator).getAttribute(attribute); + log.info("The attribute \"{}\" value of {} is: {}", attribute, locator, + value); + return value; + } + + public static boolean isElementVisible(By locator) { + try { + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + log.info("Element {} is visible", locator); + return true; + } catch (Exception e) { + log.info("Element {} is not visible", locator); + return false; + } + } + + // custom wait while Login Lightbox is visible + + public static void waitWhileElementIsVisible(By locator) { + final By locatorFinal = locator; + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver o) { + return (o.findElements(locatorFinal).size() == 0); + } + }); + } + + public static boolean isElementNotVisible(By locator) { + try { + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + log.info("Element {} is visible", locator); + return false; + } catch (Exception e) { + log.info("Element {} is not visible", locator); + return true; + } + } + + public static String getBodyText() { + log.info("Getting boby text"); + return driver.findElement(By.tagName("body")).getText(); + } + + public static void highlight(By locator) throws InterruptedException { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } +} diff --git a/ui4j_test/src/test.BAK/resources/cssSelectorOfElement.js b/ui4j_test/src/test.BAK/resources/cssSelectorOfElement.js new file mode 100644 index 000000000..4dc5ef0e9 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/cssSelectorOfElement.js @@ -0,0 +1,32 @@ +cssSelectorOfElement = function(element) { + if (!(element instanceof Element)) + return; + var path = []; + while (element.nodeType === Node.ELEMENT_NODE) { + var selector = element.nodeName.toLowerCase(); + if (element.id) { + if (element.id.indexOf('-') > -1) { + selector += '[id="' + element.id + '"]'; + } else { + selector += '#' + element.id; + } + path.unshift(selector); + break; + } else if (element.className) { + selector += '.' + element.className.replace(/^\s+/,'').replace(/\s+$/,'').replace(/\s+/g, '.'); + } else { + var element_sibling = element; + var sibling_cnt = 1; + while (element_sibling = element_sibling.previousElementSibling) { + if (element_sibling.nodeName.toLowerCase() == selector) + sibling_cnt++; + } + if (sibling_cnt != 1) + selector += ':nth-of-type(' + sibling_cnt + ')'; + } + path.unshift(selector); + element = element.parentNode; + } + return path.join(' > '); +} +return cssSelectorOfElement(arguments[0]); \ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/cssSelectorOfElementAlternative.js b/ui4j_test/src/test.BAK/resources/cssSelectorOfElementAlternative.js new file mode 100644 index 000000000..2bccd5687 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/cssSelectorOfElementAlternative.js @@ -0,0 +1,32 @@ +cssSelectorOfElement = function(element) { + + if (element == document) + return ('body'); + else if (element.id) + return (element.tagName.toLowerCase() + '#' + element.id); + + var selector = element.tagName.toLowerCase(); + var angular_attribute = ['ng-model', 'ng-href', 'name', 'aria-label'].reduce(function(a, b) { + return a || (element.getAttribute(b) ? b : null); + }, null); + if (angular_attribute != null) { + selector += '[' + angular_attribute + '="' + + element.getAttribute(angular_attribute).replace(/\\/g, '\\\\').replace(/\'/g, '\\\'').replace(/\"/g, '\\"').replace(/\0/g, '\\0') + '"]'; + } else if (element.className) { + selector += '.' + element.className.replace(/^\s+/, '').replace(/\s+$/, '').replace(/\s+/g, '.'); + } + // NOTE: using element.parentNode.querySelectorAll() to count siblings and using the ':nth-of-type(' selector suffix + // is somewhat coarse for attribute-less nodes + var nodes = element.parentNode.querySelectorAll(selector); + if (nodes && nodes.length > 1) + var elementIndex = Array.prototype.slice.call(nodes).indexOf(element); + if (elementIndex > 0) { + selector += ':nth-of-type(' + (elementIndex + 1).toString() + ')'; + } + selector = selector.replace(/\s/g, ' '); + if (element.parentNode) + selector = cssSelectorOfElement(element.parentNode) + ' > ' + selector; + return selector; +}; + +return cssSelectorOfElement(arguments[0]); \ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/dnd.js b/ui4j_test/src/test.BAK/resources/dnd.js new file mode 100644 index 000000000..80c17cf66 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/dnd.js @@ -0,0 +1,54 @@ +(function($) { + // origin: https://github.com/tourdedave/elemental-selenium-tips + // http://stackoverflow.com/questions/19384710/javascript-workaround-for-drag-and-drop-in-selenium-webdriver/26372276#26372276 + $.fn.simulateDragDrop = function(options) { + return this.each(function() { + new $.simulateDragDrop(this, options); + }); + }; + $.simulateDragDrop = function(elem, options) { + this.options = options; + this.simulateEvent(elem, options); + }; + $.extend($.simulateDragDrop.prototype, { + simulateEvent: function(elem, options) { + /*Simulating drag start*/ + var type = 'dragstart'; + var event = this.createEvent(type); + this.dispatchEvent(elem, type, event); + + /*Simulating drop*/ + type = 'drop'; + var dropEvent = this.createEvent(type, {}); + dropEvent.dataTransfer = event.dataTransfer; + this.dispatchEvent($(options.dropTarget)[0], type, dropEvent); + + /*Simulating drag end*/ + type = 'dragend'; + var dragEndEvent = this.createEvent(type, {}); + dragEndEvent.dataTransfer = event.dataTransfer; + this.dispatchEvent(elem, type, dragEndEvent); + }, + createEvent: function(type) { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(type, true, true, null); + event.dataTransfer = { + data: {}, + setData: function(type, val) { + this.data[type] = val; + }, + getData: function(type) { + return this.data[type]; + } + }; + return event; + }, + dispatchEvent: function(elem, type, event) { + if (elem.dispatchEvent) { + elem.dispatchEvent(event); + } else if (elem.fireEvent) { + elem.fireEvent("on" + type, event); + } + } + }); +})(jQuery); diff --git a/ui4j_test/src/test.BAK/resources/getStyle.js b/ui4j_test/src/test.BAK/resources/getStyle.js new file mode 100644 index 000000000..3b27a3ad8 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/getStyle.js @@ -0,0 +1,36 @@ +/** + * Returns computed style of the element or some of its properties + * + * arguments[0] {Element} The event target. + * arguments[1] {String} The name of the property (e.g. 'width'). + */ + +// http://www.htmlgoodies.com/html5/css/referencing-css3-properties-using-javascript.html#fbid=88eQV8NzD6Q +// https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle +getStyle = function(element, property) { + var result = ''; + if (window.getComputedStyle) { + var styleObj = window.getComputedStyle(element, null); + // var styleObj = document.defaultView.getComputedStyle(element, null); + if (undefined != property ) { + result = styleObj.getPropertyValue(property); + } else { + var len = styleObj.length; + for (var i = 0; i < len; i++) { + var style = styleObj[i]; + result += ' ' + style + ':' + styleObj.getPropertyValue(style) + '\n'; + } + } + } + // IE lacks getComputedStyle but has currentStyle + else if (element.currentStyle) { + try { + result = element.currentStyle[property]; + } catch (e) {} + } + return result; +} + +var element = arguments[0]; +var property = arguments[1]; +return getStyle(element, property); \ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/getText.js b/ui4j_test/src/test.BAK/resources/getText.js new file mode 100644 index 000000000..11e3cdb0e --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/getText.js @@ -0,0 +1,31 @@ +/** + * Computes text value of the element + * + * arguments[0] {Element} The event target. + * arguments[1] {Boolean} Whether to concatenate element text fragments with spaces. + */ +// http://stackoverflow.com/questions/6743912/get-the-pure-text-without-html-element-by-javascript +getText = function(element, addSpaces) { + var i, result, text, child; + if (element.childNodes && element.childNodes > 1) { + result = ''; + for (i = 0; i < element.childNodes.length; i++) { + child = element.childNodes[i]; + text = null; + // NOTE we only collapsing child node values when there is more than one child + if (child.elementType === 1) { + text = getText(child, addSpaces); + } else if (child.elementType === 3) { + text = child.elementValue; + } + if (text) { + if (addSpaces && /\S$/.test(result) && /^\S/.test(text)) text = ' ' + text; + result += text; + } + } + } else { + result = element.innerText || element.textContent || ''; + } + result = result.replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').replace(/^\s+/, '').replace(/\s+$/, '') + return result; +} \ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/highlight.js b/ui4j_test/src/test.BAK/resources/highlight.js new file mode 100644 index 000000000..3af7b9edc --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/highlight.js @@ -0,0 +1,30 @@ +/** + * Creates a floating translucent div at the specified location in order to highlight a particular + * element. Note that these scripts are run directly in the browser under test, so they need to + * be ES5 compatible and serializable. + */ +highlight_create = function(top, left, width, height) { + // console.log('Highlighting at ', top, left, width, height); + var el = document.createElement('div'); + el.id = 'BP_ELEMENT_HIGHLIGHT__'; + document.body.appendChild(el); + el.style['position'] = 'absolute'; + el.style['background-color'] = 'lightblue'; + el.style['opacity'] = '0.7'; + el.style['top'] = top + 'px'; + el.style['left'] = left + 'px'; + el.style['width'] = width + 'px'; + el.style['height'] = height + 'px'; +}; + +/** + * Removes the highlight + */ +highlight_remove = function() { + var el = document.getElementById('BP_ELEMENT_HIGHLIGHT__'); + if (el) { + el.parentElement.removeChild(el); + } +}; + +// origin: https://github.com/angular/blocking-proxy/blob/master/lib/client_scripts/highlight.js diff --git a/ui4j_test/src/test.BAK/resources/simulateClick.js b/ui4j_test/src/test.BAK/resources/simulateClick.js new file mode 100644 index 000000000..8bc3752dc --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/simulateClick.js @@ -0,0 +1,105 @@ +/** + * simulate mouse event on the element + * + * arguments[0] {Element} The event target. + * arguments[1] {String} The name of the event (e.g. 'contextmenu'). + */ + +// http://stackoverflow.com/questions/6157929/how-to-simulate-a-mouse-click-using-javascript/6158050 +// http://www.spookandpuff.com/examples/clickSimulation.html +// http://mouseevents.nerdyjs.com/search/MouseEvents +// https://raw.githubusercontent.com/sergeych/jsnippets/master/simulate_event.js +// http://stackoverflow.com/questions/35834671/similating-a-javascript-click-event-on-a-specific-page +simulate = function(element, eventName) { + var options = extend(defaultOptions, arguments[2] || {}); + var oEvent, eventType = null; + + for (var name in eventMatchers) { + if (eventMatchers[name].test(eventName)) { + eventType = name; + break; + } + } + + if (!eventType) + throw new SyntaxError('Unsupported event: ' + eventName); + + if (document.createEvent) { + oEvent = document.createEvent(eventType); + if (eventType == 'HTMLEvents') { + oEvent.initEvent(eventName, options.bubbles, options.cancelable); + } else { + oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, + options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element); + } + element.dispatchEvent(oEvent); + } else { + options.clientX = options.pointerX; + options.clientY = options.pointerY; + var evt = document.createEventObject(); + oEvent = extend(evt, options); + element.fireEvent('on' + eventName, oEvent); + } + return element; +} + +function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +} +// contextmenu is supposedly handled by simulateRightMouseButtonClick.js +var eventMatchers = { + 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, + 'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/ +} +var defaultOptions = { + pointerX: 0, + pointerY: 0, + // 0 for left button + // 1 in Chrome has effect of 'Ctrl click' - link is opened in a new tab + button: 0, + ctrlKey: true, + // modifiers have no effect in FF + altKey: false, + shiftKey: false, + metaKey: false, + bubbles: true, + cancelable: true +} + +// http://stackoverflow.com/questions/10596417/is-there-a-way-to-get-element-by-xpath-using-javascript-in-selenium-webdriver +var getElementByXpath = function getElementByXpath(xpath) { + return document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; +} + +var getElementsByXpath = function getElementByXpath(xpath) { + var result = []; + var nodesSnapshot = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0; i < nodesSnapshot.snapshotLength; i++) { + result.push(nodesSnapshot.snapshotItem(i)); + } + return result; +} +var element = null; +var eventName = null; +if (typeof(arguments) == 'undefined') { + // localor valid for a link in http://suvian.in/selenium/1.1link.html + element = getElementByXpath('//div[1]/div/div/div/div/h3[2]/a'); + eventName = 'click'; +} else { + element = arguments[0] || document.defaultView; + eventName = arguments[1] || 'click'; +} + +/* +// simplified: +var _event = new MouseEvent(eventName, { + view: window, + bubbles: true, + cancelable: true, + clientX: 20, +}); +element.dispatchEvent(_event); +*/ \ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/simulateDragDrop.js b/ui4j_test/src/test.BAK/resources/simulateDragDrop.js new file mode 100644 index 000000000..029179da6 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/simulateDragDrop.js @@ -0,0 +1,72 @@ +/** + * simulate Drag and Drop of the page element with the mouse + * + * arguments[0] {Element} The event target. + * arguments[1] {long} The destination x coordinate. + * arguments[2] {long} The destination y coordinate. + */ +// https://ynot408.wordpress.com/2011/09/22/drag-and-drop-using-selenium-webdriver/ +// http://stackoverflow.com/questions/35834671/similating-a-javascript-click-event-on-a-specific-page +simulate = function(element, eventName) { + var options = extend(defaultOptions, arguments[2] || {}); + var oEvent, eventType = null; + + for (var name in eventMatchers) { + if (eventMatchers[name].test(eventName)) { + eventType = name; + break; + } + } + + if (!eventType) + throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported'); + + if (document.createEvent) { + oEvent = document.createEvent(eventType); + if (eventType == 'HTMLEvents') { + oEvent.initEvent(eventName, options.bubbles, options.cancelable); + } else { + oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, + options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element); + } + element.dispatchEvent(oEvent); + } else { + options.clientX = options.pointerX; + options.clientY = options.pointerY; + var evt = document.createEventObject(); + oEvent = extend(evt, options); + element.fireEvent('on' + eventName, oEvent); + } + return element; +} + +function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +} +// contextmenu +var eventMatchers = { + 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, + 'MouseEvents': /^(?:click|contextmenu|dblclick|mouse(?:down|up|over|move|out))$/ +} +var defaultOptions = { + pointerX: 0, + pointerY: 0, + button: 0, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + bubbles: true, + cancelable: true +} + +var elementFrom = arguments[0] || document.defaultView; +var destX = arguments[1] || 0; +var destY = arguments[2] || 0; + +simulate(elementFrom, 'mousedown', 0, 0); +simulate(elementFrom, 'mousemove', destX, destY); +simulate(elementFrom, 'mouseup', destX, destY); diff --git a/ui4j_test/src/test.BAK/resources/simulateDragDrop2.js b/ui4j_test/src/test.BAK/resources/simulateDragDrop2.js new file mode 100644 index 000000000..03c38ed68 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/simulateDragDrop2.js @@ -0,0 +1,19 @@ +// shorter version, not functional +function simulate(f, c, d, e) { + var b, a = null; + for (b in eventMatchers) + if (eventMatchers[b].test(c)) { + a = b; + break + } + if (!a) return !1; + document.createEvent ? (b = document.createEvent(a), a == 'HTMLEvents' ? b.initEvent(c, !0, !0) : b.initMouseEvent(c, !0, !0, document.defaultView, 0, d, e, d, e, !1, !1, !1, !1, 0, null), f.dispatchEvent(b)) : (a = document.createEventObject(), a.detail = 0, a.screenX = d, a.screenY = e, a.clientX = d, a.clientY = e, a.ctrlKey = !1, a.altKey = !1, a.shiftKey = !1, a.metaKey = !1, a.button = 1, f.fireEvent('on' + c, a)); + return !0 +} +var eventMatchers = { + HTMLEvents: /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, + MouseEvents: /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/ +}; +simulate(arguments[0], 'mousedown', 0, 0); +simulate(arguments[0], 'mousemove', arguments[1], arguments[2]); +simulate(arguments[0], 'mouseup', arguments[1], arguments[2]); \ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/simulateRightMouseButtonClick.js b/ui4j_test/src/test.BAK/resources/simulateRightMouseButtonClick.js new file mode 100644 index 000000000..411b3cce8 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/simulateRightMouseButtonClick.js @@ -0,0 +1,13 @@ +/** + * simulate right mouse button click event on the element + * + * arguments[0] {Element} The click target. + */ +// http://stackoverflow.com/questions/17092328/how-to-simulate-right-click-in-javascript +function simulateRightMouseButtonClick(element) { + var e = element.ownerDocument.createEvent('MouseEvents'); + e.initMouseEvent('contextmenu', true, true, element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 2, null); // 1 ? + element.dispatchEvent(e); +} +var element = arguments[0] || document.defaultView; +simulateRightMouseButtonClick(element); \ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/test.htm b/ui4j_test/src/test.BAK/resources/test.htm new file mode 100644 index 000000000..55d15f653 --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/test.htm @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sample Table
StructureCountryCityHeightBuiltRank
Total4 buildings
Burj KhalifaUAEDubai829m20101details
"Burj" KhalifaUAEDubai829m20101details
Burj 'Khalifa'UAEDubai829m20101details
"Burj" 'Khalifa'UAEDubai829m20101details
\ No newline at end of file diff --git a/ui4j_test/src/test.BAK/resources/xpathOfElement.js b/ui4j_test/src/test.BAK/resources/xpathOfElement.js new file mode 100644 index 000000000..75161b2bb --- /dev/null +++ b/ui4j_test/src/test.BAK/resources/xpathOfElement.js @@ -0,0 +1,28 @@ +function xpathOfElement(element) { + var elementTagName = element.tagName.toLowerCase(); + if (element.id != '') { + return '//' + elementTagName + '[@id="' + element.id + '"]'; + } else if (element.name && document.getElementsByName(element.name).length === 1) { + return '//' + elementTagName + '[@name="' + element.name + '"]'; + } + if (element === document.body) { + return '/html/' + elementTagName; + } + var sibling_count = 0; + var siblings = element.parentNode.childNodes; + siblings_length = siblings.length; + for (cnt = 0; cnt < siblings_length; cnt++) { + var sibling_element = siblings[cnt]; + if (sibling_element.nodeType !== 1) { // not ELEMENT_NODE + continue; + } + if (sibling_element === element) { + return sibling_count > 0 ? xpathOfElement(element.parentNode) + '/' + elementTagName + '[' + (sibling_count + 1) + ']' : xpathOfElement(element.parentNode) + '/' + elementTagName; + } + if (sibling_element.nodeType === 1 && sibling_element.tagName.toLowerCase() === elementTagName) { + sibling_count++; + } + } + return; +}; +return xpathOfElement(arguments[0]); \ No newline at end of file diff --git a/ui4j_test/src/test/java/com/mycompany/app/BaseTest.java b/ui4j_test/src/test/java/com/mycompany/app/BaseTest.java new file mode 100644 index 000000000..b18b4911e --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/BaseTest.java @@ -0,0 +1,416 @@ +package com.mycompany.app; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; + +import org.apache.commons.codec.binary.Base64; + +public class BaseTest { + + public WebDriver driver; + public WebDriverWait wait; + public Actions actions; + public Alert alert; + public JavascriptExecutor js; + public TakesScreenshot screenshot; + private static String osName; + + public int scriptTimeout = 5; + public int flexibleWait = 120; + public int implicitWait = 1; + public long pollingInterval = 500; + + public String baseURL = "about:blank"; + + private List chromeExtensions = new ArrayList<>(); + + private String extensionDir = String.format( + "%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Extensions", + getPropertyEnv("USERPROFILE", "C:\\Users\\Serguei")); + + private static final String browser = getPropertyEnv("webdriver.driver", + "chrome"); // "firefox"; + private static final Map browserDrivers = new HashMap<>(); + static { + browserDrivers.put("chrome", "chromedriver.exe"); + browserDrivers.put("firefox", "geckodriver.exe"); + } + + public void setExtensionDir(String value) { + this.extensionDir = value; + } + + public void setScriptTimeout(int value) { + this.scriptTimeout = value; + } + + public void setFlexibleWait(int value) { + this.flexibleWait = value; + } + + public void setImplicitWait(int value) { + this.implicitWait = value; + } + + public void setPollingInterval(long value) { + this.pollingInterval = value; + } + + // WARNING: do not use @Before... or @AfterSuite otherwise the descendant test + // class may fail + @AfterSuite + public void afterSuite() throws Exception { + } + + // WARMING: do not define or the descendant test class will fail + @BeforeSuite + public void beforeSuite() { + } + + // without .crx extension + public void addChromeExtension(String value) { + this.chromeExtensions.add(value); + } + + // https://stackoverflow.com/questions/35858679/adding-extension-to-selenium2webdriver-chrome-driver + // https://productforums.google.com/forum/#!topic/chrome/g02KlhK12fU + // NOTE: simpler solution for local driver exist + // https://sites.google.com/a/chromium.org/chromedriver/capabilities#TOC-List-of-recognized-capabilities + // alternative: + // options = webdriver.ChromeOptions() + // options.add_argument("--app-id = mbopgmdnpcbohhpnfglgohlbhfongabi") + private void loadChromeExtensionsBase64Encoded(ChromeOptions chromeOptions) { + List chromeExtensionsBase64Encoded = new ArrayList<>(); + for (String extensionName : this.chromeExtensions) { + String extensionLocation = this.extensionDir + "\\" + extensionName + + ".crx"; + // System.err.println("About to load extension " + extensionLocation); + File extensionFile = new File(extensionLocation); + + if (extensionFile.exists() && !extensionFile.isDirectory()) { + // origin: + // http://www.oodlestechnologies.com/blogs/Encode-%26-Decode-Image-Using-Base64-encoding-and-Decoding + // http://www.java2s.com/Code/Java/File-Input-Output/Base64encodedecodedatausingtheBase64encodingscheme.htm + try { + FileInputStream extensionFileInputStream = new FileInputStream( + extensionFile); + byte extensionData[] = new byte[(int) extensionFile.length()]; + extensionFileInputStream.read(extensionData); + + byte[] base64EncodedByteArray = Base64.encodeBase64(extensionData); + + extensionFileInputStream.close(); + chromeExtensionsBase64Encoded.add(new String(base64EncodedByteArray)); + System.out.println(String.format( + "Chrome Extension successfully encoded and added: %s...", + new String(base64EncodedByteArray).substring(0, 64))); + } catch (FileNotFoundException e1) { + System.out.println( + "Chrome Extension not found: " + extensionLocation + " " + e1); + } catch (IOException e2) { + System.out.println("Problem in reading The Chrome Extension" + e2); + } + } + chromeOptions.addEncodedExtensions(chromeExtensionsBase64Encoded); + } + } + + @SuppressWarnings("deprecation") + @BeforeClass + public void beforeClass() throws IOException { + + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions chromeOptions = new ChromeOptions(); + + Map chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.prompt_for_download", "false"); + chromePrefs.put("download.directory_upgrade", "true"); + chromePrefs.put("plugins.always_open_pdf_externally", "true"); + + + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + chromeOptions.setExperimentalOption("prefs", chromePrefs); + chromeOptions.addArguments("allow-running-insecure-content"); + chromeOptions.addArguments("allow-insecure-localhost"); + chromeOptions.addArguments("enable-local-file-accesses"); + chromeOptions.addArguments("disable-notifications"); + // chromeOptions.addArguments("start-maximized"); + chromeOptions.addArguments("browser.download.folderList=2"); + chromeOptions.addArguments( + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf"); + chromeOptions.addArguments("browser.download.dir=" + downloadFilepath); + // chromeOptions.addArguments("user-data-dir=/path/to/your/custom/profile"); + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + capabilities.setCapability( + org.openqa.selenium.chrome.ChromeOptions.CAPABILITY, chromeOptions); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + loadChromeExtensionsBase64Encoded(chromeOptions); + // see also: + // https://github.com/pulkitsinghal/selenium/blob/master/java/client/src/org/openqa/selenium/chrome/ChromeOptions.java + // For use with RemoteWebDriver + /* + RemoteWebDriver driver = new RemoteWebDriver( + new URL("http://localhost:4444/wd/hub"), capabilities); + */ + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + // https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + + driver.manage().timeouts().setScriptTimeout(scriptTimeout, + TimeUnit.SECONDS); + // Declare a wait time + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + screenshot = ((TakesScreenshot) driver); + js = ((JavascriptExecutor) driver); + // driver.manage().window().maximize(); + + // Go to URL + driver.get(baseURL); + } + + @AfterClass + public void afterClass() throws Exception { + driver.get("about:blank"); + if (driver != null) { + driver.quit(); + } + } + + @BeforeMethod + public void beforeMethod(Method method) { + String methodName = method.getName(); + System.out.println("Test Name: " + methodName + "\n"); + } + + @AfterMethod + public void afterMethod() { + // driver.get("about:blank"); + } + + @AfterTest(alwaysRun = true) + public void afterTest() { + killProcess(browserDrivers.get(browser)); + } + + public void highlight(WebElement element) { + highlight(element, 100); + } + + public void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + "arguments[0].style.border='3px solid yellow'", element); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border=''", element); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + public Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + // Utilities + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + // origin: + // https://github.com/TsvetomirSlavov/wdci/blob/master/code/src/main/java/com/seleniumsimplified/webdriver/manager/EnvironmentPropertyReader.java + public static String getPropertyEnv(String name, String defaultValue) { + String value = System.getProperty(name); + if (value == null) { + value = System.getenv(name); + if (value == null) { + value = defaultValue; + } + } + return value; + } + + // https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2 + public static void killProcess(String processName) { + + String command = String.format((osName.toLowerCase().startsWith("windows")) + ? "taskkill.exe /F /IM %s" : "killall %s", processName.trim()); + + try { + Runtime runtime = Runtime.getRuntime(); + Process process = runtime.exec(command); + // process.redirectErrorStream( true); + + BufferedReader stdoutBufferedReader = new BufferedReader( + new InputStreamReader(process.getInputStream())); + + BufferedReader stderrBufferedReader = new BufferedReader( + new InputStreamReader(process.getErrorStream())); + String line = null; + + StringBuffer processOutput = new StringBuffer(); + while ((line = stdoutBufferedReader.readLine()) != null) { + processOutput.append(line); + } + StringBuffer processError = new StringBuffer(); + while ((line = stderrBufferedReader.readLine()) != null) { + processError.append(line); + } + int exitCode = process.waitFor(); + // ignore exit code 128: the process "" not found. + if (exitCode != 0 && (exitCode ^ 128) != 0) { + System.out.println("Process exit code: " + exitCode); + if (processOutput.length() > 0) { + System.out.println("" + processOutput + ""); + } + if (processError.length() > 0) { + // e.g. + // The process "chromedriver.exe" + // with PID 5540 could not be terminated. + // Reason: Access is denied. + System.out.println("" + processError + ""); + } + } + } catch (Exception e) { + System.err.println("Exception (ignored): " + e.getMessage()); + } + } + + public String getResourcePath(String resourceFileName) { + return String.format("%s/src/main/resources/%s", + System.getProperty("user.dir"), resourceFileName); + } + + // based on: + // https://github.com/lopukhDA/Angular-tests-on-c-sharp-and-protractor/blob/master/NUnit.Tests1/WebDriver.cs + public Boolean checkElementAttribute(WebElement element, String value, + Optional attributeOpt) { + Boolean flag = false; + String attribute = attributeOpt.isPresent() ? attributeOpt.get() : "class"; + if (element.getAttribute(attribute).contains(value)) { + flag = true; + } + return flag; + } + + public Boolean checkElementAttribute(WebElement element, String value, + String... attributes) { + Boolean flag = false; + String attribute = attributes.length > 0 ? attributes[0] : "class"; + if (element.getAttribute(attribute).contains(value)) { + flag = true; + } + return flag; + } +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/ChromeExtensionSikuliTest.java b/ui4j_test/src/test/java/com/mycompany/app/ChromeExtensionSikuliTest.java new file mode 100644 index 000000000..9996141c8 --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/ChromeExtensionSikuliTest.java @@ -0,0 +1,93 @@ +package com.mycompany.app; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.openqa.selenium.By; +import org.openqa.selenium.Capabilities; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedCondition; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.List; +import java.util.Set; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.sikuli.script.FindFailed; +import org.sikuli.script.Key; +import org.sikuli.script.Match; +import org.sikuli.script.Pattern; +import org.sikuli.script.Screen; + +// based on https://stackoverflow.com/questions/25557533/open-a-chrome-extension-through-selenium-webdriver +// https://www.blazemeter.com/blog/6-easy-steps-testing-your-chrome-extension-selenium +// https://stackoverflow.com/questions/25557533/open-a-chrome-extension-through-selenium-webdriver +// http://www.software-testing-tutorials-automation.com/2016/05/how-to-get-browser-and-os-details-on.html +// http://screenster.io/running-tests-from-selenium-ide-in-chrome/ screenster +// http://screenster.io/running-tests-from-selenium-ide-in-chrome/ screenster +public class ChromeExtensionSikuliTest extends BaseTest { + + private String baseURL = "https://auth-demo.aerobatic.io/"; + private static List chromeExtensions = new ArrayList<>(); + static { + chromeExtensions.add("chropath"); // without .crx extension + } + + @BeforeClass + public void beforeClass() throws IOException { + for (String chromeExtention : chromeExtensions) { + super.addChromeExtension(chromeExtention); + } + super.beforeClass(); + assertThat(driver, notNullValue()); + driver.get(baseURL); + } + + @Test(priority = 1, enabled = false) + public void openExtensionPopupTest() { + + Screen screen = new Screen(); + String imagePath = getResourcePath("chropath.png"); + try { + screen.find(imagePath); + screen.click(imagePath); + } catch (FindFailed e) { + e.printStackTrace(); + } + + WebDriverWait wait = new WebDriverWait(driver, 5); + wait.until(ExpectedConditions.numberOfWindowsToBe(2)); + + String parentWindow = driver.getWindowHandle(); + Set allWindows = driver.getWindowHandles(); + for (String curWindow : allWindows) { + if (!parentWindow.equals(curWindow)) { + driver.switchTo().window(curWindow); + } + } + } +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/DatePickerTest.java b/ui4j_test/src/test/java/com/mycompany/app/DatePickerTest.java new file mode 100644 index 000000000..ab3f61b0c --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/DatePickerTest.java @@ -0,0 +1,138 @@ +package com.mycompany.app; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.interactions.Actions; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import java.awt.AWTException; +import java.awt.Robot; +import java.awt.event.KeyEvent; + +// origin: https://raw.githubusercontent.com/TsvetomirSlavov/DynamicDataTablesAndCallendarsTsvetomir/master/src/main/java/DatePickerAndHighlightAndScroll.java +public class DatePickerTest extends BaseTest { + + public String baseURL = "https://www.skyscanner.com"; + + @BeforeClass + public void beforeClass() throws IOException { + super.beforeClass(); + assertThat(driver, notNullValue()); + driver.get(baseURL); + try { + driver.manage().window().fullscreen(); + } catch (WebDriverException e) { + System.err.println("Exception (ignored) " + e.toString()); + // unimplemented command + // Firefox: org.openqa.selenium.UnsupportedCommandException + } + + // NOTE: with Chrome, occasionally breaks the test, redirecting the user to + // 'As you were browsing www.skyscanner.com something about your browser + // made us think you were a bot' + // page + try { + // press F11 key of keyboard to switch the browser to full screen + Robot robot = new Robot(); + sleep(2000); + robot.keyPress(KeyEvent.VK_F11); + } catch (AWTException e) { + System.err.println("Exception (ignored) " + e.toString()); + } + } + + @Test(priority = 1, enabled = true) + public void datePickTest() { + wait.until((WebDriver driver) -> { + WebElement element = null; + try { + element = driver.findElement(By.id("js-depart-input")); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }); + // + driver.findElement(By.id("js-depart-input")).click(); + scroll(15, 100); + // zoomMinus(); + sleep(1000); + String expectedMonth = "December 2017"; + String currentMonth = driver + .findElement(By.cssSelector("div.depart span.current")).getText(); + if (expectedMonth.equals(currentMonth)) { + System.out.println("Month is already selected!"); + } else { + for (int i = 1; i < 12; i++) { + driver.findElement(By.cssSelector("div.depart button.next")).click(); + sleep(500); + currentMonth = driver + .findElement(By.cssSelector("div.depart span.current")).getText(); + if (expectedMonth.equals(currentMonth)) { + System.out.println("Month Selected: " + currentMonth); + break; + } + } + } + sleep(1000); + WebElement datePicker = driver.findElement( + By.cssSelector("div.depart div.container-body table tbody")); + List dates = datePicker.findElements(By.tagName("td")); + for (WebElement date : dates) { + String calDate = date.getAttribute(("data-id")); + if (calDate.equals("2017-12-30")) { + flash(date); + date.click(); + System.out.println("Date Selected: " + calDate); + break; + } + } + sleep(1000); + } + + public void flash(WebElement element) { + String bgcolor = element.getCssValue("backgroundColor"); + for (int i = 0; i < 3; i++) { + changeColor("rgb(0,200,0)", element); + changeColor(bgcolor, element); + } + } + + public void changeColor(String color, WebElement element) { + js.executeScript("arguments[0].style.backgroundColor = '" + color + "'", + element); + try { + Thread.sleep(20); + } catch (InterruptedException e) { + } + } + + // Scroll + public void scroll(final int x, final int y) { + final JavascriptExecutor js = (JavascriptExecutor) driver; + for (int i = 0; i <= x; i = i + 50) { + js.executeScript("scroll(" + i + ",0)"); + } + for (int j = 0; j <= y; j = j + 50) { + js.executeScript("scroll(0," + j + ")"); + } + } + + // Zoom current browser window -1 via keyboard shortcut + public void zoomMinus() { + Actions actions = new Actions(driver); + actions.keyDown(Keys.CONTROL).sendKeys(Keys.SUBTRACT).perform(); + actions = new Actions(driver); + actions.keyUp(Keys.CONTROL).perform(); + } + +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/DragAndDropKendoUIGridTest.java b/ui4j_test/src/test/java/com/mycompany/app/DragAndDropKendoUIGridTest.java new file mode 100644 index 000000000..9597fc2e5 --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/DragAndDropKendoUIGridTest.java @@ -0,0 +1,151 @@ +package com.mycompany.app; + +import java.util.HashMap; +import java.util.Map; + +import java.util.concurrent.TimeUnit; + +import org.junit.Assert; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.WebDriverException; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import java.io.File; +import java.lang.reflect.Method; + +//origin: https://github.com/TsvetomirSlavov/DynamicDataTablesAndCallendarsTsvetomir/blob/master/src/main/java/DragAndDropKendoUIGrid.java + +public class DragAndDropKendoUIGridTest { + + public static WebElement dragItem1; + public static WebElement dragItem2; + static WebDriver driver = null; + + @SuppressWarnings("deprecation") + @BeforeSuite + public void beforeSuiteMethod() throws InterruptedException { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + Map chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + options.addArguments("allow-running-insecure-content"); + options.addArguments("allow-insecure-localhost"); + options.addArguments("enable-local-file-accesses"); + options.addArguments("disable-notifications"); + // options.addArguments("start-maximized"); + options.addArguments("browser.download.folderList=2"); + options.addArguments( + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf"); + options.addArguments("browser.download.dir=" + downloadFilepath); + // options.addArguments("user-data-dir=/path/to/your/custom/profile"); + capabilities.setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + + driver.manage().deleteAllCookies(); + driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); + driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS); + driver.manage().window().maximize(); + driver.get("http://demos.telerik.com/kendo-ui/grid/index"); + } + + + @BeforeMethod + public void loadPage() { + } + + @Test(priority = 1, enabled = true) + public void dragDropTest() { + driver.findElement(By.xpath("//a[contains(.,'Contact Name')]")).click(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + JavascriptExecutor js = (JavascriptExecutor) driver; + js.executeScript( + "$(\"#grid\").kendoGrid({\n" + + " columns: [\n" + + " { field: \"name\" },\n" + + " { field: \"age\" }\n" + + " ],\n" + + " dataSource: [\n" + + " { name: \"Ceko\", age: 30 },\n" + + " { name: \"Zai\", age: 33 }\n" + + " ]\n" + "});\n" + + "var grid = $(\"#grid\").data(\"kendoGrid\");\n" + + "grid.reorderColumn(1, grid.columns[0]);" + ); + WebElement columnValue = driver + .findElement(By.xpath("//*[@id='grid']/div[3]/table/tbody/tr[1]/td[2]")); + String text = columnValue.getText(); + Assert.assertEquals("Ceko", text); + + dragItem1 = driver.findElement(By.linkText("Contact Name")); + System.out.println(dragItem1.getText()); + dragItem2 = driver.findElement(By.className("k-grouping-header")); + System.out.println(dragItem2.getText()); + try { + Thread.sleep(30000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + dragItem1.click(); + Actions action = new Actions(driver); + action.clickAndHold(dragItem1).moveToElement(dragItem2).release(); + action.build(); + action.perform(); + + // elementToBeClickable(dragItem1); + // dragAndDrop(driver, dragItem1, dragItem2); + } + + @AfterSuite + public void afterSuiteMethod() throws Exception { + driver.quit(); + } + + // Actions always first build() then perform() because only perform does not + // work in Firefox + public static void dragAndDrop(WebDriver driver, WebElement srcElement, + WebElement dstElement) { + + Actions action = new Actions(driver); + action.dragAndDrop(srcElement, dstElement); + action.build(); + action.perform(); + } + + public static WebElement elementToBeClickable(final WebElement element) { + return (new WebDriverWait(driver, 5)) + .until(ExpectedConditions.elementToBeClickable(element)); + } + +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/EscapeXPathTest.java b/ui4j_test/src/test/java/com/mycompany/app/EscapeXPathTest.java new file mode 100644 index 000000000..7033d3603 --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/EscapeXPathTest.java @@ -0,0 +1,372 @@ +package com.mycompany.app; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.io.IOException; + +import java.lang.RuntimeException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.concurrent.TimeUnit; +import java.util.Enumeration; +import java.util.Formatter; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import static java.lang.Boolean.*; +import static java.lang.Float.*; +import java.lang.Float; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.testng.internal.Nullable; +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class EscapeXPathTest extends BaseTest { + + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final Logger log = LogManager.getLogger(EscapeXPathTest.class); + + @SuppressWarnings("unused") + private static Pattern pattern; + private static Matcher matcher; + + @BeforeClass + public void beforeClass() throws IOException { + super.beforeClass(); + assertThat(driver, notNullValue()); + } + + @BeforeMethod + public void loadPage() { + driver.navigate().to(getPageContent("test.htm")); + } + + @Test(enabled = true) + public void test1() { + List texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + + System.err.println( + String.format("test1 (1): %s => %s ", text, escapeXPath(text))); + System.err.println( + String.format("test1 (2): %s => %s ", text, escapeXPath2(text))); + /* System.err.println( + String.format("test1 (2): %s => %s ", text, escapeXPath3(text))); + */ + try { + List elements1 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath(text)))); + assertTrue(elements1.size() > 0); + highlight(elements1.get(0)); + List elements2 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath2(text)))); + assertTrue(elements2.size() > 0); + highlight(elements2.get(0)); + /* List elements3 = driver.findElements(By.xpath( + String.format("//*[contains(text(), %s)]", escapeXPath3(text)))); + assertTrue(elements3.size() > 0); + highlight(elements3.get(0)); + */ + sleep(500); + } catch (InvalidSelectorException e) { + // ignore + // InvalidSelectorError: + // Unable to locate an element with the xpath expression + // //*[contains(text(), '""Burj"" ''Khalifa'')] because of the following + // error: + // SyntaxError: The expression is not a legal expression. + System.err.println("Test1 Ignored: " + e.toString()); + } + } + } + + // origin: + // https://saucelabs.com/resources/articles/selenium-tips-css-selectors + // NOTE: all failing + @Test(enabled = true) + public void test2() { + // sleep(10000); + List texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + System.err.println(String.format("test2: %s", text)); + + try { + List elements = driver.findElements( + By.cssSelector(String.format("th:contains('%s')", text))); + assertTrue(elements.size() > 0); + highlight(elements.get(0)); + sleep(500); + } catch (InvalidSelectorException e) { + // ignore + // InvalidSelectorError: + // Unable to locate an element with the xpath expression + // //*[contains(text(), '""Burj"" ''Khalifa'')] because of the following + // error: + // SyntaxError: The expression is not a legal expression. + System.err.println("Test2 Ignored: " + e.toString()); + } + } + } + + @Test(enabled = true) + public void test3() { + List texts = new ArrayList<>( + Arrays.asList(new String[] { "Burj Khalifa", "\"Burj\" 'Khalifa'", + "\"Burj\" Khalifa", "Burj 'Khalifa'" })); + + for (String text : texts) { + System.err.println(String.format("test3: %s", text)); + + Optional element = driver + .findElements(By.cssSelector("th[scope='row']")).stream() + .filter(o -> { + String t = o.getText(); + // System.err.println("in stream filter (3): Text = " + t); + return (Boolean) (t.contains(text)); + }).findFirst(); + + assertTrue(element.isPresent()); + highlight(element.get()); + sleep(500); + } + } + + // https://sqa.stackexchange.com/questions/362/a-way-to-match-on-text-using-css-locators + // requires jQuery + public static WebElement findByText(WebDriver driver, + String cssSelectorParent, String text) { + WebElement parent = driver.findElement(By.cssSelector(cssSelectorParent)); + Object element = ((JavascriptExecutor) driver).executeScript(String.format( + "var x = $(arguments[0]).find(\":contains('%s')\"); return x;", text), + parent); + return (WebElement) element; + } + + // origin: https://groups.google.com/forum/#!topic/selenium-users/sTWcaVbnU6c + + public static String toHexStr(byte b) { + String str = "0x" + String.format("%02x", b); + return str; + } + + private String replaceSpecials() { + // http://utf8-chartable.de/unicode-utf8-table.pl?start=8064&names=-&utf8=0x + String pageSource = ""; + pageSource = driver.getPageSource(); + byte[] allBytes = null; + try { + allBytes = pageSource.getBytes("UTF-8"); + } catch (UnsupportedEncodingException ex) { + ex.printStackTrace(); + } + + String translate = ""; + for (int i = 0; i < allBytes.length; i++) { + // newBytes[i + offset] = allBytes[i]; + + if (allBytes[i] == ((byte) 0xE2)) { + // System.out.println(String.format("0xE2%s%s " , toHexStr(allBytes[i + + // 1]), " " + toHexStr(allBytes[i + 2]))); + switch (allBytes[i + 2]) { + case (byte) 0x98: // opening single quote + case (byte) 0x99: // closing single quote + translate += "'"; + i += 2; + break; + case (byte) 0x94: // dash, also 0xe292, 0xe293 + translate += "-"; + i += 2; + break; + case (byte) 0x9c: // opening double quote + case (byte) 0x9d: // closing double quote + translate += "\""; + i += 2; + break; + } + } else { + translate += (char) allBytes[i]; + } + } + + // pageSource = translate; + return translate; + } + + // origin: + // https://stackoverflow.com/questions/642125/encoding-xpath-expressions-with-both-single-and-double-quotes + // alternative: use java.text.Normalizer + // alternative: use built-in xpath translate function e.g. + // "//*[contains(translate(@name,'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu'),'converted')]" + // possibly a better way yet is to use streams to query XML node texts in a + // way that allows one to compare the value of interest directly. + // not relying on possibly fragile XPath composition, but the purpose is the + // same + /** + * Escapes the quote characters inside the text condition in an XPath expression. + * Because there is no escape character in XPath string values, this method is not really escapes passed string, but + * breaks it into pars and uses XPath concat function. + * + * @param value String to escape. + * @return Escaped value. + */ + + public String escapeXPath(@Nullable String string) { + if (string == null) { + return null; + } else if (string.contains("'")) { + StringBuilder sb = new StringBuilder(); + sb.append("concat('"); + + for (int i = 0; i < string.length(); i++) { + char ch = string.charAt(i); + if ('\'' == ch) { + sb.append("',\"").append(ch).append("\",'"); + } else { + sb.append(ch); + } + } + + sb.append("')"); + return sb.toString(); + } else { + return "'" + string + "'"; + } + } + + // shorter version of escapeXPath + public String escapeXPath2(@Nullable String value) { + if (!value.contains("'")) + return '\'' + value + '\''; + else if (!value.contains("\"")) + return '"' + value + '"'; + else + return "concat('" + value.replace("'", "',\"'\",'") + "')"; + } + + // one can escape quotes and apostrophes in XPath 2.0 by doubling them, but + // there is no way of doing it in XPath 1.0. + // NOTE: does not work + public String escapeXPath3(@Nullable String value) { + return "'" + value.replace("'", "''").replace("\"", "\"\""); + } + + // alternative: use built-in xpath translate function e.g. + // "//*[contains(translate(@name,'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu'),'converted')]" + // other XPath 2.0 Solutions + // "//*/text()[contains(lower-case(.),'test')]" + // "//*/text()[matches(.,'test', 'i')]" + // "//*/text()[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'test')] + + protected String getPageContent(String pagename) { + try { + URI uri = EscapeXPathTest.class.getClassLoader().getResource(pagename) + .toURI(); + System.err.println("Testing local file: " + uri.toString()); + return uri.toString(); + } catch (URISyntaxException e) { // NOTE: multi-catch statement is not + // supported in -source 1.6 + throw new RuntimeException(e); + } + } +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/GmailTest.java b/ui4j_test/src/test/java/com/mycompany/app/GmailTest.java new file mode 100644 index 000000000..725cee5cd --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/GmailTest.java @@ -0,0 +1,398 @@ +package com.mycompany.app; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedCondition; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class GmailTest extends BaseTest { + + private String baseURL = "https://www.google.com/gmail/about/#"; + + private By signInLink = By.xpath("//*[@data-g-label='Sign in']"); + // By.xpath("/html/body/nav/div/a[2]"); + private By identifier = By.cssSelector("#identifierId"); + private By identifierNextButton = By + .xpath("//*[@id='identifierNext']/content/span[contains(text(),'Next')]"); + private By passwordInput = By.xpath("//*[@id='password']//input"); + private By passwordNextButton = By + .xpath("//*[@id='passwordNext']/content/span[contains(text(),'Next')]"); + private By profileImage = By.xpath( + "//a[contains(@href,'https://accounts.google.com/SignOutOptions')]"); + // By.xpath("//*[@id='gb']/div[1]/div[1]/div[2]/div[4]/div[1]/a/span"); + private By signOutButton = By.xpath( + "//div[@aria-label='Account Information']//a[contains(text(), 'Sign out')][contains(@href, 'https://accounts.google.com/Logout?')]"); + // By.xpath(".//*[@id='gb_71']") + + @BeforeClass + public void beforeClass() throws IOException { + super.beforeClass(); + assertThat(driver, notNullValue()); + } + + @BeforeMethod + public void beforeMethod() { + System.err.println("Navigate to URL: " + baseURL); + driver.get(baseURL); + // Wait for page url to change + ExpectedCondition urlChange = driver -> driver.getCurrentUrl() + .matches(String.format("^%s.*", baseURL)); + wait.until(urlChange); + System.err.println("Current URL: " + driver.getCurrentUrl()); + } + + @Test(priority = 1, enabled = true) + public void invalidUsernameTest() throws InterruptedException, IOException { + + // click on Sign in link + driver.findElement(signInLink).click(); + + enterData(identifier, "InvalidUser_UVW"); + + // Click on next button + clickNextButton(identifierNextButton); + + // Inspect error messages + List errMsg = waitForElements(By.xpath( + "//*[contains (text(), \"Couldn't find your Google Account\")]")); + assertTrue(errMsg.size() > 0); + } + + @Test(priority = 2, enabled = true) + public void invalidPasswordTest() { + + driver.get("https://www.google.com/gmail/about/#"); + + // Sign in + driver.findElement(signInLink).click(); + sleep(1000); + + // Enter the email id + enterData(identifier, "automationnewuser24@gmail.com"); + + // Click on next button + clickNextButton(identifierNextButton); + + // Enter the password + enterData(passwordInput, "InvalidPwd"); + + // Click on next button + clickNextButton(passwordNextButton); + + // Inspect error messages + List errMsg = waitForElements( + By.xpath("//*[contains (text(),'Wrong password. Try again.')]")); + assertTrue(errMsg.size() > 0); + } + + @Test(priority = 3, enabled = false) + public void loginAfterTest() throws InterruptedException, IOException { + + // Click on Sign in Link + System.err.println("Click on Sign in Link"); + driver.findElement(signInLink).click(); + + // Wait for page url to change + System.err.println("Wait for page url to change"); + ExpectedCondition urlChange = driver -> driver.getCurrentUrl() + .matches("^https://accounts.google.com/signin.*"); + wait.until(urlChange); + + // Enter the email id + System.err.println("Enter the email id"); + enterData(identifier, "automationnewuser24@gmail.com"); + + // Click on next button + System.err.println("Click on next button"); + clickNextButton(identifierNextButton); + + // Enter the password + System.err.println("Enter the password"); + enterData(passwordInput, "automationnewuser2410"); + + // Click on next button + System.err.println("Click on next button"); + clickNextButton(passwordNextButton); + + // Wait for page url to change + urlChange = driver -> { + String url = driver.getCurrentUrl(); + System.err.println("The url is: " + url); + return (Boolean) url.matches("^https://mail.google.com/mail.*"); + }; + wait.until(urlChange); + + // Click on profile image + System.err.println("Click on profile image"); + wait.until((WebDriver driver) -> { + WebElement element = null; + try { + element = driver.findElement(profileImage); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }).click(); + + // Sign out + System.err.println("Sign out"); + highlight(driver.findElement(signOutButton), 100); + driver.findElement(signOutButton).click(); + + try { + alert = driver.switchTo().alert(); + alert.accept(); + } catch (NoAlertPresentException ex) { + // Alert not present + System.err.println("NoAlertPresentException: " + ex.getStackTrace()); + } catch (WebDriverException ex) { + System.err.println("Alert was not handled by PhantomJS: " + + ex.getStackTrace().toString()); + } + + // Wait for page url to change + System.err.println("Wait for page url to change"); + urlChange = driver -> driver.getCurrentUrl() + .matches("^https://accounts.google.com/signin.*"); + wait.until(urlChange); + // Click on Choose user Link + sleep(100); + /* + List x = driver.findElements(By.cssSelector("svg")); + for (WebElement y : x) { + System.err.println(y.getAttribute("outerHTML")); + } + */ + System.err.println("Click on users list link"); + WebElement svgSelector = + // driver.findElement(By.cssSelector("div[role='button'] + // svg")).findElement(By.xpath("..")); + driver + .findElements( + By.cssSelector("div[role='button'] svg[width='24px']")) + .get(0).findElement(By.xpath("..")); + // System.err.println(svgSelector.findElement(By.xpath("..")).findElement(By.xpath("..")).findElement(By.xpath("..")).findElement(By.xpath("..")).findElement(By.xpath("..")).findElement(By.xpath("..")).getAttribute("outerHTML")); + /* + +
+

Hi auto

+
+ +
automationnewuser24@gmail.com
+
+
+
+ + + + + + + +
+
+
+
+ + */ + highlight(svgSelector, 100); + svgSelector.click(); + // Wait for page url to change + System.err.println("Wait for page url to change"); + urlChange = driver -> driver.getCurrentUrl() + .matches("^https://accounts.google.com/ServiceLogin/signinchooser.*"); + wait.until(urlChange); + // TODO: examine cookies + sleep(1000); + } + + @Test(priority = 4, enabled = true) + public void loginTest() throws InterruptedException, IOException { + + // Click on Sign in Link + driver.findElement(signInLink).click(); + + // origin: + // https://github.com/TsvetomirSlavov/JavaScriptForSeleniumMyCollection + + // Wait for page url to change + ExpectedCondition urlChange = driver -> driver.getCurrentUrl() + .matches("^https://accounts.google.com/signin.*"); + wait.until(urlChange); + // TODO: examine it landed on https://accounts.google.com/AccountChooser + + // Enter the email id + enterData(identifier, "automationnewuser24@gmail.com"); + /* + File screenshotFile = screenshot.getScreenshotAs(OutputType.FILE); + // Move image file to new destination + FileUtils.copyFile(screenshotFile, new File("c:\\temp\\UserID.jpg")); + */ + + // Click on next button + clickNextButton(identifierNextButton); + + // Enter the password + enterData(passwordInput, "automationnewuser2410"); + + // Click on next button + clickNextButton(passwordNextButton); + + // Wait for page url to change + /* + urlChange = driver -> { + String url = driver.getCurrentUrl(); + System.err.println("The url is: " + url); + return (Boolean) url.matches("^https://mail.google.com/mail.*"); + }; + wait.until(urlChange); + */ + + wait.until(new ExpectedCondition() { + public Boolean apply(WebDriver webDriver) { + System.out.println("Checking if mail page is loaded..."); + // NOTE: in a realistic project this method + // will belong to the page object + // e.g. + // https://github.com/pawnu/SeleniumQA/blob/master/EcommerceProject/RunTest.java + return checkPage(); + } + }); + + // Wait until form is redndered, old semantics + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver driver) { + System.err.println("Wait for form to finish rendering"); + JavascriptExecutor js = ((JavascriptExecutor) driver); + Boolean active = (Boolean) js + .executeScript("return document.readyState == 'complete'"); + if (active) { + System.err.println("Done"); + } + return active; + } + }); + + System.err.println("Click on profile image"); + // Click on profile image + wait.until((WebDriver driver) -> { + WebElement element = null; + try { + element = driver.findElement(profileImage); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }).click(); + + // Wait until form is redndered, lambda semantics + wait.until((WebDriver driver) -> { + System.err.println("Wait for form to finish rendering"); + JavascriptExecutor js = ((JavascriptExecutor) driver); + Boolean active = (Boolean) js + .executeScript("return document.readyState == 'complete'"); + if (active) { + System.err.println("Done"); + } + return active; + }); + + // Sign out + System.err.println("Sign out"); + highlight(driver.findElement(signOutButton), 100); + driver.findElement(signOutButton).click(); + + try { + alert = driver.switchTo().alert(); + alert.accept(); + } catch (NoAlertPresentException ex) { + // Alert not present + System.err.println("NoAlertPresentException (ignored): " + ex.getStackTrace()); + return; + } catch (WebDriverException ex) { + System.err.println("Alert was not handled by PhantomJS: " + + ex.getStackTrace().toString()); + return; + } + } + + private void clickNextButton(By locator) { + wait.until((WebDriver driver) -> { + WebElement element = null; + try { + element = driver.findElement(locator); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }).click(); + } + + private Boolean checkPage() { + return driver.getCurrentUrl().matches("^https://mail.google.com/mail.*"); + } + + private void enterData(By locator, String data) { + wait.until((WebDriver driver) -> { + WebElement element = null; + try { + element = driver.findElement(locator); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }).sendKeys(data); + + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private List waitForElements(By locator) { + + return wait.until((WebDriver d) -> { + List elements = new ArrayList<>(); + try { + elements = d.findElements(locator); + } catch (Exception e) { + return null; + } + return (elements.size() > 0) ? elements : null; + }); + + } + + @AfterMethod + public void resetBrowser() { + if (driver != null) { + driver.get("about:blank"); + } + } + +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/JqueryBarRatingTest.java b/ui4j_test/src/test/java/com/mycompany/app/JqueryBarRatingTest.java new file mode 100644 index 000000000..29d43c0db --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/JqueryBarRatingTest.java @@ -0,0 +1,373 @@ +package com.mycompany.app; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import java.util.concurrent.TimeUnit; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.IOException; +import java.io.InputStream; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.hamcrest.CoreMatchers; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class JqueryBarRatingTest { + + private WebDriver driver; + private WebDriverWait wait; + static Actions actions; + private Predicate hasClass; + private Predicate hasAttr; + private Predicate hasText; + private int flexibleWait = 5; + private int implicitWait = 1; + private long pollingInterval = 500; + private String baseUrl = "http://antenna.io/demo/jquery-bar-rating/examples/"; + private static final String browser = "firefox"; + private static String osName; + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + @SuppressWarnings("deprecation") + @BeforeSuite + public void beforeSuiteMethod() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + Map chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + options.addArguments("allow-running-insecure-content"); + options.addArguments("allow-insecure-localhost"); + options.addArguments("enable-local-file-accesses"); + options.addArguments("disable-notifications"); + // options.addArguments("start-maximized"); + options.addArguments("browser.download.folderList=2"); + options.addArguments( + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf"); + options.addArguments("browser.download.dir=" + downloadFilepath); + // options.addArguments("user-data-dir=/path/to/your/custom/profile"); + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + // https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + } + + @AfterSuite + public void afterSuiteMethod() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void loadPage() { + driver.get(baseUrl); + } + + @AfterMethod + public void resetBrowser() { + driver.get("about:blank"); + } + + @Test(enabled = true) + public void test1() { + // Arrange + WebElement bar = wait.until((WebDriver d) -> { + WebElement element = null; + try { + element = d.findElement(By.cssSelector( + "section.section-examples div.examples div.box-example-square div.box-body div.br-theme-bars-square")); + } catch (Exception e) { + return null; + } + return (element.isDisplayed()) ? element : null; + }); + // Act + // NOTE: relative xpath selector + assertTrue( + bar.findElements(By.xpath("//a[@data-rating-value]")).size() > 7); + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + // TODO: test that result set elements are unique ? + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + // + ratings.keySet().stream().forEach(o -> { + System.err.println("Mouse over rating: " + o); + WebElement r = ratings.get(o); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + sleep(1000); + }); + // Assert + } + + @Test(enabled = true) + public void test2() { + // Arrange + + wait.until(ExpectedConditions.or( + // NOTE: Boolean + ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed")), + ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed")))); + + WebElement bar = wait.until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("div.examples div.box-example-reversed"))); + + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + // Act + ratings.keySet().stream().forEach(o -> { + WebElement r = ratings.get(o); + assertThat(r, notNullValue()); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + // Assert + WebElement comment = bar.findElement(By.xpath( + ".//*[contains(@class, 'br-current-rating') and contains(@class ,'br-selected')]")); + assertThat(comment.getText(), equalTo(o)); + System.err.println("Mouse over rating: " + o); + sleep(1000); + }); + } + + @Test(enabled = true) + public void test3() { + // Arrange + // custom Expected Condition static Helper class + WebElement bar = wait.until(Helper.oneOfElementsLocatedVisible( + By.xpath( + "//section[contains(@class, 'section-examples')]//div[contains(@class, 'box-example-movie')]//div[contains(@class, 'br-widget')]"), + By.cssSelector( + "section.section-examples div.box-example-movie div.br-widget"))); + // Act + List ratingElements = bar + .findElements(By.xpath(".//a[@data-rating-value]")); + assertTrue(ratingElements.size() > 0); + Map ratings = ratingElements.stream().collect(Collectors + .toMap(o -> o.getAttribute("data-rating-text"), Function.identity())); + ratings.keySet().stream().forEach(o -> { + WebElement r = ratings.get(o); + assertThat(r, notNullValue()); + // hover + actions.moveToElement(r).build().perform(); + highlight(r); + r.click(); + // Assert + WebElement comment = bar + .findElement(By.xpath(".//*[contains(@class, 'br-current-rating')]")); + assertThat(comment.getText(), equalTo(o)); + System.err.println("Mouse over rating: " + o); + // NOTE: there is a hidden select sibling element. The selected option + // does not appear to be updated + sleep(1000); + final String script = "var result = $(\"section.section-examples div.box-example-movie div.br-theme-bars-movie select#example-movie option[selected='selected']\");return result.val();"; + if (driver instanceof JavascriptExecutor) { + Object result = ((JavascriptExecutor) driver).executeScript(script); + System.err.println("Select option value: " + result.toString()); + } + }); + } + + private void highlight(WebElement element) { + highlight(element, 100); + } + + private void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + "arguments[0].style.border='3px solid yellow'", element); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border=''", element); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + public static class Helper { + // for complex expected Condition, based on + // http://stackoverflow.com/questions/14840884/wait-untilexpectedconditions-visibilityof-element1-or-element2 + + public static ExpectedCondition oneOfElementsLocatedVisible( + By... bys) { + return new ExpectedCondition() { + @Override + public WebElement apply(WebDriver driver) { + for (By by : Arrays.asList(bys)) { + WebElement element; + try { + System.err.println("Locator : " + by.toString()); + element = driver.findElement(by); + } catch (Exception e) { + continue; + } + if (element.isDisplayed()) + return element; + } + return null; + } + }; + } + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/JqueryScrollTest.java b/ui4j_test/src/test/java/com/mycompany/app/JqueryScrollTest.java new file mode 100644 index 000000000..bcfad29a1 --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/JqueryScrollTest.java @@ -0,0 +1,225 @@ +package com.mycompany.app; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Assert; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedCondition; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +// based on https://stackoverflow.com/questions/4884839/how-do-i-get-an-element-to-scroll-into-view-using-jquery +public class JqueryScrollTest extends BaseTest { + + private String baseURL = "http://demos.flesler.com/jquery/scrollTo/old/"; + + @BeforeClass + public void beforeClass() throws IOException { + super.beforeClass(); + assertThat(driver, notNullValue()); + driver.get(baseURL); + } + + @BeforeMethod + public void loadPageInBrowser() { + driver.get(baseURL); + waitJQueryDone(); + } + + @Test(priority = 2, enabled = true) + public void computeOffsetTest() { + List fragmentIds = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7)); + for (int fragmentId : fragmentIds) { + WebElement fragmentElement = null; + String fragmentLocator = String.format("#y > ul > li:nth-child(%d) > a", + fragmentId); + Map result = new HashMap<>(); + String data = null; + String script = String.format( + "var element = $('%s'); return JSON.stringify(element.offset());", + fragmentLocator); + + List fragmentElements = driver + .findElements(By.cssSelector(fragmentLocator)); + assertTrue(fragmentElements.size() > 0); + + fragmentElement = fragmentElements.get(0); + + data = (String) js.executeScript(script); + result = parseOffsets(data); + System.err.println("Fragment " + fragmentId + ":"); + for (String dimension : result.keySet()) { + System.err.println( + String.format("%s = %2$,.2f", dimension, result.get(dimension))); + } + try { + data = (String) js.executeScript( + "var element = arguments[0]; return element.offset()", + fragmentElement); + } catch (WebDriverException e) { + // System.err.println("Exception (ignored): " + e.toString()); + // unknown error: element.offset is not a function + // ignore + } + + // scroll the fragment + WebElement label1 = driver.findElement(By.xpath(String + .format("//*[contains(text(), '%s')]", "Scroll the window to"))); + highlight(label1); + Assert.assertTrue(checkElementAttribute(label1, "txt_screen", "for")); + WebElement input1 = label1.findElement(By + .cssSelector(String.format("input#%s", label1.getAttribute("for")))); + highlight(input1); + Assert.assertTrue(checkElementAttribute(input1, "text", "type")); + WebElement label2 = label1.findElement(By.xpath("following::label")); + highlight(label2); + WebElement input2 = label2.findElement(By.xpath("input[@type='text']")); + highlight(input2); + input2.clear(); + input2.sendKeys(String.format("%d", fragmentId)); + WebElement button = driver + .findElement(By.cssSelector("body > label:nth-child(6) > button")); + highlight(button); + button.click(); + + waitJQueryDone(); + sleep(1000); + highlight(fragmentElement); + + data = (String) js.executeScript(script); + result = parseOffsets(data); + System.err.println("Fragment " + fragmentId + " (after scroll):"); + for (String dimension : result.keySet()) { + System.err.println( + String.format("%s = %2$,.2f", dimension, result.get(dimension))); + } + sleep(1000); + } + } + + @Test(priority = 1, enabled = true) + public void compareOffsetsTest() { + int fragmentId = 5; + WebElement fragmentElement = null; + WebElement containerElement = null; + String fragmentLocator = String.format("#y > ul > li:nth-child(%d) > a", + fragmentId); + String containerLocator = "#y"; + + Map result = new HashMap<>(); + String data1 = null; + String data2 = null; + String script1 = String.format( + "var element = $('%s'); return JSON.stringify(element.offset());", + fragmentLocator); + String script2 = String.format( + "var element = $('%s'); return JSON.stringify(element.offset());", + containerLocator); + + List fragmentElements = driver + .findElements(By.cssSelector(fragmentLocator)); + assertTrue(fragmentElements.size() > 0); + + fragmentElement = fragmentElements.get(0); + // containerElement = fragmentElement.findElement(By.xpath("..")); + containerElement = driver.findElement(By.cssSelector(containerLocator)); + Assert.assertTrue(checkElementAttribute(containerElement, "container")); + + data2 = (String) js.executeScript(script2); + result = parseOffsets(data2); + System.err.println("Container: "); + for (String dimension : result.keySet()) { + System.err.println( + String.format("%s = %2$,.2f", dimension, result.get(dimension))); + } + + // scroll the fragment + WebElement input = driver.findElement( + By.cssSelector("body > label:nth-child(6) > input[type='text']")); + highlight(input); + input.clear(); + input.sendKeys(String.format("%d", fragmentId)); + WebElement button = driver + .findElement(By.cssSelector("body > label:nth-child(6) > button")); + highlight(button); + button.click(); + + waitJQueryDone(); + sleep(1000); + highlight(fragmentElement); + + data1 = (String) js.executeScript(script1); + result = parseOffsets(data1); + System.err.println("Fragment " + fragmentId + " (after scroll):"); + for (String dimension : result.keySet()) { + System.err.println( + String.format("%s = %2$,.2f", dimension, result.get(dimension))); + } + } + + @AfterMethod + public void resetBrowser() { + if (driver != null) { + driver.get("about:blank"); + } + } + + // utils + + private void waitJQueryDone() { + // Wait until form is rendered, lambda semantics + wait.until((WebDriver driver) -> { + // System.err.println("Wait for form to finish rendering"); + JavascriptExecutor js = ((JavascriptExecutor) driver); + Boolean done = (Boolean) ((Long) js + .executeScript("return jQuery.active") == 0); + if (done) { + // System.err.println("Done"); + } + return done; + }); + + } + + private Map parseOffsets(String payload) { + /* {"top":1167.4000244140625,"left":44} */ + Map result = new HashMap<>(); + + payload = payload.substring(1, payload.length() - 1); + String[] pairs = payload.split(","); + + for (String pair : pairs) { + String[] values = pair.split(":"); + result.put(values[0].trim(), Double.parseDouble(values[1])); + } + return result; + + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/LabelInputFinderTest.java b/ui4j_test/src/test/java/com/mycompany/app/LabelInputFinderTest.java new file mode 100644 index 000000000..79f1ce33c --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/LabelInputFinderTest.java @@ -0,0 +1,158 @@ +package com.mycompany.app; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import java.util.concurrent.TimeUnit; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +public class LabelInputFinderTest extends BaseTest { + + public String baseURL = "https://v4-alpha.getbootstrap.com/components/forms/"; + + @BeforeClass + public void beforeClass() throws IOException { + super.beforeClass(); + assertThat(driver, notNullValue()); + driver.get(baseURL); + } + + // origin: + // https://github.com/TsvetomirSlavov/JavaScriptForSeleniumMyCollection/blob/master/src/seleniumOrgJQuery/JQUeryElementsLocators.java + @Test(priority = 1, enabled = true) + public void testInputByLabel() { + List labels = driver.findElements(By.tagName("label")); + @SuppressWarnings("unchecked") + List inputs = (List) (js + .executeScript("var labels = arguments[0],\n" + "inputs = [];\n" + + " for (var i = 0; i < labels.length; i++) {\n" + + " if (labels[i].getAttribute('for') != null) {\n" + + " inputs.push(document.getElementById(labels[i].getAttribute('for')));\n" + + " }\n" + " }\n" + "return inputs;", labels)); + inputs.stream().forEach(o -> { + System.err.println(o.getAttribute("outerHTML")); + scrolltoElement(o); + highlight(o); + flash(o); + }); + } + + @Test(priority = 2, enabled = false) + public void testInputByLabelTextOrdered() { + List labelElements = driver.findElements(By.tagName("label")); + // more info: + // https://www.mkyong.com/java/java-how-to-convert-a-primitive-array-to-list/ + List elementOrder = new ArrayList(); + for (int cnt = 0; cnt < labelElements.size(); cnt++) { + elementOrder.add(cnt); + } + Map elementMap = labelElements.stream() + // java.lang.IllegalArgumentException: Cannot find elements with a null + // id attribute. + .filter(o -> o.getAttribute("for") != null) + // java.lang.IllegalStateException: Duplicate key + .collect(Collectors.toMap(o -> { + // local variables referenced from a lambda expression must be final + // or effectively final + // return String.format("%d_%s_%d", ++pos, o.getText()); + return String.format("%02d_%s", elementOrder.remove(0), o.getText()); + }, o -> driver.findElement(By.id(o.getAttribute("for"))))); + + elementMap.keySet().stream().sorted().forEach(o -> { + WebElement input = elementMap.get(o); + String text = o.replaceAll("^(?:\\d+_)", ""); + System.err.println(String.format("Input for %s is\n%s\n", text, + input.getAttribute("outerHTML"))); + scrolltoElement(input); + highlight(input); + flash(input); + }); + } + + @Test(priority = 3, enabled = false) + public void testInputByLabelTextRandom() { + Random suffix = new Random(); + List labelElements = driver.findElements(By.tagName("label")); + Map elementMap = labelElements.stream() + // java.lang.IllegalArgumentException: Cannot find elements with a null + // id attribute. + .filter(o -> o.getAttribute("for") != null) + // java.lang.IllegalStateException: Duplicate key + .collect(Collectors.toMap(o -> { + return String.format("%s_%d", o.getText(), suffix.nextInt()); + }, o -> driver.findElement(By.id(o.getAttribute("for"))))); + + elementMap.entrySet().stream().forEach(o -> { + String text = o.getKey().replaceAll("(?:_[-\\d]+)$", ""); + WebElement input = o.getValue(); + System.err.println(String.format("Input for %s is\n%s\n", text, + input.getAttribute("outerHTML"))); + scrolltoElement(input); + highlight(input); + flash(input); + }); + } + + public void flash(WebElement element) { + String bgcolor = element.getCssValue("backgroundColor"); + for (int i = 0; i < 3; i++) { + changeColor("rgb(0,200,0)", element); + changeColor(bgcolor, element); + } + } + + public void changeColor(String color, WebElement element) { + js.executeScript("arguments[0].style.backgroundColor = '" + color + "'", + element); + try { + Thread.sleep(20); + } catch (InterruptedException e) { + } + } + + // Scroll + public void scroll(final int x, final int y) { + final JavascriptExecutor js = (JavascriptExecutor) driver; + for (int i = 0; i <= x; i = i + 50) { + js.executeScript("scroll(" + i + ",0)"); + } + for (int j = 0; j <= y; j = j + 50) { + js.executeScript("scroll(0," + j + ")"); + } + } + + // origin: + // https://github.com/TsvetomirSlavov/JavaScriptForSeleniumMyCollection/blob/master/src/utils/UtilsQAAutoman.java + public void scrolltoElement(WebElement element) { + Coordinates coordinate = ((Locatable) element).getCoordinates(); + coordinate.onPage(); + coordinate.inViewPort(); + } + +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/PlunkerTest.java b/ui4j_test/src/test/java/com/mycompany/app/PlunkerTest.java new file mode 100644 index 000000000..6dd2e284e --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/PlunkerTest.java @@ -0,0 +1,402 @@ +package com.mycompany.app; + +import java.io.IOException; +import java.io.InputStream; +import java.io.IOException; + +import java.lang.RuntimeException; +import java.net.MalformedURLException; +import java.net.URL; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.concurrent.TimeUnit; +import java.util.Enumeration; +import java.util.Formatter; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.NoSuchWindowException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import static java.lang.Boolean.*; +import static java.lang.Float.*; +import java.lang.Float; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.testng.ITestResult; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; +// import static org.hamcrest.CoreMatchers.matchesPattern; +// https://stackoverflow.com/questions/8505153/assert-regex-matches-in-junit +// https://piotrga.wordpress.com/2009/03/27/hamcrest-regex-matcher/ + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class PlunkerTest extends BaseTest { + + private static String baseURL = "https://embed.plnkr.co/"; + private static String projectId = "ggL5oAvGgucDA5HCYk7K"; + + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final Logger log = LogManager.getLogger(PlunkerTest.class); + private static String osName; + + private static Pattern pattern; + private static Matcher matcher; + private static Set windowHandles; + + @BeforeClass + public void beforeClass() throws IOException { + super.beforeClass(); + assertThat(driver, notNullValue()); + driver.manage().timeouts().implicitlyWait(implicitWait, TimeUnit.SECONDS); + } + + @Override + @AfterClass + public void afterClass() throws Exception { + try { + driver.close(); + } catch (NoSuchWindowException e) { + + } + driver.quit(); + driver = null; + if (verificationErrors.length() != 0) { + throw new Exception(verificationErrors.toString()); + } + } + + @BeforeMethod + public void loadBaseURL() { + driver.get(baseURL); + } + + @Test(enabled = true) + public void testEditorPreview() { + driver.get(String.format("https://plnkr.co/edit/%s/?p=info", projectId)); + + List iframes = driver.findElements(By.cssSelector("iframe")); + Map iframesMap = new HashMap<>(); + for (WebElement iframe : iframes) { + String key = String.format("id: \'%s\", name: \"%s\"", + iframe.getAttribute("id"), iframe.getAttribute("name")); + System.err.println(String.format("Found iframe %s", key)); + iframesMap.put(key, iframe); + } + + WebElement runButton = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("body > nav button i.icon-play"))); + assertThat(runButton, notNullValue()); + highlight(runButton); + runButton.click(); + iframes = driver.findElements(By.cssSelector("iframe")); + for (WebElement iframe : iframes) { + String key = String.format("id: \'%s\", name: \"%s\"", + iframe.getAttribute("id"), iframe.getAttribute("name")); + if (!iframesMap.containsKey(key)) { + System.err.println(String.format("Found new iframe %s", key)); + } + } + WebElement previewIframe = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("iframe[name='plunkerPreviewTarget']"))); + assertThat(previewIframe, notNullValue()); + // System.err.println(driver.getCurrentUrl()); + assertTrue(driver.getCurrentUrl().matches("^.*\\?p=preview$")); + // driver.findElement(By.linkText("urlLink")).sendKeys(Keys.chord(Keys.CONTROL,Keys.RETURN)); + } + + @Test(enabled = true) + public void testEmbed() { + driver.get("https://embed.plnkr.co/" + projectId); + WebElement closeButton = wait + .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector( + "body div.plunker-ide-workspace button.plunker-ops-close"))); + highlight(closeButton); + closeButton.click(); + // button.plunker-sidebar-selector.plunker-selector-tree is better handled + // via Protractor + } + + @Test(enabled = true) + public void testFullScreeen() { + projectId = "WFJYrM"; + driver.get(String.format("https://plnkr.co/edit/%s/?p=info", projectId)); + WebElement runButton = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("body > nav button i.icon-play"))); + assertThat(runButton, notNullValue()); + highlight(runButton); + runButton.click(); + WebElement previewIframe = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("iframe[name='plunkerPreviewTarget']"))); + assertThat(previewIframe, notNullValue()); + WebDriver iframe = driver.switchTo().frame(previewIframe); + sleep(500); + // System.err.println(iframe.getPageSource()); + // the fullscreen button is not in the preview frame + driver.switchTo().defaultContent(); + WebElement fullScreenButton = null; + try { + fullScreenButton = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Optional e = d + .findElements(By.cssSelector("button#expand-preview")).stream() + .filter(o -> { + String t = o.getAttribute("title"); + return (Boolean) (t + .contains("Launch the preview in a separate window")); + }).findFirst(); + return (e.isPresent()) ? e.get() : (WebElement) null; + } + }); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + assertThat(fullScreenButton, notNullValue()); + // confirm it opens in a new tab. + // fullScreenButton.click(); + // alternatively, enforce open in a new tab: + String openinLinkNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN); + fullScreenButton.sendKeys(openinLinkNewTab); + sleep(500); + // confirm it opens in a new tab. + String currentHandle = null; + try { + currentHandle = driver.getWindowHandle(); + // System.err.println("Thread: Current Window handle: " + currentHandle); + } catch (NoSuchWindowException e) { + + } + windowHandles = driver.getWindowHandles(); + assertThat(windowHandles.size(), equalTo(2)); + + Iterator windowHandleIterator = windowHandles.iterator(); + while (windowHandleIterator.hasNext()) { + String handle = windowHandleIterator.next(); + if (!handle.equals(currentHandle)) { + driver.switchTo().window(handle); + assertThat(getBaseURL(), equalTo("https://run.plnkr.co")); + // System.err.println(getBaseURL()); + driver.switchTo().defaultContent(); + } + } + } + + // Failed tests: afterMethod(com.mycompany.app.PlunkerTest): no such window: + // target window already closed(..) + + @Test(enabled = false) + public void testFullScreeenInNewWindow() { + projectId = "WFJYrM"; + driver.get(String.format("https://plnkr.co/edit/%s/?p=info", projectId)); + WebElement runButton = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("body > nav button i.icon-play"))); + assertThat(runButton, notNullValue()); + highlight(runButton); + runButton.click(); + WebElement previewIframe = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector("iframe[name='plunkerPreviewTarget']"))); + assertThat(previewIframe, notNullValue()); + WebDriver iframe = driver.switchTo().frame(previewIframe); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + // System.err.println(iframe.getPageSource()); + // the fullscreen button is not in the preview frame + driver.switchTo().defaultContent(); + WebElement fullScreenButton = null; + try { + fullScreenButton = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Optional e = d + .findElements(By.cssSelector("button#expand-preview")).stream() + .filter(o -> { + String t = o.getAttribute("title"); + return (Boolean) (t + .contains("Launch the preview in a separate window")); + }).findFirst(); + return (e.isPresent()) ? e.get() : (WebElement) null; + } + }); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + assertThat(fullScreenButton, notNullValue()); + String currentHandle = null; + try { + currentHandle = driver.getWindowHandle(); + // System.err.println("Thread: Current Window handle: " + currentHandle); + } catch (NoSuchWindowException e) { + + } + // open fullscreen view in a new browser window. + String openinLinkNewBrowserWindow = Keys.chord(Keys.SHIFT, Keys.RETURN); + fullScreenButton.sendKeys(openinLinkNewBrowserWindow); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + // confirm it opens in a new browser window. + windowHandles = driver.getWindowHandles(); + assertThat(windowHandles.size(), equalTo(2)); + + Iterator windowHandleIterator = windowHandles.iterator(); + while (windowHandleIterator.hasNext()) { + String handle = windowHandleIterator.next(); + if (!handle.equals(currentHandle)) { + driver.switchTo().window(handle); + assertThat(getBaseURL(), equalTo("https://run.plnkr.co")); + // System.err.println(getBaseURL()); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + driver.close(); + // System.err.println("After close"); + try { + driver.switchTo().defaultContent(); + System.err.println("After defaultcontext"); + } catch (NoSuchWindowException e) { + } + } + } + } + + public String getBaseURL() { + System.err.println("Get base URL: " + driver.getCurrentUrl()); + log.info("Get base URL: {}", driver.getCurrentUrl()); + String currentURL = driver.getCurrentUrl(); + String protocol = null; + String domain = null; + + try { + URL url = new URL(currentURL); + protocol = url.getProtocol(); + domain = url.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // System.err.println("Returning: " + protocol + "://" + domain); + return protocol + "://" + domain; + } + + public void scrollIntoView(By locator) { + log.info("Scrolling into view: {}", locator); + ((JavascriptExecutor) driver).executeScript( + "arguments[0].scrollIntoView(true);", driver.findElement(locator)); + } + + public void highlight(By locator, long highlight_interval) { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + try { + Thread.sleep(highlight_interval); + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + executeScript("arguments[0].style.border=''", element); + } + +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/Select2WrapperTest.java b/ui4j_test/src/test/java/com/mycompany/app/Select2WrapperTest.java new file mode 100644 index 000000000..d4a343212 --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/Select2WrapperTest.java @@ -0,0 +1,641 @@ +package com.mycompany.app; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +/* + * This class tests the Select 2 Element https://select2.github.io/examples.html + * intended to create a custom class implementing subset of ISelect interface + * influenced by [selenium select2 wrapper project by sskorol](https://github.com/sskorol/sslect2-wrapper) + * https://qa-automation-notes.blogspot.com/2015/11/webdriver-vs-select2.html +*/ + +public class Select2WrapperTest { + + private WebDriver driver; + private WebDriverWait wait; + private static Actions actions; + private int flexibleWait = 5; + private long pollingInterval = 500; + private static String baseURL = "https://select2.github.io/examples.html"; + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final String browser = "chrome"; + private static String osName; + + private static final String selectOptionScript = "var selector = arguments[0]; var o_val = arguments[1]; var s2_obj = $(selector).select2(); option = s2_obj.val(o_val); option.trigger('select');"; + private static final String querySelectedValueScript = "var selector = arguments[0]; var s2_obj = $(selector).select2(); return s2_obj.val();"; + private static final String selectByVisibleTextScript = "var selector = arguments[0]; var s2_obj = $(selector).select2(); var text = arguments[1]; var found_opt = s2_obj.find('option:contains(\"' + text + '\")').val(); return found_opt"; + private static final String selectMultiOptionClearScript = "var selector = arguments[0]; $(selector).select2().val(null).trigger('change');"; + + @Test(enabled = false) + public void selectByOptionValueTest() { + String selectOption = "FL"; + + // Arrange + wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("select.js-states")))); + // Act + + executeScript(selectOptionScript, "select.js-states", selectOption); + // TODO: appears without running the second script the result is not updated + String result = (String) executeScript(querySelectedValueScript, + "select.js-states"); + System.err.println("Selected via Javascript: " + result); + + sleep(150); + // Assert + // TODO: Update the Expectation condition with Iterator and String methods + WebElement selectionElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + "span.selection span.select2-selection span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getText()); + } + + @Test(enabled = false) + public void selectByVisibleOptionTextTest() { + // Arrange + wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("select.js-states")))); + // Act + String result = (String) executeScript(selectByVisibleTextScript, + "select.js-states", "Florida"); + System.err.println("Selected via Javascript: " + result); + + sleep(150); + // Assert + // TODO: Update the Expectation condition with Iterator and String methods + WebElement selectionElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + "span.selection span.select2-selection span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getText()); + } + + // multiple + @Test(enabled = false) + public void selectBySelectWrapperObjectMultipleOptionsTest() { + // Arrange + Select2 element = new Select2(driver, + "select.js-example-basic-multiple.js-states"); + // Act + highlight(element.getWrappedElement()); + // Assert + assertThat(element, notNullValue()); + // Act + Map stateMap = new HashMap<>(); + stateMap.put("Florida", "FL"); + stateMap.put("Washington", "WA"); + Iterator stateiIterator = stateMap.keySet().iterator(); + while (stateiIterator.hasNext()) { + String stateFullName = stateiIterator.next(); + String result = element.selectByVisibleText(stateFullName); + // Assert + assertTrue(result.equals(stateMap.get(stateFullName)), + String.format("State %s code should be %s but was %s", stateFullName, + stateMap.get(stateFullName), result)); + System.err.println("Result: " + result); + + sleep(150); + } + } + + @Test(enabled = false) + public void selectBySelectWrapperObjectTest() { + // Arrange + Select2 element = new Select2(driver, "select.js-states"); + // Act + highlight(element.getWrappedElement()); + // Assert + assertThat(element, notNullValue()); + // Act + Map stateMap = new HashMap<>(); + stateMap.put("Florida", "FL"); + stateMap.put("Washington", "WA"); + Iterator stateiIterator = stateMap.keySet().iterator(); + while (stateiIterator.hasNext()) { + String stateFullName = stateiIterator.next(); + String result = element.selectByVisibleText(stateFullName); + // Assert + assertTrue(result.equals(stateMap.get(stateFullName)), + String.format("State %s code should be %s but was %s", stateFullName, + stateMap.get(stateFullName), result)); + System.err.println("Result: " + result); + + sleep(150); + } + } + + @Test(enabled = false) + public void select2VisualVerifyTest1() { + String selectOption = "FL"; + String select2Selector = "select.js-example-basic-single.js-states"; + + // Arrange + wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector(select2Selector)))); + // Act + executeScript(selectOptionScript, select2Selector, selectOption); + String result = (String) executeScript(querySelectedValueScript, + select2Selector); + // Assert + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected via Javascript: " + result); + sleep(150); + // Act + WebElement arrowElement = driver + .findElement(By.cssSelector("span.select2-selection__arrow")); + highlight(arrowElement); + arrowElement.click(); + + sleep(150); + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + List options = resultsElement + .findElements(By.cssSelector("li.select2-results__option")); + // available options + // options.stream().forEach(o -> + // System.err.println(o.getText())); + WebElement highlightedOption = options.stream() + .filter(o -> o.getAttribute("class").contains("highlighted")) + .findFirst().get(); + System.err.println( + "Selected options visible text: " + highlightedOption.getText()); + highlight(highlightedOption); + highlightedOption.click(); + + sleep(150); + // Assert + WebElement selectionElement = wait + .until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector("span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection rendered: " + selectionElement.getText()); + } + + @Test(enabled = true) + public void select2VisualVerifyTest2() { + List selectOptions = new ArrayList<>( + Arrays.asList(new String[] { "FL", "NC", "MN" })); + String select2Selector = "select.js-example-basic-multiple.js-states"; + + String divText = "Multiple select boxes"; + + // Arrange + WebElement selectElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector(select2Selector)))); + List divElements = driver.findElements(By.xpath(String + .format("//h2[@id = 'multiple'][contains(text(), '%s')]", divText))); + assertTrue(divElements.size() > 0); + WebElement divElement = divElements.get(0); + actions.moveToElement(divElement).build().perform(); + highlight(divElement); + + WebElement spanElement = selectElement + .findElement(By.xpath("following-sibling::span")); + actions.moveToElement(spanElement).build().perform(); + highlight(spanElement); + + // Act + for (String selectOption : selectOptions) { + executeScript(selectOptionScript, select2Selector, selectOption); + @SuppressWarnings("unchecked") + List results = (ArrayList) executeScript( + querySelectedValueScript, select2Selector); + System.err.println("size = " + results.size()); + String result = results.get(0); + // Assert + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected via Javascript: " + result); + } + + sleep(5000); + // Act + // following-sibling js-example-basic-multiple js-states + WebElement arrowElement = driver + .findElement(By.cssSelector("span.select2-selection--multiple")); + highlight(arrowElement); + arrowElement.click(); + + sleep(150); + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + List options = resultsElement + .findElements(By.cssSelector("li.select2-results__option")); + // available options + // options.stream().forEach(o -> + // System.err.println(o.getText())); + WebElement highlightedOption = options.stream() + .filter(o -> o.getAttribute("class").contains("highlighted")) + .findFirst().get(); + System.err.println( + "Selected options visible text: " + highlightedOption.getText()); + highlight(highlightedOption); + // highlightedOption.click(); + + sleep(150); + // Assert + WebElement selectionElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + "span.select2-selection--multiple ul.select2-selection__rendered li.select2-selection__choice")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection rendered: " + selectionElement.getText()); + } + + // TODO: refactor + @Test(enabled = false) + public void select2VisualActionVerify2Test() { + String selectOption = "FL"; + + // Arrange + wait.until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("select.js-example-basic-single.js-states")))); + // Act + String result = (String) executeScript(selectByVisibleTextScript, + "select.js-states", "Florida"); + System.err.println("Selected via Javascript: " + result); + // Assert + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected via Javascript: " + result); + try { + Thread.sleep(150); + } catch (InterruptedException e) { + } + // Act + WebElement arrowElement = driver + .findElement(By.cssSelector("span.select2-selection__arrow")); + highlight(arrowElement); + arrowElement.click(); + + sleep(150); + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + + WebElement highlightedOption = resultsElement + .findElements(By.cssSelector("li.select2-results__option")).stream() + .filter(o -> o.getAttribute("class").contains("highlighted")) + .findFirst().get(); + System.err.println("Selected Text: " + highlightedOption.getText()); + highlight(highlightedOption); + highlightedOption.click(); + + sleep(150); + // Assert + WebElement selectionElement = wait + .until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector("span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getText()); + } + + @Test(enabled = false) + public void select2VisualActionSelectTest() { + String selectOption = "MN"; + + // Arrange + WebElement select2 = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("select.js-example-theme-single.js-states")))); + actions.moveToElement(select2).build().perform(); + // Act + WebElement arrowElement = driver.findElement( + By.cssSelector("div.s2-example span.select2-selection__arrow")); + highlight(arrowElement); + arrowElement.click(); + // TODO: convert to flexible + + sleep(150); + WebElement resultsElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("span.select2-container span.select2-results")))); + System.err.println(resultsElement.getAttribute("innerHTML")); + // TODO: scroll somehow + // TODO: filter out role="group" + WebElement selectedOption = resultsElement + .findElements(By.cssSelector("li.select2-results__option")).stream() + .filter(o -> o.getAttribute("role").matches("treeitem")).filter(o -> { + String text = o.getText(); + System.err.println(String.format("Option text: \"%s\"", text)); + actions.moveToElement(o).build().perform(); + if (text.contains("Minnesota")) { + return true; + } else { + return false; + } + }).findFirst().get(); + System.err.println("Selected Visible Text: " + selectedOption.getText()); + highlight(selectedOption); + actions.moveToElement(selectedOption).click().build().perform(); + + sleep(5000); + + // Assert + String result = (String) executeScript(querySelectedValueScript, + "select.js-example-theme-single.js-states"); + assertTrue(result.equals(selectOption), String + .format("State code should be %s but was %s", selectOption, result)); + System.err.println("Selected: " + result); + // Assert + WebElement selectionElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By + .cssSelector("div.s2-example span.select2-selection__rendered")))); + assertThat(selectionElement, notNullValue()); + highlight(selectionElement); + System.err.println("Selection: " + selectionElement.getAttribute("title")); + } + + @BeforeSuite + @SuppressWarnings("deprecation") + public void beforeSuite() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + HashMap chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + + for (String optionAgrument : (new String[] { + "allow-running-insecure-content", "allow-insecure-localhost", + "enable-local-file-accesses", "disable-notifications", + /* "start-maximized" , */ + "browser.download.folderList=2", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("browser.download.dir=%s", downloadFilepath) + /* "user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + /* + System.setProperty("webdriver.chrome.driver", + "c:/java/selenium/chromedriver.exe"); + driver = new ChromeDriver(); + */ + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + actions = new Actions(driver); + } + + @AfterSuite + public void afterSuite() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void BeforeMethod() { + driver.get(baseURL); + } + + @AfterMethod + public void AfterMethod(ITestResult result) { + if (verificationErrors.length() != 0) { + throw new RuntimeException(String.format("Error in the method %s : %s", + result.getMethod().getMethodName(), verificationErrors.toString())); + } + driver.get("about:blank"); + } + + // utilities + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + private void highlightNew(WebElement element, long highlight_interval) { + Rectangle elementRect = element.getRect(); + String highlightScript = getScriptContent("highlight.js"); + // append calling + + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format( + "%s\nhighlight_create(arguments[0],arguments[1],arguments[2],arguments[3]);", + highlightScript), + elementRect.y, elementRect.x, elementRect.width, + elementRect.height); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format("%s\nhighlight_remove();", highlightScript)); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + + } + + private void highlight(WebElement element) { + highlight(element, 100); + } + + private void highlight(WebElement element, long highlight_interval) { + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + try { + wait.until(ExpectedConditions.visibilityOf(element)); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + private Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + protected static String getScriptContent(String scriptName) { + try { + final InputStream stream = Select2WrapperTest.class.getClassLoader() + .getResourceAsStream(scriptName); + final byte[] bytes = new byte[stream.available()]; + stream.read(bytes); + return new String(bytes, "UTF-8"); + } catch (IOException e) { + throw new RuntimeException(scriptName); + } + } + + // inspired by: + // https://github.com/sskorol/select2-wrapper/blob/master/src/main/java/com/tools/qaa/elements/Select2.java + // https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/ui/Select.java + public static class Select2 { + + private WebDriver driver = null; + private WebElement element; + private WebDriverWait wait; + private boolean isMulti = false; + private String elementCssSelector; + private int flexibleWait = 5; + private long pollingInterval = 500; + + public WebElement getWrappedElement() { + return this.element; + } + + public Select2(WebDriver driver, String elementCssSelector) { + this.elementCssSelector = elementCssSelector; + this.driver = driver; + this.wait = new WebDriverWait(driver, this.flexibleWait); + this.wait.pollingEvery(this.pollingInterval, TimeUnit.MILLISECONDS); + this.element = wait.until(ExpectedConditions.visibilityOf( + driver.findElement(By.cssSelector(this.elementCssSelector)))); + } + + public String selectByVisibleText(final String text) { + String selectByVisibleTextScript = "var s2_obj = $('" + + this.elementCssSelector + + "').select2(); var text = arguments[0] ; var found_opt = s2_obj.find('option:contains(\"' + text + '\")').val(); return found_opt"; + wait.until(ExpectedConditions.visibilityOf( + driver.findElement(By.cssSelector(this.elementCssSelector)))); + String optionValue = (String) executeScript(selectByVisibleTextScript, + text); + return optionValue; + } + + public String getSelectedText() { + wait.until(ExpectedConditions.visibilityOf( + driver.findElement(By.cssSelector(this.elementCssSelector)))); + // TODO: + return (String) executeScript( + "return $('" + this.elementCssSelector + "').select2('data').text;"); + } + + private Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/SessionTest.java b/ui4j_test/src/test/java/com/mycompany/app/SessionTest.java new file mode 100644 index 000000000..752a92220 --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/SessionTest.java @@ -0,0 +1,221 @@ +package com.mycompany.app; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.io.File; +import java.io.InputStream; +import java.io.StringWriter; +import java.lang.StringBuilder; +import java.util.HashMap; +import java.util.concurrent.TimeUnit; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.FileUtils; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.openqa.selenium.WebElement; + +import org.openqa.selenium.Dimension; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Platform; +import org.apache.http.message.BasicHttpEntityEnclosingRequest; + +import org.openqa.selenium.interactions.Actions; +import org.apache.http.impl.client.DefaultHttpClient; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.HttpCommandExecutor; +import org.openqa.selenium.remote.RemoteWebDriver; + +import org.openqa.selenium.firefox.FirefoxDriver; +// import org.openqa.selenium.firefox.ProfileManager; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.BindException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.Charset; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +@SuppressWarnings("deprecation") +public class SessionTest { + + public RemoteWebDriver driver; + public DesiredCapabilities capabilities; + public WebDriverWait wait; + public Actions actions; + public Alert alert; + public JavascriptExecutor js; + public TakesScreenshot screenshot; + + private static final String browser = getPropertyEnv("webdriver.driver", + "chrome"); // "firefox"; + private static String osName; + public int scriptTimeout = 5; + public int flexibleWait = 120; + public int implicitWait = 1; + public long pollingInterval = 500; + public int pageLoadTimeout = 50; + public int implicitlyWaitTimeout = 20; + + public String baseURL = "http://m.carnival.com/"; + + @BeforeClass + public void beforeClass() throws IOException { + + getOsName(); + if (browser.equals("chrome")) { + capabilities = DesiredCapabilities.chrome(); + } else if (browser.equals("firefox")) { + // capabilities = DesiredCapabilities.firefox(); + capabilities = new DesiredCapabilities("firefox", "", Platform.ANY); + FirefoxProfile profile = new ProfilesIni().getProfile("default"); + capabilities.setCapability("firefox_profile", profile); + } + driver = null; + + try { + driver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub"), + capabilities); + } catch (MalformedURLException ex) { + } + + assertThat(driver, notNullValue()); + + actions = new Actions(driver); + + driver.manage().timeouts().setScriptTimeout(scriptTimeout, + TimeUnit.SECONDS); + // Declare a wait time + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + screenshot = ((TakesScreenshot) driver); + js = ((JavascriptExecutor) driver); + driver.manage().window().setSize(new Dimension(600, 800)); + driver.manage().timeouts().pageLoadTimeout(pageLoadTimeout, + TimeUnit.SECONDS); + driver.manage().timeouts().implicitlyWait(implicitlyWaitTimeout, + TimeUnit.SECONDS); + // print the node information + getIPOfNode(driver); + // Go to URL + driver.get(baseURL); + } + + @Test + public void test() { + + String value1 = "ddlDestinations"; + + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.className("ccl-logo"))); + + String xpath_selector1 = String.format("//select[@id='%s']", value1); + wait.until( + ExpectedConditions.elementToBeClickable(By.xpath(xpath_selector1))); + WebElement element = driver.findElement(By.xpath(xpath_selector1)); + + // System.out.println(element.getAttribute("id")); + Actions builder = new Actions(driver); + builder.moveToElement(element).build().perform(); + + String csspath_selector2 = "div.find-cruise-submit > a"; + WebElement element2 = driver.findElement(By.cssSelector(csspath_selector2)); + // System.out.println(element2.getText()); + new Actions(driver).moveToElement(element2).click().build().perform(); + } + + @AfterClass + public void afterClass() throws Exception { + driver.get("about:blank"); + if (driver != null) { + driver.quit(); + } + } + + private static int getIPOfNode(RemoteWebDriver driver) { + int proxyPort = 5555; // default + try { + HttpCommandExecutor ce = (HttpCommandExecutor) driver + .getCommandExecutor(); + String hostName = ce.getAddressOfRemoteServer().getHost(); + int hubPort = ce.getAddressOfRemoteServer().getPort(); + HttpHost host = new HttpHost(hostName, hubPort); + @SuppressWarnings("deprecation") + DefaultHttpClient client = new DefaultHttpClient(); + URL sessionURL = new URL( + String.format("http://%s:%d/grid/api/testsession?session=%s", + hostName, hubPort, driver.getSessionId())); + + System.err.println(sessionURL); + BasicHttpEntityEnclosingRequest r = new BasicHttpEntityEnclosingRequest( + "POST", sessionURL.toExternalForm()); + HttpResponse response = client.execute(host, r); + JSONObject object = extractObject(response); + URL myURL = new URL(object.getString("proxyId")); + if ((myURL.getHost() != null) && (myURL.getPort() != -1)) { + proxyPort = myURL.getPort(); + } + } catch (Exception e) { + System.err.println(e); + } + System.err.println(proxyPort); + + return proxyPort; + } + + private static JSONObject extractObject(HttpResponse response) + throws IOException, JSONException { + InputStream contents = response.getEntity().getContent(); + StringWriter writer = new StringWriter(); + IOUtils.copy(contents, writer, "UTF8"); + JSONObject obj = new JSONObject(writer.toString()); + return obj; + } + + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + public static String getPropertyEnv(String name, String defaultValue) { + String value = System.getProperty(name); + if (value == null) { + value = System.getenv(name); + if (value == null) { + value = defaultValue; + } + } + return value; + } +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/SuvianTest.java b/ui4j_test/src/test/java/com/mycompany/app/SuvianTest.java new file mode 100644 index 000000000..611a05587 --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/SuvianTest.java @@ -0,0 +1,2949 @@ +package com.mycompany.app; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.firefox.internal.ProfilesIni; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.interactions.HasInputDevices; +import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Mouse; +import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.InvalidSelectorException; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.phantomjs.PhantomJSDriver; +import org.openqa.selenium.phantomjs.PhantomJSDriverService; +import org.openqa.selenium.Platform; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.UnreachableBrowserException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import org.hamcrest.CoreMatchers; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.fail; + +import org.testng.asserts.SoftAssert; +// http://www.softwaretestingmaterial.com/soft-assert/ + + +public class SuvianTest extends BaseTest { + + private WebDriver driver; + private WebDriverWait wait; + private static Actions actions; + private static Alert alert; + private int flexibleWait = 5; + private int implicitWait = 1; + private long pollingInterval = 500; + private static String baseURL = "about:blank"; + private static final StringBuffer verificationErrors = new StringBuffer(); + private static String defaultScript = null; + private static final String browser = "chrome"; + private static String osName; + + @BeforeSuite + @SuppressWarnings("deprecation") + public void beforeSuite() { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + Map chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + + for (String optionAgrument : (new String[] { + "allow-running-insecure-content", "allow-insecure-localhost", + "enable-local-file-accesses", "disable-notifications", + /* "start-maximized" , */ + "browser.download.folderList=2", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("browser.download.dir=%s", downloadFilepath) + /* "user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + /* + System.setProperty("webdriver.chrome.driver", + "c:/java/selenium/chromedriver.exe"); + driver = new ChromeDriver(); + */ + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + actions = new Actions(driver); + } + + @AfterSuite + public void afterSuite() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void BeforeMethod() { + driver.get(baseURL); + } + + @AfterMethod + public void AfterMethod(ITestResult result) { + if (verificationErrors.length() != 0) { + throw new RuntimeException(String.format("Error in the method %s : %s", + result.getMethod().getMethodName(), verificationErrors.toString())); + } + driver.get("about:blank"); + } + + // Firebug console validation: + // $x("") + // $$("") + @Test(enabled = false) + public void test0_1() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + // Wait page to load + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + // assertTrue(elements.size() > 0); + // http://grepcode.com/file/repo1.maven.org/maven2/org.testng/testng/6.8/org/testng/asserts/SoftAssert.java + SoftAssert softAssert = new SoftAssert (); + softAssert.assertTrue(elements.size() > 0); + // System.out.println("softAssert Method Was Executed"); + softAssert.assertAll(); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + + element.click(); + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + + // Assert + // 1. Expected Condition uses enclosing element + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + String t = d.findElement(By.className("intro-message")).getText(); + Boolean result = t.contains("Link Successfully clicked"); + System.err.println( + "in apply: Text = " + t + "\nresult = " + result.toString()); + return result; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // 3. Alternative wait, functional style, with Optional + // http://www.nurkiewicz.com/2013/08/optional-in-java-8-cheat-sheet.html + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Optional e = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> { + String t = o.getText(); + System.err.println("in stream filter (3): Text = " + t); + return (Boolean) (t.contains("Navigate Back")); + }).findFirst(); + return (e.isPresent()) ? e.get() : (WebElement) null; + } + }); + + System.err + .println("element check: " + checkElement.getAttribute("innerHTML")); + } + + catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // http://stackoverflow.com/questions/12858972/how-can-i-ask-the-selenium-webdriver-to-wait-for-few-seconds-in-java + // http://stackoverflow.com/questions/31102351/selenium-java-lambda-implementation-for-explicit-waits + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")); + // longer version + Stream elementsStream = elements.stream(); + elements = elementsStream.filter(o -> { + String t = o.getText(); + System.err.println("(in filter) Text: " + t); + return (Boolean) (t.equalsIgnoreCase("Link Successfully clicked")); + }).collect(Collectors.toList()); + + // shorter version + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> "Link Successfully clicked".equalsIgnoreCase(o.getText())) + .collect(Collectors.toList()); + + assertThat(elements.size(), equalTo(1)); + + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> o.getText().equalsIgnoreCase("Link Successfully clicked")) + .collect(Collectors.toList()); + assertThat(elements.size(), equalTo(1)); + + element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Link Successfully clicked"), + element.getText()); + } + + @Test(enabled = false) + public void test0_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + highlight(element); + element.click(); + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + // 2. Alternative Iterator, uses Regex methods + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + Iterator i = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .iterator(); + WebElement result = null; + Pattern pattern = Pattern.compile( + "(?:" + Pattern.quote("Navigate Back") + ")", + Pattern.CASE_INSENSITIVE); + while (i.hasNext()) { + WebElement e = i.next(); + String t = e.getText(); + // System.err.println("in apply iterator (2): Text = " + t); + Matcher matcher = pattern.matcher(t); + if (matcher.find()) { + result = e; + break; + } + } + return result; + } + }); + assertThat(checkElement, notNullValue()); + + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + } + + @Test(enabled = false) + public void test0_3() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + element.click(); + // 2. Expected condition with Iterator, uses String methods + try { + element = wait.until(new ExpectedCondition() { + + @Override + public WebElement apply(WebDriver d) { + Iterator elementsIterator = d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .iterator(); + WebElement result = null; + while (elementsIterator.hasNext()) { + WebElement e = elementsIterator.next(); + String t = e.getText(); + System.err.println("in apply iterator (1): Text = " + t); + if (t.contains("Navigate Back")) { + result = e; + break; + } + } + return result; + } + }); + } catch ( + + Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Act + element.click(); + } + + @Test(enabled = false) + public void test0_4() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + // Wait page to load + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + } + + @Test(enabled = false) + public void test0_5() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + String simulateRightMouseButtonClick = getScriptContent( + "simulateRightMouseButtonClick.js"); + System.err.println("Simulate (1) right mouse click on element"); + executeScript(simulateRightMouseButtonClick, element); + sleep(3000); + String simulateClick = getScriptContent("simulateClick.js"); + System.err.println("Simulate (2) right mouse click on element"); + executeScript(simulateClick, element, "contextmenu"); + sleep(3000); + System.err.println("Simulate (3) right mouse click on element"); + actions.moveToElement(element).build().perform(); + actions.keyDown(Keys.CONTROL).contextClick().keyUp(Keys.CONTROL).build() + .perform(); + sleep(3000); + } + + // http://software-testing.ru/forum/index.php?/topic/17746-podskazhite-po-xpath/ + @Test(enabled = false) + public void test0_8() { + + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + String elementText = "Click Here"; + WebElement element = null; + try { + element = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver _driver) { + int cnt = 4; + String[] xpaths = new String[] { "//a[text() = '%s']", + "//a[normalize-space(.) = '%s']", + "//a[normalize-space(text()) = '%s']", + "//*[normalize-space(text()) = '%s']", + "//a[contains(normalize-space(.), '%s')]", + // NOTE: way too permissive for a selector + "//*[contains(normalize-space(.), '%s')]" }; + String xpath = String.format(xpaths[cnt], elementText); + System.err.println("Locator: xpath " + xpath); + Optional _element = _driver.findElements(By.xpath(xpath)) + .stream().filter(o -> { + String t = o.getText(); + System.err.println("In filter: " + o.getTagName() + ' ' + + (t.length() > 20 ? t.substring(0, 20) : t)); + Pattern pattern = Pattern.compile( + "^ *" + Pattern.quote(elementText), + Pattern.CASE_INSENSITIVE); + return pattern.matcher(t).find(); + // quicker, less precise + // return (Boolean) (__element.getText().contains(elementText)); + }).findFirst(); + return (_element.isPresent()) ? _element.get() : (WebElement) null; + } + }); + System.err.println("Element: " + element.getAttribute("innerHTML")); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // Act + highlight(element); + highlightNew(element, 1000); + assertTrue(element.getText().equalsIgnoreCase(elementText), + element.getText()); + } + + @Test(enabled = false) + public void test1() { + + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + List elements = driver + .findElements(By.xpath("//div[1]/div/div/div/div/h3[2]/a")); + assertTrue(elements.size() > 0); + + // Act + WebElement element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Click Here"), + element.getText()); + element.click(); + try { // Wait page to load + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + // Inspect enclosing element to confirm the page loaded + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + return (Boolean) d.findElement(By.className("intro-message")) + .getText().contains("Link Successfully clicked"); + } + }); + } catch (Exception e) { + } + + // Assert + elements = driver + .findElements(By.cssSelector(".container .row .intro-message h3")) + .stream() + .filter(o -> o.getText().equalsIgnoreCase("Link Successfully clicked")) + .collect(Collectors.toList()); + assertThat(elements.size(), equalTo(1)); + element = elements.get(0); + highlight(element); + assertTrue(element.getText().equalsIgnoreCase("Link Successfully clicked"), + element.getText()); + elements.forEach(System.out::println); // output : ?? + } + + @Test(enabled = false) + public void test4() { + // Arrange + driver.get("http://suvian.in/selenium/1.4gender_dropdown.html"); + wait.until( // Wait page to load + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message select")))); + // Act + WebElement element = driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message select")); + Select select = new Select(element); + String optionString = "Male"; + // create predicate driven case-insensitive option search + Predicate hasText = o -> o.getText() + .matches("(?i:" + optionString.toLowerCase() + ")"); + List options = select.getOptions().stream().filter(hasText) + .collect(Collectors.toList()); + // Assert + assertThat(options.size(), equalTo(1)); + element = options.get(0); + assertTrue(element.getText().equals(optionString), element.getText()); + } + + @Test(enabled = false) + public void test5_1() { + // Arrange + driver.get("http://suvian.in/selenium/1.5married_radio.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + String label = "yes"; + String elementContents = driver + .findElement(By.xpath( + "//div[@class='intro-header']/div[@class='container']/div[@class='row']/div[@class='col-lg-12']/div[@class='intro-message']/form")) + .getAttribute("outerHTML"); + + String line = new ArrayList( + Arrays.asList(elementContents.split("
"))).stream() + .filter(o -> o.toLowerCase().indexOf(label) > -1).findFirst().get(); + Matcher matcher = Pattern.compile("value=\\\"([^\"]*)\\\"").matcher(line); // Pattern.quote + // ? + String checkboxValue = null; + if (matcher.find()) { + checkboxValue = matcher.group(1); + System.err.println("checkbox value = " + checkboxValue); + } else { + System.err.println("checkbox value not found"); + } + WebElement checkBoxElement = null; + if (checkboxValue != null) { + checkBoxElement = driver.findElement(By.xpath(String.format( + "//div[@class='intro-header']/div[@class='container']/div[@class='row']/div[@class='col-lg-12']/div[@class='intro-message']/form/input[@name='married' and @value='%s']", + checkboxValue))); + } + // Act + assertThat(checkBoxElement, notNullValue()); + highlight(checkBoxElement); + checkBoxElement.sendKeys(Keys.SPACE); + // Assert + // NOTE: behaves differently in C# + assertTrue(checkBoxElement.isSelected()); + } + + @Test(enabled = false) + public void test5_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.5married_radio.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + String label = "no"; + WebElement formElement = driver.findElement(By.cssSelector( + ".intro-header .container .row .col-lg-12 .intro-message form")); + String elementContents = formElement.getAttribute("outerHTML"); + + String line = new ArrayList( + Arrays.asList(elementContents.split("
"))).stream() + .filter(o -> o.toLowerCase().indexOf(label) > -1).findFirst().get(); + Matcher matcher = Pattern.compile("value=\\\"([^\"]*)\\\"").matcher(line); + String checkboxValue = null; + if (matcher.find()) { + checkboxValue = matcher.group(1); + System.err.println("checkbox value = " + checkboxValue); + } else { + System.err.println("checkbox value not found"); + } + WebElement checkBoxElement = null; + if (checkboxValue != null) { + checkBoxElement = formElement.findElement(By.cssSelector( + String.format("input[name='married'][value='%s']", checkboxValue))); + } + // Act + assertThat(checkBoxElement, notNullValue()); + highlight(checkBoxElement); + checkBoxElement.click(); + sleep(500); + // Assert + assertTrue(checkBoxElement.isSelected()); + } + + @Test(enabled = false) + public void test6_1() { + // Arrange + List hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing")); + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + try { + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + System.err + .println("element check: " + checkElement.getAttribute("innerHTML")); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + // Act + WebElement formElement = driver.findElement(By.cssSelector("input[id]")) + .findElement(By.xpath("..")); + assertThat(formElement, notNullValue()); + highlight(formElement); + List inputElements = formElement + .findElements(By.cssSelector("label[for]")).stream() + .filter(o -> hobbies.contains(o.getText())) + .collect(Collectors.toList()); + // C#: dataMap = elements.ToDictionary(x => x.GetAttribute("for"), x => + // x.Text); + Map dataMap = inputElements.stream().collect( + Collectors.toMap(o -> o.getText(), o -> o.getAttribute("for"))); + List checkboxes = new ArrayList<>(); + for (String hobby : hobbies) { + try { + System.err.println("finding: " + dataMap.get(hobby)); + checkboxes.add(formElement.findElement( + // will throw exception + By.cssSelector(String.format("input#%s", dataMap.get(hobby))))); + } catch (InvalidSelectorException e) { + System.err.println("ignored: " + e.toString()); + } + try { + checkboxes.add(formElement.findElement( + // will not throw exception + By.xpath(String.format("input[@id='%s']", dataMap.get(hobby))))); + } catch (Exception e) { + System.err.println("ignored: " + e.toString()); + } + + } + checkboxes.stream().forEach(o -> { + highlight(o); + o.click(); + }); + + // Assert + + assertTrue( + formElement.findElements(By.cssSelector("input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + // NOTE: this test is broken + // label follows the check box therefore + // the following-sibling to find the check box by its label does not seem to + // be appropriate + // - see the test6_3 for the solution + // however preceding-sibling always finds the check box #1 + @Test(enabled = false) + public void test6_2() { + // Arrange + List hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing", "Sports")); + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + WebElement checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + assertThat(checkElement, notNullValue()); + // Act + List elements = checkElement + .findElements(By.xpath("..//label[@for]")).stream() + .filter(o -> hobbies.contains(o.getText())) + .collect(Collectors.toList()); + assertTrue(elements.size() > 0); + List checkBoxes = elements.stream() + .map(o -> o.findElement(By.xpath("preceding-sibling::input"))) + .collect(Collectors.toList()); + assertTrue(checkBoxes.size() > 0); + + checkBoxes.stream().forEach(o -> { + highlight(o); + sleep(100); + o.click(); + }); + // Assert + assertTrue( + driver + .findElements(By.cssSelector( + ".container .intro-message input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + // reverse usage of following-sibling to locate check box by its label + @Test(enabled = false) + public void test6_3() { + // Arrange + driver.get("http://suvian.in/selenium/1.6checkbox.html"); + List hobbies = new ArrayList<>( + Arrays.asList("Singing", "Dancing", "Sports")); + WebElement checkElement = null; + try { + checkElement = wait.until(new ExpectedCondition() { + @Override + public WebElement apply(WebDriver d) { + return d + .findElements( + By.cssSelector("div.container div.row div.intro-message h3")) + .stream().filter(o -> o.getText().toLowerCase() + .indexOf("select your hobbies") > -1) + .findFirst().get(); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + assertThat(checkElement, notNullValue()); + // Act + List checkBoxes = checkElement + .findElements(By.xpath("..//input[@type = 'checkbox']")).stream() + .filter(o -> { + WebElement label = o + .findElement(By.xpath("following-sibling::label")); + if (hobbies.contains(label.getText())) { + System.err.println(String.format("checkbox element %s: '%s'", + o.getAttribute("id"), label.getText())); + return true; + } else { + return false; + } + }).collect(Collectors.toList()); + + assertTrue(checkBoxes.size() > 0); + checkBoxes.stream().forEach(o -> { + highlight(o); + sleep(100); + o.click(); + }); + // Assert + assertTrue( + driver + .findElements(By.cssSelector( + ".container .intro-message input[type='checkbox']")) + .stream().filter(o -> o.isSelected()).count() == hobbies.size()); + } + + @Test(enabled = false) + public void test10() { + // Arrange + driver.get("http://suvian.in/selenium/1.10selectElementFromDD.html"); + WebElement buttonDropDown = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.dropdown button.dropbtn")))); + assertThat(buttonDropDown, notNullValue()); + + // Act + buttonDropDown.click(); + wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.dropdown div#myDropdown")))); + List optionElements = driver + .findElements(By.cssSelector( + ".container .row .intro-message div.dropdown div#myDropdown")) + .stream().filter(o -> o.getText().contains("Option 2")) + .collect(Collectors.toList()); + assertTrue(optionElements.size() > 0); + final String currentHandle = driver.getWindowHandle(); + final String text = "Congratulations.. You Selected option 2. Close this browser tab and proceed to end of Level 1."; + optionElements.get(0).click(); + + // Assert + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Boolean result = false; + System.err.println("Inspecting driver Window handles"); + Set windowHandles = d.getWindowHandles(); + if (windowHandles.size() > 1) { + System.err.println("Found " + (windowHandles.size() - 1) + + " additional tabs opened"); + } else { + System.out.println("No other tabs found"); + return false; + } + Iterator windowHandleIterator = windowHandles.iterator(); + while (windowHandleIterator.hasNext()) { + String handle = windowHandleIterator.next(); + if (!handle.equals(currentHandle)) { + System.err.println("Switch to: " + handle); + driver.switchTo().window(handle); + String t = d.getPageSource(); + System.err.println(String.format("Page source: %s", + t.substring( + org.apache.commons.lang3.StringUtils.indexOf(t, ""), + t.length() - 1))); + if (t.contains(text)) { + System.err.println("Found text: " + text); + + result = true; + } + if (result) { + System.err.println("Close the browser tab: " + handle); + d.close(); + } + System.err.println("Switch to the main window."); + driver.switchTo().window(currentHandle); + driver.switchTo().defaultContent(); + } + } + return result; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + // throw new RuntimeException(e.toString()); + } + } + + @Test(enabled = false) + public void test12_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.2browserPopUp.html"); + WebElement button = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button.btn-warning")))); + assertThat(button, notNullValue()); + final String parentHandle = driver.getWindowHandle(); + + // Act + button.click(); + + // Assert + try { // Wait for the new browser widow to get shown + String popupHandle = wait.until(new ExpectedCondition() { + @Override + public String apply(WebDriver d) { + Boolean result = false; + System.err.println("Inspecting driver Window handles"); + Set windowHandles = d.getWindowHandles(); + if (windowHandles.size() > 1) { + windowHandles.remove(parentHandle); + String s = (String) (windowHandles.toArray())[0]; + System.err.println("Found popup window handle: " + s); + return s; + } else { + System.out.println("No popup found"); + return null; + } + } + }); + // Act + driver.switchTo().window(popupHandle); + System.out.println("Popup Title: " + driver.getTitle()); + driver.close(); + System.out.println("Closed popup"); + driver.switchTo().window(parentHandle); + System.out.println("switched to parent window: " + parentHandle); + driver.switchTo().defaultContent(); + System.out.println("switched to default content."); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + + // Assert + try { + assertThat(driver.getWindowHandles().size(), is(1)); + } catch (AssertionError e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + } + + @Test(enabled = false) + public void test12_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.2browserPopUp.html"); + wait.until(ExpectedConditions.textToBePresentInElement( + driver.findElement(By + .cssSelector(".container .row .intro-message button.btn-warning")), + "Click Me")); + + WebElement button = driver.findElement( + By.cssSelector(".container .row .intro-message button.btn-warning")); + assertThat(button, notNullValue()); + final String parentHandle = driver.getWindowHandle(); + + // Act + button.click(); + while (true) { // Wait for the new browser widow to get shown and close it + List popupHandles = driver.getWindowHandles().stream() + .filter(((Predicate) (o -> o.equalsIgnoreCase(parentHandle))) + .negate()) + .collect(Collectors.toList()); + if (popupHandles.size() > 0) { + driver.switchTo().window(popupHandles.get(0)); + System.out.println("Popup Title: " + driver.getTitle()); + driver.close(); + System.out.println("Closed popup"); + driver.switchTo().window(parentHandle); + System.out.println("switched to parent window: " + parentHandle); + driver.switchTo().defaultContent(); + System.out.println("switched to default content."); + break; + } else { + sleep(100); + } + } + // Assert + try { + assertThat(driver.getWindowHandles().size(), is(1)); + } catch (AssertionError e) { + System.err.println("Exception: " + e.toString()); + verificationErrors.append(e.toString()); + } + } + + // This test appears to find the button even though it is inside iframe + // without frame switch + @Test(enabled = false) + public void test13_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt( + By.cssSelector(".container .row .intro-message iframe"))); + + // Act + WebElement buttonElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("h3 button")))); + + assertThat(buttonElement, notNullValue()); + // Assert + + WebElement currentElement = buttonElement; + for (int cnt = 0; cnt != 4; cnt++) { + try { + WebElement containerElement = currentElement + .findElement(By.xpath("..")); + String elementHTML = containerElement.getAttribute("outerHTML"); + System.err.println("Parent element: " + (elementHTML.length() > 120 + ? elementHTML.substring(0, 120) + "..." : elementHTML)); + currentElement = containerElement; + } catch (InvalidSelectorException e) { + // InvalidSelectorError: The result of the xpath expression ".." is: + // [object HTMLDocument]. It should be an element. + // ignore - reached top level + break; + } + } + buttonElement.click(); + // Assert + try { + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + // confirm alert + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + // This test does switch frame fefore find the button in the iframed document + @Test(enabled = false) + public void test13_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + WebElement frameElement = wait + .until(ExpectedConditions.visibilityOfElementLocated( + By.cssSelector(".container .row .intro-message iframe"))); + assertThat(frameElement, notNullValue()); + String frameElementDocument = frameElement.getAttribute("outerHTML"); + + System.err + .println("Switching to frame:\n" + (frameElementDocument.length() > 80 + ? frameElementDocument.substring(0, 80) + "..." + : frameElementDocument)); + + driver.switchTo().frame(frameElement); + System.err.println("Inside the frame"); + try { + frameElement.getTagName(); + } catch (org.openqa.selenium.StaleElementReferenceException e) { + // Element belongs to a different frame than the current one + System.err.println("Exception (expected, ignored): " + e.toString()); + } + WebElement rootElement = driver.findElement(By.xpath("/*")); + String documentText = rootElement.getAttribute("outerHTML"); + System.err.println("Root element:\n" + (documentText.length() > 80 + ? documentText.substring(0, 80) + "..." : documentText)); + String pageSource = driver.getPageSource(); + System.err.println("Page source:\n" + (pageSource.length() > 80 + ? pageSource.substring(0, 80) + "..." : pageSource)); + + // Act + WebElement buttonElement = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector("h3 button[onclick = 'myFunction()']")))); + + assertThat(buttonElement, notNullValue()); + buttonElement.click(); + // Assert + + try { + // confirm alert + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + @Test(enabled = false) + public void test13_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.3frame.html"); + + wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt( + By.cssSelector(".container .row .intro-message iframe"))); + + // Act + WebElement buttonElement = driver + .findElement(By.xpath("//button[@onclick = 'myFunction()']")); + assertThat(buttonElement, notNullValue()); + // Assert + + buttonElement.click(); + // Assert + try { + alert = driver.switchTo().alert(); + String alertText = alert.getText(); + assertTrue(alertText.contains("You clicked a button within a frame")); + // confirm alert + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + } + + @Test(enabled = false) + public void test14_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.4mouseHover.html"); + + WebElement elementWithTooltip = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(elementWithTooltip, notNullValue()); + // the link title attribute is present regardless of tooltip shown or not + // Assert + assertThat(elementWithTooltip.getAttribute("title"), + equalTo("This is a tooltip.")); + // Act + actions.moveToElement(elementWithTooltip).build().perform(); + // Assert + assertThat(elementWithTooltip.getAttribute("title"), + equalTo("This is a tooltip.")); + // How to discover whether core HTML tool tip is displayed ? + + } + + // https://docs.google.com/a/jazzteam.org/document/d/1PdfKMDfoqFIlF4tN1jKrOf1iZ1rqESy2xVMIj3uuV3g/pub#h.qkrwckq52qpd + + // http://sqa.stackexchange.com/questions/14247/how-can-i-get-the-value-of-the-tooltip + @Test(enabled = false) + public void test14_2() { + // Arrange + driver.get("http://yuilibrary.com/yui/docs/charts/charts-pie.html"); + + WebElement elementWithTooltip = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//*[contains(@class,'yui3-svgSvgPieSlice')][@fill = '#66007f']")))); + assertThat(elementWithTooltip, notNullValue()); + + WebElement chartTitle = driver + .findElement(By.cssSelector("div#doc div.content h1")); + // Act + actions.moveToElement(chartTitle).build().perform(); + sleep(100); + // Assert + // the tooltip element is present on the page regardless of mouse position, + // but is not visible. + assertThat((int) driver + .findElements(By.cssSelector("div[class $= 'chart-tooltip']")).stream() + .filter(o -> { + return (Boolean) (o.getAttribute("style") + .indexOf("visibility: hidden;") == -1); + }).count(), is(0)); + + // Act + actions.moveToElement(elementWithTooltip).build().perform(); + sleep(100); + // Assert + List tooltips = driver + .findElements(By.xpath("//div[contains(@id, '_tooltip')]")); + assertThat(tooltips.size(), is(1)); + // TODO: visibility check + assertThat(tooltips.get(0).getText(), containsString("day: Monday")); + } + + @Test(enabled = false) + public void test15_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.5resize.html"); + WebElement textAreaElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 textarea")))); + assertThat(textAreaElement, notNullValue()); + System.err.println( + "Text area original width: " + textAreaElement.getSize().width); + System.err.println( + "Text area original height: " + textAreaElement.getSize().height); + WebElement lineElement = driver.findElement( + By.cssSelector(".container .row .intro-message h3 hr.intro-divider")); + assertThat(lineElement, notNullValue()); + System.err.println("Line element width: " + lineElement.getSize().width); + // Act + int distance = (lineElement.getSize().width + - textAreaElement.getSize().width); + highlight(textAreaElement); + int xOffset = textAreaElement.getSize().getWidth() - 1; + int yOffset = textAreaElement.getSize().getHeight() - 1; + System.err + .println(String.format("Click and hold at (%d,%d)", xOffset, yOffset)); + + actions.moveToElement(textAreaElement, xOffset, yOffset).clickAndHold() + .moveByOffset(distance, 0); + actions.release().build().perform(); + // Assert + sleep(100); + System.err.println( + "Text area new width: " + textAreaElement.getSize().getWidth()); + System.err.println( + "Text area new height: " + textAreaElement.getSize().getHeight()); + } + + @Test(enabled = false) + public void test15_2() { + // Arrange + driver.get("http://suvian.in/selenium/1.1link.html"); + + String cssSelector = ".container .row .intro-message h3 a"; + WebElement element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertTrue(element.getText().equalsIgnoreCase("click here"), + element.getText()); + + // Act + highlight(element); + + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates coords = ((Locatable) element).getCoordinates(); + System.err.println(String.format("Mouse click at: (%-4d, %-4d)", + coords.inViewPort().x, coords.inViewPort().y)); + mouse.click(coords); + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("1.1link_validate.html")); + } catch (UnreachableBrowserException e) { + } + + // Assert + try { + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + return d.findElement(By.className("intro-message")).getText() + .contains("Link Successfully clicked"); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + } + + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.interactions.Mouse + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.interactions.internal.Coordinates + // http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium/selenium-api/2.40.0/org/openqa/selenium/interactions/Mouse.java#Mouse.mouseMove%28org.openqa.selenium.interactions.internal.Coordinates%2Clong%2Clong%29 + @Test(enabled = false) + public void test15_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.5resize.html"); + WebElement textAreaElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h3 textarea")))); + assertThat(textAreaElement, notNullValue()); + System.err.println(textAreaElement.getSize().width); + System.err.println(textAreaElement.getSize().height); + WebElement lineElement = driver.findElement( + By.cssSelector(".container .row .intro-message h3 hr.intro-divider")); + assertThat(lineElement, notNullValue()); + // Act + int distance = (lineElement.getSize().width + - textAreaElement.getSize().width) / 2; + highlight(textAreaElement); + int xOffset = textAreaElement.getSize().getWidth() - 1; + int yOffset = textAreaElement.getSize().getHeight() - 1; + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Locatable locatable = (Locatable) textAreaElement; + Coordinates coords = locatable.getCoordinates(); + System.err.println(String.format("Mouse down at: (%d,%d)", + coords.inViewPort().x, coords.inViewPort().y)); + mouse.mouseMove(coords, xOffset, yOffset); + sleep(1000); + mouse.mouseDown(coords); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + mouse.mouseUp(coords); + mouse.click(coords); + sleep(1000); + } + + @Test(enabled = false) + public void test16_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + + WebElement book2 = driver.findElement(By.xpath( + "//div[@class='intro-message']/ul/li[ contains(text(), 'Book 2')]")); + assertThat(book2.getText(), containsString("Book 2")); + + // Act + int count = 0; + Enumeration chapters = Collections + .enumeration(book2.findElements(By.cssSelector("ul li"))); + + while (chapters.hasMoreElements()) { + WebElement currentChapter = chapters.nextElement(); + count++; + try { + highlight(currentChapter); + currentChapter.click(); + } catch (WebDriverException e) { + System.err + .println(String.format("Exception (ignored):\n%s", e.toString())); + // Element is not clickable + } + } + // Assert + assertThat(count, is(7)); + System.err.println(count); + + WebElement resultElement = driver + .findElement(By.cssSelector("input#chapbook2")); + resultElement.clear(); + resultElement.sendKeys(String.format("%d", count)); + sleep(1000); + } + + @Test(enabled = false) + public void test16_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + // Act + + List elements = driver + .findElements( + By.cssSelector(".container .row .intro-message ul#books li")) + .stream().filter(o -> { + return (Boolean) (o.getText().indexOf("Book") > -1); + }).map(o -> o.findElements(By.cssSelector("ul li"))) + .collect(ArrayList::new, List::addAll, List::addAll); + // http://stackoverflow.com/questions/25147094/turn-a-list-of-lists-into-a-list-using-lambdas + + // Assert + assertThat(elements.size(), is(15)); + System.err.println("Total:" + elements.size()); + WebElement resultElement = driver + .findElement(By.cssSelector("input#chapall")); + resultElement.clear(); + resultElement.sendKeys(String.format("%d", elements.size())); + } + + @Test(enabled = false) + public void test16_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.6liCount.html"); + + // Act + driver + .findElements( + By.cssSelector(".container .row .intro-message ul#books li")) + .stream().filter(o -> { + CharSequence text = "Book"; + return (Boolean) !(o.getText().contains(text)); + }).forEach(o -> { + try { + highlight(o); + o.click(); + } catch (WebDriverException e) { + System.err.println( + String.format("Exception (ignored):\n%s", e.toString())); + // Element is not clickable + } + }); + } + + @Test(enabled = false) + public void test17() { + // Arrange + driver.get("http://suvian.in/selenium/2.7waitUntil.html"); + + WebElement clickElement = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(clickElement, notNullValue()); + assertThat(clickElement.getText(), containsString("Click Me")); + // Act + long startTime = System.currentTimeMillis(); + clickElement.click(); + // Assert + long retryInterval = 1000; + long maxRetry = 30; + long checkRetryDelay = 0; + while (true) { + try { + // confirm alert + driver.switchTo().alert().accept(); + break; + } catch (NoAlertPresentException e) { + // check if waited long enough already + checkRetryDelay = System.currentTimeMillis() - startTime; + if (Math.ceil(checkRetryDelay / retryInterval) > maxRetry + 1) { + System.err.format("Alert not present after %d second\n", + checkRetryDelay); + throw new RuntimeException(); + } + try { + System.err.print(String.format("Sleep %4.2f sec ...", + Math.ceil(retryInterval / 1000))); + Thread.sleep(retryInterval); + } catch (InterruptedException e2) { + System.err.println("Unexpected Interrupted Exception: " + + e.getStackTrace().toString()); + throw new RuntimeException(e.toString()); + } + } catch (Exception e) { + System.err + .println("Unexpected exception: " + e.getStackTrace().toString()); + throw new RuntimeException(e.toString()); + } + } + + long delaySecond = (checkRetryDelay / 1000) % 60; + long delayMinute = (checkRetryDelay / (1000 * 60)) % 60; + long delayHour = (checkRetryDelay / (1000 * 60 * 60)) % 24; + String delayTime = String.format("%02d:%02d:%02d", delayHour, delayMinute, + delaySecond); + System.err.format("Alert was confirmed at %s\n", delayTime); + } + + @Test(enabled = false) + public void test18_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message button#button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message div.w3-progress-container div#myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + + // Act + button1.click(); + // Brute force wait until button2 gets enabled - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + String t = button2.getAttribute("disabled"); + return (t == null); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Assert + } + + @Test(enabled = false) + public void test18_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + WebElement progressBarContainer = progressBar.findElement(By.xpath("..")); + int denom = Integer.parseInt( + styleOfElement(progressBarContainer, "width").replace("px", "")); + // Act + button1.click(); + + // Evaluate the progressBar width to reach 100% - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Pattern p = Pattern.compile("([0-9.]+)px", + Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + float percentage = Float.parseFloat( + p.matcher(styleOfElement(progressBar, "width")).replaceAll("$1")) + / denom; + System.err.println("Progress Bar: " + percentage); + return (percentage >= .97); + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + // Assert + sleep(100); + System.err.println( + "Button2 attribute check (1) : " + button2.getAttribute("outerHTML")); + button2.click(); + try { + // confirm alert + driver.switchTo().alert().accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + // NOTE: latency + System.err.println( + "Button2 attribute check (2) : " + button2.getAttribute("outerHTML")); + } + + @Test(enabled = false) + public void test18_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.8progressBar.html"); + + // html body div.intro-header div.container div.row div.col-lg-12 + // div.intro-message button.w3-btn.w3-dark-grey + WebElement button1 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message button:nth-of-type(1)")))); + assertThat(button1, notNullValue()); + assertThat(button1.getAttribute("disabled"), nullValue()); + + WebElement button2 = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("button2")))); + assertThat(button2, notNullValue()); + assertThat(button2.getAttribute("disabled"), notNullValue()); + + WebElement progressBar = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("myBar")))); + assertThat(progressBar, notNullValue()); + assertThat(progressBar.getAttribute("style"), notNullValue()); + WebElement progressBarContainer = progressBar.findElement(By.xpath("..")); + int denom = Integer.parseInt( + styleOfElement(progressBarContainer, "width").replace("px", "")); + // Act + button1.click(); + + // Evaluate the progressBar width to reach 100% + // Use Javascript to evaluate the disabled property of the DOM element + // that will be changing from true to false - need a longer wait timeout + try { + (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver d) { + Boolean disabled = Boolean.parseBoolean( + executeScript("return arguments[0].disabled", button2) + .toString()); + return !disabled; + } + }); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + System.err.println( + "Button2 attribute check (3) : " + button2.getAttribute("outerHTML")); + } + + @Test(enabled = false) + public void test19_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.9greenColorBlock.html"); + + WebElement greenBoxElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message table div.greenbox")))); + // Act + + // Assert + assertThat(greenBoxElement, notNullValue()); + // TODO: computed style of that element + + actions.moveToElement(greenBoxElement).build().perform(); + greenBoxElement.click(); + try { + // confirm alert + alert = driver.switchTo().alert(); + String alert_text = alert.getText(); + assertThat(alert_text, containsString("You clicked on Green")); + + alert.accept(); + } catch (NoAlertPresentException e) { + // Alert not present - ignore + } catch (WebDriverException e) { + System.err + .println("Alert was not handled : " + e.getStackTrace().toString()); + return; + } + + } + + @Test(enabled = false) + public void test19_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.9greenColorBlock.html"); + + WebElement greenBoxElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message table div.greenbox")))); + // Act + + // Assert + assertThat(greenBoxElement, notNullValue()); + // simplified script for computed style an element does not work + String script = "var element = arguments[0];window.document.defaultView.getComputedStyle(element,null).getPropertyValue(arguments[1]);"; + + Object computedStyle = ((JavascriptExecutor) driver).executeScript(script, + greenBoxElement, "background-color"); + try { + System.err + .println("Red Box background color: " + computedStyle.toString()); + } catch (NullPointerException e) { + System.err.println("Script does not return the value : " + e.toString()); + } + String style = styleOfElement(greenBoxElement); + System.err.println("style:\n" + style); + + String backgroundColorAttribute = styleOfElement(greenBoxElement, + "background-color"); + String heightAttribute = styleOfElement(greenBoxElement, "height"); + String widthAttribute = styleOfElement(greenBoxElement, "width"); + + System.err + .println("backgroundColorAttribute:\n" + backgroundColorAttribute); + + Pattern pattern = Pattern.compile("\\(\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)\\)"); + Matcher matcher = pattern.matcher(backgroundColorAttribute); + int red = 0, green = 0, blue = 0; + + if (matcher.find()) { + red = Integer.parseInt(matcher.group(1).toString()); + green = Integer.parseInt(matcher.group(2).toString()); + blue = Integer.parseInt(matcher.group(3).toString()); + assertTrue(red == 0); + } + pattern = Pattern + .compile("\\(\\s*(?\\d+),\\s*(?\\d+),\\s*(?\\d+)\\)"); + matcher = pattern.matcher(backgroundColorAttribute); + if (matcher.find()) { + red = Integer.parseInt(matcher.group("red").toString()); + green = Integer.parseInt(matcher.group("green").toString()); + blue = Integer.parseInt(matcher.group("blue").toString()); + assertTrue(green >= 128); + } + System.err.println("green:" + green); + + System.err.println("heightAttribute:\n" + heightAttribute); + System.err.println("widthAttribute:\n" + widthAttribute); + // assertThat(greenBoxElement.getAttribute("background-color"), + // equalTo("red")); + + } + + // Few failing attempts. Warning: Timing out with Firefox + + // Attempt #1 + @Test(enabled = false) + public void test20_1() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + actions.clickAndHold(draggableElement).moveToElement(dropElement).release() + .build().perform(); + sleep(1000); + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #2 + @Test(enabled = false) + public void test20_2() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + actions.dragAndDrop(draggableElement, dropElement).build().perform(); + sleep(1000); + + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #3 + @Test(enabled = false) + public void test20_3() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Point source_location = draggableElement.getLocation(); + highlight(draggableElement); + Point target_location = dropElement.getLocation(); + actions.dragAndDropBy(draggableElement, 0, + target_location.y - source_location.y).build().perform(); + actions.release().build(); + actions.perform(); + sleep(1000); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #4 + @Test(enabled = false) + public void test20_4() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + System.err.println(String.format("Mouse down at: (%-4d, %-4d)", + source_coords.inViewPort().x, source_coords.inViewPort().y)); + mouse.mouseDown(source_coords); + + mouse.mouseMove(source_coords, 0, + target_coords.inViewPort().y - source_coords.inViewPort().y); + System.err.println(String.format("Mouse up at: (%-4d, %-4d)", + target_coords.inViewPort().x + 10, target_coords.inViewPort().y + 10)); + mouse.mouseUp(target_coords); + sleep(1000); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // Attempt #5 + @Test(enabled = false) + public void test20_5() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector(".container .row .intro-message h5#drag1 strong")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + String simulateDragDropScript = getScriptContent("simulateDragDrop.js"); + System.err.println(String.format("Simulate drag an drop by: (%-4d, %-4d)", + target_coords.inViewPort().x, target_coords.inViewPort().y)); + + executeScript(simulateDragDropScript, draggableElement, + target_coords.inViewPort().x, target_coords.inViewPort().y); + + sleep(1000); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + } + + // https://github.com/tourdedave/elemental-selenium-tips + @Test(enabled = false) + public void test20_6() { + // Arrange + driver.get("http://the-internet.herokuapp.com/drag_and_drop"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#column-a")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), containsString("A")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#column-b")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("B")); + + // Act + String dragDropScript = String.format( + "%s\n$('#column-a').simulateDragDrop({ dropTarget: '#column-b'});", + getScriptContent("dnd.js")); + ((JavascriptExecutor) driver).executeScript(dragDropScript); + + // Assert + assertThat(dropElement.getText(), containsString("B")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_7() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + String dragDropScript = String.format( + "%s\n$('#drag1').simulateDragDrop({ dropTarget: '#div1'});", + getScriptContent("dnd.js")); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript); + + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_8() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + String dragDropScript = String.format("%s\n%s", getScriptContent("dnd.js"), + "var dragElememt = $(arguments[0]); var dropTargetSelector = arguments[1]; dragElememt.simulateDragDrop({ dropTarget: dropTargetSelector});"); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript, + String.format("#%s", draggableElement.getAttribute("id")), + String.format("#%s", dropElement.getAttribute("id"))); + + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + } + + @Test(enabled = false) + public void test20_9() { + // Arrange + driver.get("http://suvian.in/selenium/2.10dragAndDrop.html"); + + WebElement draggableElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getText(), + containsString("This is a draggable text.")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.cssSelector("#div1")))); + assertThat(dropElement, notNullValue()); + assertThat(dropElement.getText(), containsString("Drop Here")); + + // Act + dragdrop(By.id("drag1"), By.id("div1")); + // Assert + assertThat(dropElement.getText(), + containsString("This is a draggable text.")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + sleep(3000); + } + + // NOTE: this test is failing + @Test(enabled = false) + public void test21() { + // Arrange + driver.get("http://suvian.in/selenium/3.1fileupload.html"); + + wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + + // Act + + // Wait page to load + try { + wait.until(ExpectedConditions.urlContains("3.1fileupload_validate.html")); + } catch (UnreachableBrowserException e) { + } + // Assert + } + + @Test(enabled = false) + public void test22_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + // Act + + // Act + String dragDropScript = String.format("%s\n%s", getScriptContent("dnd.js"), + "var dragElememt = $(arguments[0]); var dropTargetSelector = arguments[1]; dragElememt.simulateDragDrop({ dropTarget: dropTargetSelector});"); + // System.err.println(dragDropScript); + + ((JavascriptExecutor) driver).executeScript(dragDropScript, + String.format("#%s", draggableElement.getAttribute("id")), + String.format("#%s", dropElement.getAttribute("id"))); + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + } + + // Few failing attempts + // Attempt #1 + @Test(enabled = false) + public void test22_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Act + actions.clickAndHold(draggableElement).moveToElement(dropElement).release() + .build().perform(); + sleep(1000); + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + + } + + // Attempt #2 + @Test(enabled = false) + public void test22_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Act + actions.dragAndDrop(draggableElement, dropElement).build().perform(); + sleep(1000); + + // Assert + assertThat(dropElement.getAttribute("innerHTML"), + containsString("img id=\"drag1\"")); + System.err.println("Result: " + dropElement.getAttribute("innerHTML")); + // Assert + Optional dragResult = dropElement + .findElements(By.cssSelector("img#drag1")).stream().findFirst(); + WebElement dragResultElement = (dragResult.isPresent()) ? dragResult.get() + : null; + assertThat(dragResultElement, notNullValue()); + + } + + // Few failing attempts. Warning: Timing out with Firefox + @Test(enabled = false) + public void test22_4() { + // Arrange + driver.get("http://suvian.in/selenium/3.2dragAndDrop.html"); + + WebElement draggableElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.id("drag1")))); + assertThat(draggableElement, notNullValue()); + assertThat(draggableElement.getAttribute("src"), + containsString("img/img_logo.gif")); + + WebElement dropElement = wait.until(ExpectedConditions + .visibilityOf(driver.findElement(By.xpath("//div[@id='div1']")))); + assertThat(dropElement, notNullValue()); + + // Attempt #3 + Point source_location = draggableElement.getLocation(); + highlight(draggableElement); + Point target_location = dropElement.getLocation(); + actions.dragAndDropBy(draggableElement, 0, + target_location.y - source_location.y).build().perform(); + actions.release().build(); + actions.perform(); + + // Attempt #4 + Mouse mouse = ((HasInputDevices) driver).getMouse(); + Coordinates source_coords = ((Locatable) draggableElement).getCoordinates(); + Coordinates target_coords = ((Locatable) dropElement).getCoordinates(); + System.err.println(String.format("Mouse down at: (%-4d, %-4d)", + source_coords.inViewPort().x, source_coords.inViewPort().y)); + mouse.mouseDown(source_coords); + + mouse.mouseMove(source_coords, 0, target_location.y - source_location.y); + System.err.println(String.format("Mouse up at: (%-4d, %-4d)", + target_coords.inViewPort().x + 10, target_coords.inViewPort().y + 10)); + mouse.mouseUp(target_coords); + + // Assert + } + + // only loads first 25 lines of code + @Test(enabled = false) + public void test23_1() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + List codeLines = codeElement + .findElements(By.cssSelector("pre[role='presentation']")); + + // Assert + assertTrue(codeLines.size() > 0); + System.err.println(String.format("%d Lines of code:", codeLines.size())); + List code = codeLines.stream().map(e -> { + executeScript("arguments[0].scrollIntoView(true);", e); + highlight(e); + return e.getText(); + }).collect(Collectors.toList()); + + code.stream().forEach(e -> System.err.println(e)); + } + + // loads all code + @Test(enabled = false) + public void test23_2() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + WebElement codeLine = codeElement + .findElement(By.cssSelector("pre[role='presentation']:nth-of-type(1)")); + + // Assert + assertThat(codeLine, notNullValue()); + while (true) { + try { + List codeLinesFollowing = codeLine + .findElements(By.xpath("following-sibling::pre")); + if (codeLinesFollowing.size() == 0) { + System.err + .println(String.format("Last line: '%s'", codeLine.getText())); + break; + } + WebElement nextCodeLine = codeLinesFollowing.get(0); + executeScript("arguments[0].scrollIntoView(true);", nextCodeLine); + highlight(codeLine); + System.err.println(codeLine.getText()); + codeLine = nextCodeLine; + } catch (Exception e) { + e.printStackTrace(); + break; + } + } + } + + // only loads first 35 lines of code + @Test(enabled = false) + public void test23_3() { + // Arrange + driver.get("https://codemirror.net/demo/simplemode.html"); + WebElement codeElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[@id = 'code']//div[@class='CodeMirror-code']")))); + assertThat(codeElement, notNullValue()); + // Act + + // brute force ? + int cnt = 0; + while (true) { + cnt++; + try { + WebElement codeLine = codeElement.findElement(By.cssSelector( + String.format("pre[role='presentation']:nth-of-type(%d)", cnt))); + assertThat(codeLine, notNullValue()); + executeScript("arguments[0].scrollIntoView(true);", codeLine); + highlight(codeLine); + System.err.println(codeLine.getText()); + } catch (NoSuchElementException e) { + // e.printStackTrace(); + break; + } + } + // Assert + } + + @Test(enabled = false) + public void test25_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + + assertThat(link, notNullValue()); + assertThat(link.getText(), containsString("Generate Scorecard")); + link.click(); + + // Wait page to update + + try { + wait.until(SuvianTest::hasScoreMethod); + } catch (UnreachableBrowserException e) { + } + // Assert + List rowElements = driver.findElements( + By.cssSelector(".container .row .intro-message table tbody tr")); + Map playerScores = rowElements.stream() + .collect(Collectors.toMap( + o -> o.findElement(By.cssSelector("td:nth-of-type(1)")).getText() + .trim(), + o -> Integer.parseInt( + o.findElement(By.cssSelector("td:nth-of-type(2)")).getText()))); + List> playerScoresList = new LinkedList<>( + playerScores.entrySet()); + Collections.sort(playerScoresList, + new Comparator>() { + @Override + public int compare(Map.Entry first, + Map.Entry second) { + return (second.getValue()).compareTo(first.getValue()); + } + }); + + String bestScoringPlayerName = playerScoresList.get(0).getKey(); + WebElement playerNameInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("form.form-inline input#score[name='topscorer']")))); + playerNameInput.clear(); + playerNameInput.sendKeys(bestScoringPlayerName); + System.err.println(bestScoringPlayerName); + sleep(1000); + } + + static boolean hasScoreMethod(WebDriver driver) { + return driver + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0; + } + + // This test was developed with Selenium Driver 2.53 and needs update to work + // with Selenium 3.x.x + /* + @Test(enabled = false) + public void test25_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + // Act + + assertThat(link, notNullValue()); + assertThat(link.getText(), containsString("Generate Scorecard")); + link.click(); + + // Wait page to update + com.google.common.base.Predicate hasScore = d -> { + return (boolean) (d + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0); + }; + try { + wait.until(hasScore); + } catch (UnreachableBrowserException e) { + } + // Assert + List scores = driver + .findElements(By.cssSelector( + ".container .row .intro-message table tbody tr td:nth-of-type(2) p[id]")) + .stream().map(e -> Integer.parseInt(e.getText().trim())) + .collect(Collectors.toList()); + Collections.sort(scores, Collections.reverseOrder()); + int maxScore = scores.get(0); + int minScore = scores.get(scores.size() - 1); + assertTrue(maxScore >= minScore); + + List players = driver + .findElements(By.cssSelector( + ".container .row .intro-message table tbody tr td:nth-of-type(1)")) + .stream().filter(o -> { + WebElement s = o.findElement(By.xpath("following-sibling::td")); + return (Boolean) (Integer.parseInt(s.getText()) == maxScore); + }).map(e -> e.getText()).collect(Collectors.toList()); + System.err.println(players.get(0)); + WebElement playerNameInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement( + By.cssSelector("form.form-inline input#score[name='topscorer']")))); + playerNameInput.clear(); + playerNameInput.sendKeys(StringUtils.join(players, ",")); + Integer scoreSachin = Integer.parseInt(driver + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim()); + WebElement scoreInput = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By + .cssSelector("form.form-inline input#score[name='sachinruns']")))); + scoreInput.clear(); + scoreInput.sendKeys(String.format("%d", scoreSachin)); + sleep(1000); + } + */ + + // This test was developed with Selenium Driver 2.53 and needs update to work + // with Selenium 3.x.x + /* + @Test(enabled = false) + public void test25_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.5cricketScorecard.html"); + + WebElement link = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message h3 a")))); + assertThat(link, notNullValue()); + + // Act + link.click(); + + // Wait page to update + try { + wait.until((com.google.common.base.Predicate) (d -> d + .findElement(By.cssSelector( + ".container .row .intro-message table tbody tr td p#sachinruns")) + .getText().trim().length() > 0)); + } catch (UnreachableBrowserException e) { + } + Map playerScores = driver + .findElements( + By.cssSelector(".container .row .intro-message table tbody tr")) + .stream() + .collect(Collectors.toMap( + o -> o.findElement(By.xpath("td[1]")).getText().trim(), + o -> Integer.parseInt(o.findElement(By.xpath("td[2]")).getText()))); + // Assert + LinkedHashMap playerScoresList = sortByValue(playerScores); + + // TODO : finish + for (String key : playerScoresList.keySet()) { + System.out.println(key + ":\t" + playerScoresList.get(key)); + } + } + + // sorting example from + // http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java + public static > LinkedHashMap sortByValue( + Map map) { + return map.entrySet().stream() + .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (e1, e2) -> e1, LinkedHashMap::new)); + } + */ + + @Test(enabled = false) + public void test26() { + // Arrange + driver.get("http://suvian.in/selenium/3.6copyTextFromTextField.html"); + WebElement sourceElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message form textarea[name='field_one']")))); + assertThat(sourceElement, notNullValue()); + WebElement targetElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//div[@class = 'container']//div[@class = 'row']//div[@class = 'intro-message']//form/textarea[@name='field_two']")))); + assertThat(targetElement, notNullValue()); + + // Act + String text = sourceElement.getText(); + executeScript("arguments[0].removeAttribute('readonly');", sourceElement); + // arguments[0].removeAttribute('readonly',0) + sourceElement.clear(); + targetElement.sendKeys((CharSequence) text); + sleep(100); + + // Assert + String textValue = executeScript("return arguments[0].value;", + targetElement).toString(); + + assertThat(textValue, containsString(text)); + System.err.println("value = " + textValue); + + assertThat(targetElement.getAttribute("value"), containsString(text)); + // Assert + try { + assertThat(targetElement.getText(), containsString(text)); + } catch (AssertionError e) { + System.err.println("Exception(ignoredd): " + e.toString()); + // new textArea value is not possible to retrieve with getText() + } + } + + @Test(enabled = false) + public void test27_1() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement inputElement = wait + .until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( + "//div[@class='intro-message']/ul[@id='tst']/li[.='India']/input[@type='radio' and @name='country']")))); + assertThat(inputElement, notNullValue()); + inputElement.click(); + sleep(100); + // Assert + String script = "var radios = document.getElementsByTagName('input');\n" + + "var checkedRadioItemNumber = 1; for (var cnt = 0; cnt < radios.length; cnt++) {\n" + + "if (radios[cnt].type === 'radio' && radios[cnt].checked) {\n" + + "checkedRadioItemNumber = cnt; }\n}\n" + + "var value = radios[checkedRadioItemNumber].value;" + + "return (checkedRadioItemNumber + 1).toString();"; + String checkedRadioItemNumber = executeScript(script).toString(); + System.err.println("Checked is Radio item #" + checkedRadioItemNumber); + WebElement itemElement = driver.findElement(By.xpath( + String.format("//ul[@id='tst']/li[%s]", checkedRadioItemNumber))); + assertThat(itemElement, notNullValue()); + System.err.println("Result : " + itemElement.getText()); + } + + @Test(enabled = false) + public void test27_2() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement itemList = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message ul#tst")))); + assertThat(itemList, notNullValue()); + // Act + + WebElement inputElement = itemList.findElements(By.tagName("li")).stream() + .filter(o -> o.getText().contains((CharSequence) "India")) + .map(o -> o + .findElement(By.xpath("input[@type='radio' and @name='country']"))) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + sleep(100); + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + // https://docs.google.com/a/jazzteam.org/document/d/1PdfKMDfoqFIlF4tN1jKrOf1iZ1rqESy2xVMIj3uuV3g/pub + @Test(enabled = false) + public void test27_3() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + WebElement itemList = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.cssSelector(".container .row .intro-message ul#tst")))); + assertThat(itemList, notNullValue()); + // Act + WebElement inputElement = itemList + .findElements(By.xpath( + "li[contains(text(), 'India')]//input[@type='radio' and @name='country']")) + .stream() + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + sleep(100); + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + @Test(enabled = false) + public void test27_4() { + // Arrange + driver.get("http://suvian.in/selenium/3.7correspondingRadio.html"); + + // Act + WebElement inputElement = driver + .findElements(By.xpath( + "//li[contains(text(), 'India')]//input[@type='radio' and @name='country']")) + .stream() + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .findFirst().orElseThrow(RuntimeException::new); + inputElement.click(); + sleep(100); + // Assert + Optional result = driver.findElements(By.tagName("input")) + .stream().filter(o -> o.getAttribute("type").equalsIgnoreCase("radio")) + .filter(o -> o.findElement(By.xpath("..")).getText() + .contains((CharSequence) "India")) + .filter(o -> o.getAttribute("checked") != null).findFirst(); + WebElement checkedRadioButton = (result.isPresent()) ? result.get() : null; + assertThat(checkedRadioButton, notNullValue()); + System.err.println(String.format("Value : %s\tChecked: %s", + checkedRadioButton.getAttribute("value"), + checkedRadioButton.getAttribute("checked"))); + } + + @Test(enabled = false) + public void test28_1() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + WebElement linkElement = driver.findElement(By.xpath( + "//table[@summary='Sample Table']/tbody/tr/td[text()='Taipei']/../descendant::a[@href='#']")); + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + @Test(enabled = false) + public void test28_2() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + WebElement linkElement = driver.findElement(By.xpath( + "//table[@summary='Sample Table']/tbody/tr[td/text()='Taipei']/descendant::a[@href='#']")); + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + @Test(enabled = false) + public void test28_3() { + // Arrange + driver.get("http://toolsqa.com/automation-practice-table/"); + // Act + Optional trylinkElement = driver + .findElements(By.xpath("//table[@summary='Sample Table']/tbody/tr")) + .stream() + .filter( + o -> o.findElements(By.xpath("td[text()='Taipei']")).size() != 0) + .map(o -> o.findElement(By.xpath("td/a[@href='#']"))).findFirst(); + WebElement linkElement = (trylinkElement.isPresent()) ? trylinkElement.get() + : null; + assertThat(linkElement, notNullValue()); + highlight(linkElement); + + assertThat(linkElement, notNullValue()); + highlight(linkElement); + } + + /* + +
+ +
+
+ + "//li/section[span/text()='Credit Card']/../following-sibling::section/span[@name='edit']" + */ + + @Test(enabled = false) + public void test30() { + // Arrange + driver.get("http://suvian.in/selenium/3.10select1stFriday.html"); + + WebElement calendarElement = wait.until( + ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector( + ".container .row .intro-message h4 input[name='calendar']")))); + int xOffset = calendarElement.getSize().getWidth() - 5; + int yOffset = calendarElement.getSize().getHeight() - 5; + System.err.println(String.format("Hover at (%d, %d)", xOffset, yOffset)); + + actions.moveToElement(calendarElement, xOffset, yOffset); + actions.build().perform(); + sleep(1000); + calendarElement.sendKeys("01/21/2017"); + actions.moveToElement(calendarElement, xOffset, yOffset).click().build() + .perform(); + + sleep(100); + // NOTE: unable to locate individual calendar dates elements with Selenium + // WebDriver + driver.findElements(By.xpath("//*[contains(@class,'calendar')]")).stream() + .forEach(o -> { + System.err.println(o.getAttribute("outerHTML")); + }); + for (int i = 0; i != 8; i++) { + calendarElement.sendKeys(Keys.ARROW_RIGHT); + sleep(100); + } + sleep(10000); + // Assert + } + + // bad practice ? + // too much navigation and excessively detailed - possibly auto-generated - + // locators + // http://automated-testing.info/t/webdriver-java-ne-rabotaet-metod-click/13838/16 + @Test(enabled = false) + public void test31_1() { + // Arrange + driver.get( + "https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru"); + // Act + WebElement element = driver.findElement(By.xpath( + "//strong[text()='Пол']/following-sibling::div/div[@role='listbox'][1]")); + assertThat(element, notNullValue()); + highlight(element); + element.click(); + sleep(300); + element = wait.until(ExpectedConditions.visibilityOf(driver.findElement( + By.xpath("//div[text()='Мужской']/parent::div[@role='option']")))); + highlight(element); + element.click(); + + } + + // somewhat refactored + @Test(enabled = false) + public void test31_2() { + // Arrange + driver.get( + "https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru"); + // Act + + List elements = driver.findElements(By.xpath( + "//div/label[strong/text()='Пол']/div[@id='Gender']/div[@role='listbox']")); + assertThat(elements.get(0), notNullValue()); + WebElement element = elements.get(0); + highlight(element); + sleep(300); + element.click(); + sleep(300); + element = wait.until(ExpectedConditions.visibilityOf(driver + .findElement(By.xpath("//div[@role='option'][div/text()='Мужской']")))); + highlight(element); + element.click(); + } + + // + @Test(enabled = false) + public void test32_1() { + // Arrange + driver.get( + "https://market.yandex.ru/catalog/54913/list?hid=90566&track=fr_ctlg&lr=0&local-offers-first=0&deliveryincluded=0&onstock=1"); + actions.moveToElement( + wait.until(ExpectedConditions.visibilityOf(driver.findElement(By + .xpath("//div[@class='n-filter-panel-aside__content']/div[4]"))))); + + // Act + List elements = driver.findElements(By.xpath( + "//div[@class='n-filter-panel-aside__content']/div[4]//span[@class='checkbox__box']/input[@type='checkbox']")); + assertTrue(elements.size() > 0); + assertThat(elements.get(0), notNullValue()); + for (WebElement element : elements) { + System.err + .println("Selecting the checkbox:\n" + element.getAttribute("id")); + actions.moveToElement(element); + element.sendKeys(Keys.SPACE); + try { + highlight(element, 100); + } catch (Exception e) { + System.err.println("highlight() Exception " + e.getMessage()); + // Exception Expected condition failed: waiting for visibility of + // element + } + try { + highlightNew(element, 100); + } catch (Exception e) { + System.err.println("highlightNew() Exception: " + e.getMessage()); + // Exception unknown command: session/.../element/.../rect + } + try { + element.click(); + } catch (Exception e) { + System.err.println("click() Exception: " + e.getMessage()); + // Element ... is not clickable at point ... Other element would receive + // the click + } + sleep(100); + } + } + + @Test(enabled = false) + public void test32_2() { + // Arrange + driver.get( + "https://market.yandex.ru/catalog/54913/list?hid=90566&track=fr_ctlg&lr=0&local-offers-first=0&deliveryincluded=0&onstock=1"); + actions.moveToElement( + wait.until(ExpectedConditions.visibilityOf(driver.findElement(By + .xpath("//div[@class='n-filter-panel-aside__content']/div[4]"))))); + + // Act + List elements = driver.findElements(By.xpath( + "//div[@class='n-filter-panel-aside__content']/div[4]//span[span/@class='checkbox__box']/label[@class='checkbox__label']")); + System.err.println("Elements size=" + elements.size()); + assertThat(elements.get(0), notNullValue()); + for (WebElement element : elements) { + actions.moveToElement(element); + highlight(element); + System.err.println("Click on label:" + element.getAttribute("for")); + element.click(); + try { + element.sendKeys(Keys.SPACE); + } catch (Exception e) { + // unknown error: cannot focus element + System.err.println("sendKeys() Exception " + e.getMessage()); + } + } + } + + // + @Test(enabled = true) + public void test33_1() { + // Arrange + driver.get("https://datatables.net/examples/api/form.html"); + String table_id = "example"; + + WebElement table_element; + try { + table_element = wait.until( + ExpectedConditions.visibilityOfElementLocated(By.id(table_id))); + } catch (RuntimeException timeoutException) { + return; + } + String text_input_css_selector = "input[id='row-5-age']"; + WebElement text_input_element = table_element + .findElement(By.cssSelector(text_input_css_selector)); + actions.moveToElement(text_input_element).build().perform(); + String cell_text = "Software Developer"; + text_input_element.clear(); + // https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/Keys.html + text_input_element.sendKeys(Keys.chord(Keys.BACK_SPACE, Keys.BACK_SPACE, + Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE)); + sleep(3000); + text_input_element.sendKeys(Keys.chord("20", org.openqa.selenium.Keys.TAB, + cell_text, org.openqa.selenium.Keys.ENTER)); + sleep(3000); + } + + @Test(enabled = true) + public void test33_2() { + + // Go to base url + driver.get("https://datatables.net/examples/api/highlight.html"); + + // Maximize Window + driver.manage().window().maximize(); + + String table_id = "example"; + WebElement table_element; + + try { + wait.until( + ExpectedConditions.visibilityOfElementLocated(By.id(table_id))); + } catch (RuntimeException timeoutException) { + return; + } + // http://stackoverflow.com/questions/6198947/how-to-get-text-from-each-cell-of-an-html-table + String script = "var table_row_locator = 'div#example_wrapper table#example tbody tr';\n" + + "var rows = document.querySelectorAll(table_row_locator);\n" + + "var result = [];\n" + + "for (row_cnt = 0; row_cnt != rows.length; row_cnt++) {\n" + + "var row = rows[row_cnt];\n" + "if (row instanceof Element) {\n" + + "var cols = row.querySelectorAll('td');\n" + + "var check_col_num = 1;\n" + "var data_col_num = 0;\n" + + "if (cols[check_col_num].innerHTML.match(/^Software.*/ig)) {\n" + + "result.push(cols[data_col_num].innerHTML);\n" + "}\n" + "}\n" + "}\n" + + "return result.join();\n"; + + System.out.println( + String.format("Script: '%s'\nResult: '%s'", script, storeEval(script))); + + // NOTE: Works in IDE, does not work with WebDriver + script = String.format("(function() { %s })();", script); + System.out.println( + String.format("Script: '%s'\nResult: '%s'", script, storeEval(script))); + + table_element = driver.findElement(By.id(table_id)); + // NOTE: no leading slash in XPath + List rows = table_element.findElements(By.xpath("tbody/tr")); + System.out.println("NUMBER OF ROWS IN THIS TABLE = " + rows.size()); + int row_num, cell_num, max_rows; + max_rows = 3; + row_num = 1; + String row_role_attribute = "row"; + for (WebElement row : rows) { + if (row_num > max_rows) { + break; + } + assertTrue( + // String.format("Unexpected title '%s'", row.getAttribute("role")), + row.getAttribute("role").matches(row_role_attribute)); + cell_num = 1; + List cells = row.findElements(By.xpath("td")); + String checkColumn = cells.get(cell_num).getText(); + // System.out.println(checkColumn); + if (checkColumn.matches("Software.*")) { + // System.out.println("NUMBER OF COLUMNS=" + cells.size()); + cell_num = 1; + for (WebElement cell : cells) { + // Hover over cell + actions.moveToElement(cell).build().perform(); + highlight(cell); + System.out.println(String.format("row # %d, col # %d text='%s'", + row_num, cell_num, cell.getText())); + cell_num++; + } + row_num++; + } + } + } + + // Utils + + private String storeEval(String script) { + String result = null; + if (driver instanceof JavascriptExecutor) { + System.out.println("running the script"); + result = (String) ((JavascriptExecutor) driver).executeScript(script); + } + return result; + } + + private void highlightNew(WebElement element, long highlight_interval) { + Rectangle elementRect = element.getRect(); + String highlightScript = getScriptContent("highlight.js"); + // append calling + + try { + wait.until(ExpectedConditions.visibilityOf(element)); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format( + "%s\nhighlight_create(arguments[0],arguments[1],arguments[2],arguments[3]);", + highlightScript), + elementRect.y, elementRect.x, elementRect.width, + elementRect.height); + } + Thread.sleep(highlight_interval); + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver).executeScript( + String.format("%s\nhighlight_remove();", highlightScript)); + } + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + + } + + private boolean areElementsPresent(WebElement parentWebElement, + By byLocator) { + return parentWebElement.findElements(byLocator).size() == 1; + // usage: + // assertTrue(areElementsPresent(driver.findElements(By.cssSelector("li[class*= + // product]")).get(0), By.cssSelector("[class*=sticker]"))); + } + + public boolean isGreaterThen(String a, String b) { + return a.compareTo(b) < 0; + // usage: + // List rows = + // table.findElements(By.cssSelector("td:nth-of-type(5)>a")); + // + // for (int i = 0; i prefs = new HashMap<>(); + prefs.put("profile.default_content_settings.popups", 0); + //Put this into prefs map to switch off browser notification + prefs.put("profile.default_content_setting_values.notifications", 2); + //Put this into prefs map to switch off save password notification + prefs.put("credentials_enable_service", false); + prefs.put("profile.password_manager_enabled", false); + String downloadPath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + prefs.put("download.default_directory", downloadPath); + prefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", prefs); + + for (String optionAgrument : (new String[] { + "--allow-running-insecure-content", "--allow-insecure-localhost", + "--enable-local-file-accesses", "--disable-notifications", + "--disable-save-password-bubble", + /* "start-maximized" , */ + "--browser.download.folderList=2", + "--disable-web-security", "--no-proxy-server", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("--browser.download.dir=%s", downloadPath) + /* "--user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + + } else if (browser.equals("firefox")) { + // TODO: Observed user agent problem with firefox - mobile version of tripadvisor is rendered + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + wait = new WebDriverWait(driver, flexible_wait_interval); + wait.pollingEvery(wait_polling_interval, TimeUnit.MILLISECONDS); + driver.get(baseURL); + driver.manage().timeouts().implicitlyWait(implicit_wait_interval, + TimeUnit.SECONDS); + } + + @AfterSuite + public static void tearDown() throws Exception { + driver.close(); + driver.quit(); + if (verificationErrors.length() != 0) { + throw new Exception(verificationErrors.toString()); + } + } + + @BeforeMethod + public void loadBaseURL() { + driver.get(baseURL); + } + + @Test(enabled = true) + public void test1() { + assertEquals("Hotels", findElement("link_text", "Hotels").getText()); + } + + @Test(enabled = true) + public void test2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = xpathOfElement(element); + assertEquals("//div[@id=\"HEAD\"]/div/div[2]/ul/li/span/a", selector); + element = findElement("xpath", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test3_1() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElement(element); + System.err.println("test 2: CssSelector: " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + // without class attributes: + // "div#HEAD > div > div:nth-of-type(2) > ul > li > span > a" + try { + element = findElement("css_selector", selector); + highlight(element); + } catch (NullPointerException e) { + verificationErrors.append("test 2: " + e.toString()); + } + } + + @Test(enabled = true) + public void test3_2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElement(element); + System.err.println("test 2: CssSelector: " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test4_1() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + System.err.println("test 3: Css Selector (alternative) : " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + // without class attributes: + // "div#HEAD > div > div:nth-of-type(2) > ul > li > span > a" + try { + element = findElement("css_selector", selector); + highlight(element); + } catch (NullPointerException e) { + verificationErrors.append("test 3: " + e.toString()); + } + } + + @Test(enabled = true) + public void test4_2() { + WebElement element = findElement("link_text", "Hotels"); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + System.err.println("test 3: Css Selector (alternative) : " + selector); + assertEquals( + "div#HEAD > div.masthead.masthead_war_dropdown_enabled.masthead_notification_enabled > div.tabsBar > ul.tabs > li.tabItem.dropDownJS.jsNavMenu.hvrIE6 > span.tabLink.arwLink > a.arrow_text.pid2972", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + @Test(enabled = true) + public void test5() { + WebElement element = findElement("css_selector", "input#mainSearch"); + assertEquals("input#mainSearch", cssSelectorOfElement(element)); + assertEquals("input#mainSearch", cssSelectorOfElementAlternative(element)); + highlight(element); + } + + @Test(enabled = true) + public void test6() { + WebElement element = findElement("css_selector", "span#rdoFlights") + .findElement(By.cssSelector("div span.label")); + assertEquals("span#rdoFlights > div.header > span.label", + cssSelectorOfElement(element)); + highlight(element); + } + + @Test(enabled = true) + public void test7() { + WebElement element = findElement("id", "searchbox"); + assertEquals("input#searchbox", cssSelectorOfElement(element)); + highlight(element); + } + + @Test(enabled = true) + public void test8() { + WebElement element = findElement("id", "searchbox") + .findElement(By.xpath("..")); + highlight(element); + String selector = cssSelectorOfElementAlternative(element); + // System.err.println("test 7: selector (alternative):\n" + selector); + assertEquals( + "form#PTPT_HAC_FORM > div.metaFormWrapper > div.metaFormLine.flex > label.ptptLabelWrap", + selector); + element = findElement("css_selector", selector); + assertThat(element, notNullValue()); + highlight(element); + } + + // @Ignore + @SuppressWarnings("static-access") + @Test(enabled = true) + public void test9() { + + WebElement element = findElement("link_text", "Hotels"); + assertThat(element, notNullValue()); + highlight(element); + String style = styleOfElement(element); + System.err.println("style:\n" + style); + String colorAttribute = styleOfElement(element, "color"); + String heightAttribute = styleOfElement(element, "height"); + String widthAttribute = styleOfElement(element, "width"); + + // assertions of certain CSS attributes + try { + assertTrue(colorAttribute.equals("rgb(255, 255, 255)")); + } catch (AssertionError e) { + // slurp + } + // pattern = Pattern.compile("\\((\\d+),"); + matcher = Pattern.compile("\\((\\d+),").matcher(colorAttribute); + if (matcher.find()) { + int red = Integer.parseInt(matcher.group(1).toString()); + assertTrue(red > 254); + } + System.err.println("color:" + colorAttribute); + + try { + assertTrue(widthAttribute.equals("36.6667px")); // fragile ! + } catch (AssertionError e) { + // slurp + } + pattern = Pattern.compile("([\\d\\.]+)px"); + matcher = pattern.matcher(widthAttribute); + if (matcher.find()) { + Float mask = new Float("20.75f"); + Float width = mask.parseFloat(matcher.group(1).toString()); + assertTrue(width > 36.5); + } + System.err.println("width:" + widthAttribute); + + System.err.println("examine height attribute: " + heightAttribute); + // broken after 431eac6a3baa + // assertTrue(height.equals("12px")); + // print css values + // System.err.println("height:" + heightAttribute); + } + + // Utils + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + private String cssSelectorOfElement(WebElement element) { + return (String) executeScript(getScriptContent("cssSelectorOfElement.js"), + element); + } + + private String styleOfElement(WebElement element, Object... arguments) { + return (String) executeScript(getScriptContent("getStyle.js"), element, + arguments); + } + + private String cssSelectorOfElementAlternative(WebElement element) { + return (String) executeScript( + getScriptContent("cssSelectorOfElementAlternative.js"), element); + } + + private void highlight(WebElement element) { + highlight(element, highlight_interval); + } + + private static void highlight(WebElement element, long highlight) { + try { + wait.until(ExpectedConditions.visibilityOf(element)); + executeScript("arguments[0].style.border='3px solid yellow'", + new Object[] { element }); + Thread.sleep(highlight); + executeScript("arguments[0].style.border=''", new Object[] { element }); + + } catch (InterruptedException e) { + // System.err.println("Ignored: " + e.toString()); + } + } + + private String xpathOfElement(WebElement element) { + return (String) executeScript(getScriptContent("xpathOfElement.js"), + new Object[] { element }); + } + + public static Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); // a.k.a. (JavascriptExecutor) driver; + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + private List findElements(String selectorKind, + String selectorValue, WebElement parent) { + SearchContext finder; + String parent_css_selector = null; + String parent_xpath = null; + + List elements = null; + Hashtable selectorStrategies = new Hashtable(); + selectorStrategies.put("css_selector", true); + selectorStrategies.put("xpath", true); + + if (selectorKind == null || !selectorStrategies.containsKey(selectorKind) + || !selectorStrategies.get(selectorKind)) { + return null; + } + if (parent != null) { + parent_css_selector = cssSelectorOfElement(parent); + parent_xpath = xpathOfElement(parent); + finder = parent; + } else { + finder = driver; + } + + if (selectorKind == "css_selector") { + String extended_css_selector = String.format("%s %s", + parent_css_selector, selectorValue); + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.cssSelector(extended_css_selector))); + } catch (RuntimeException timeoutException) { + return null; + } + elements = finder.findElements(By.cssSelector(selectorValue)); + } + if (selectorKind == "xpath") { + String extended_xpath = String.format("%s/%s", parent_xpath, + selectorValue); + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.xpath(extended_xpath))); + } catch (RuntimeException timeoutException) { + return null; + } + elements = finder.findElements(By.xpath(selectorValue)); + } + return elements; + } + + private List findElements(String selectorKind, + String selectorValue) { + return findElements(selectorKind, selectorValue, null); + } + + private WebElement findElement(String selectorKind, String selectorValue) { + WebElement element = null; + Hashtable selectorStrategies = new Hashtable(); + selectorStrategies.put("id", true); + selectorStrategies.put("css_selector", true); + selectorStrategies.put("xpath", true); + selectorStrategies.put("partial_link_text", false); + selectorStrategies.put("link_text", true); + selectorStrategies.put("classname", false); + + if (selectorKind == null || !selectorStrategies.containsKey(selectorKind) + || !selectorStrategies.get(selectorKind)) { + return null; + } + if (selectorKind == "id") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.id(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.id(selectorValue)); + } + if (selectorKind == "classname") { + + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.className(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.className(selectorValue)); + } + if (selectorKind == "link_text") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.linkText(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.linkText(selectorValue)); + } + if (selectorKind == "css_selector") { + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.cssSelector(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.cssSelector(selectorValue)); + } + if (selectorKind == "xpath") { + + try { + wait.until(ExpectedConditions + .visibilityOfElementLocated(By.xpath(selectorValue))); + } catch (RuntimeException timeoutException) { + return null; + } + element = driver.findElement(By.xpath(selectorValue)); + } + return element; + } + + protected static String getScriptContent(String scriptName) { + try { + final InputStream stream = TripAdvisorTest.class.getClassLoader() + .getResourceAsStream(scriptName); + final byte[] bytes = new byte[stream.available()]; + stream.read(bytes); + return new String(bytes, "UTF-8"); + } catch (IOException e) { + throw new RuntimeException("Cannot load file: " + scriptName); + } + } + + public static void waitForElementVisible(By locator) { + log.info("Waiting for element visible for locator: {}", locator); + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + } + + public static void waitForElementVisible(By locator, long timeout) { + log.info("Waiting for element visible for locator: {}", locator); + WebDriverWait wait = new WebDriverWait(driver, timeout); + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + } + + public static void waitForElementPresent(By locator) { + log.info("Waiting for element present for locator: {}", locator); + wait.until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + public static void waitForElementPresent(By locator, long timeout) { + log.info("Waiting for element present for locator: {}", locator); + WebDriverWait wait = new WebDriverWait(driver, timeout); + wait.until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + public static void waitForPageLoad() { + log.info("Wait for page load via JS..."); + String state = ""; + int counter = 0; + + do { + try { + state = (String) ((JavascriptExecutor) driver) + .executeScript("return document.readyState"); + Thread.sleep(1000); + } catch (Exception e) { + e.printStackTrace(); + } + counter++; + log.info(("Browser state is: " + state)); + } while (!state.equalsIgnoreCase("complete") && counter < 20); + + } + + public static boolean isAttributePresent(By locator, String attribute) { + log.info("Is Attribute Present for locator: {}, attribute: {}", locator, + attribute); + return driver.findElement(locator).getAttribute(attribute) != null; + } + + public static void selectDropdownByIndex(By locator, int index) { + log.info("Select Dropdown for locator: {} and index: {}", locator, index); + try { + Select select = new Select(driver.findElement(locator)); + select.selectByIndex(index); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static String getBaseURL() { + // TODO: somehow browser is set to mobile + // if the next line is commented + System.err.println("Get base URL: " + driver.getCurrentUrl()); + log.info("Get base URL: {}", driver.getCurrentUrl()); + String currentURL = driver.getCurrentUrl(); + String protocol = null; + String domain = null; + + try { + URL url = new URL(currentURL); + protocol = url.getProtocol(); + domain = url.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // System.err.println("Returning: " + protocol + "://" + domain); + return protocol + "://" + domain; + } + + public static void clickJS(By locator) { + log.info("Clicking on locator via JS: {}", locator); + wait.until( + ExpectedConditions.elementToBeClickable(driver.findElement(locator))); + ((JavascriptExecutor) driver).executeScript("arguments[0].click();", + driver.findElement(locator)); + } + + public static void scrollIntoView(By locator) { + log.info("Scrolling into view: {}", locator); + ((JavascriptExecutor) driver).executeScript( + "arguments[0].scrollIntoView(true);", driver.findElement(locator)); + } + + public static void mouseOver(By locator) { + log.info("Mouse over: {}", locator); + actions.moveToElement(driver.findElement(locator)).build().perform(); + } + + public static void click(By locator) { + log.info("Clicking: {}", locator); + driver.findElement(locator).click(); + } + + public static void clear(By locator) { + log.info("Clearing input: {}", locator); + driver.findElement(locator).clear(); + } + + public static void sendKeys(By locator, String text) { + log.info("Typing \"{}\" into locator: {}", text, locator); + driver.findElement(locator).sendKeys(text); + } + + public static String getText(By locator) { + String text = driver.findElement(locator).getText(); + log.info("The string at {} is: {}", locator, text); + return text; + } + + public static String getAttributeValue(By locator, String attribute) { + String value = driver.findElement(locator).getAttribute(attribute); + log.info("The attribute \"{}\" value of {} is: {}", attribute, locator, + value); + return value; + } + + public static boolean isElementVisible(By locator) { + try { + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + log.info("Element {} is visible", locator); + return true; + } catch (Exception e) { + log.info("Element {} is not visible", locator); + return false; + } + } + + // custom wait while Login Lightbox is visible + + public static void waitWhileElementIsVisible(By locator) { + final By locatorFinal = locator; + wait.until(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver o) { + return (o.findElements(locatorFinal).size() == 0); + } + }); + } + + public static boolean isElementNotVisible(By locator) { + try { + wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + log.info("Element {} is visible", locator); + return false; + } catch (Exception e) { + log.info("Element {} is not visible", locator); + return true; + } + } + + public static String getBodyText() { + log.info("Getting boby text"); + return driver.findElement(By.tagName("body")).getText(); + } + + public static void highlight(By locator) throws InterruptedException { + log.info("Highlighting element {}", locator); + WebElement element = driver.findElement(locator); + executeScript("arguments[0].style.border='3px solid yellow'", element); + Thread.sleep(highlight_interval); + executeScript("arguments[0].style.border=''", element); + } +} diff --git a/ui4j_test/src/test/java/com/mycompany/app/XMLHttpRequestAsyncTest.java b/ui4j_test/src/test/java/com/mycompany/app/XMLHttpRequestAsyncTest.java new file mode 100644 index 000000000..9d312f3ce --- /dev/null +++ b/ui4j_test/src/test/java/com/mycompany/app/XMLHttpRequestAsyncTest.java @@ -0,0 +1,658 @@ +package com.mycompany.app; + +import static org.hamcrest.MatcherAssert.assertThat; +// import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.startsWith; + +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.UnhandledAlertException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +// origin: https://github.com/TsvetomirSlavov/JavaScriptSwTestAcademy/blob/master/ExecuteAsyncXMLHttpRequestTest.java + +//Ref1: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html +//Ref2: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php + +public class XMLHttpRequestAsyncTest { + + private static WebDriver driver; + private WebDriverWait wait; + private static Actions actions; + private static JavascriptExecutor js; + private int flexibleWait = 5; + private long pollingInterval = 500; + private static final StringBuffer verificationErrors = new StringBuffer(); + private static final String browser = "chrome"; + private static String osName; + private static String baseURL = "http://phppot.com/demo/jquery-dependent-dropdown-list-countries-and-states/"; + + @Test(enabled = true) + public void sendArgTest() { + // Arrange + String response = null; + + int country_index= 3; + WebElement countryListElement = driver + .findElement(By.xpath("//select[@id='country-list']")); + try { + Select select = new Select(countryListElement); + select.selectByIndex(country_index); + } catch (Exception e) { + e.printStackTrace(); + } + + countryListElement.click(); + sleep(100); + + // Injecting a XMLHttpRequest and waiting for the result + // https://stackoverflow.com/questions/13452822/webdriver-executeasyncscript-vs-executescript + // https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html#executeAsyncScript-java.lang.String-java.lang.Object...- + + String inlineScript = "var callback = arguments[arguments.length - 1];\n" + + "var option_index = (arguments.length > 1 )? arguments[arguments.length - 2]:1;\n" + + "var http = new XMLHttpRequest();\n" + + "var url = 'get_state.php';\n" + + "var params = 'country_id=' + option_index;\n" + + "http.open('POST', url, true);\n" + + "http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n" + + "http.setRequestHeader('Content-length', params.length);\n" + + "http.setRequestHeader('Connection', 'close');\n" + + "http.onreadystatechange = function() {\n" + + " if (http.readyState == 4) {\n" + + " callback(http.responseText);\n" + + " };\n" + + "};\n" + + "http.send(params);"; + try { + response = (String ) js.executeAsyncScript( inlineScript , country_index); + } catch (UnhandledAlertException e) { + System.err.println("Error executing XMLHttpRequest"); + } + System.out.println("sendXMLHTTPRequestArgTest response: "+ response); + + // Assert that returned cities are related with chosen country + + // Assert + assertThat(response, + org.hamcrest.CoreMatchers.containsString("")); + try { + + // https://stackoverflow.com/questions/8923398/regex-doesnt-work-in-string-matches + assertTrue( + response.replace("\n", "").matches(".*.*")); + + } catch (AssertionError e) { + System.err.println("Exception (ignored) " + e.toString()); + } + + String stateName = "Picardie"; + Pattern pattern = Pattern.compile(String + .format(".*.*", stateName), + Pattern.CASE_INSENSITIVE); + // ".*.*", + Matcher matcher = pattern.matcher(response); + int stateIndex = 0; + assertTrue(matcher.find()); + stateIndex = Integer.parseInt(matcher.group(1).toString()); + // stateName = matcher.group(2).toString(); + assertTrue(stateIndex > 0); + assertThat(stateName, notNullValue()); + System.err.println("Selected state index: " + stateIndex); + WebElement stateListElement = driver + .findElement(By.xpath("//select[@id='state-list']")); + try { + Select select = new Select(stateListElement); + select.selectByVisibleText(stateName); + } catch (Exception e) { + e.printStackTrace(); + } + stateListElement.click(); + sleep(100); + } + + @Test(enabled = false) + // asynchronous script timeout: result was not received in 30 seconds(..) + public void sendJSONArgBasicTest() { + String response = null; + int country_index = 3; + WebElement countryListElement = driver + .findElement(By.xpath("//select[@id='country-list']")); + try { + Select select = new Select(countryListElement); + select.selectByIndex(country_index); + } catch (Exception e) { + e.printStackTrace(); + } + + countryListElement.click(); + sleep(100); + + String inlineScript = "var callback = function(data){/* console.log(data); */ return data;}\n" + + "var option_data = '{\"option_name\": \"country_id\", \"option_index\": 3}';\n" + + "var obj = JSON.parse(option_data);\n" + + "var http = new XMLHttpRequest();\n" + + "var url = 'get_state.php';\n" + + "var params = obj.option_name + ' = ' + obj.option_index;\n" + + "http.open('POST', url, true);\n" + + "http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n" + + "http.setRequestHeader('Content-length', params.length);\n" + + "http.setRequestHeader('Connection', 'close');\n" + + "http.onreadystatechange = function() {\n" + + " if (http.readyState == 4) {\n" + + " callback(http.responseText);\n" + + " };\n" + + "};\n" + + "http.send(params);\n"; + + try { + String jsonArgs = String.format( + "{\"option_name\": \"%s\", \"option_index\": %d}", "country_id", + country_index); + System.out.println("sendJSONArgTest script: " + inlineScript); + System.out.println("sendJSONArgTest args: " + jsonArgs); + // error is likely here + response = (String) js.executeAsyncScript(inlineScript, jsonArgs); + } catch (UnhandledAlertException e) { + System.err.println("Error executing XMLHttpRequest"); + } + System.out.println("sendJSONArgTest response: " + response); + + + // Assert + assertThat(response, org.hamcrest.CoreMatchers + .containsString("")); + try { + + // https://stackoverflow.com/questions/8923398/regex-doesnt-work-in-string-matches + assertTrue(response.replace("\n", "") + .matches(".*.*")); + + } catch (AssertionError e) { + System.err.println("Exception (ignored) " + e.toString()); + } + + String stateName = "Picardie"; + Pattern pattern = Pattern.compile( + String.format(".*.*", stateName), + Pattern.CASE_INSENSITIVE); + // ".*.*", + Matcher matcher = pattern.matcher(response); + int stateIndex = 0; + assertTrue(matcher.find()); + stateIndex = Integer.parseInt(matcher.group(1).toString()); + // stateName = matcher.group(2).toString(); + assertTrue(stateIndex > 0); + assertThat(stateName, notNullValue()); + System.err.println("Selected state index: " + stateIndex); + WebElement stateListElement = driver + .findElement(By.xpath("//select[@id='state-list']")); + try { + Select select = new Select(stateListElement); + select.selectByVisibleText(stateName); + } catch (Exception e) { + e.printStackTrace(); + } + stateListElement.click(); + sleep(100); + } + + @Test(enabled = false) + public void sendJSONArgDebugTest() { + String response = null; + int country_index = 3; + WebElement countryListElement = driver + .findElement(By.xpath("//select[@id='country-list']")); + try { + Select select = new Select(countryListElement); + select.selectByIndex(country_index); + } catch (Exception e) { + e.printStackTrace(); + } + + countryListElement.click(); + sleep(100); + + + // https://stackoverflow.com/questions/15466802/how-can-i-auto-hide-alert-box-after-it-showing-it + + String inlineScript = "var callback = arguments[arguments.length - 1];\n" + + "var option_data = (arguments.length > 1 )? arguments[arguments.length - 2]:'{\"option_name\": \"country_id\", \"option_index\": 3}';\n" + + "var obj = JSON.parse(option_data);\n" + + "var http = new XMLHttpRequest();\n" + + "var url = 'get_state.php';\n" + + "var params = obj.option_name + '=' + obj.option_index;\n" + + "http.open('POST', url, true);\n" + + "http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n" + + "http.setRequestHeader('Content-length', params.length);\n" + + "http.setRequestHeader('Connection', 'close');\n" + + "http.onreadystatechange = function() {\n" + + " if (http.readyState == 4) {\n" + + " alert(http.responseText); callback(http.responseText);\n" + + " };\n" + + "};\n" + + "http.send(params);"; + + try { + String jsonArgs = String.format( + "{\"option_name\": \"%s\", \"option_index\": %d}", "country_id", + country_index); + System.out.println("sendJSONArgTest script: " + inlineScript); + System.out.println("sendJSONArgTest args: " + jsonArgs); + // error is likely here + response = (String) js.executeAsyncScript(inlineScript, jsonArgs); + } catch (UnhandledAlertException e) { + System.err.println("Error executing XMLHttpRequest"); + } + System.out.println("sendJSONArgTest response: " + response); + + + // Assert + assertThat(response, org.hamcrest.CoreMatchers + .containsString("")); + try { + + // https://stackoverflow.com/questions/8923398/regex-doesnt-work-in-string-matches + assertTrue(response.replace("\n", "") + .matches(".*.*")); + + } catch (AssertionError e) { + System.err.println("Exception (ignored) " + e.toString()); + } + + String stateName = "Picardie"; + Pattern pattern = Pattern.compile( + String.format(".*.*", stateName), + Pattern.CASE_INSENSITIVE); + // ".*.*", + Matcher matcher = pattern.matcher(response); + int stateIndex = 0; + assertTrue(matcher.find()); + stateIndex = Integer.parseInt(matcher.group(1).toString()); + // stateName = matcher.group(2).toString(); + assertTrue(stateIndex > 0); + assertThat(stateName, notNullValue()); + System.err.println("Selected state index: " + stateIndex); + WebElement stateListElement = driver + .findElement(By.xpath("//select[@id='state-list']")); + try { + Select select = new Select(stateListElement); + select.selectByVisibleText(stateName); + } catch (Exception e) { + e.printStackTrace(); + } + stateListElement.click(); + sleep(100); + } + + @Test(enabled = false ) + public void sendJSONArgTrackingTest() { + String response = null; + + int country_index = 3; + WebElement countryListElement = driver + .findElement(By.xpath("//select[@id='country-list']")); + try { + Select select = new Select(countryListElement); + select.selectByIndex(country_index); + } catch (Exception e) { + e.printStackTrace(); + } + + countryListElement.click(); + sleep(100); + + // Injecting a XMLHttpRequest, passing JSON object with the data and waiting for the result + String inlineScript = "var callback = arguments[arguments.length - 1];\n" + + "var option_data = (arguments.length > 1 )? arguments[arguments.length - 2]:'{\"option_name\": \"country_id\", \"option_index\": 3}';\n" + + "var obj = JSON.parse(option_data);\n" + + "var http = new XMLHttpRequest();\n" + + "var url = 'get_state.php';\n" + + "var params = obj.option_name + ' = ' + obj.option_index;\n" + + "var tempAlert = function (msg,duration) {\n" + + "var el = document.createElement('div');\n" + + "el.setAttribute('style','position:absolute;top:40%;left:20%;background-color:white;');\n" + + "el.innerHTML = msg;\n" + + "setTimeout(function(){\n" + + "el.parentNode.removeChild(el);\n" + + "},duration);\n" + + "document.body.appendChild(el);\n" + + "};\n" + + "http.open('POST', url, true);\n" + + "http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n" + + "http.setRequestHeader('Content-length', params.length);\n" + + "http.setRequestHeader('Connection', 'close');\n" + + "http.onreadystatechange = function() {\n" + + " if (http.readyState == 4) {\n" + + " /* tempAlert('close',100); */ \n" + + " callback(http.responseText);\n" + + " };\n" + + "};\n" + + "http.send(params);"; + try { + String jsonArgs = String.format( + "{\"option_name\": \"%s\", \"option_index\": %d}", "country_id", + country_index); + System.out.println("sendJSONArgTest script: " + inlineScript); + System.out.println("sendJSONArgTest args: " + jsonArgs); + // error is likely here + response = (String) js.executeAsyncScript(inlineScript, jsonArgs); + } catch (UnhandledAlertException e) { + System.err.println("Error executing XMLHttpRequest"); + } + System.out.println("sendJSONArgTest response: " + response); + + // Assert + assertThat(response, org.hamcrest.CoreMatchers + .containsString("")); + try { + // https://stackoverflow.com/questions/8923398/regex-doesnt-work-in-string-matches + assertTrue(response.replace("\n", "") + .matches(".*.*")); + + } catch (AssertionError e) { + System.err.println("Exception (ignored) " + e.toString()); + } + + String stateName = "Picardie"; + Pattern pattern = Pattern.compile( + String.format(".*.*", stateName), + Pattern.CASE_INSENSITIVE); + // ".*.*", + Matcher matcher = pattern.matcher(response); + int stateIndex = 0; + assertTrue(matcher.find()); + stateIndex = Integer.parseInt(matcher.group(1).toString()); + // stateName = matcher.group(2).toString(); + assertTrue(stateIndex > 0); + assertThat(stateName, notNullValue()); + System.err.println("Selected state index: " + stateIndex); + WebElement stateListElement = driver + .findElement(By.xpath("//select[@id='state-list']")); + try { + Select select = new Select(stateListElement); + select.selectByVisibleText(stateName); + } catch (Exception e) { + e.printStackTrace(); + } + stateListElement.click(); + sleep(100); + } + + + @Test(enabled = false ) + public void sendJSONArgTest() { + String response = null; + + int country_index = 3; + WebElement countryListElement = driver + .findElement(By.xpath("//select[@id='country-list']")); + try { + Select select = new Select(countryListElement); + select.selectByIndex(country_index); + } catch (Exception e) { + e.printStackTrace(); + } + + countryListElement.click(); + sleep(1000); + + // Injecting a XMLHttpRequest, passing JSON object with the data and waiting for the result + String inlineScript = "var callback = arguments[arguments.length - 1];\n" + + "var option_data = (arguments.length > 1 )? arguments[arguments.length - 2]:'{\"option_name\": \"country_id\", \"option_index\": 3}';\n" + + "var obj = JSON.parse(option_data);\n" + + "var http = new XMLHttpRequest();\n" + + "var url = 'get_state.php';\n" + + "var params = obj.option_name + ' = ' + obj.option_index;\n" + + "http.open('POST', url, true);\n" + + "http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n" + + "http.setRequestHeader('Content-length', params.length);\n" + + "http.setRequestHeader('Connection', 'close');\n" + + "http.onreadystatechange = function() {\n" + + " if (http.readyState == 4) {\n" + + " callback(http.responseText);\n" + + " };\n" + + "};\n" + + "http.send(params);"; + /* + System.out.println("sendJSONArgTest script: " + inlineScript); + System.out.println("sendJSONArgTest args: " + + String.format("{\"option_name\": \"%s\", \"option_index\": %d}", + "country_id", country_index)); + response = (String) js.executeAsyncScript(inlineScript, + String.format("{\"option_name\": \"%s\", \"option_index\": %d}", + "country_id", country_index)); + */ + + try { + String jsonArgs = String.format( + "{\"option_name\": \"%s\", \"option_index\": %d}", "country_id", + country_index); + System.out.println("sendJSONArgTest script: " + inlineScript); + System.out.println("sendJSONArgTest args: " + jsonArgs); + // error is likely here + response = (String) js.executeAsyncScript(inlineScript, jsonArgs); + } catch (UnhandledAlertException e) { + System.err.println("Error executing XMLHttpRequest"); + } + System.out.println("sendJSONArgTest response: " + response); + sleep(10000 ); + + // Assert + assertThat(response, org.hamcrest.CoreMatchers + .containsString("")); + try { + // https://stackoverflow.com/questions/8923398/regex-doesnt-work-in-string-matches + assertTrue(response.replace("\n", "") + .matches(".*.*")); + + } catch (AssertionError e) { + System.err.println("Exception (ignored) " + e.toString()); + } + + String stateName = "Picardie"; + Pattern pattern = Pattern.compile( + String.format(".*.*", stateName), + Pattern.CASE_INSENSITIVE); + // ".*.*", + Matcher matcher = pattern.matcher(response); + int stateIndex = 0; + assertTrue(matcher.find()); + stateIndex = Integer.parseInt(matcher.group(1).toString()); + // stateName = matcher.group(2).toString(); + assertTrue(stateIndex > 0); + assertThat(stateName, notNullValue()); + System.err.println("Selected state index: " + stateIndex); + WebElement stateListElement = driver + .findElement(By.xpath("//select[@id='state-list']")); + try { + Select select = new Select(stateListElement); + select.selectByVisibleText(stateName); + } catch (Exception e) { + e.printStackTrace(); + } + stateListElement.click(); + sleep(1000); + } + + + // common code + @BeforeSuite + @SuppressWarnings("deprecation") + public void beforeSuite() throws Exception { + getOsName(); + if (browser.equals("chrome")) { + System.setProperty("webdriver.chrome.driver", + (new File("c:/java/selenium/chromedriver.exe")).getAbsolutePath()); + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); + ChromeOptions options = new ChromeOptions(); + + Map chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + String downloadFilepath = System.getProperty("user.dir") + + System.getProperty("file.separator") + "target" + + System.getProperty("file.separator"); + chromePrefs.put("download.default_directory", downloadFilepath); + chromePrefs.put("enableNetwork", "true"); + options.setExperimentalOption("prefs", chromePrefs); + + for (String optionAgrument : (new String[] { + "allow-running-insecure-content", "allow-insecure-localhost", + "enable-local-file-accesses", "disable-notifications", + /* "start-maximized" , */ + "browser.download.folderList=2", + "--browser.helperApps.neverAsk.saveToDisk=image/jpg,text/csv,text/xml,application/xml,application/vnd.ms-excel,application/x-excel,application/x-msexcel,application/excel,application/pdf", + String.format("browser.download.dir=%s", downloadFilepath) + /* "user-data-dir=/path/to/your/custom/profile" , */ + })) { + options.addArguments(optionAgrument); + } + + // options for headless + /* + for (String optionAgrument : (new String[] { "headless", + "window-size=1200x600", })) { + options.addArguments(optionAgrument); + } + */ + capabilities + .setBrowserName(DesiredCapabilities.chrome().getBrowserName()); + + capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + driver = new ChromeDriver(capabilities); + } else if (browser.equals("firefox")) { + System.setProperty("webdriver.gecko.driver", + osName.toLowerCase().startsWith("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : "/tmp/geckodriver"); + System + .setProperty("webdriver.firefox.bin", + osName.toLowerCase().startsWith("windows") ? new File( + "c:/Program Files (x86)/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // use legacy FirefoxDriver + capabilities.setCapability("marionette", false); + // http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.firefox.FirefoxProfile + capabilities.setCapability("locationContextEnabled", false); + capabilities.setCapability("acceptSslCerts", true); + capabilities.setCapability("elementScrollBehavior", 1); + FirefoxProfile profile = new FirefoxProfile(); + profile.setAcceptUntrustedCertificates(true); + profile.setAssumeUntrustedCertificateIssuer(true); + profile.setEnableNativeEvents(false); + + System.out.println(System.getProperty("user.dir")); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException("Cannot initialize Firefox driver"); + } + } + actions = new Actions(driver); + /* + System.setProperty("webdriver.chrome.driver", + "c:/java/selenium/chromedriver.exe"); + driver = new ChromeDriver(); + */ + driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + wait.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS); + actions = new Actions(driver); + // Declare JavascriptExecutor + js = (JavascriptExecutor) driver; + } + + @AfterSuite + public void afterSuite() throws Exception { + driver.quit(); + } + + @BeforeMethod + public void BeforeMethod() { + driver.get(baseURL); + } + + @AfterMethod + public void AfterMethod(ITestResult result) { + if (verificationErrors.length() != 0) { + throw new RuntimeException(String.format("Error in the method %s : %s", + result.getMethod().getMethodName(), verificationErrors.toString())); + } + driver.get("about:blank"); + } + + // utilities + public static String getOsName() { + if (osName == null) { + osName = System.getProperty("os.name"); + } + return osName; + } + + public void sleep(Integer seconds) { + long secondsLong = (long) seconds; + try { + Thread.sleep(secondsLong); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public static void selectDropdownByIndex(By locator, int index) { + try { + Select select = new Select(driver.findElement(locator)); + select.selectByIndex(index); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void selectDropdownByVisibleText(By locator, String text) { + try { + Select select = new Select(driver.findElement(locator)); + select.selectByVisibleText(text); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/ui4j_test/src/test/resources/cssSelectorOfElement.js b/ui4j_test/src/test/resources/cssSelectorOfElement.js new file mode 100644 index 000000000..4dc5ef0e9 --- /dev/null +++ b/ui4j_test/src/test/resources/cssSelectorOfElement.js @@ -0,0 +1,32 @@ +cssSelectorOfElement = function(element) { + if (!(element instanceof Element)) + return; + var path = []; + while (element.nodeType === Node.ELEMENT_NODE) { + var selector = element.nodeName.toLowerCase(); + if (element.id) { + if (element.id.indexOf('-') > -1) { + selector += '[id="' + element.id + '"]'; + } else { + selector += '#' + element.id; + } + path.unshift(selector); + break; + } else if (element.className) { + selector += '.' + element.className.replace(/^\s+/,'').replace(/\s+$/,'').replace(/\s+/g, '.'); + } else { + var element_sibling = element; + var sibling_cnt = 1; + while (element_sibling = element_sibling.previousElementSibling) { + if (element_sibling.nodeName.toLowerCase() == selector) + sibling_cnt++; + } + if (sibling_cnt != 1) + selector += ':nth-of-type(' + sibling_cnt + ')'; + } + path.unshift(selector); + element = element.parentNode; + } + return path.join(' > '); +} +return cssSelectorOfElement(arguments[0]); \ No newline at end of file diff --git a/ui4j_test/src/test/resources/cssSelectorOfElementAlternative.js b/ui4j_test/src/test/resources/cssSelectorOfElementAlternative.js new file mode 100644 index 000000000..2bccd5687 --- /dev/null +++ b/ui4j_test/src/test/resources/cssSelectorOfElementAlternative.js @@ -0,0 +1,32 @@ +cssSelectorOfElement = function(element) { + + if (element == document) + return ('body'); + else if (element.id) + return (element.tagName.toLowerCase() + '#' + element.id); + + var selector = element.tagName.toLowerCase(); + var angular_attribute = ['ng-model', 'ng-href', 'name', 'aria-label'].reduce(function(a, b) { + return a || (element.getAttribute(b) ? b : null); + }, null); + if (angular_attribute != null) { + selector += '[' + angular_attribute + '="' + + element.getAttribute(angular_attribute).replace(/\\/g, '\\\\').replace(/\'/g, '\\\'').replace(/\"/g, '\\"').replace(/\0/g, '\\0') + '"]'; + } else if (element.className) { + selector += '.' + element.className.replace(/^\s+/, '').replace(/\s+$/, '').replace(/\s+/g, '.'); + } + // NOTE: using element.parentNode.querySelectorAll() to count siblings and using the ':nth-of-type(' selector suffix + // is somewhat coarse for attribute-less nodes + var nodes = element.parentNode.querySelectorAll(selector); + if (nodes && nodes.length > 1) + var elementIndex = Array.prototype.slice.call(nodes).indexOf(element); + if (elementIndex > 0) { + selector += ':nth-of-type(' + (elementIndex + 1).toString() + ')'; + } + selector = selector.replace(/\s/g, ' '); + if (element.parentNode) + selector = cssSelectorOfElement(element.parentNode) + ' > ' + selector; + return selector; +}; + +return cssSelectorOfElement(arguments[0]); \ No newline at end of file diff --git a/ui4j_test/src/test/resources/dnd.js b/ui4j_test/src/test/resources/dnd.js new file mode 100644 index 000000000..80c17cf66 --- /dev/null +++ b/ui4j_test/src/test/resources/dnd.js @@ -0,0 +1,54 @@ +(function($) { + // origin: https://github.com/tourdedave/elemental-selenium-tips + // http://stackoverflow.com/questions/19384710/javascript-workaround-for-drag-and-drop-in-selenium-webdriver/26372276#26372276 + $.fn.simulateDragDrop = function(options) { + return this.each(function() { + new $.simulateDragDrop(this, options); + }); + }; + $.simulateDragDrop = function(elem, options) { + this.options = options; + this.simulateEvent(elem, options); + }; + $.extend($.simulateDragDrop.prototype, { + simulateEvent: function(elem, options) { + /*Simulating drag start*/ + var type = 'dragstart'; + var event = this.createEvent(type); + this.dispatchEvent(elem, type, event); + + /*Simulating drop*/ + type = 'drop'; + var dropEvent = this.createEvent(type, {}); + dropEvent.dataTransfer = event.dataTransfer; + this.dispatchEvent($(options.dropTarget)[0], type, dropEvent); + + /*Simulating drag end*/ + type = 'dragend'; + var dragEndEvent = this.createEvent(type, {}); + dragEndEvent.dataTransfer = event.dataTransfer; + this.dispatchEvent(elem, type, dragEndEvent); + }, + createEvent: function(type) { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(type, true, true, null); + event.dataTransfer = { + data: {}, + setData: function(type, val) { + this.data[type] = val; + }, + getData: function(type) { + return this.data[type]; + } + }; + return event; + }, + dispatchEvent: function(elem, type, event) { + if (elem.dispatchEvent) { + elem.dispatchEvent(event); + } else if (elem.fireEvent) { + elem.fireEvent("on" + type, event); + } + } + }); +})(jQuery); diff --git a/ui4j_test/src/test/resources/getStyle.js b/ui4j_test/src/test/resources/getStyle.js new file mode 100644 index 000000000..3b27a3ad8 --- /dev/null +++ b/ui4j_test/src/test/resources/getStyle.js @@ -0,0 +1,36 @@ +/** + * Returns computed style of the element or some of its properties + * + * arguments[0] {Element} The event target. + * arguments[1] {String} The name of the property (e.g. 'width'). + */ + +// http://www.htmlgoodies.com/html5/css/referencing-css3-properties-using-javascript.html#fbid=88eQV8NzD6Q +// https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle +getStyle = function(element, property) { + var result = ''; + if (window.getComputedStyle) { + var styleObj = window.getComputedStyle(element, null); + // var styleObj = document.defaultView.getComputedStyle(element, null); + if (undefined != property ) { + result = styleObj.getPropertyValue(property); + } else { + var len = styleObj.length; + for (var i = 0; i < len; i++) { + var style = styleObj[i]; + result += ' ' + style + ':' + styleObj.getPropertyValue(style) + '\n'; + } + } + } + // IE lacks getComputedStyle but has currentStyle + else if (element.currentStyle) { + try { + result = element.currentStyle[property]; + } catch (e) {} + } + return result; +} + +var element = arguments[0]; +var property = arguments[1]; +return getStyle(element, property); \ No newline at end of file diff --git a/ui4j_test/src/test/resources/getText.js b/ui4j_test/src/test/resources/getText.js new file mode 100644 index 000000000..11e3cdb0e --- /dev/null +++ b/ui4j_test/src/test/resources/getText.js @@ -0,0 +1,31 @@ +/** + * Computes text value of the element + * + * arguments[0] {Element} The event target. + * arguments[1] {Boolean} Whether to concatenate element text fragments with spaces. + */ +// http://stackoverflow.com/questions/6743912/get-the-pure-text-without-html-element-by-javascript +getText = function(element, addSpaces) { + var i, result, text, child; + if (element.childNodes && element.childNodes > 1) { + result = ''; + for (i = 0; i < element.childNodes.length; i++) { + child = element.childNodes[i]; + text = null; + // NOTE we only collapsing child node values when there is more than one child + if (child.elementType === 1) { + text = getText(child, addSpaces); + } else if (child.elementType === 3) { + text = child.elementValue; + } + if (text) { + if (addSpaces && /\S$/.test(result) && /^\S/.test(text)) text = ' ' + text; + result += text; + } + } + } else { + result = element.innerText || element.textContent || ''; + } + result = result.replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').replace(/^\s+/, '').replace(/\s+$/, '') + return result; +} \ No newline at end of file diff --git a/ui4j_test/src/test/resources/highlight.js b/ui4j_test/src/test/resources/highlight.js new file mode 100644 index 000000000..3af7b9edc --- /dev/null +++ b/ui4j_test/src/test/resources/highlight.js @@ -0,0 +1,30 @@ +/** + * Creates a floating translucent div at the specified location in order to highlight a particular + * element. Note that these scripts are run directly in the browser under test, so they need to + * be ES5 compatible and serializable. + */ +highlight_create = function(top, left, width, height) { + // console.log('Highlighting at ', top, left, width, height); + var el = document.createElement('div'); + el.id = 'BP_ELEMENT_HIGHLIGHT__'; + document.body.appendChild(el); + el.style['position'] = 'absolute'; + el.style['background-color'] = 'lightblue'; + el.style['opacity'] = '0.7'; + el.style['top'] = top + 'px'; + el.style['left'] = left + 'px'; + el.style['width'] = width + 'px'; + el.style['height'] = height + 'px'; +}; + +/** + * Removes the highlight + */ +highlight_remove = function() { + var el = document.getElementById('BP_ELEMENT_HIGHLIGHT__'); + if (el) { + el.parentElement.removeChild(el); + } +}; + +// origin: https://github.com/angular/blocking-proxy/blob/master/lib/client_scripts/highlight.js diff --git a/ui4j_test/src/test/resources/simulateClick.js b/ui4j_test/src/test/resources/simulateClick.js new file mode 100644 index 000000000..8bc3752dc --- /dev/null +++ b/ui4j_test/src/test/resources/simulateClick.js @@ -0,0 +1,105 @@ +/** + * simulate mouse event on the element + * + * arguments[0] {Element} The event target. + * arguments[1] {String} The name of the event (e.g. 'contextmenu'). + */ + +// http://stackoverflow.com/questions/6157929/how-to-simulate-a-mouse-click-using-javascript/6158050 +// http://www.spookandpuff.com/examples/clickSimulation.html +// http://mouseevents.nerdyjs.com/search/MouseEvents +// https://raw.githubusercontent.com/sergeych/jsnippets/master/simulate_event.js +// http://stackoverflow.com/questions/35834671/similating-a-javascript-click-event-on-a-specific-page +simulate = function(element, eventName) { + var options = extend(defaultOptions, arguments[2] || {}); + var oEvent, eventType = null; + + for (var name in eventMatchers) { + if (eventMatchers[name].test(eventName)) { + eventType = name; + break; + } + } + + if (!eventType) + throw new SyntaxError('Unsupported event: ' + eventName); + + if (document.createEvent) { + oEvent = document.createEvent(eventType); + if (eventType == 'HTMLEvents') { + oEvent.initEvent(eventName, options.bubbles, options.cancelable); + } else { + oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, + options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element); + } + element.dispatchEvent(oEvent); + } else { + options.clientX = options.pointerX; + options.clientY = options.pointerY; + var evt = document.createEventObject(); + oEvent = extend(evt, options); + element.fireEvent('on' + eventName, oEvent); + } + return element; +} + +function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +} +// contextmenu is supposedly handled by simulateRightMouseButtonClick.js +var eventMatchers = { + 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, + 'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/ +} +var defaultOptions = { + pointerX: 0, + pointerY: 0, + // 0 for left button + // 1 in Chrome has effect of 'Ctrl click' - link is opened in a new tab + button: 0, + ctrlKey: true, + // modifiers have no effect in FF + altKey: false, + shiftKey: false, + metaKey: false, + bubbles: true, + cancelable: true +} + +// http://stackoverflow.com/questions/10596417/is-there-a-way-to-get-element-by-xpath-using-javascript-in-selenium-webdriver +var getElementByXpath = function getElementByXpath(xpath) { + return document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; +} + +var getElementsByXpath = function getElementByXpath(xpath) { + var result = []; + var nodesSnapshot = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0; i < nodesSnapshot.snapshotLength; i++) { + result.push(nodesSnapshot.snapshotItem(i)); + } + return result; +} +var element = null; +var eventName = null; +if (typeof(arguments) == 'undefined') { + // localor valid for a link in http://suvian.in/selenium/1.1link.html + element = getElementByXpath('//div[1]/div/div/div/div/h3[2]/a'); + eventName = 'click'; +} else { + element = arguments[0] || document.defaultView; + eventName = arguments[1] || 'click'; +} + +/* +// simplified: +var _event = new MouseEvent(eventName, { + view: window, + bubbles: true, + cancelable: true, + clientX: 20, +}); +element.dispatchEvent(_event); +*/ \ No newline at end of file diff --git a/ui4j_test/src/test/resources/simulateDragDrop.js b/ui4j_test/src/test/resources/simulateDragDrop.js new file mode 100644 index 000000000..029179da6 --- /dev/null +++ b/ui4j_test/src/test/resources/simulateDragDrop.js @@ -0,0 +1,72 @@ +/** + * simulate Drag and Drop of the page element with the mouse + * + * arguments[0] {Element} The event target. + * arguments[1] {long} The destination x coordinate. + * arguments[2] {long} The destination y coordinate. + */ +// https://ynot408.wordpress.com/2011/09/22/drag-and-drop-using-selenium-webdriver/ +// http://stackoverflow.com/questions/35834671/similating-a-javascript-click-event-on-a-specific-page +simulate = function(element, eventName) { + var options = extend(defaultOptions, arguments[2] || {}); + var oEvent, eventType = null; + + for (var name in eventMatchers) { + if (eventMatchers[name].test(eventName)) { + eventType = name; + break; + } + } + + if (!eventType) + throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported'); + + if (document.createEvent) { + oEvent = document.createEvent(eventType); + if (eventType == 'HTMLEvents') { + oEvent.initEvent(eventName, options.bubbles, options.cancelable); + } else { + oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, + options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element); + } + element.dispatchEvent(oEvent); + } else { + options.clientX = options.pointerX; + options.clientY = options.pointerY; + var evt = document.createEventObject(); + oEvent = extend(evt, options); + element.fireEvent('on' + eventName, oEvent); + } + return element; +} + +function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +} +// contextmenu +var eventMatchers = { + 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, + 'MouseEvents': /^(?:click|contextmenu|dblclick|mouse(?:down|up|over|move|out))$/ +} +var defaultOptions = { + pointerX: 0, + pointerY: 0, + button: 0, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + bubbles: true, + cancelable: true +} + +var elementFrom = arguments[0] || document.defaultView; +var destX = arguments[1] || 0; +var destY = arguments[2] || 0; + +simulate(elementFrom, 'mousedown', 0, 0); +simulate(elementFrom, 'mousemove', destX, destY); +simulate(elementFrom, 'mouseup', destX, destY); diff --git a/ui4j_test/src/test/resources/simulateDragDrop2.js b/ui4j_test/src/test/resources/simulateDragDrop2.js new file mode 100644 index 000000000..03c38ed68 --- /dev/null +++ b/ui4j_test/src/test/resources/simulateDragDrop2.js @@ -0,0 +1,19 @@ +// shorter version, not functional +function simulate(f, c, d, e) { + var b, a = null; + for (b in eventMatchers) + if (eventMatchers[b].test(c)) { + a = b; + break + } + if (!a) return !1; + document.createEvent ? (b = document.createEvent(a), a == 'HTMLEvents' ? b.initEvent(c, !0, !0) : b.initMouseEvent(c, !0, !0, document.defaultView, 0, d, e, d, e, !1, !1, !1, !1, 0, null), f.dispatchEvent(b)) : (a = document.createEventObject(), a.detail = 0, a.screenX = d, a.screenY = e, a.clientX = d, a.clientY = e, a.ctrlKey = !1, a.altKey = !1, a.shiftKey = !1, a.metaKey = !1, a.button = 1, f.fireEvent('on' + c, a)); + return !0 +} +var eventMatchers = { + HTMLEvents: /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, + MouseEvents: /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/ +}; +simulate(arguments[0], 'mousedown', 0, 0); +simulate(arguments[0], 'mousemove', arguments[1], arguments[2]); +simulate(arguments[0], 'mouseup', arguments[1], arguments[2]); \ No newline at end of file diff --git a/ui4j_test/src/test/resources/simulateRightMouseButtonClick.js b/ui4j_test/src/test/resources/simulateRightMouseButtonClick.js new file mode 100644 index 000000000..411b3cce8 --- /dev/null +++ b/ui4j_test/src/test/resources/simulateRightMouseButtonClick.js @@ -0,0 +1,13 @@ +/** + * simulate right mouse button click event on the element + * + * arguments[0] {Element} The click target. + */ +// http://stackoverflow.com/questions/17092328/how-to-simulate-right-click-in-javascript +function simulateRightMouseButtonClick(element) { + var e = element.ownerDocument.createEvent('MouseEvents'); + e.initMouseEvent('contextmenu', true, true, element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 2, null); // 1 ? + element.dispatchEvent(e); +} +var element = arguments[0] || document.defaultView; +simulateRightMouseButtonClick(element); \ No newline at end of file diff --git a/ui4j_test/src/test/resources/test.htm b/ui4j_test/src/test/resources/test.htm new file mode 100644 index 000000000..55d15f653 --- /dev/null +++ b/ui4j_test/src/test/resources/test.htm @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sample Table
StructureCountryCityHeightBuiltRank
Total4 buildings
Burj KhalifaUAEDubai829m20101details
"Burj" KhalifaUAEDubai829m20101details
Burj 'Khalifa'UAEDubai829m20101details
"Burj" 'Khalifa'UAEDubai829m20101details
\ No newline at end of file diff --git a/ui4j_test/src/test/resources/xpathOfElement.js b/ui4j_test/src/test/resources/xpathOfElement.js new file mode 100644 index 000000000..75161b2bb --- /dev/null +++ b/ui4j_test/src/test/resources/xpathOfElement.js @@ -0,0 +1,28 @@ +function xpathOfElement(element) { + var elementTagName = element.tagName.toLowerCase(); + if (element.id != '') { + return '//' + elementTagName + '[@id="' + element.id + '"]'; + } else if (element.name && document.getElementsByName(element.name).length === 1) { + return '//' + elementTagName + '[@name="' + element.name + '"]'; + } + if (element === document.body) { + return '/html/' + elementTagName; + } + var sibling_count = 0; + var siblings = element.parentNode.childNodes; + siblings_length = siblings.length; + for (cnt = 0; cnt < siblings_length; cnt++) { + var sibling_element = siblings[cnt]; + if (sibling_element.nodeType !== 1) { // not ELEMENT_NODE + continue; + } + if (sibling_element === element) { + return sibling_count > 0 ? xpathOfElement(element.parentNode) + '/' + elementTagName + '[' + (sibling_count + 1) + ']' : xpathOfElement(element.parentNode) + '/' + elementTagName; + } + if (sibling_element.nodeType === 1 && sibling_element.tagName.toLowerCase() === elementTagName) { + sibling_count++; + } + } + return; +}; +return xpathOfElement(arguments[0]); \ No newline at end of file From 0d881deba42c2893dc64e154a363ef3ca454b176 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 22 Mar 2024 00:06:33 +0100 Subject: [PATCH 083/171] intermediate revision - added alternative script templates resources and misc. documentation updates --- basic-processhandle/README.md | 31 +++++++++- basic-processhandle/pom.xml | 2 +- .../src/main/java/example/CounterApp.java | 2 + .../src/main/java/example/Dialog.java | 2 + .../src/main/java/example/Launcher.java | 58 +++++++++---------- .../src/main/java/example/Utils.java | 26 ++++++--- .../src/main/resources/wrapper_script.txt | 12 ++++ .../main/resources/wrapper_script_long.txt | 35 +++++++++++ 8 files changed, 127 insertions(+), 41 deletions(-) create mode 100644 basic-processhandle/src/main/resources/wrapper_script.txt create mode 100644 basic-processhandle/src/main/resources/wrapper_script_long.txt diff --git a/basic-processhandle/README.md b/basic-processhandle/README.md index ab2d4450a..b614ae4b6 100644 --- a/basic-processhandle/README.md +++ b/basic-processhandle/README.md @@ -135,6 +135,32 @@ can not use the XML comment: [ERROR] Non-parseable POM c:\developer\sergueik\selenium_java\basic-processhandle\pom.xml: in comment after two dashes (--) next character must be > not r ( position: END_TAG seen ...${java.version}\r\n + + + + + From 43446e4c34ad95c8c92455a1c3cee15d0403245d Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 6 Apr 2024 01:08:01 +0200 Subject: [PATCH 090/171] updated README covering performance counter terms - no code change --- jna_pdh/README.md | 18 +++++++++++++++++- jna_pdh/pom.xml | 10 ++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/jna_pdh/README.md b/jna_pdh/README.md index eac1fb189..407a70ae1 100644 --- a/jna_pdh/README.md +++ b/jna_pdh/README.md @@ -1,7 +1,16 @@ ### Info + this directory contains a fragment of the `PDHTest.java` [test class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/PdhTest.java) from -[jna](https://github.com/java-native-access/jna) project focusing on collecting the `System\Processor Queue Length` performance metric +[jna](https://github.com/java-native-access/jna) project focusing on collecting the Windows Performance Counters metrics, +for example the `System\Processor Queue Length` or `Processor\% Processor Time\0` where the notation is: + + +token | description | comment +--- | --- | --- +`Processor` | category | +`% Processor Time`| counter | +`0` | Instance | blank for *single instance* counters The code was modeled after the native app implementation found in [host-sflow](https://github.com/sflow/host-sflow): ```c @@ -82,6 +91,13 @@ mvn test ```text \System\Processor Queue Length Thu Mar 03 08:50:27 PST 2022 1st=14 2nd=0 multi=1 ``` +### See Also + * [Performance Counters](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-portal) + + [About Performance Counters](https://learn.microsoft.com/en-us/windows/win32/perfctrs/about-performance-counters) + + [Using Performance Counters](https://learn.microsoft.com/en-us/windows/win32/perfctrs/using-performance-counters) + + [Performance Counters Reference](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-reference) + + [Performance Counter functions](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-functions) + + [performance Counters XML Schema](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-schema) ### Author [Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/jna_pdh/pom.xml b/jna_pdh/pom.xml index 732152711..9f01016a2 100644 --- a/jna_pdh/pom.xml +++ b/jna_pdh/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.sun.jna.platform jna_pdh - 0.2.0-SNAPSHOT + 0.3.0-SNAPSHOT jar ${project.groupId}:${project.artifactId} jna pdh test @@ -16,7 +16,9 @@ - UTF-8 + UTF-8 + ${encoding} + ${encoding} 1.10 4.2 1.3 @@ -119,7 +121,7 @@ ${java.version} ${java.version} - utf-8 + ${encoding} -Xlint:all true true @@ -133,7 +135,7 @@ maven-assembly-plugin ${maven-assembly-plugin.version} - SWTsample + ${project.groupId}.${project.artifactId} false jar-with-dependencies From c6fdd5a3164ef22c7aa4160b3092c56b949b3453 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 23 Apr 2024 00:07:57 +0200 Subject: [PATCH 091/171] intermediate revision - added NAME (A) option for filtering --- utils/generate_convert.sh | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/utils/generate_convert.sh b/utils/generate_convert.sh index b8d85c782..881e66737 100755 --- a/utils/generate_convert.sh +++ b/utils/generate_convert.sh @@ -74,10 +74,12 @@ # custom sizes: # '1280x800' => '852x532' -OPTS=`getopt -o dvnhibks:e: --long debug,verbose,dry-run,help,inspect,batterycheck,keep,size:,extension: -n 'parse-options' -- "$@"` +OPTS=`getopt -o dvnhibks:e:a: --long debug,verbose,dry-run,help,inspect,battery,keep,size:,extension:,name: -n 'parse-options' -- "$@"` if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi # TODO: dirscan -# find . -iname '*mp4' | sed 's|\([^.]\)/.*$|\1|g'|sort -u +# EXTENSION='*mp4' +# NAME='*filename*' +# find . -iname "$NAME.$EXTENSION" | sed 's|\([^.]\)/.*$|\1|g'|sort -u VERBOSE=false HELP=false DRY_RUN=false @@ -85,17 +87,19 @@ KEEP_SIZE=false BATTERY_CHECK=false SIZE='qhd' EXTENSION='mp4' +NAME='*' while true; do case "$1" in - -d | --debug ) DEBUG=true; shift ;; - -v | --verbose ) VERBOSE=true; shift ;; - -i | --inspect ) INSPECT=true; shift ;; - -h | --help ) HELP=true; shift ;; - -n | --dry-run ) DRY_RUN=true; shift ;; - -b | --battery-check ) BATTERY_CHECK=true; shift ;; - -s | --size ) SIZE="$2"; shift; shift ;; - -k | --keep ) KEEP_SIZE=true; shift ;; + -d | --debug ) DEBUG=true; shift ;; + -v | --verbose ) VERBOSE=true; shift ;; + -i | --inspect ) INSPECT=true; shift ;; + -a | --name ) NAME="*$2*"; shift ;; + -h | --help ) HELP=true; shift ;; + -n | --dry-run ) DRY_RUN=true; shift ;; + -b | --battery ) BATTERY_CHECK=true; shift ;; + -s | --size ) SIZE="$2"; shift; shift ;; + -k | --keep ) KEEP_SIZE=true; shift ;; -e | --extension ) EXTENSION="$2"; shift; shift ;; -- ) shift; break ;; * ) break ;; @@ -149,7 +153,7 @@ if [[ "${INSPECT}" = 'true' ]]; then echo "Inspecting first file \"*${EXTENSION}\"" fi # ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_height=\(.*\)$|\1|p' - S=$(find . -iname "*${EXTENSION}" | head -1) + S=$(find . -iname "${NAME}.${EXTENSION}" | head -1) H=$(ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_height=\(.*\)$|\1|p') W=$(ffprobe -select_streams v -show_streams "$S" 2>&1 | sed -n 's|coded_width=\(.*\)$|\1|p') @@ -183,7 +187,7 @@ if [[ "${INSPECT}" = 'true' ]]; then exit 0 fi # technically able to descend, seldom used -find . -iname "*${EXTENSION}" | sort | while read filename ; do +find . -iname "${NAME}.${EXTENSION}" | sort | while read filename ; do D=$(dirname "$filename") S=$(basename "$filename") N="${S/.${EXTENSION}/.temp.mkv}" From 1629f0f176bed74078634dd3d013e9174a4eeb96 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 6 May 2024 02:28:01 +0200 Subject: [PATCH 092/171] bumped jackson-detabind version per dependabot --- remote_browser_log/pom.xml | 2 +- restAssured_training/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/remote_browser_log/pom.xml b/remote_browser_log/pom.xml index 042b50ef9..7ae70084f 100644 --- a/remote_browser_log/pom.xml +++ b/remote_browser_log/pom.xml @@ -41,7 +41,7 @@ om/fasterxml/jackson/core/jackson-annotations/2.10.0-SNAPSHOT/jackson-annotatio s-2.10.0-20190602.04115-4.pom which will lead to quickly polluting the maven local repository cache ~/.m2/repository/com/fasterxml/jackson with snapshot versions. --> 2.9.9 - 2.11.4 + 2.12.7.1 1.15.3 4.13.2 2.17.1 diff --git a/restAssured_training/pom.xml b/restAssured_training/pom.xml index 421e3e1e9..3f169e939 100644 --- a/restAssured_training/pom.xml +++ b/restAssured_training/pom.xml @@ -8,7 +8,7 @@ UTF-8 UTF-8 2.9.8 - 2.9.10.8 + 2.12.7.1 3.1.1 6.14.3 1.3 From 6ff3ee53729f548516d1ea51364ae0a637c2981d Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 13 May 2024 00:27:29 +0200 Subject: [PATCH 093/171] cosmetic changes, variable names and console logging --- utils/resampler.cmd | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/utils/resampler.cmd b/utils/resampler.cmd index 90bc2a726..809bb6d63 100644 --- a/utils/resampler.cmd +++ b/utils/resampler.cmd @@ -18,37 +18,36 @@ set "SOURCPATH=%CD%" if not "%~1" == "" set "SOURCPATH=%~1" set TIMEOUT=10 set PATH=%PATH%;c:\tools\resampler - -set OPT= -if not "%2" equ "" set OPT=/R "%SOURCEPATH%" +set TOOL=resampler.exe +set FILESCAN_OPTIONS= +if not "%2" equ "" set FILESCAN_OPTIONS=/R "%SOURCEPATH%" set "MAX_PROCESSES=2" set "PROCESS_COUNTER=0" for /F "tokens=2 delims==" %%. in ('wmic.exe cpu get NumberOfCores /format:list') do set /A "MAX_PROCESSES=%%. * 2" if not "%3" == "" set "MAX_PROCESSES=%3" -echo Will run !MAX_PROCESSES! in parallel +@echo Will run !MAX_PROCESSES! in parallel cd /d "%SOURCPATH%" REM no need for "tokens=*" -REM set OPTIONS=-r 44100 -b 16 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" -set OPTIONS=-r 44100 -b 16 --dither 3 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" +REM set CONVERT_OPTIONS=-r 44100 -b 16 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" +set CONVERT_OPTIONS=-r 44100 -b 16 --dither 3 --minphase --relaxedLPF --showStages --tempDir "%TEMP%" REM Relies on REM Walks the directory tree %SOURCEPATH%, executing the FOR statement in each directory of the tree REM or just the current directory when the option is not set - -for %OPT% %%_ in (*.flac) do ( +for %FILESCAN_OPTIONS% %%_ in (*.flac) do ( set "INPUTFILE=%%_" set "OUTPUTFILE=%%~dp_%%~n_ - 01%%~x_" - rem NODE dealing with quotes - set "COMMAND=ReSampler.exe -i "!INPUTFILE!" -o "!OUTPUTFILE!" !OPTIONS!" - echo Launch the resampler tool in a separate process: !COMMAND! + REM NOTE dealing with quotes + set "COMMAND=!TOOL! -i "!INPUTFILE!" -o "!OUTPUTFILE!" !CONVERT_OPTIONS!" + @echo Launch the resampler tool in a separate process: !COMMAND! start /B CMD /C "!COMMAND!" set /A PROCESS_COUNTER+=1 - echo Running !PROCESS_COUNTER! processes + @echo Running !PROCESS_COUNTER! processes if !PROCESS_COUNTER! geq !MAX_PROCESSES! ( - rem Wait for any of the launched processes to finish before launching more + REM Wait for any of the launched processes to finish before launching more call :COUNT_FOR_PROCESS ) ) @@ -57,10 +56,9 @@ for %OPT% %%_ in (*.flac) do ( rem Wait untill all processes finish C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak -set TOOL=ReSampler.exe for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !TOOL!" /NH') do ( if "%%_" == "!TOOL!" ( - rem There is still at least one instance of the !TOOL! running + REM There is still at least one instance of the !TOOL! running goto :WAIT_FOR_PROCESS ) ) @@ -69,20 +67,19 @@ cls exit /B goto :EOF -REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 +REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=980xi3 :COUNT_FOR_PROCESS -rem Wait untill at least one !TOOL! process finishes +REM Wait untill at least one !TOOL! process finishes C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak -set TOOL=ReSampler.exe set /A RUNNING_PPOCESS_COUNT=0 -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !TOOL!" /NH ^| C:\Windows\System32\find.exe /i "!TOOL!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( +for /F "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !TOOL!" /NH ^| C:\Windows\System32\find.exe /i "!TOOL!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( set /A RUNNING_PPOCESS_COUNT=%%_ - echo !RUNNING_PPOCESS_COUNT! !TOOL! processes are running + @echo !RUNNING_PPOCESS_COUNT! !TOOL! processes are running if !RUNNING_PPOCESS_COUNT! equ !MAX_PROCESSES! ( goto :COUNT_FOR_PROCESS ) ) set /A "PROCESS_COUNTER=!RUNNING_PPOCESS_COUNT!" -echo set PROCESS_COUNTER to !PROCESS_COUNTER! +@echo set PROCESS_COUNTER to !PROCESS_COUNTER! exit /B From 2d94512b918f633659b26032250c401035c969ea Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 13 May 2024 21:51:50 -0400 Subject: [PATCH 094/171] fixed typo in counter registry path in README.md --- jna_pdh/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jna_pdh/README.md b/jna_pdh/README.md index 407a70ae1..97dff877d 100644 --- a/jna_pdh/README.md +++ b/jna_pdh/README.md @@ -3,7 +3,7 @@ this directory contains a fragment of the `PDHTest.java` [test class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/PdhTest.java) from [jna](https://github.com/java-native-access/jna) project focusing on collecting the Windows Performance Counters metrics, -for example the `System\Processor Queue Length` or `Processor\% Processor Time\0` where the notation is: +for example the `System\Processor Queue Length` or `Processor\0\% Processor Time` where the notation is: token | description | comment @@ -12,7 +12,7 @@ token | description | comment `% Processor Time`| counter | `0` | Instance | blank for *single instance* counters -The code was modeled after the native app implementation found in [host-sflow](https://github.com/sflow/host-sflow): +The code was modeled after the native C app implementation found in [host-sflow](https://github.com/sflow/host-sflow): ```c uint64_t readFormattedCounter(char* path) { From f6ccdbcd67250974ae1cd77a1352719a353fdf88 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 25 May 2024 02:00:33 +0200 Subject: [PATCH 095/171] intermediate reviion - excluded terraform package directrories, which are quite heavy - suboptimal --- utils/projectcopy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/projectcopy.sh b/utils/projectcopy.sh index 7958bd55d..dc763c61d 100755 --- a/utils/projectcopy.sh +++ b/utils/projectcopy.sh @@ -9,9 +9,9 @@ REMOTE_USER=${2:-sergueik} # using gnu tar exclude option # NOTE: can also use simpler expression like --exclude 'packages' if [[ $DEBUG == 'true' ]] ; then - echo tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude './packages/*' --exclude './*/obj/*' --exclude './*/bin/*' . + echo tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude './packages/*' --exclude './*/obj/*' --exclude './*/bin/*' --exclude './*/.terraform/*' --exclude './.terraform/*' . fi -tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude './packages/*' --exclude './*/obj/*' --exclude './*/bin/*' . +tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude './packages/*' --exclude './*/obj/*' --exclude './*/bin/*' --exclude './*/.terraform/*' --exclude './.terraform/*' . if [[ $DEBUG == 'true' ]] ; then echo scp ../$PROJECT.tar.gz $REMOTE_USER@${REMOTE_HOST}: fi From 9dc2cd659325e480f9dabc69662ae6c4db40b63f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 25 May 2024 02:07:59 +0200 Subject: [PATCH 096/171] intermediate revision - switched to shorter multi --exclude="packages" option --- utils/projectcopy.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/projectcopy.sh b/utils/projectcopy.sh index dc763c61d..1b7bdcdf8 100755 --- a/utils/projectcopy.sh +++ b/utils/projectcopy.sh @@ -6,12 +6,12 @@ REMOTE_USER=${2:-sergueik} # unfortunately `whoami` in Windows in git bash can be different from # target unix machine user -# using gnu tar exclude option -# NOTE: can also use simpler expression like --exclude 'packages' +# using gnu tar exclude option: --exclude='packages' +# TODO: switch to compact --exclude=PATTERN exclude files, given as a PATTERN if [[ $DEBUG == 'true' ]] ; then - echo tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude './packages/*' --exclude './*/obj/*' --exclude './*/bin/*' --exclude './*/.terraform/*' --exclude './.terraform/*' . + echo tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude='packages' --exclude='obj' --exclude='bin' --exclude='.terraform' . fi -tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude './packages/*' --exclude './*/obj/*' --exclude './*/bin/*' --exclude './*/.terraform/*' --exclude './.terraform/*' . +tar czvf ../$PROJECT.tar.gz --exclude='.git*' --exclude='target' --exclude='packages' --exclude='obj' --exclude='bin' --exclude='.terraform' . if [[ $DEBUG == 'true' ]] ; then echo scp ../$PROJECT.tar.gz $REMOTE_USER@${REMOTE_HOST}: fi From bea63553f07af1641cab2944d7b37c5c029b20b7 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 26 May 2024 03:35:45 +0200 Subject: [PATCH 097/171] intermediate revision - bumped the yamlconfig version --- yaml_config_extend/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yaml_config_extend/pom.xml b/yaml_config_extend/pom.xml index 80c63226e..b4e5f868a 100644 --- a/yaml_config_extend/pom.xml +++ b/yaml_config_extend/pom.xml @@ -3,7 +3,7 @@ 4.0.0 example yamlconfig_extend - 0.10.0-SNASHOT + 0.11.0-SNASHOT yamlconfig_extend serialize application configuration in YAML file and support classpath-style dotted notation. @@ -12,7 +12,7 @@ 3.6.1 4.13.1 2.0 - 1.0.1 + 1.1.2 From b94f08b1d461c2236009fc58c126ee315270bf5c Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 14 Jun 2024 05:33:10 +0200 Subject: [PATCH 098/171] bumped xerces version per dependabot --- remote_browser_log/pom.xml | 1060 ++++++++++++++++++------------------ 1 file changed, 530 insertions(+), 530 deletions(-) diff --git a/remote_browser_log/pom.xml b/remote_browser_log/pom.xml index 7ae70084f..a64cd6c4b 100644 --- a/remote_browser_log/pom.xml +++ b/remote_browser_log/pom.xml @@ -1,530 +1,530 @@ - - - - 4.0.0 - example - logging - jar - 0.3.0-SNAPSHOT - logging - http://maven.apache.org - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - ${encoding} - ${encoding} - chrome - 1.3 - 2.7 - 3.0.1 - 1.3 - 2.0.4 - 2.37.0 - 1.8 - 20080701 - [2.9.10,) - - 2.9.9 - 2.12.7.1 - 1.15.3 - 4.13.2 - 2.17.1 - 3.6.0 - 1.8 - 1.8 - 3.1.0 - 2.20 - 0.9.5 - 1.4.4 - - 4.0.0-alpha-2 - - 3.142.0 - 3.13.0 - ${selenium.version} - ${selenium.version} - ${selenium.version} - - 2.0 - 3.25.2 - - 6.14.3 - 1.4.9 - 2.8.9 - 23.1 - 4.3.0 - 1.1.0 - 1.0.2 - 1.3.0 - 2.12.0 - - - - io.rest-assured - rest-assured - ${rest-assured.version} - - - - - com.eclipsesource.minimal-json - minimal-json - ${minimal-json.version} - - - xerces - xercesImpl - ${xerces.version} - - - com.rationaleemotions - simple-ssh - ${simple-ssh.version} - - - org.apache.sshd - sshd-core - ${sshd-core.version} - test - - - org.exparity - hamcrest-date - ${hamcrest-date.version} - - - org.mongodb - mongo-java-driver - 3.6.1 - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - test - - - net.sourceforge.htmlunit - htmlunit - ${htmlunit.version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-databind.version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${jackson.version} - - - org.jsoup - jsoup - ${jsoup.version} - - - com.google.code.gson - gson - ${gson.version} - - - - com.google.guava - guava - - - - - com.sikulix - sikulixapi - ${sikulixapi.version} - - - org.apache.logging.log4j - log4j-core - ${log4j.version} - - - org.apache.commons - - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - junit - junit - ${junit.version} - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - - - org.seleniumhq.selenium - selenium-chrome-driver - ${selenium-chrome-driver.version} - - - org.seleniumhq.selenium - selenium-ie-driver - ${selenium-ie-driver.version} - - - org.seleniumhq.selenium - selenium-server - ${selenium.version} - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - com.codeborne - phantomjsdriver - ${phantomjsdriver.version} - test - - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - - - org.json - json - ${json.version} - - - org.yaml - snakeyaml - ${snakeyaml.version} - - - org.xerial - sqlite-jdbc - ${sqlite-jdbc.version} - - - com.mashape.unirest - unirest-java - ${unirest-java.version} - - - org.testng - testng - ${testng.version} - - - junit - junit - - - - - - - - com.opera - firefoxdriver - 1.1 - - - org.seleniumhq.selenium - selenium-remote-driver - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - ${encoding} - - -Xlint:all - -Xlint:-processing - - - - true - true - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - ${encoding} - - - - - src/test/resources/testng.xml - - - -Dfile.encoding=${encoding} - - true - - - - unit-tests - test - - test - - - false - - ${browser.name} - ${selenium.version} - ${property.filepath} - - - - - - - org.apache.maven.plugins - ${maven-resources-plugin.version} - maven-resources-plugin - - ${encoding} - - - - - - - properties - - - target/classes - sergueik2016 - automationnewuser24@gmail.com - ${env.TEST_PASSWORD} - - - - - - org.codehaus.mojo - properties-maven-plugin - 1.0.0 - - - generate-resources - - write-project-properties - - - - ${project.build.outputDirectory}/test.properties - - - - - - - - - - false - - - - chrome - - chrome - - - true - - - - edge - - edge - - - - firefox - - firefox - - - - - yandex - - yandex - - - - com.opera - operadriver - 0.7.3 - - - - - - - maven-central - maven central repo - https://mvnrepository.com/repos/central - - - osgeo - osgeo repo - https://download.osgeo.org/webdav/geotools/ - - - seasar - seasar repo - https://www.seasar.org/maven/maven2 - - - jcenter - https://jcenter.bintray.com/ - - - swt-repo - https://swt-repo.googlecode.com/svn/repo/ - - - central - https://repo1.maven.org/maven2/ - - - consol - https://labs.consol.de/maven/repository/ - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - project.local - project - file:${project.basedir}/repo - - - + + + + 4.0.0 + example + logging + jar + 0.3.0-SNAPSHOT + logging + http://maven.apache.org + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + UTF-8 + ${encoding} + ${encoding} + chrome + 1.3 + 2.7 + 3.0.1 + 1.3 + 2.0.4 + 2.37.0 + 1.8 + 20080701 + [2.9.10,) + + 2.9.9 + 2.12.7.1 + 1.15.3 + 4.13.2 + 2.17.1 + 3.6.0 + 1.8 + 1.8 + 3.1.0 + 2.20 + 0.9.5 + 1.4.4 + + 4.0.0-alpha-2 + + 3.142.0 + 3.13.0 + ${selenium.version} + ${selenium.version} + ${selenium.version} + + 2.0 + 3.25.2 + + 6.14.3 + 1.4.9 + 2.8.9 + 23.1 + 4.3.0 + 1.1.0 + 1.0.2 + 1.3.0 + 2.12.2 + + + + io.rest-assured + rest-assured + ${rest-assured.version} + + + + + com.eclipsesource.minimal-json + minimal-json + ${minimal-json.version} + + + xerces + xercesImpl + ${xerces.version} + + + com.rationaleemotions + simple-ssh + ${simple-ssh.version} + + + org.apache.sshd + sshd-core + ${sshd-core.version} + test + + + org.exparity + hamcrest-date + ${hamcrest-date.version} + + + org.mongodb + mongo-java-driver + 3.6.1 + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + test + + + net.sourceforge.htmlunit + htmlunit + ${htmlunit.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson.version} + + + org.jsoup + jsoup + ${jsoup.version} + + + com.google.code.gson + gson + ${gson.version} + + + + com.google.guava + guava + + + + + com.sikulix + sikulixapi + ${sikulixapi.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.commons + + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + junit + junit + ${junit.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + org.seleniumhq.selenium + selenium-firefox-driver + ${selenium-firefox-driver.version} + + + org.seleniumhq.selenium + selenium-chrome-driver + ${selenium-chrome-driver.version} + + + org.seleniumhq.selenium + selenium-ie-driver + ${selenium-ie-driver.version} + + + org.seleniumhq.selenium + selenium-server + ${selenium.version} + + + org.seleniumhq.selenium + selenium-support + ${selenium.version} + + + com.codeborne + phantomjsdriver + ${phantomjsdriver.version} + test + + + + org.seleniumhq.selenium + selenium-remote-driver + ${selenium.version} + + + org.json + json + ${json.version} + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + org.xerial + sqlite-jdbc + ${sqlite-jdbc.version} + + + com.mashape.unirest + unirest-java + ${unirest-java.version} + + + org.testng + testng + ${testng.version} + + + junit + junit + + + + + + + + com.opera + firefoxdriver + 1.1 + + + org.seleniumhq.selenium + selenium-remote-driver + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + ${encoding} + + -Xlint:all + -Xlint:-processing + + + + true + true + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + false + ${encoding} + + + + + src/test/resources/testng.xml + + + -Dfile.encoding=${encoding} + + true + + + + unit-tests + test + + test + + + false + + ${browser.name} + ${selenium.version} + ${property.filepath} + + + + + + + org.apache.maven.plugins + ${maven-resources-plugin.version} + maven-resources-plugin + + ${encoding} + + + + + + + properties + + + target/classes + sergueik2016 + automationnewuser24@gmail.com + ${env.TEST_PASSWORD} + + + + + + org.codehaus.mojo + properties-maven-plugin + 1.0.0 + + + generate-resources + + write-project-properties + + + + ${project.build.outputDirectory}/test.properties + + + + + + + + + + false + + + + chrome + + chrome + + + true + + + + edge + + edge + + + + firefox + + firefox + + + + + yandex + + yandex + + + + com.opera + operadriver + 0.7.3 + + + + + + + maven-central + maven central repo + https://mvnrepository.com/repos/central + + + osgeo + osgeo repo + https://download.osgeo.org/webdav/geotools/ + + + seasar + seasar repo + https://www.seasar.org/maven/maven2 + + + jcenter + https://jcenter.bintray.com/ + + + swt-repo + https://swt-repo.googlecode.com/svn/repo/ + + + central + https://repo1.maven.org/maven2/ + + + consol + https://labs.consol.de/maven/repository/ + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + project.local + project + file:${project.basedir}/repo + + + From 316e53c9a7a1e1711383e8411c10e0e093b03ccd Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 14 Jun 2024 05:36:20 +0200 Subject: [PATCH 099/171] bumped commons-beanutils:commons-beanutils version per dependabot --- yellow_clue/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yellow_clue/pom.xml b/yellow_clue/pom.xml index fa8035d27..0a12af51c 100644 --- a/yellow_clue/pom.xml +++ b/yellow_clue/pom.xml @@ -18,7 +18,7 @@ UTF-8 UTF-8 - 1.9.3 + 1.9.4 2.10.1 4.2 1.3 From 8ec4751fcb83e9a25183c15a7819f51b2742c223 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 14 Jun 2024 05:41:49 +0200 Subject: [PATCH 100/171] bumped jetty-server version per dependabot --- justify-cli/README.md | 3 + justify-cli/pom.xml | 374 ++++++++++++++++++++---------------------- 2 files changed, 185 insertions(+), 192 deletions(-) diff --git a/justify-cli/README.md b/justify-cli/README.md index ef0653c41..7068a37ed 100644 --- a/justify-cli/README.md +++ b/justify-cli/README.md @@ -8,3 +8,6 @@ This directory contains a replica of [Justify CLI](https://github.com/leadpony/j * https://www.jsonschema.net/ * https://github.com/fge/json-schema-processor-examples + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/justify-cli/pom.xml b/justify-cli/pom.xml index fe5e54c31..e6f9f4781 100644 --- a/justify-cli/pom.xml +++ b/justify-cli/pom.xml @@ -1,202 +1,192 @@ - - - 4.0.0 - - org.leadpony.justify - justify-cli - 0.14.0-SNAPSHOT - jar - org.leadpony.justify.cli - + + 4.0.0 + org.leadpony.justify + justify-cli + 0.14.0-SNAPSHOT + jar + org.leadpony.justify.cli + Justify CLI is a command line utility for validating JSON documents. - - - UTF-8 - 1.8 - 1.8 - - - - - - ${project.groupId} - justify - 0.13.0 - - - org.glassfish - javax.json - 1.1.3 - - - org.fusesource.jansi - jansi - 1.17.1 - - - org.junit.jupiter - junit-jupiter-engine - 5.4.0 - - - org.junit.jupiter - junit-jupiter-params - 5.4.0 - - - org.assertj - assertj-core - 3.12.0 - - - org.eclipse.jetty - jetty-server - 9.4.15.v20190215 - - - - + + UTF-8 + 1.8 + 1.8 + 10.0.10 + + - - org.leadpony.justify - justify - - - org.glassfish - javax.json - runtime - - - org.fusesource.jansi - jansi - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.junit.jupiter - junit-jupiter-params - test - - - org.assertj - assertj-core - test - - - org.eclipse.jetty - jetty-server - test - + + ${project.groupId} + justify + 0.13.0 + + + org.glassfish + javax.json + 1.1.3 + + + org.fusesource.jansi + jansi + 1.17.1 + + + org.junit.jupiter + junit-jupiter-engine + 5.4.0 + + + org.junit.jupiter + junit-jupiter-params + 5.4.0 + + + org.assertj + assertj-core + 3.12.0 + + + org.eclipse.jetty + jetty-server + ${jetty.version} + - - - - - src/main/resources - true - - - - - src/test/resources - - - src/test/schemas/org/json-schema - - - src/test/schemas/org/leadpony - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - - org.apache.maven.plugins - maven-resources-plugin - 3.1.0 - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0-M3 - - + + + + org.leadpony.justify + justify + + + org.glassfish + javax.json + runtime + + + org.fusesource.jansi + jansi + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params + test + + + org.assertj + assertj-core + test + + + org.eclipse.jetty + jetty-server + test + + + + + + src/main/resources + true + + + + + src/test/resources + + + src/test/schemas/org/json-schema + + + src/test/schemas/org/leadpony + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M3 + + -Duser.language=en -Duser.country=US -Dorg.leadpony.justify.cli.use.jansi=false - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.1 - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - org.leadpony.justify.cli.Launcher - true - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - assemble - package - - single - - - false - - src/assembly/distribution.xml - - - - - - - - - https://github.com/leadpony/justify - 2018 - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.1 + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + org.leadpony.justify.cli.Launcher + true + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assemble + package + + single + + + false + + src/assembly/distribution.xml + + + + + + + + https://github.com/leadpony/justify + 2018 + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + From 5397220444ef85f6c0767a226cbba7818fe1a173 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 14 Jun 2024 00:08:47 -0400 Subject: [PATCH 101/171] bumped jetty-server version per dependabot. NOTE: tests are currently failing --- driver-binary-downloader-maven-plugin/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/driver-binary-downloader-maven-plugin/pom.xml b/driver-binary-downloader-maven-plugin/pom.xml index 386ff4358..53e559822 100644 --- a/driver-binary-downloader-maven-plugin/pom.xml +++ b/driver-binary-downloader-maven-plugin/pom.xml @@ -22,6 +22,7 @@ UTF-8 2.17.1 1.7.30 + 10.0.10 @@ -117,13 +118,13 @@ org.eclipse.jetty jetty-server - 9.4.19.v20190610 + ${jetty.version} test org.eclipse.jetty jetty-webapp - 9.4.19.v20190610 + ${jetty.version} test From 205a5b29314eb091ece10cefd6c9efde26c16f24 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 15 Jun 2024 04:58:39 +0200 Subject: [PATCH 102/171] bumped version of "jetty-server" per dependabot --- driver-binary-downloader-maven-plugin/pom.xml | 2 +- justify-cli/pom.xml | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/driver-binary-downloader-maven-plugin/pom.xml b/driver-binary-downloader-maven-plugin/pom.xml index 53e559822..2933f39e5 100644 --- a/driver-binary-downloader-maven-plugin/pom.xml +++ b/driver-binary-downloader-maven-plugin/pom.xml @@ -22,7 +22,7 @@ UTF-8 2.17.1 1.7.30 - 10.0.10 + 10.0.14 diff --git a/justify-cli/pom.xml b/justify-cli/pom.xml index e6f9f4781..98857d167 100644 --- a/justify-cli/pom.xml +++ b/justify-cli/pom.xml @@ -13,7 +13,8 @@ UTF-8 1.8 1.8 - 10.0.10 + 5.4.0 + 10.0.14 @@ -35,12 +36,12 @@ org.junit.jupiter junit-jupiter-engine - 5.4.0 + ${junit-jupiter.version} org.junit.jupiter junit-jupiter-params - 5.4.0 + ${junit-jupiter.version} org.assertj From d7a24e4e0b5a5c5e07d8ac1d27413a3bf38230c4 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 30 Jun 2024 12:14:44 -0400 Subject: [PATCH 103/171] intermediate reision - added help --- utils/generate_convert.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/utils/generate_convert.sh b/utils/generate_convert.sh index 881e66737..03c1be59a 100755 --- a/utils/generate_convert.sh +++ b/utils/generate_convert.sh @@ -70,7 +70,7 @@ # 'whuxga' 7680x4800 # # -# origin: https://gist.github.com/cosimo/3760587 +# based on: https://gist.github.com/cosimo/3760587 # custom sizes: # '1280x800' => '852x532' @@ -105,7 +105,13 @@ while true; do * ) break ;; esac done - +if [[ "${HELP}" = "true" ]]; then +cat < Date: Mon, 1 Jul 2024 00:32:06 +0200 Subject: [PATCH 104/171] intermediate revision - extacted non-working check_remaining_battery function into standalone script --- utils/check_remaining_battery.sh | 100 +++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100755 utils/check_remaining_battery.sh diff --git a/utils/check_remaining_battery.sh b/utils/check_remaining_battery.sh new file mode 100755 index 000000000..d5823e2b8 --- /dev/null +++ b/utils/check_remaining_battery.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +OPTS=`getopt -o dhb: --long debug,help,battery: -h 'parse-options' -- "$@"` +if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi +HELP=false +BATTERY_CHECK=false +SIZE=5 + +while true; do + case "$1" in + -d | --debug ) DEBUG=true; shift ;; + -h | --help ) HELP=true; shift ;; + -b | --battery ) BATTERY_CHECK=true; SIZE="$2"; shift; shift ;; + -- ) shift; break ;; + * ) break ;; + esac +done +if [[ "${HELP}" = "true" ]]; then +cat < Date: Mon, 1 Jul 2024 00:34:15 +0200 Subject: [PATCH 105/171] intermediate revision - fixed battery argument processing --- utils/generate_convert.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/generate_convert.sh b/utils/generate_convert.sh index 03c1be59a..12be6fa42 100755 --- a/utils/generate_convert.sh +++ b/utils/generate_convert.sh @@ -131,8 +131,9 @@ cat <>$SCRIPT check_remaining_battery () { STATE=\$(upower -i \$(upower -e | grep -i battery | head -1)| grep -E 'state: *' | awk '{print \$2}') MINUTES=\$(upower -i \$(upower -e | grep -i battery | head -1)| grep 'time to empty' | grep minutes | awk '{print \$4}' | sed 's|\.[0-9][0-9]*||') -if [[ "\${STATE}" -ne 'charging' ]] +if [[ "\${STATE}" -eq 'discharging' ]] # when the battery is charging the time to empty is meaningless +# NOTE: == / != is better than -eq / -ne , since -ne does not work then if [[ ! -z \$MINUTES ]] then From 5169c9479437f32bed94cb9ca7a3e5b170ccbbbd Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 2 Jul 2024 02:22:21 +0200 Subject: [PATCH 106/171] internediate revision - removed unneded options from "check_remaining_battery.sh" --- utils/check_remaining_battery.sh | 60 +++++++++++++------------------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/utils/check_remaining_battery.sh b/utils/check_remaining_battery.sh index d5823e2b8..d62a2b464 100755 --- a/utils/check_remaining_battery.sh +++ b/utils/check_remaining_battery.sh @@ -1,16 +1,16 @@ #!/bin/bash -OPTS=`getopt -o dhb: --long debug,help,battery: -h 'parse-options' -- "$@"` +# based on: https://www.cyberciti.biz/faq/linux-laptop-battery-status-temperature/ + +OPTS=`getopt -o hb: --long help,battery: -h 'parse-options' -- "$@"` if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi HELP=false -BATTERY_CHECK=false -SIZE=5 +BATTERY_SIZE=5 while true; do case "$1" in - -d | --debug ) DEBUG=true; shift ;; -h | --help ) HELP=true; shift ;; - -b | --battery ) BATTERY_CHECK=true; SIZE="$2"; shift; shift ;; + -b | --battery ) BATTERY_SIZE="$2"; shift; shift ;; -- ) shift; break ;; * ) break ;; esac @@ -18,75 +18,65 @@ done if [[ "${HELP}" = "true" ]]; then cat < Date: Thu, 1 Aug 2024 02:03:39 +0200 Subject: [PATCH 107/171] intermediate revision - begin refactoring the project into replica of jna pdh contrib and new code --- jna_pdh/pom.xml | 84 +------------------ .../ProcessorQueueLengthTest.java | 53 +++++------- 2 files changed, 23 insertions(+), 114 deletions(-) rename jna_pdh/src/test/java/{com/sun/jna/platform/win32 => example}/ProcessorQueueLengthTest.java (63%) diff --git a/jna_pdh/pom.xml b/jna_pdh/pom.xml index 9f01016a2..b62bfa271 100644 --- a/jna_pdh/pom.xml +++ b/jna_pdh/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.sun.jna.platform jna_pdh - 0.3.0-SNAPSHOT + 0.4.0-SNAPSHOT jar ${project.groupId}:${project.artifactId} jna pdh test @@ -204,88 +204,6 @@ - - diff --git a/jna_pdh/src/test/java/com/sun/jna/platform/win32/ProcessorQueueLengthTest.java b/jna_pdh/src/test/java/example/ProcessorQueueLengthTest.java similarity index 63% rename from jna_pdh/src/test/java/com/sun/jna/platform/win32/ProcessorQueueLengthTest.java rename to jna_pdh/src/test/java/example/ProcessorQueueLengthTest.java index 5745c35a2..13c7a6d67 100644 --- a/jna_pdh/src/test/java/com/sun/jna/platform/win32/ProcessorQueueLengthTest.java +++ b/jna_pdh/src/test/java/example/ProcessorQueueLengthTest.java @@ -1,6 +1,6 @@ -package com.sun.jna.platform.win32; +package example; /** - * Copyright 2022 Serguei Kouzmine + * Copyright 2022,2024 Serguei Kouzmine */ import static org.hamcrest.CoreMatchers.is; @@ -12,47 +12,44 @@ import org.junit.Test; import com.sun.jna.Native; +import com.sun.jna.platform.win32.Pdh; import com.sun.jna.platform.win32.Pdh.PDH_COUNTER_PATH_ELEMENTS; import com.sun.jna.platform.win32.Pdh.PDH_RAW_COUNTER; +import com.sun.jna.platform.win32.PdhMsg; import com.sun.jna.platform.win32.WinDef.DWORD; import com.sun.jna.platform.win32.WinDef.DWORDByReference; +import com.sun.jna.platform.win32.WinError; import com.sun.jna.platform.win32.WinNT.HANDLE; import com.sun.jna.platform.win32.WinNT.HANDLEByReference; +import com.sun.jna.platform.win32.AbstractWin32TestSupport; @SuppressWarnings({ "deprecation", "unused" }) public class ProcessorQueueLengthTest extends AbstractWin32TestSupport { private static final Pdh pdh = Pdh.INSTANCE; - private static void showRawCounterData(PrintStream out, String counterName, - PDH_RAW_COUNTER rawCounter) { - out.append('\t').append(counterName).append(" ") - .append(String.valueOf(rawCounter.TimeStamp.toDate())).append(" 1st=") - .append(String.valueOf(rawCounter.FirstValue)).append(" 2nd=") + private static void showRawCounterData(PrintStream out, String counterName, PDH_RAW_COUNTER rawCounter) { + out.append('\t').append(counterName).append(" ").append(String.valueOf(rawCounter.TimeStamp.toDate())) + .append(" 1st=").append(String.valueOf(rawCounter.FirstValue)).append(" 2nd=") .append(String.valueOf(rawCounter.SecondValue)).append(" multi=") .append(String.valueOf(rawCounter.MultiCount)).println(); } - private static String makeCounterPath(Pdh pdh, - PDH_COUNTER_PATH_ELEMENTS pathElements) { + private static String makeCounterPath(Pdh pdh, PDH_COUNTER_PATH_ELEMENTS pathElements) { DWORDByReference pcchBufferSize = new DWORDByReference(); int status = pdh.PdhMakeCounterPath(pathElements, null, pcchBufferSize, 0); - assertThat("Unexpected status code: 0x" + Integer.toHexString(status), - status, is(PdhMsg.PDH_MORE_DATA)); + assertThat("Unexpected status code: 0x" + Integer.toHexString(status), status, is(PdhMsg.PDH_MORE_DATA)); DWORD bufSize = pcchBufferSize.getValue(); int numChars = bufSize.intValue(); - assertThat("Bad required buffer size: " + numChars, numChars, - greaterThan(0)); + assertThat("Bad required buffer size: " + numChars, numChars, greaterThan(0)); char[] szFullPathBuffer = new char[numChars + 1 /* the \0 */]; pcchBufferSize.setValue(new DWORD(szFullPathBuffer.length)); - assertThat("Error in PdhMakeCounterPath", pdh - .PdhMakeCounterPath(pathElements, szFullPathBuffer, pcchBufferSize, 0), - is(WinError.ERROR_SUCCESS)); + assertThat("Error in PdhMakeCounterPath", + pdh.PdhMakeCounterPath(pathElements, szFullPathBuffer, pcchBufferSize, 0), is(WinError.ERROR_SUCCESS)); return Native.toString(szFullPathBuffer); } - @Test public void test() { PDH_COUNTER_PATH_ELEMENTS elems = new PDH_COUNTER_PATH_ELEMENTS(); @@ -63,36 +60,30 @@ public void test() { String counterName = makeCounterPath(pdh, elems); HANDLEByReference ref = new HANDLEByReference(); - assertThat("Error in PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), - is(WinError.ERROR_SUCCESS)); + assertThat("Error in PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), is(WinError.ERROR_SUCCESS)); HANDLE hQuery = ref.getValue(); try { ref.setValue(null); - assertThat("Error in PdhAddEnglishCounter", - pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), + assertThat("Error in PdhAddEnglishCounter", pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), is(WinError.ERROR_SUCCESS)); HANDLE hCounter = ref.getValue(); try { - assertThat("Error in PdhCollectQueryData call", - pdh.PdhCollectQueryData(hQuery), is(WinError.ERROR_SUCCESS)); + assertThat("Error in PdhCollectQueryData call", pdh.PdhCollectQueryData(hQuery), + is(WinError.ERROR_SUCCESS)); DWORDByReference lpdwType = new DWORDByReference(); PDH_RAW_COUNTER rawCounter = new PDH_RAW_COUNTER(); - assertThat("Error in PdhGetRawCounterValue", - pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), - is(WinError.ERROR_SUCCESS)); - assertThat("unexected Counter data status", rawCounter.CStatus, + assertThat("Error in PdhGetRawCounterValue", pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), is(WinError.ERROR_SUCCESS)); + assertThat("unexected Counter data status", rawCounter.CStatus, is(WinError.ERROR_SUCCESS)); showRawCounterData(System.out, counterName, rawCounter); } finally { - assertThat("Error in PdhRemoveCounter", pdh.PdhRemoveCounter(hCounter), - is(WinError.ERROR_SUCCESS)); + assertThat("Error in PdhRemoveCounter", pdh.PdhRemoveCounter(hCounter), is(WinError.ERROR_SUCCESS)); } } finally { - assertThat("Error in PdhCloseQuery", pdh.PdhCloseQuery(hQuery), - is(WinError.ERROR_SUCCESS)); + assertThat("Error in PdhCloseQuery", pdh.PdhCloseQuery(hQuery), is(WinError.ERROR_SUCCESS)); } } } From d5ed55b3c54148dd3d594e062fbba09835d9b965 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 2 Aug 2024 02:55:53 +0200 Subject: [PATCH 108/171] intermediate revision - removed original PdhTest class --- jna_pdh/README.md | 11 +- jna_pdh/pom.xml | 2 +- .../platform/AbstractPlatformTestSupport.java | 1 - .../win32/AbstractWin32TestSupport.java | 301 +++++++++--------- .../com/sun/jna/platform/win32/PdhTest.java | 252 --------------- 5 files changed, 169 insertions(+), 398 deletions(-) delete mode 100644 jna_pdh/src/test/java/com/sun/jna/platform/win32/PdhTest.java diff --git a/jna_pdh/README.md b/jna_pdh/README.md index 97dff877d..33584ab18 100644 --- a/jna_pdh/README.md +++ b/jna_pdh/README.md @@ -1,8 +1,15 @@ ### Info this directory contains -a fragment of the `PDHTest.java` [test class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/PdhTest.java) from -[jna](https://github.com/java-native-access/jna) project focusing on collecting the Windows Performance Counters metrics, +a derivative of the `PDHTest.java` [test class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/PdhTest.java) +and its dependencies + * `AbstractPlatformTestSupport` [class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/AbstractPlatformTestSupport.java) + * `AbstractWin32TestSupport` [class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/AbstractWin32TestSupport.java) + + from +[jna](https://github.com/java-native-access/jna) contribution project + +focusing on collecting the Windows specific __Performance Counters__ metrics, for example the `System\Processor Queue Length` or `Processor\0\% Processor Time` where the notation is: diff --git a/jna_pdh/pom.xml b/jna_pdh/pom.xml index b62bfa271..74696c327 100644 --- a/jna_pdh/pom.xml +++ b/jna_pdh/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.sun.jna.platform jna_pdh - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT jar ${project.groupId}:${project.artifactId} jna pdh test diff --git a/jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java b/jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java index 309515c4d..b2b45272c 100644 --- a/jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java +++ b/jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java @@ -26,7 +26,6 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.rules.TestName; - /** * @author lgoldstein */ diff --git a/jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java b/jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java index b6952a034..b7401ac1c 100644 --- a/jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java +++ b/jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java @@ -36,158 +36,175 @@ import java.util.Arrays; import java.util.Collections; + public abstract class AbstractWin32TestSupport extends AbstractPlatformTestSupport { - protected AbstractWin32TestSupport() { - super(); - } + protected AbstractWin32TestSupport() { + super(); + } - /** - * Makes sure that the method names (which represent APIs) do not repeat - * themselves. This check is in order where APIs are WIN32 API functions - * since these are C functions - which means no overloading is possible. - * - * @param ifc The interface (not checked) class to test - * @see #detectDuplicateMethods(Class) - */ - public static final void assertNoDuplicateMethodsNames(Class ifc) { - Collection dupSet = detectDuplicateMethods(ifc); - assertTrue("Duplicate names found in " + ifc.getSimpleName() + ": " + dupSet, dupSet.isEmpty()); - } + /** + * Makes sure that the method names (which represent APIs) do not repeat + * themselves. This check is in order where APIs are WIN32 API + * functions since these are C functions - which means no overloading + * is possible. + * + * @param ifc + * The interface (not checked) class to test + * @see #detectDuplicateMethods(Class) + */ + public static final void assertNoDuplicateMethodsNames(Class ifc) { + Collection dupSet = detectDuplicateMethods(ifc); + assertTrue("Duplicate names found in " + ifc.getSimpleName() + ": " + dupSet, dupSet.isEmpty()); + } - /** - * Checks if there are methods with the same name - regardless of the signature - * - * @param ifc The interface (not checked) class to test - * @return The {@link Set} of duplicate names - empty if no duplicates - */ - public static final Set detectDuplicateMethods(Class ifc) { - Method[] methods = ifc.getMethods(); - Set nameSet = new HashSet(methods.length); - Set dupSet = new HashSet(); - for (Method m : methods) { - String name = m.getName(); - if (!nameSet.add(name)) { - dupSet.add(name); - } - } + /** + * Checks if there are methods with the same name - regardless of the + * signature + * + * @param ifc + * The interface (not checked) class to test + * @return The {@link Set} of duplicate names - empty if no duplicates + */ + public static final Set detectDuplicateMethods(Class ifc) { + Method[] methods = ifc.getMethods(); + Set nameSet = new HashSet(methods.length); + Set dupSet = new HashSet(); + for (Method m : methods) { + String name = m.getName(); + if (!nameSet.add(name)) { + dupSet.add(name); + } + } - return dupSet; - } + return dupSet; + } - /** - * Checks if the API call result is {@code true}. If not, then calls - * {@link Kernel32#GetLastError()} and fails with the error code. - * Note: if the error code is {@link WinError#ERROR_SUCCESS} - * then an "unknown reason code" is reported - * @param message Message to display if call failed - * @param result The API call result - */ - public static final void assertCallSucceeded(String message, boolean result) { - if (result) { - return; - } + /** + * Checks if the API call result is {@code true}. If not, then calls + * {@link Kernel32#GetLastError()} and fails with the error code. + * Note: if the error code is {@link WinError#ERROR_SUCCESS} then an + * "unknown reason code" is reported + * + * @param message + * Message to display if call failed + * @param result + * The API call result + */ + public static final void assertCallSucceeded(String message, boolean result) { + if (result) { + return; + } - int hr = Kernel32.INSTANCE.GetLastError(); - if (hr == WinError.ERROR_SUCCESS) { - fail(message + " failed with unknown reason code"); - } else { - fail(message + " failed: hr=" + hr + " - 0x" + Integer.toHexString(hr)); - } - } + int hr = Kernel32.INSTANCE.GetLastError(); + if (hr == WinError.ERROR_SUCCESS) { + fail(message + " failed with unknown reason code"); + } else { + fail(message + " failed: hr=" + hr + " - 0x" + Integer.toHexString(hr)); + } + } - /** - * Checks if the status code is ERROR_SUCCESS - * @param message Message to display if code is an error - * @param statusCode Status code to check - * @param showHex If status code is not error success then show it as HEX - */ - public static final void assertErrorSuccess(String message, int statusCode, boolean showHex) { - if (showHex) { - if (statusCode != WinError.ERROR_SUCCESS) { - fail(message + " - failed - hr=0x" + Integer.toHexString(statusCode)); - } - } else { - assertEquals(message, WinError.ERROR_SUCCESS, statusCode); - } - } + /** + * Checks if the status code is ERROR_SUCCESS + * + * @param message + * Message to display if code is an error + * @param statusCode + * Status code to check + * @param showHex + * If status code is not error success then show it as HEX + */ + public static final void assertErrorSuccess(String message, int statusCode, boolean showHex) { + if (showHex) { + if (statusCode != WinError.ERROR_SUCCESS) { + fail(message + " - failed - hr=0x" + Integer.toHexString(statusCode)); + } + } else { + assertEquals(message, WinError.ERROR_SUCCESS, statusCode); + } + } - /** - * Makes sure that the handle argument is not {@code null} or {@link WinBase#INVALID_HANDLE_VALUE}. - * If invalid handle detected, then it invokes {@link Kernel32#GetLastError()} - * in order to display the error code - * @param message Message to display if bad handle - * @param handle The {@link HANDLE} to test - * @return The same as the input handle if good handle - otherwise does - * not return and throws an assertion error - */ - public static final HANDLE assertValidHandle(String message, HANDLE handle) { - if ((handle == null) || WinBase.INVALID_HANDLE_VALUE.equals(handle)) { - int hr = Kernel32.INSTANCE.GetLastError(); - if (hr == WinError.ERROR_SUCCESS) { - fail(message + " failed with unknown reason code"); - } else { - fail(message + " failed: hr=" + hr + " - 0x" + Integer.toHexString(hr)); - } - } + /** + * Makes sure that the handle argument is not {@code null} or + * {@link WinBase#INVALID_HANDLE_VALUE}. If invalid handle detected, then it + * invokes {@link Kernel32#GetLastError()} in order to display the error + * code + * + * @param message + * Message to display if bad handle + * @param handle + * The {@link HANDLE} to test + * @return The same as the input handle if good handle - otherwise does not + * return and throws an assertion error + */ + public static final HANDLE assertValidHandle(String message, HANDLE handle) { + if ((handle == null) || WinBase.INVALID_HANDLE_VALUE.equals(handle)) { + int hr = Kernel32.INSTANCE.GetLastError(); + if (hr == WinError.ERROR_SUCCESS) { + fail(message + " failed with unknown reason code"); + } else { + fail(message + " failed: hr=" + hr + " - 0x" + Integer.toHexString(hr)); + } + } - return handle; - } + return handle; + } - public static final LCID systemLCID = Kernel32.INSTANCE.GetSystemDefaultLCID(); - public static final boolean isEnglishLocale = - systemLCID.intValue() == 0x409 // en_US - || systemLCID.intValue() == 0x809 // en_GB - ; + public static final LCID systemLCID = Kernel32.INSTANCE.GetSystemDefaultLCID(); + public static final boolean isEnglishLocale = systemLCID.intValue() == 0x409 // en_US + || systemLCID.intValue() == 0x809 // en_GB + ; - public static void killProcessByName(String filename) { - HANDLE hSnapShot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(TH32CS_SNAPALL, null); - Tlhelp32.PROCESSENTRY32 process = new Tlhelp32.PROCESSENTRY32(); - boolean hRes = Kernel32.INSTANCE.Process32First(hSnapShot, process); - while (hRes) { - String imageName = Native.toString(process.szExeFile); - if (imageName.equalsIgnoreCase(filename)) { - HANDLE hProcess = Kernel32.INSTANCE.OpenProcess(Kernel32.PROCESS_TERMINATE, false, process.th32ProcessID.intValue()); - if (hProcess != null) { - Kernel32.INSTANCE.TerminateProcess(hProcess, 9); - Kernel32.INSTANCE.CloseHandle(hProcess); - } - } - hRes = Kernel32.INSTANCE.Process32Next(hSnapShot, process); - } - Kernel32.INSTANCE.CloseHandle(hSnapShot); - } + public static void killProcessByName(String filename) { + HANDLE hSnapShot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(TH32CS_SNAPALL, null); + Tlhelp32.PROCESSENTRY32 process = new Tlhelp32.PROCESSENTRY32(); + boolean hRes = Kernel32.INSTANCE.Process32First(hSnapShot, process); + while (hRes) { + String imageName = Native.toString(process.szExeFile); + if (imageName.equalsIgnoreCase(filename)) { + HANDLE hProcess = Kernel32.INSTANCE.OpenProcess(Kernel32.PROCESS_TERMINATE, false, + process.th32ProcessID.intValue()); + if (hProcess != null) { + Kernel32.INSTANCE.TerminateProcess(hProcess, 9); + Kernel32.INSTANCE.CloseHandle(hProcess); + } + } + hRes = Kernel32.INSTANCE.Process32Next(hSnapShot, process); + } + Kernel32.INSTANCE.CloseHandle(hSnapShot); + } - /** - * Return true if the supplied uuid can be found in the registry. - * - * @param uuid Format: {<UID>} - */ - public static boolean checkCOMRegistered(String uuid) { - WinReg.HKEYByReference phkKey = null; - try { - phkKey = Advapi32Util.registryGetKey(WinReg.HKEY_CLASSES_ROOT, "Interface\\" + uuid, WinNT.KEY_READ); - if(phkKey != null) { - return true; - } - } catch (Win32Exception ex) { - // Ok - failed ... - } finally { - if(phkKey != null && phkKey.getValue() != null) { - Advapi32Util.registryCloseKey(phkKey.getValue()); - } - } - try { - phkKey = Advapi32Util.registryGetKey(WinReg.HKEY_CLASSES_ROOT, "CLSID\\" + uuid, WinNT.KEY_READ); - if(phkKey != null) { - return true; - } - } catch (Win32Exception ex) { - // Ok - failed ... - } finally { - if(phkKey != null && phkKey.getValue() != null) { - Advapi32Util.registryCloseKey(phkKey.getValue()); - } - } - return false; - } + /** + * Return true if the supplied uuid can be found in the registry. + * + * @param uuid + * Format: {<UID>} + */ + public static boolean checkCOMRegistered(String uuid) { + WinReg.HKEYByReference phkKey = null; + try { + phkKey = Advapi32Util.registryGetKey(WinReg.HKEY_CLASSES_ROOT, "Interface\\" + uuid, WinNT.KEY_READ); + if (phkKey != null) { + return true; + } + } catch (Win32Exception ex) { + // Ok - failed ... + } finally { + if (phkKey != null && phkKey.getValue() != null) { + Advapi32Util.registryCloseKey(phkKey.getValue()); + } + } + try { + phkKey = Advapi32Util.registryGetKey(WinReg.HKEY_CLASSES_ROOT, "CLSID\\" + uuid, WinNT.KEY_READ); + if (phkKey != null) { + return true; + } + } catch (Win32Exception ex) { + // Ok - failed ... + } finally { + if (phkKey != null && phkKey.getValue() != null) { + Advapi32Util.registryCloseKey(phkKey.getValue()); + } + } + return false; + } } diff --git a/jna_pdh/src/test/java/com/sun/jna/platform/win32/PdhTest.java b/jna_pdh/src/test/java/com/sun/jna/platform/win32/PdhTest.java deleted file mode 100644 index a32080c73..000000000 --- a/jna_pdh/src/test/java/com/sun/jna/platform/win32/PdhTest.java +++ /dev/null @@ -1,252 +0,0 @@ -/* Copyright (c) 2007 Timothy Wall, All Rights Reserved - * - * The contents of this file is dual-licensed under 2 - * alternative Open Source/Free licenses: LGPL 2.1 or later and - * Apache License 2.0. (starting with JNA version 4.0.0). - * - * You can freely decide which license you want to apply to - * the project. - * - * You may obtain a copy of the LGPL License at: - * - * http://www.gnu.org/licenses/licenses.html - * - * A copy is also included in the downloadable source code package - * containing JNA, in file "LGPL2.1". - * - * You may obtain a copy of the Apache License at: - * - * http://www.apache.org/licenses/ - * - * A copy is also included in the downloadable source code package - * containing JNA, in file "AL2.0". - */ -package com.sun.jna.platform.win32; - -import java.io.PrintStream; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; - -import org.junit.Ignore; -import org.junit.Test; - -import com.sun.jna.Native; -import com.sun.jna.platform.win32.Pdh.PDH_COUNTER_PATH_ELEMENTS; -import com.sun.jna.platform.win32.Pdh.PDH_RAW_COUNTER; -import com.sun.jna.platform.win32.PdhUtil.PdhEnumObjectItems; -import com.sun.jna.platform.win32.PdhUtil.PdhException; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.DWORDByReference; -import com.sun.jna.platform.win32.WinNT.HANDLE; -import com.sun.jna.platform.win32.WinNT.HANDLEByReference; - -/** - * @author lgoldstein - */ -public class PdhTest extends AbstractWin32TestSupport { - private static final Pdh pdh = Pdh.INSTANCE; - - @Ignore - @Test - public void testQueryOneCounter() { - PDH_COUNTER_PATH_ELEMENTS elems = new PDH_COUNTER_PATH_ELEMENTS(); - elems.szObjectName = "Processor"; - elems.szInstanceName = "_Total"; - elems.szCounterName = "% Processor Time"; - String counterName = makeCounterPath(pdh, elems); - - HANDLEByReference ref = new HANDLEByReference(); - assertErrorSuccess("PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), true); - - HANDLE hQuery = ref.getValue(); - try { - ref.setValue(null); - assertErrorSuccess("PdhAddEnglishCounter", - pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), true); - - HANDLE hCounter = ref.getValue(); - try { - assertErrorSuccess("PdhCollectQueryData", - pdh.PdhCollectQueryData(hQuery), true); - - DWORDByReference lpdwType = new DWORDByReference(); - PDH_RAW_COUNTER rawCounter = new PDH_RAW_COUNTER(); - assertErrorSuccess("PdhGetRawCounterValue", - pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), true); - assertEquals("Bad counter data status", PdhMsg.PDH_CSTATUS_VALID_DATA, - rawCounter.CStatus); - - DWORD dwType = lpdwType.getValue(); - int typeValue = dwType.intValue(); - // see - // https://technet.microsoft.com/en-us/library/cc786359(v=ws.10).aspx - assertEquals("Mismatched counter type", WinPerf.PERF_100NSEC_TIMER_INV, - typeValue); - showRawCounterData(System.out, counterName, rawCounter); - } finally { - assertErrorSuccess("PdhRemoveCounter", pdh.PdhRemoveCounter(hCounter), - true); - } - } finally { - assertErrorSuccess("PdhCloseQuery", pdh.PdhCloseQuery(hQuery), true); - } - } - - @Ignore - @Test - public void testQueryMultipleCounters() { - Collection names = new LinkedList(); - PDH_COUNTER_PATH_ELEMENTS elems = new PDH_COUNTER_PATH_ELEMENTS(); - elems.szObjectName = "Processor"; - elems.szInstanceName = "_Total"; - for (String n : new String[] { "% Processor Time", "% Idle Time", - "% User Time" }) { - elems.szCounterName = n; - String counterName = makeCounterPath(pdh, elems); - names.add(counterName); - } - - HANDLEByReference ref = new HANDLEByReference(); - assertErrorSuccess("PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), true); - - HANDLE hQuery = ref.getValue(); - try { - Map handlesMap = new HashMap( - names.size()); - try { - for (String counterName : names) { - ref.setValue(null); - assertErrorSuccess("PdhAddCounter[" + counterName + "]", - pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), true); - - HANDLE hCounter = ref.getValue(); - handlesMap.put(counterName, hCounter); - } - - assertErrorSuccess("PdhCollectQueryData", - pdh.PdhCollectQueryData(hQuery), true); - - for (Map.Entry ch : handlesMap.entrySet()) { - String counterName = ch.getKey(); - HANDLE hCounter = ch.getValue(); - PDH_RAW_COUNTER rawCounter = new PDH_RAW_COUNTER(); - DWORDByReference lpdwType = new DWORDByReference(); - assertErrorSuccess("PdhGetRawCounterValue[" + counterName + "]", - pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), true); - assertEquals("Bad counter data status for " + counterName, - PdhMsg.PDH_CSTATUS_VALID_DATA, rawCounter.CStatus); - showRawCounterData(System.out, counterName, rawCounter); - } - } finally { - names.clear(); - - for (Map.Entry ch : handlesMap.entrySet()) { - String name = ch.getKey(); - HANDLE hCounter = ch.getValue(); - int status = pdh.PdhRemoveCounter(hCounter); - if (status != WinError.ERROR_SUCCESS) { - names.add(name); - } - } - - if (names.size() > 0) { - fail("Failed to remove counters: " + names); - } - } - } finally { - assertErrorSuccess("PdhCloseQuery", pdh.PdhCloseQuery(hQuery), true); - } - } - - private static void showRawCounterData(PrintStream out, String counterName, - PDH_RAW_COUNTER rawCounter) { - out.append('\t').append(counterName).append(" ") - .append(String.valueOf(rawCounter.TimeStamp.toDate())).append(" 1st=") - .append(String.valueOf(rawCounter.FirstValue)).append(" 2nd=") - .append(String.valueOf(rawCounter.SecondValue)).append(" multi=") - .append(String.valueOf(rawCounter.MultiCount)).println(); - } - - private static String makeCounterPath(Pdh pdh, - PDH_COUNTER_PATH_ELEMENTS pathElements) { - DWORDByReference pcchBufferSize = new DWORDByReference(); - int status = pdh.PdhMakeCounterPath(pathElements, null, pcchBufferSize, 0); - assertEquals("Unexpected status code: 0x" + Integer.toHexString(status), - PdhMsg.PDH_MORE_DATA, status); - - DWORD bufSize = pcchBufferSize.getValue(); - int numChars = bufSize.intValue(); - assertTrue("Bad required buffer size: " + numChars, numChars > 0); - - char[] szFullPathBuffer = new char[numChars + 1 /* the \0 */]; - pcchBufferSize.setValue(new DWORD(szFullPathBuffer.length)); - assertErrorSuccess("PdhMakeCounterPath", pdh.PdhMakeCounterPath( - pathElements, szFullPathBuffer, pcchBufferSize, 0), true); - - return Native.toString(szFullPathBuffer); - } - - @Ignore - @Test - public void testLookupPerfIndex() { - int processorIndex = 238; - String processorStr = "Processor"; // English locale - - // Test index-to-name - String testStr = PdhUtil.PdhLookupPerfNameByIndex(null, processorIndex); - if (AbstractWin32TestSupport.isEnglishLocale) { - assertEquals(processorStr, testStr); - } else { - assertTrue(testStr.length() > 0); - } - - // Test name-to-index - DWORDByReference pdwIndex = new DWORDByReference(); - Pdh.INSTANCE.PdhLookupPerfIndexByName(null, testStr, pdwIndex); - assertEquals(processorIndex, pdwIndex.getValue().intValue()); - - // Test English name to index - assertEquals(processorIndex, - PdhUtil.PdhLookupPerfIndexByEnglishName(processorStr)); - } - - @Ignore - @Test - public void testEnumObjectItems() { - if (AbstractWin32TestSupport.isEnglishLocale) { - String processorStr = "Processor"; - String processorTimeStr = "% Processor Time"; - - // Fetch the counter and instance names - PdhEnumObjectItems objects = PdhUtil.PdhEnumObjectItems(null, null, - processorStr, 100); - - assertTrue(objects.getInstances().contains("0")); - assertTrue(objects.getInstances().contains("_Total")); - - // Should have a "% Processor Time" counter - assertTrue(objects.getCounters().contains(processorTimeStr)); - } else { - System.err.println( - "testEnumObjectItems test can only be run with english locale."); - } - } - - @Ignore - @Test - public void testEnumObjectItemsNonExisting() { - Exception caughtException = null; - try { - PdhUtil.PdhEnumObjectItems(null, null, "Unknown counter", 100); - } catch (Exception ex) { - caughtException = ex; - } - assertNotNull(caughtException); - assertTrue(caughtException instanceof PdhException); - assertEquals(Pdh.PDH_CSTATUS_NO_OBJECT, - ((PdhException) caughtException).getErrorCode()); - } - -} From 382b6328cc2d9d786a98592b1da45009e4af1d0c Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 5 Aug 2024 04:54:50 +0200 Subject: [PATCH 109/171] added note to README.md --- jna_pdh/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jna_pdh/README.md b/jna_pdh/README.md index 33584ab18..01140d17d 100644 --- a/jna_pdh/README.md +++ b/jna_pdh/README.md @@ -7,8 +7,11 @@ and its dependencies * `AbstractWin32TestSupport` [class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/AbstractWin32TestSupport.java) from -[jna](https://github.com/java-native-access/jna) contribution project +[jna](https://github.com/java-native-access/jna) contribution project. +Note, that since the code above is part of the test, it is not included in the `jna-platform.jar` released to [Maven Central](https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform) (the `Pdh.java` is ) + +The test is focusing on collecting the Windows specific __Performance Counters__ metrics, for example the `System\Processor Queue Length` or `Processor\0\% Processor Time` where the notation is: From 2ecf6217577ce28a944af8488373ae806659b2d0 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 6 Aug 2024 16:23:37 -0400 Subject: [PATCH 110/171] moved jna projects to "springboot_study" repository --- jna_autoit/README.md | 321 ----- jna_autoit/pom.xml | 144 -- jna_autoit/src/main/java/example/AutoItX.java | 1280 ----------------- .../src/main/java/example/AutoItXLibrary.java | 471 ------ .../java/example/AutoItXLibraryGenerator.java | 71 - .../src/main/java/example/Constants.java | 93 -- .../src/main/java/example/UnsignedInt.java | 29 - .../src/main/resources/AutoItX3.Assembly.dll | Bin 42664 -> 0 bytes .../main/resources/AutoItX3.PowerShell.dll | Bin 51376 -> 0 bytes jna_autoit/src/main/resources/AutoItX3.dll | Bin 465080 -> 0 bytes .../src/main/resources/AutoItX3_x64.dll | Bin 524472 -> 0 bytes jna_autoit/src/test/java/example/AU3Test.java | 266 ---- .../src/test/java/example/AutoItTest.java | 331 ----- .../test/java/example/EnvironmentTest.java | 47 - .../src/test/java/example/FirefoxTest.java | 245 ---- .../InternetExplorerMultiThreadTest.java | 169 --- .../java/example/InternetExplorerTest.java | 134 -- jna_autoit/src/test/java/example/Utils.java | 40 - jna_pdh/README.md | 113 -- jna_pdh/pom.xml | 209 --- .../platform/AbstractPlatformTestSupport.java | 42 - .../win32/AbstractWin32TestSupport.java | 210 --- .../example/ProcessorQueueLengthTest.java | 89 -- jna_versioninfo/README.md | 87 -- jna_versioninfo/pom.xml | 305 ---- .../src/test/java/example/VersionHelpers.java | 158 -- .../test/java/example/VersionHelpersTest.java | 85 -- 27 files changed, 4939 deletions(-) delete mode 100644 jna_autoit/README.md delete mode 100644 jna_autoit/pom.xml delete mode 100644 jna_autoit/src/main/java/example/AutoItX.java delete mode 100644 jna_autoit/src/main/java/example/AutoItXLibrary.java delete mode 100644 jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java delete mode 100644 jna_autoit/src/main/java/example/Constants.java delete mode 100644 jna_autoit/src/main/java/example/UnsignedInt.java delete mode 100755 jna_autoit/src/main/resources/AutoItX3.Assembly.dll delete mode 100755 jna_autoit/src/main/resources/AutoItX3.PowerShell.dll delete mode 100755 jna_autoit/src/main/resources/AutoItX3.dll delete mode 100755 jna_autoit/src/main/resources/AutoItX3_x64.dll delete mode 100644 jna_autoit/src/test/java/example/AU3Test.java delete mode 100644 jna_autoit/src/test/java/example/AutoItTest.java delete mode 100644 jna_autoit/src/test/java/example/EnvironmentTest.java delete mode 100644 jna_autoit/src/test/java/example/FirefoxTest.java delete mode 100644 jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java delete mode 100644 jna_autoit/src/test/java/example/InternetExplorerTest.java delete mode 100644 jna_autoit/src/test/java/example/Utils.java delete mode 100644 jna_pdh/README.md delete mode 100644 jna_pdh/pom.xml delete mode 100644 jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java delete mode 100644 jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java delete mode 100644 jna_pdh/src/test/java/example/ProcessorQueueLengthTest.java delete mode 100644 jna_versioninfo/README.md delete mode 100644 jna_versioninfo/pom.xml delete mode 100644 jna_versioninfo/src/test/java/example/VersionHelpers.java delete mode 100644 jna_versioninfo/src/test/java/example/VersionHelpersTest.java diff --git a/jna_autoit/README.md b/jna_autoit/README.md deleted file mode 100644 index 0f3cc6889..000000000 --- a/jna_autoit/README.md +++ /dev/null @@ -1,321 +0,0 @@ -### Info - -This project started from a replica of [JNAutoIt - JNA AutoitX dll wrapper](https://github.com/midorlo/JNAutoIt) -project by Michael Dorlöchter that offers a [Java Native Access](https://en.wikipedia.org/wiki/Java_Native_Access) -based providing dynamically invoked core AutoitX [functions](https://documentation.help/AutoItX/) methods -wrappers `AU3_*` -that are exported from the vendor dll which can be e.g. installed from -[Nuget package for AutoitX](https://www.nuget.org/packages/AutoItX/) with no -COM dll registration nor application installation. - -Since code differences are somewhat big, no upstream PR is available at this time. - -### Project Goals - -Unfortunately for the Java developer the original `AutoItXLibrary` interface method signatures are too low level - -This project adds a few more java-friendly methods like -```java -public String WinGetText(String title, String text) { -// ... -} -``` - -compared to underlying -```java -public void AU3_WinGetText(WString title, WString text, LPWSTR resultPointer, int bufSize) { -// ... -} -``` -both wrapping the [WinGetText](https://www.autoitscript.com/autoit3/docs/functions/WinGetText.htm) method for retrieving the text from a window. -```basic -WinGetText -Retrieves the text from a window. - -WinGetText ( "title" [, "text"] ) -``` -to `AutoItX`. This greately simplifies interacting with AutoIt, see below. - -Currently extended with Java-friendly signatures are the following metods: - - * `AutoItSetOption` - * `ClipGet` - * `ClipPut` - * `ControlCommand` - * `ControlClick` - * `ControlFocus` - * `ControlGetPos` - * `ControlGetText` - * `ControlShow` - * `ControlHide` - * `ControlSend` - * `DriveMapAdd` - * `DriveMapDel` - * `DriveMapGet` - * `MouseGetPos` - * `MouseClick` - * `ProcessClose` - * `ProcessExists` - * `ProcessWaitClose` - * `Run` - * `RunAs` - * `RunWait` - * `Send` - * `ToolTip` - * `WinActivate` - * `WinActive` - * `WinClose` - * `WinExists` - * `WinGetClassList` - * `WinGetHandle` - * `WinGetHandleAsText` - * `WinGetTextByHandle` - * `WinGetPos` - * `WinGetText` - * `WinGetState` - * `WinGetTitle` - * `WinSetOnTop` - * `WinSetState` - * `WinSetTitle` - * `WinKill` - * `WinMenuSelectItem` - * `WinClose` - * `WinWaitActive` - * `WinWaitNotActive` - -This addresses the anticipated needs of AutoIt with Selenium testing. - -Converting all methods is a work in progress (adequate tests might be a bit of a challenge). - -### Example Usage - -#### Save the downloaded File under desired Path - -This is much lightweight compared to the -original [file Upload Example using AutoIT and with Selenium Webdriver](https://www.guru99.com/use-autoit-selenium.html) recipe. -which requires an full "compile script to exe" -Windows executable generation from the following sample `.au3` [script](https://automated-testing.info/t/webdriver-features-rabota-s-upload-popup-windows-native-okno-pri-pomoshhi-selenium-web-driver/2288): -```basic -WinWaitActive("Open") // ждем активности Windows окна Open -Send("D:\AutoIT-commands\TestingVideo.mp4") //Отправляем иму путь к файлу (фокус по умолчанию стоит на текст-боксе где прописываеться путь к файлу) -Send("{ENTER}") //эмулируем нажатие клавиши Enter (а-ля загрузить) -``` - -```java -import example.AutoItX; -// pending PR -// import de.midorlo.jnautoit.jna.AutoItX; - - String windowTitle = "Save"; - String windowText = ""; - AutoItX instance = AutoItX.getInstance(); - String filePath = "C:\\Users\\user\\Downloads\\TestingVideo.mp4"; - // Selenium test launches file download - instance.WinWaitActive(windowTitle, windowText); - instance.Send(filePath); - instance.Send("\n"); -``` - -#### Change page Zoom or restore 100% zoom Settings - -The JNA verion supports the genuine [AutoIt keys and modifiers](https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm) - -```java -import example.AutoItX; - - @Test(enabled = true) - public void testZoomFirefoxBrowser() { - System.err.println("Close Mozilla Firefox Browser"); - title = "Mozilla Firefox Start Page"; - instance.AutoItSetOption("SendKeyDownDelay", 30); - instance.AutoItSetOption("SendKeyDelay", 10); - // zoom out four times - for (int cnt = 0 ; cnt!=4; cnt++){ - instance.Send("^-", true); - sleep(1000); - } - // zoom 100 % - instance.Send("^0", true); - sleep(1000); - // CTLR + is a bit tricky since the '+' itself has a special meaning - // zoom in 2 times - instance.Send("^{+}^{+}", true); - sleep(1000); - instance.WinClose(title, text); -``` - -### TODO: - - -One can generate the dump list of the `AutoItX3_x64.dll` exports using Visual Studio linker tool (platform-specific version): - -```cmd - -"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\link.exe" /dump /exports AutoItX3_x64.dll - AU3_AutoItSetOption - AU3_ClipGet - AU3_ClipPut - AU3_ControlClick - AU3_ControlClickByHandle - AU3_ControlCommand - AU3_ControlCommandByHandle - AU3_ControlDisable - AU3_ControlDisableByHandle - AU3_ControlEnable - AU3_ControlEnableByHandle - AU3_ControlFocus - AU3_ControlFocusByHandle - AU3_ControlGetFocus - AU3_ControlGetFocusByHandle - AU3_ControlGetHandle - AU3_ControlGetHandleAsText - AU3_ControlGetPos - AU3_ControlGetPosByHandle - AU3_ControlGetText - AU3_ControlGetTextByHandle - AU3_ControlHide - AU3_ControlHideByHandle - AU3_ControlListView - AU3_ControlListViewByHandle - AU3_ControlMove - AU3_ControlMoveByHandle - AU3_ControlSend - AU3_ControlSendByHandle - AU3_ControlSetText - AU3_ControlSetTextByHandle - AU3_ControlShow - AU3_ControlShowByHandle - AU3_ControlTreeView - AU3_ControlTreeViewByHandle - AU3_DriveMapAdd - AU3_DriveMapDel - AU3_DriveMapGet - AU3_Init - AU3_IsAdmin - AU3_MouseClick - AU3_MouseClickDrag - AU3_MouseDown - AU3_MouseGetCursor - AU3_MouseGetPos - AU3_MouseMove - AU3_MouseUp - AU3_MouseWheel - AU3_Opt - AU3_PixelChecksum - AU3_PixelGetColor - AU3_PixelSearch - AU3_ProcessClose - AU3_ProcessExists - AU3_ProcessSetPriority - AU3_ProcessWait - AU3_ProcessWaitClose - AU3_Run - AU3_RunAs - AU3_RunAsWait - AU3_RunWait - AU3_Send - AU3_Shutdown - AU3_Sleep - AU3_StatusbarGetText - AU3_StatusbarGetTextByHandle - AU3_ToolTip - AU3_WinActivate - AU3_WinActivateByHandle - AU3_WinActive - AU3_WinActiveByHandle - AU3_WinClose - AU3_WinCloseByHandle - AU3_WinExists - AU3_WinExistsByHandle - AU3_WinGetCaretPos - AU3_WinGetClassList - AU3_WinGetClassListByHandle - AU3_WinGetClientSize - AU3_WinGetClientSizeByHandle - AU3_WinGetHandle - AU3_WinGetHandleAsText - AU3_WinGetPos - AU3_WinGetPosByHandle - AU3_WinGetProcess - AU3_WinGetProcessByHandle - AU3_WinGetState - AU3_WinGetStateByHandle - AU3_WinGetText - AU3_WinGetTextByHandle - AU3_WinGetTitle - AU3_WinGetTitleByHandle - AU3_WinKill - AU3_WinKillByHandle - AU3_WinMenuSelectItem - AU3_WinMenuSelectItemByHandle - AU3_WinMinimizeAll - AU3_WinMinimizeAllUndo - AU3_WinMove - AU3_WinMoveByHandle - AU3_WinSetOnTop - AU3_WinSetOnTopByHandle - AU3_WinSetState - AU3_WinSetStateByHandle - AU3_WinSetTitle - AU3_WinSetTitleByHandle - AU3_WinSetTrans - AU3_WinSetTransByHandle - AU3_WinWait - AU3_WinWaitActive - AU3_WinWaitActiveByHandle - AU3_WinWaitByHandle - AU3_WinWaitClose - AU3_WinWaitCloseByHandle - AU3_WinWaitNotActive - AU3_WinWaitNotActiveByHandle - AU3_error -``` -The plain java library generator is failing on a vanilla system: - -```cmd -java -cp target\jnautoit-0.0.4-SNAPSHOT.jar;target\lib\* example.AutoItXLibraryGenerator -Exception in thread "main" java.lang.UnsatisfiedLinkError: -Unable to load library 'AutoItX3.dll': -Can't obtain InputStream for win32-x86/AutoItX3.dll - -``` -To solve this one may need a checked version of the dll or place some missing dependency -into the System32 folder (all imports listed by link.exe are already in `c:\Windows\System32`: -```cmd - -"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\link.exe" /dump /imports AutoItX3_x64.dll | findstr /i \.dll -Dump of file AutoItX3_x64.dll - MPR.dll - WINMM.dll - COMCTL32.dll - USERENV.dll - KERNEL32.dll - USER32.dll - GDI32.dll - ADVAPI32.dll - SHELL32.dll - ole32.dll - OLEAUT32.dll - RPCRT4.dll -``` -### See Also - - * Older Autoit [home page](https://www.autoitscript.com/site/) - * [Java Native Access](https://github.com/java-native-access/jna) project on github - * [Index of /autoit3/docs/functions](https://www.autoitscript.com/autoit3/docs/functions/) - * Powershell AutoIt cmdlets [documentation](https://www.autoitconsulting.com/site/scripting/autoit-cmdlets-for-windows-powershell/) - * Russian Autoit tester community [documentation](http://forum.ru-board.com/topic.cgi?forum=5&limit=1&m=9&start=0&topic=33902)(in Russian) - * [Autoit forum](https://www.autoitscript.com/forum/forum/35-windows-client/) - * [Autoit forum](http://autoit-script.ru/index.php)(in Russian) - * Misc. autoit-related topics in [QA forum](https//automated-testing.info/search?q=autoit)(in Russian) - * Yet another [Autoit forum](http://www.cyberforum.ru/autoit/) (in Russian) - * [Uploading a file using Autoit & WebDrive](https://selenium-training-way2automation.blogspot.com/2013/04/uploading-file-using-autoit-webdriver.html) - apparently very non-developer geared tutorial covering usage of Autoit's own __SciTe Script Editor__, an UFT-like control for enumerating Windows controls propeties and design Autoit *script* to automate browser file upload when impossible in plain Selenium - * post discussing [Mouse automation with AutoItX](https://www.codeproject.com/Articles/5258929/Mouse-automation) - * Mouse automation with [AutoItX](https://www.codeproject.com/Articles/5258929/Mouse-automation-with-AutoItX) - * Alterhative UI automation tool [PhantmTest](https://code.google.com/archive/p/phantomtest/source/default/source) - -### License -This project is licensed under the terms of the MIT license. - -### Author -[Serguei Kouzmine](kouzmine_serguei@yahoo.com) - diff --git a/jna_autoit/pom.xml b/jna_autoit/pom.xml deleted file mode 100644 index bb943cac8..000000000 --- a/jna_autoit/pom.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - 4.0.0 - example - jnautoit - 0.12.0-SNAPSHOT - jar - JNAutoIt - JNAutoIt - Java Native wrapper of AutoItX dll - - UTF-8 - 1.8 - 1.8 - 3.6.1 - 2.20 - 3.0.2 - 1.3 - 4.5.2 - 3.141.59 - 3.13.0 - ${selenium.version} - ${selenium.version} - ${selenium.version} - 7.5.1 - - - - net.java.dev.jna - jna - ${jna.version} - - - net.java.dev.jna - jna-platform - ${jna.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - test - - - org.testng - testng - ${testng.version} - test - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - - - org.seleniumhq.selenium - selenium-ie-driver - ${selenium-ie-driver.version} - - - org.seleniumhq.selenium - selenium-server - ${selenium.version} - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - - - jcenter - bintray - http://jcenter.bintray.com - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${maven.compiler.source} - ${maven.compiler.target} - utf-8 - -Xlint:all - true - true - - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - ${project.groupId}.${mainClass} - true - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - ${project.build.sourceEncoding} - -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp - - - - - diff --git a/jna_autoit/src/main/java/example/AutoItX.java b/jna_autoit/src/main/java/example/AutoItX.java deleted file mode 100644 index dff0fc948..000000000 --- a/jna_autoit/src/main/java/example/AutoItX.java +++ /dev/null @@ -1,1280 +0,0 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * - * Licensed 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. - */ -package example; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.sun.jna.Memory; -import com.sun.jna.Native; -import com.sun.jna.Pointer; -import com.sun.jna.WString; - -import com.sun.jna.platform.win32.WTypes.LPWSTR; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.WinDef.RECT; - -/** - * @author midorlo - * @author sergueik - */ - -public class AutoItX implements AutoItXLibrary { - - final AutoItXLibrary LIB; - private static AutoItX INSTANCE; - private static int bufSize = 1024; - private static String resultString = fill(bufSize, " "); - - private boolean debug = false; - - public void setDebug(boolean value) { - this.debug = value; - } - - @SuppressWarnings("deprecation") - AutoItX() { - LIB = Native.loadLibrary(Constants.DLL, AutoItXLibrary.class); - LIB.AU3_Init(); - INSTANCE = this; - } - - public static AutoItX getInstance() { - return (null == INSTANCE) ? new AutoItX() : INSTANCE; - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm - // The button to click default is the left button, can be - // left, right, middle, main, menu, primary, secondary - @Override - public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks, int x) { - return LIB.AU3_ControlClick(title, text, controlID, button, clicks, x); - } - - public boolean ControlClick(String title, String text, String controlID, String button, int clicks, int x) { - return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), - clicks, x) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks) { - return LIB.AU3_ControlClick(title, text, controlID, button, clicks); - } - - public boolean ControlClick(String title, String text, String controlID, String button, int clicks) { - return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), - clicks) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlClick(WString title, WString text, WString controlID, WString button, int clicks, int x, - int y) { - return LIB.AU3_ControlClick(title, text, controlID, button, clicks, x, y); - } - - public boolean ControlClick(String title, String text, String controlID, String button, int clicks, int x, int y) { - return (LIB.AU3_ControlClick(new WString(title), new WString(text), new WString(controlID), new WString(button), - clicks, x, y) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/Run.htm - @Override - public int AU3_Run(WString program, WString workingdir) { - return LIB.AU3_Run(program, workingdir); - } - - public boolean Run(String program, String workingdir) { - return (LIB.AU3_Run(new WString(program), new WString(workingdir)) != Constants.AU3_FAILURE); - } - // https://www.autoitscript.com/autoit3/docs/functions/InputBox.htm - // No API named AU3_InputBox is currently exported - - // https://www.autoitscript.com/autoit3/docs/functions/WinList.htm - // https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm - // No API named AU3_WinList is exported - - @Override - public int AU3_Run(WString program, WString workingdir, int showFlag) { - return LIB.AU3_Run(program, workingdir, showFlag); - } - - public boolean Run(String program, String workingdir, int showFlag) { - // SW_HIDE, SW_MINIMIZE, SW_MAXIMIZE - return (LIB.AU3_Run(new WString(program), new WString(workingdir), showFlag) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlSend.htm - @Override - public int AU3_ControlSend(WString title, WString text, WString controlID, WString data) { - return LIB.AU3_ControlSend(title, text, controlID, data); - } - - public boolean ControlSend(String title, String text, String controlID, String data) { - // data: String of characters to send to the control. - // flag = 0: Changes how "keys" is processed - // AU3_SEND_DEFAULT ($SEND_DEFAULT) (0) = - // special characters + and ! indicate SHIFT and ALT key-presses - // AU3_SEND_RAW ($SEND_RAW) (1) = keys are sent raw - return (LIB.AU3_ControlSend(new WString(title), new WString(text), new WString(controlID), - new WString(data)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlSend(WString title, WString text, WString controlID, WString data, int flag) { - return LIB.AU3_ControlSend(title, text, controlID, data, flag); - } - - public boolean ControlSend(String title, String text, String controlID, String data, int flag) { - return (LIB.AU3_ControlSend(new WString(title), new WString(text), new WString(controlID), new WString(data), - flag) == Constants.AU3_SUCCESS); - } - - @Override - public void AU3_Init() { - LIB.AU3_Init(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ClipPut.htm - @Override - public void AU3_ClipPut(WString value) { - LIB.AU3_ClipPut(value); - } - - public void ClipPut(String value) { - // TODO: boolean - LIB.AU3_ClipPut(new WString(value)); - } - - // https://www.autoitscript.com/autoit3/docs/functions/Sleep.htm - @Override - public void AU3_Sleep(int delay) { - LIB.AU3_Sleep(delay); - } - - public void Sleep(int delay) { - LIB.AU3_Sleep(delay); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetHandle.htm - @Override - public HWND AU3_WinGetHandle(WString title, WString text) { - return LIB.AU3_WinGetHandle(title, text); - } - - public HWND WinGetHandle(String title, String text) { - return LIB.AU3_WinGetHandle(new WString(title), new WString(text)); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetPos.htm - @Override - public int AU3_WinGetPos(WString title, WString text, RECT rect) { - return LIB.AU3_WinGetPos(title, text, rect); - // NOTE: return value is not compatible with other methods - } - - // 4-element array containing the following information: - // $_[0] = X position - // $_[1] = Y position - // $_[2] = Width - // $_[3] = Height - public int[] WinGetPos(String title, String text) { - RECT rect = new RECT(); - // @FieldOrder(value={"left", "top", "right", "bottom"}) - int[] pos = { 0, 0, 0, 0 }; - // NOTE: the successful call returns 0 - // other AU3 methods return 0 to indicate of a failure - // therefore is not verified - LIB.AU3_WinGetPos(new WString(title), new WString(text), rect); - // https://java-native-access.github.io/jna/4.2.1/com/sun/jna/platform/win32/WinDef.RECT.html - pos[0] = rect.left; - pos[1] = rect.top; - pos[2] = rect.right - rect.left; - pos[3] = rect.bottom - rect.top; - // TODO: the original autoit's - // WinGetPos() returns negative numbers such as -32000 for minimized - // windows, but works fine with (non-minimized) hidden windows. - return pos; - } - - @Override - public void AU3_WinGetText(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetText(title, text, resultPtr, bufSize); - } - - public String WinGetText(String title, String text) { - // https://www.programcreek.com/java-api-examples/index.php?api=com.sun.jna.platform.win32.WTypes - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetText(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/DriveMapGet.htm - @Override - public void AU3_DriveMapGet(WString device, LPWSTR resultPtr, int bufSize) { - LIB.AU3_DriveMapGet(device, resultPtr, bufSize); - } - - public String DriveMapGet(String device) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - // TODO: handle @error - LIB.AU3_DriveMapGet(new WString(device), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetState.htm - @Override - public int AU3_WinGetState(WString title, WString text) { - return LIB.AU3_WinGetState(title, text); - } - - public String WinGetState(String title, String text) { - int state = LIB.AU3_WinGetState(new WString(title), new WString(text)); - String stateName = ""; - - if (state != Constants.AU3_FAILURE) { - for (int defined_state : Constants.stateNames.keySet()) { - if ((state & defined_state) != 0) { - stateName += Constants.stateNames.get(defined_state); - stateName += "\n"; - } - } - } - return stateName; - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetTrans.htm - @Override - public int AU3_WinSetTrans(WString title, WString text, int transparency) { - return LIB.AU3_WinSetTrans(title, text, transparency); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinExists.htm - @Override - public int AU3_WinExists(WString title, WString text) { - return LIB.AU3_WinExists(title, text); - } - - public boolean WinExists(String title, String text) { - // NOTE: LIB.AU3_WinExists will return AU3_SUCCESS even if the window is - // hidden - return (LIB.AU3_WinExists(new WString(title), new WString(text)) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessClose.htm - @Override - public int AU3_ProcessClose(WString process) { - return LIB.AU3_ProcessClose(process); - } - - public boolean ProcessClose(String process) { - // TODO: implement accessing the @error - return (LIB.AU3_ProcessClose(new WString(process)) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/DriveMapDel.htm - @Override - public int AU3_DriveMapDel(WString drive) { - return LIB.AU3_DriveMapDel(drive); - } - - public boolean DriveMapDel(String drive) { - return (LIB.AU3_DriveMapDel(new WString(drive)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/DriveMapAdd.htm - @Override - public void AU3_DriveMapAdd(WString device, WString remoteShare, int flags, WString user, WString password, - LPWSTR arg5, int arg6) { - LIB.AU3_DriveMapAdd(device, remoteShare, flags, user, password, arg5, arg6); - } - - public void DriveMapAdd(String device, String remoteShare, int flags, String user, String password, LPWSTR arg5, - int arg6) { - LIB.AU3_DriveMapAdd(new WString(device), new WString(remoteShare), flags, new WString(user), - new WString(password), arg5, arg6); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetOnTop.htm - @Override - public int AU3_WinSetOnTop(WString title, WString text, int flag) { - return LIB.AU3_WinSetOnTop(title, text, flag); - } - - public boolean WinSetOnTop(String title, String text, int flag) { - if (flag == Constants.AU3_WINDOWS_NOONTOP || flag == Constants.AU3_WINDOWS_ONTOP) { - return (LIB.AU3_WinSetOnTop(new WString(title), new WString(text), flag) != Constants.AU3_FAILURE); - } else { - return false; - } - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinClose.htm - @Override - public int AU3_WinClose(WString title, WString text) { - return LIB.AU3_WinClose(title, text); - } - - public boolean WinClose(String title, String text) { - return (LIB.AU3_WinClose(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetState.htm - @Override - public int AU3_WinSetState(WString title, WString text, int flag) { - return LIB.AU3_WinSetState(title, text, flag); - } - - public boolean WinSetState(String title, String text, int flag) { - List sw_flags = Arrays.asList(Constants.SW_HIDE, Constants.SW_SHOW, Constants.SW_MINIMIZE, - Constants.SW_MAXIMIZE, Constants.SW_RESTORE); - /* - * TODO: Constants.SW_DISABLE, Constants.SW_ENABLE - */ - return (sw_flags.contains(flag)) - ? (LIB.AU3_WinSetState(new WString(title), new WString(text), flag) == Constants.AU3_SUCCESS) - : false; - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinKill.htm - // https://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm - @Override - public int AU3_WinKill(WString title, WString text) { - return LIB.AU3_WinKill(title, text); - } - - public boolean WinKill(String title, String text) { - return (LIB.AU3_WinKill(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlHide.htm - // https://www.autoitscript.com/autoit3/docs/intro/controls.htm - @Override - public int AU3_ControlHide(WString title, WString text, WString controlID) { - return LIB.AU3_ControlHide(title, text, controlID); - } - - public boolean ControlHide(String title, String text, String controlID) { - return (LIB.AU3_ControlHide(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinActive.htm - @Override - public int AU3_WinActive(WString title, WString text) { - return LIB.AU3_WinActive(title, text); - } - - public boolean WinActive(String title, String text) { - return (LIB.AU3_WinActive(new WString(title), new WString(text)) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlFocus.htm - @Override - public int AU3_ControlFocus(WString title, WString text, WString controlID) { - return LIB.AU3_ControlFocus(title, text, controlID); - } - - public boolean ControlFocus(String title, String text, String controlID) { - return (LIB.AU3_ControlFocus(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetTitle.htm - @Override - public void AU3_WinGetTitle(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetTitle(title, text, resultPtr, bufSize); - } - - public String WinGetTitle(String title, String text) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - AU3_WinGetTitle(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlShow.htm - @Override - public int AU3_ControlShow(WString title, WString text, WString controlID) { - return LIB.AU3_ControlShow(title, text, controlID); - } - - public boolean ControlShow(String title, String text, String controlID) { - return (LIB.AU3_ControlShow(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ClipGet.htm - @Override - public void AU3_ClipGet(LPWSTR arg0, int arg1) { - LIB.AU3_ClipGet(arg0, arg1); - } - - public String ClipGet() { - resultString = fill(bufSize, " "); - // bufSize = resultString.length() + 1; - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ClipGet(resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - /* - * TODO: handle error 1 = if clipboard is empty 2 = if contains a non-text - * entry. 3 or 4 = if cannot access the clipboard. - */ - } - - // https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm - @Override - public int AU3_Opt(WString option, int param) { - return LIB.AU3_Opt(option, param); - } - - // You may use Opt() as an alternative to AutoItSetOption(). - public int Opt(String option, int param) { - return LIB.AU3_Opt(new WString(option), param); - } - - @Override - public void AU3_MouseWheel(WString arg0, int arg1) { - LIB.AU3_MouseWheel(arg0, arg1); - } - - @Override - public void AU3_MouseUp(WString arg0) { - LIB.AU3_MouseUp(arg0); - } - - @Override - public int AU3_error() { - return LIB.AU3_error(); - } - - @Override - public void AU3_MouseDown(WString arg0) { - LIB.AU3_MouseDown(arg0); - } - - @Override - public int AU3_Shutdown(int arg0) { - return LIB.AU3_Shutdown(arg0); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinSetTitle.htm - @Override - public int AU3_WinSetTitle(WString title, WString text, WString newTitle) { - return LIB.AU3_WinSetTitle(title, text, newTitle); - } - - public boolean WinSetTitle(String title, String text, String newTitle) { - return (LIB.AU3_WinSetTitle(new WString(title), new WString(text), - new WString(newTitle)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_WinSetTitle(WString title, WString text, WString newTitle, WString arg3) { - return LIB.AU3_WinSetTitle(title, text, newTitle, arg3); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinActivate.htm - @Override - public int AU3_WinActivate(WString arg0, WString arg1) { - return LIB.AU3_WinActivate(arg0, arg1); - } - - public boolean WinActivate(String title, String text) { - return (LIB.AU3_WinActivate(new WString(title), new WString(text)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_IsAdmin() { - return LIB.AU3_IsAdmin(); - } - - @Override - public void AU3_PixelSearch(RECT arg0, int arg1, int arg2, int arg3, Pointer arg4) { - LIB.AU3_PixelSearch(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public void AU3_ControlCommandByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, LPWSTR arg4, int arg5) { - LIB.AU3_ControlCommandByHandle(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_MouseGetCursor() { - return LIB.AU3_MouseGetCursor(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlEnable.htm - @Override - public int AU3_ControlEnable(WString title, WString text, WString controlID) { - return LIB.AU3_ControlEnable(title, text, controlID); - } - - public boolean ControlEnable(String title, String text, String controlID) { - return (LIB.AU3_ControlEnable(new WString(title), new WString(text), - new WString(controlID)) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlShowByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlShowByHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm - @Override - public int AU3_AutoItSetOption(WString option, int param) { - return LIB.AU3_AutoItSetOption(option, param); - } - - public boolean AutoItSetOption(String option, int param) { - return (LIB.AU3_AutoItSetOption(new WString(option), param) == Constants.AU3_SUCCESS); - } - - @Override - public int AU3_ControlEnableByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlEnableByHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlCommand.htm - @Override - public void AU3_ControlCommand(WString title, WString text, WString controlID, WString command, WString option, - LPWSTR resultPtr, int bufSize) { - LIB.AU3_ControlCommand(title, text, controlID, command, option, resultPtr, bufSize); - /* - * Command, Option Return Value "IsVisible", "" Returns 1 if Control is visible, - * 0 otherwise "IsEnabled", "" Returns 1 if Control is enabled, 0 otherwise - * "ShowDropDown", "" Displays the ComboBox dropdown "HideDropDown", "" Hides - * the ComboBox dropdown "AddString", 'string' Adds a string to the end in a - * ListBox or ComboBox "DelString", occurrence Deletes a string according to - * occurrence in a ListBox or ComboBox "FindString", 'string' Returns occurrence - * ref of the exact string in a ListBox or ComboBox "SetCurrentSelection", - * occurrence Sets selection to occurrence ref in a ListBox or ComboBox - * "SelectString", 'string' Sets selection according to string in a ListBox or - * ComboBox "IsChecked", "" Returns 1 if Button is checked, 0 otherwise "Check", - * "" Checks radio or check Button "UnCheck", "" Unchecks radio or check Button - * "GetCurrentLine", "" Returns the line # where the caret is in an Edit - * "GetCurrentCol", "" Returns the column # where the caret is in an Edit - * "GetCurrentSelection", "" Returns name of the currently selected item in a - * ListBox or ComboBox "GetLineCount", "" Returns # of lines in an Edit - * "GetLine", line# Returns text at line # passed of an Edit "GetSelected", "" - * Returns selected text of an Edit "EditPaste", 'string' Pastes the 'string' at - * the Edit's caret position "CurrentTab", "" Returns the current Tab shown of a - * SysTabControl32 "TabRight", "" Moves to the next tab to the right of a - * SysTabControl32 "TabLeft", "" Moves to the next tab to the left of a - * SysTabControl32 "SendCommandID", Command ID Simulates the WM_COMMAND message. - * Usually used for ToolbarWindow32 controls - use the ToolBar tab of Au3Info to - * get the Command ID. - */ - } - - public String ControlCommand(String title, String text, String controlID, String command, String option) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ControlCommand(new WString(title), new WString(text), new WString(controlID), new WString(command), - new WString(option), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public int AU3_ControlDisable(WString title, WString text, WString controlID) { - return LIB.AU3_ControlDisable(title, text, controlID); - } - - @Override - public int AU3_ControlDisableByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlDisableByHandle(arg0, arg1); - } - - @Override - public int AU3_ControlSetTextByHandle(HWND arg0, HWND arg1, WString arg2) { - return LIB.AU3_ControlSetTextByHandle(arg0, arg1, arg2); - } - - @Override - public void AU3_ControlTreeViewByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, WString arg4, LPWSTR arg5, - int arg6) { - LIB.AU3_ControlTreeViewByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_ControlHideByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlHideByHandle(arg0, arg1); - } - - @Override - public int AU3_ControlFocusByHandle(HWND arg0, HWND arg1) { - return LIB.AU3_ControlFocusByHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetFocus.htm - @Override - public void AU3_ControlGetFocus(WString title, WString text, LPWSTR arg2, int arg3) { - LIB.AU3_ControlGetFocus(title, text, arg2, arg3); - } - - @Override - public void AU3_ControlListView(WString arg0, WString arg1, WString arg2, WString arg3, WString arg4, WString arg5, - LPWSTR arg6, int arg7) { - LIB.AU3_ControlListView(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessExists.htm - // NOTE: returns 0 if the process does not exist, and PID when process exists - @Override - public int AU3_ProcessExists(WString process) { - return LIB.AU3_ProcessExists(process); - } - - public boolean ProcessExists(String process) { - return (LIB.AU3_ProcessExists(new WString(process)) != 0); - } - - @Override - public int AU3_WinSetStateByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinSetStateByHandle(arg0, arg1); - } - - @Override - public int AU3_ProcessSetPriority(WString arg0, int arg1) { - return LIB.AU3_ProcessSetPriority(arg0, arg1); - } - - @Override - public int AU3_PixelGetColor(int arg0, int arg1) { - return LIB.AU3_PixelGetColor(arg0, arg1); - } - - @Override - public void AU3_ControlTreeView(WString arg0, WString arg1, WString arg2, WString arg3, WString arg4, WString arg5, - LPWSTR arg6, int arg7) { - LIB.AU3_ControlTreeView(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinMinimizeAll.htm - @Override - public String AU3_WinMinimizeAll() { - return LIB.AU3_WinMinimizeAll(); - // Send("#m") is a possible alternative. - } - - @Override - public void AU3_ControlGetTextByHandle(HWND arg0, HWND arg1, LPWSTR arg2, int arg3) { - LIB.AU3_ControlGetTextByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_ControlSetText(WString arg0, WString arg1, WString arg2, WString arg3) { - return LIB.AU3_ControlSetText(arg0, arg1, arg2, arg3); - } - - @Override - public HWND AU3_ControlGetHandle(HWND arg0, WString arg1) { - return LIB.AU3_ControlGetHandle(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetHandle.htm - @Override - public void AU3_ControlGetHandleAsText(WString title, WString text, WString controlID, LPWSTR resultPtr, - int bufSize) { - LIB.AU3_ControlGetHandleAsText(title, text, controlID, resultPtr, bufSize); - } - - public String ControlGetHandleAsText(String title, String text, String controlID) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ControlGetHandleAsText(new WString(title), new WString(text), new WString(controlID), resultPtr, - bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetPos.htm - @Override - public int AU3_ControlGetPos(WString title, WString text, WString controlID, RECT rect) { - return LIB.AU3_ControlGetPos(title, text, controlID, rect); - } - - public boolean ControlGetPos(String title, String text, String controlID, RECT rect) { - return (LIB.AU3_ControlGetPos(new WString(title), new WString(text), new WString(controlID), - rect) == Constants.AU3_SUCCESS); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ControlGetText.htm - @Override - public void AU3_ControlGetText(WString title, WString text, WString controlID, LPWSTR resultPtr, int bufSize) { - LIB.AU3_ControlGetText(title, text, controlID, resultPtr, bufSize); - } - - public String ControlGetText(String title, String text, String controlID) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_ControlGetText(new WString(title), new WString(text), new WString(controlID), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public void AU3_ControlGetFocusByHandle(HWND arg0, LPWSTR arg1, int arg2) { - LIB.AU3_ControlGetFocusByHandle(arg0, arg1, arg2); - } - - @Override - public int AU3_ControlGetPosByHandle(HWND arg0, HWND arg1, RECT arg2) { - return LIB.AU3_ControlGetPosByHandle(arg0, arg1, arg2); - } - - @Override - public void AU3_ControlListViewByHandle(HWND arg0, HWND arg1, WString arg2, WString arg3, WString arg4, LPWSTR arg5, - int arg6) { - LIB.AU3_ControlListViewByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_WinCloseByHandle(HWND arg0) { - return LIB.AU3_WinCloseByHandle(arg0); - } - - @Override - public void AU3_WinMinimizeAllUndo() { - LIB.AU3_WinMinimizeAllUndo(); - } - - // - @Override - public int AU3_ControlSendByHandle(HWND arg0, HWND arg1, WString arg2) { - return LIB.AU3_ControlSendByHandle(arg0, arg1, arg2); - } - - @Override - public int AU3_ControlSendByHandle(HWND arg0, HWND arg1, WString arg2, int arg3) { - return LIB.AU3_ControlSendByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinWaitActiveByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinWaitActiveByHandle(arg0, arg1); - } - - @Override - public int AU3_WinMoveByHandle(HWND arg0, int arg1, int arg2, int arg3) { - return LIB.AU3_WinMoveByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinMoveByHandle(HWND arg0, int arg1, int arg2, int arg3, int arg4) { - return LIB.AU3_WinMoveByHandle(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_StatusbarGetTextByHandle(HWND arg0, int arg1, LPWSTR arg2, int arg3) { - return LIB.AU3_StatusbarGetTextByHandle(arg0, arg1, arg2, arg3); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetClassList.htm - @Override - public void AU3_WinGetClassList(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetClassList(title, text, resultPtr, bufSize); - } - - public List WinGetClassList(String title, String text) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetClassList(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString().trim(); - if (debug) { - System.err.println("WinGetClassList: " + resultString); - } - return Arrays.asList(resultString.split("\\n")); - // no fancy regexp like (?:\\n+) appears to work - } - - @Override - public int AU3_WinExistsByHandle(HWND arg0) { - return LIB.AU3_WinExistsByHandle(arg0); - } - - @Override - public int AU3_MouseClickDrag(WString arg0, int arg1, int arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_MouseClickDrag(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_MouseClickDrag(WString arg0, int arg1, int arg2, int arg3, int arg4) { - return LIB.AU3_MouseClickDrag(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_WinWaitByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinWaitByHandle(arg0, arg1); - } - - @Override - public int AU3_ControlClickByHandle(HWND arg0, HWND arg1, WString arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_ControlClickByHandle(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_ControlClickByHandle(HWND arg0, HWND arg1, WString arg2, int arg3) { - return LIB.AU3_ControlClickByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinActivateByHandle(HWND arg0) { - return LIB.AU3_WinActivateByHandle(arg0); - } - - @Override - public int AU3_ControlMoveByHandle(HWND arg0, HWND arg1, int arg2, int arg3) { - return LIB.AU3_ControlMoveByHandle(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_ControlMoveByHandle(HWND arg0, HWND arg1, int arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_ControlMoveByHandle(arg0, arg1, arg2, arg3, arg4, arg5); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessWaitClose.htm - @Override - public int AU3_ProcessWaitClose(WString process) { - return LIB.AU3_ProcessWaitClose(process); - } - - public boolean ProcessWaitClose(String process) { - return (LIB.AU3_ProcessWaitClose(new WString(process)) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_ProcessWaitClose(WString process, int timeout) { - return LIB.AU3_ProcessWaitClose(process, timeout); - } - - @Override - public UnsignedInt AU3_PixelChecksum(RECT arg0) { - return LIB.AU3_PixelChecksum(arg0); - } - - @Override - public UnsignedInt AU3_PixelChecksum(RECT arg0, int arg1) { - return LIB.AU3_PixelChecksum(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinGetHandle.htm - @Override - public void AU3_WinGetHandleAsText(WString title, WString text, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetHandleAsText(title, text, resultPtr, bufSize); - } - - public String WinGetHandleAsText(String title, String text) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetHandleAsText(new WString(title), new WString(text), resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public int AU3_WinGetCaretPos(Pointer arg0) { - return LIB.AU3_WinGetCaretPos(arg0); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinWaitActive.htm - @Override - public int AU3_WinWaitActive(WString title, WString text, int timeout) { - return LIB.AU3_WinWaitActive(title, text, timeout); - } - - // NOTE: not returning handle to requested window getting active - public boolean WinWaitActive(String title, String text, int timeout) { - return (LIB.AU3_WinWaitActive(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinWaitActive(WString title, WString text) { - return LIB.AU3_WinWaitActive(title, text); - } - - // NOTE: not returning handle to requested window getting active - public boolean WinWaitActive(String title, String text) { - return (LIB.AU3_WinWaitActive(new WString(title), new WString(text)) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinGetStateByHandle(HWND arg0) { - return LIB.AU3_WinGetStateByHandle(arg0); - } - - @Override - public int AU3_WinActiveByHandle(HWND arg0) { - return LIB.AU3_WinActiveByHandle(arg0); - } - - @Override - public int AU3_WinSetOnTopByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinSetOnTopByHandle(arg0, arg1); - } - - @Override - public int AU3_WinSetTitleByHandle(HWND arg0, WString arg1) { - return LIB.AU3_WinSetTitleByHandle(arg0, arg1); - } - - @Override - public DWORD AU3_WinGetProcessByHandle(HWND arg0) { - return LIB.AU3_WinGetProcessByHandle(arg0); - } - - @Override - public int AU3_WinGetClientSize(WString arg0, WString arg1, RECT arg2) { - return LIB.AU3_WinGetClientSize(arg0, arg1, arg2); - } - - @Override - public void AU3_WinGetTextByHandle(HWND hwnd, LPWSTR resultPtr, int bufSize) { - LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); - } - - public String WinGetTextByHandle(HWND hwnd) { - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - public String WinGetTextByHandle(String windowHandle) { - HWND hwnd = new HWND(); - hwnd.setPointer(new Pointer(Long.decode(windowHandle))); - resultString = fill(bufSize, " "); - LPWSTR resultPtr = new LPWSTR(resultString); - LIB.AU3_WinGetTextByHandle(hwnd, resultPtr, bufSize); - resultString = resultPtr.getValue().toString(); - return resultString.trim(); - } - - @Override - public int AU3_WinGetPosByHandle(HWND arg0, RECT arg1) { - return LIB.AU3_WinGetPosByHandle(arg0, arg1); - } - - @Override - public void AU3_WinGetTitleByHandle(HWND arg0, LPWSTR arg1, int arg2) { - LIB.AU3_WinGetTitleByHandle(arg0, arg1, arg2); - } - - @Override - public int AU3_StatusbarGetText(WString arg0, WString arg1, int arg2, LPWSTR arg3, int arg4) { - return LIB.AU3_StatusbarGetText(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public void AU3_WinGetClassListByHandle(HWND arg0, LPWSTR arg1, int arg2) { - LIB.AU3_WinGetClassListByHandle(arg0, arg1, arg2); - } - - @Override - public DWORD AU3_WinGetProcess(WString arg0, WString arg1) { - return LIB.AU3_WinGetProcess(arg0, arg1); - } - - @Override - public int AU3_WinGetClientSizeByHandle(HWND arg0, RECT arg1) { - return LIB.AU3_WinGetClientSizeByHandle(arg0, arg1); - } - - @Override - public int AU3_WinWaitCloseByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinWaitCloseByHandle(arg0, arg1); - } - - @Override - public int AU3_WinMenuSelectItemByHandle(HWND arg0, WString arg1, WString arg2, WString arg3, WString arg4, - WString arg5, WString arg6, WString arg7, WString arg8) { - return LIB.AU3_WinMenuSelectItemByHandle(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinWaitNotActive.htm - @Override - public int AU3_WinWaitNotActive(WString title, WString text, int timeout) { - return LIB.AU3_WinWaitNotActive(title, text, timeout); - } - - public boolean WinWaitNotActive(String title, String text, int timeout) { - return (LIB.AU3_WinWaitNotActive(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinMenuSelectItem.htms - // NOTE: Autoit documentation only covers 6 submenu text arguments - @Override - public int AU3_WinMenuSelectItem(WString title, WString text, WString submenu1Text, WString submenu2Text, - WString submenu3Text, WString submenu4Text, WString submenu5Text, WString submenu6Text, WString exraArg1, - WString exraArg2) { - return LIB.AU3_WinMenuSelectItem(title, text, submenu1Text, submenu2Text, submenu3Text, submenu4Text, - submenu5Text, submenu6Text, exraArg1, exraArg2); - } - - public boolean WinMenuSelectItem(String title, String text, String submenu1Text, String submenu2Text, - String submenu3Text, String submenu4Text, String submenu5Text, String submenu6Text) { - return (LIB.AU3_WinMenuSelectItem(new WString(title), new WString(text), new WString(submenu1Text), - new WString(submenu2Text), new WString(submenu3Text), new WString(submenu4Text), - new WString(submenu5Text), new WString(submenu6Text), new WString(""), - new WString("")) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinSetTransByHandle(HWND arg0, int arg1) { - return LIB.AU3_WinSetTransByHandle(arg0, arg1); - } - - @Override - public int AU3_WinKillByHandle(HWND arg0) { - return LIB.AU3_WinKillByHandle(arg0); - } - - // https://www.autoitscript.com/autoit3/docs/functions/WinWaitClose.htm - @Override - public int AU3_WinWaitClose(WString title, WString text) { - return LIB.AU3_WinWaitClose(title, text); - } - - @Override - public int AU3_WinWaitClose(WString title, WString text, int timeout) { - return LIB.AU3_WinWaitClose(title, text, timeout); - } - - public boolean WinWaitClose(String title, String text, int timeout) { - return (LIB.AU3_WinWaitClose(new WString(title), new WString(text), timeout) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3) { - return LIB.AU3_WinMove(arg0, arg1, arg2, arg3); - } - - @Override - public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3, int arg4) { - return LIB.AU3_WinMove(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_WinMove(WString arg0, WString arg1, int arg2, int arg3, int arg4, int arg5) { - return LIB.AU3_WinMove(arg0, arg1, arg2, arg3, arg4, arg5); - } - - @Override - public int AU3_WinWait(WString arg0, WString arg1, int arg2) { - return LIB.AU3_WinWait(arg0, arg1, arg2); - } - - @Override - public int AU3_WinWait(WString arg0, WString arg1) { - return LIB.AU3_WinWait(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/MouseGetPos.htm - @Override - public void AU3_MouseGetPos(Pointer arg) { - LIB.AU3_MouseGetPos(arg); - } - - // a two-element int array containing the mouse coordinates - // $_[0] X coordinate - // $_[1] Y coordinate - public int[] MouseGetPos() { - int[] pos = { 0, 0 }; - // https://www.baeldung.com/java-size-of-object - // TODO: examine return value of the AU3 method call - Pointer arg = new Memory(32); - LIB.AU3_MouseGetPos(arg); - pos = arg.getIntArray(0, 2); - return pos; - } - - // an int mouse coordinate - // if dimension=0, the X coordinate - // if dimension=1, the Y coordinate - public int MouseGetPos(int dimension) { - int[] pos = { 0, 0 }; - Pointer arg = new Memory(32); - LIB.AU3_MouseGetPos(arg); - pos = arg.getIntArray(0, 2); - return dimension == 0 ? pos[0] : pos[1]; - } - - // https://www.autoitscript.com/autoit3/docs/functions/MouseClick.htm - @Override - public int AU3_MouseClick(WString button, int x, int y, int clicks, int speed) { - // button: "left","right","middle","main", "menu", "primary", "secindary" - return LIB.AU3_MouseClick(button, x, y, clicks, speed); - } - - public int MouseClick(String button, int x, int y, int clicks, int speed) { - // button: "left","right","middle","main", "menu", "primary", "secindary" - return LIB.AU3_MouseClick(new WString(button), x, y, clicks, speed); - } - - @Override - public int AU3_MouseClick(WString button) { - return LIB.AU3_MouseClick(button); - } - - @Override - public int AU3_ControlMove(WString arg0, WString arg1, WString arg2, int arg3, int arg4) { - return LIB.AU3_ControlMove(arg0, arg1, arg2, arg3, arg4); - } - - @Override - public int AU3_ControlMove(WString arg0, WString arg1, WString arg2, int arg3, int arg4, int arg5, int arg6) { - return LIB.AU3_ControlMove(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_RunAsWait(WString arg0, WString arg1, WString arg2, int arg3, WString arg4, WString arg5, int arg6) { - return LIB.AU3_RunAsWait(arg0, arg1, arg2, arg3, arg4, arg5, arg6); - } - - @Override - public int AU3_RunAsWait(WString arg0, WString arg1, WString arg2, int arg3, WString arg4, WString arg5) { - return LIB.AU3_RunAsWait(arg0, arg1, arg2, arg3, arg4, arg5); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ToolTip.htm - @Override - public void AU3_ToolTip(WString text, int options) { - LIB.AU3_ToolTip(text, options); - } - - public void ToolTip(String text, int options) { - LIB.AU3_ToolTip(new WString(text), options); - } - - @Override - public void AU3_ToolTip(WString text) { - LIB.AU3_ToolTip(text); - } - - public void ToolTip(String text) { - LIB.AU3_ToolTip(new WString(text)); - } - - @Override - public void AU3_ToolTip(WString arg0, int arg1, int arg2) { - LIB.AU3_ToolTip(arg0, arg1, arg2); - } - - // https://www.autoitscript.com/autoit3/docs/functions/Send.htm - @Override - public void AU3_Send(WString keys) { - LIB.AU3_Send(keys); - } - - public void Send(String keys) { - LIB.AU3_Send(new WString(keys)); - } - - @Override - public void AU3_Send(WString keys, int flag) { - LIB.AU3_Send(keys, flag); - } - - public void Send(String keys, Boolean flag) { - LIB.AU3_Send(new WString(keys), flag ? 0 : 1); - } - - @Override - public int AU3_MouseMove(int arg0, int arg1, int arg2) { - return LIB.AU3_MouseMove(arg0, arg1, arg2); - } - - @Override - public int AU3_MouseMove(int arg0, int arg1) { - return LIB.AU3_MouseMove(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/ProcessWait.htm - @Override - public int AU3_ProcessWait(WString process) { - return LIB.AU3_ProcessWait(process); - } - - public boolean AU3_ProcessWait(String process) { - return (LIB.AU3_ProcessWait(new WString(process)) != Constants.AU3_FAILURE); - } - - @Override - public int AU3_ProcessWait(WString arg0, int arg1) { - return LIB.AU3_ProcessWait(arg0, arg1); - } - - // https://www.autoitscript.com/autoit3/docs/functions/RunWait.htm - @Override - public int AU3_RunWait(WString program, WString workingdir, int show_flag) { - // NOTE: may return nonzero Value as the exitcode of the program - return LIB.AU3_RunWait(program, workingdir, show_flag); - } - - @Override - public int AU3_RunWait(WString program, WString workingdir) { - return LIB.AU3_RunWait(program, workingdir); - } - - public int RunWait(String program, String workingdir) { - return LIB.AU3_RunWait(new WString(program), new WString(workingdir)); - } - - // https://www.autoitscript.com/autoit3/docs/functions/RunAs.htm - @Override - public int AU3_RunAs(WString username, WString domain, WString password, int logon_flag, WString program, - WString workingdir) { - return LIB.AU3_RunAs(username, domain, password, logon_flag, program, workingdir); - } - - // https://www.autoitscript.com/autoit3/docs/functions/RunAs.htm - @Override - public int AU3_RunAs(WString username, WString domain, WString password, int logon_flag, WString program, - WString workingdir, int show_flag) { - return LIB.AU3_RunAs(username, domain, password, logon_flag, program, workingdir, show_flag); - } - - public boolean RunAs(String username, String domain, String password, int logon_flag, String program, - String workingdir, int show_flag) { - return (LIB.AU3_RunAs(new WString(username), new WString(domain), new WString(password), logon_flag, - new WString(program), new WString(workingdir), show_flag) != Constants.AU3_FAILURE); - /* - * RUN_LOGON_NOPROFILE (0) - Interactive logon with no profile. - * RUN_LOGON_PROFILE (1) - Interactive logon with profile. RUN_LOGON_NETWORK (2) - * - Network credentials only. RUN_LOGON_INHERIT (4) - Inherit the calling - * process's environment instead of the user's environment. - */ - } - - private static String fill(int length, String with) { - StringBuilder sb = new StringBuilder(length); - while (sb.length() < length) { - sb.append(with); - } - return sb.toString(); - } - -} diff --git a/jna_autoit/src/main/java/example/AutoItXLibrary.java b/jna_autoit/src/main/java/example/AutoItXLibrary.java deleted file mode 100644 index 50f694c25..000000000 --- a/jna_autoit/src/main/java/example/AutoItXLibrary.java +++ /dev/null @@ -1,471 +0,0 @@ -/* - * Copyright 2018 midorlo. - * - * Licensed 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. - */ -package example; - -import static example.Constants.AU3_INTDEFAULT; -import static example.Constants.SW_SHOWNORMAL; - -import com.sun.jna.Library; -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.WTypes.LPWSTR; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.WinDef.RECT; - -import com.sun.jna.Library; -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.WTypes.LPWSTR; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.WinDef.RECT; - -/** - * - * @author midorlo - * @author sergueik - */ -interface AutoItXLibrary extends Library { - - String AU3_WinMinimizeAll(); - - void AU3_Init(); - - int AU3_error(); - - int AU3_AutoItSetOption(WString szOption, int nValue); - - void AU3_ClipGet(LPWSTR szClip, int nBufSize); - - void AU3_ClipPut(WString szClip); - - default int AU3_ControlClick(WString szTitle, WString szText, - WString szControl, WString szButton, int nNumClicks) { - return AU3_ControlClick(szTitle, szText, szControl, szButton, nNumClicks, - AU3_INTDEFAULT, AU3_INTDEFAULT); - } - - default int AU3_ControlClick(WString szTitle, WString szText, - WString szControl, WString szButton, int nNumClicks, int nX) { - return AU3_ControlClick(szTitle, szText, szControl, szButton, nNumClicks, - nX, AU3_INTDEFAULT); - } - - int AU3_ControlClick(WString szTitle, WString szText, WString szControl, - WString szButton, int nNumClicks, int nX, int nY); - - default int AU3_ControlClickByHandle(HWND hWnd, HWND hCtrl, WString szButton, - int nNumClicks) { - return AU3_ControlClickByHandle(hWnd, hCtrl, szButton, nNumClicks, - AU3_INTDEFAULT, AU3_INTDEFAULT); - } - - int AU3_ControlClickByHandle(HWND hWnd, HWND hCtrl, WString szButton, - int nNumClicks, int nX, int nY); - - void AU3_ControlCommand(WString szTitle, WString szText, WString szControl, - WString szCommand, WString szExtra, LPWSTR szResult, int nBufSize); - - void AU3_ControlCommandByHandle(HWND hWnd, HWND hCtrl, WString szCommand, - WString szExtra, LPWSTR szResult, int nBufSize); - - void AU3_ControlListView(WString szTitle, WString szText, WString szControl, - WString szCommand, WString szExtra1, WString szExtra2, LPWSTR szResult, - int nBufSize); - - void AU3_ControlListViewByHandle(HWND hWnd, HWND hCtrl, WString szCommand, - WString szExtra1, WString szExtra2, LPWSTR szResult, int nBufSize); - - int AU3_ControlDisable(WString szTitle, WString szText, WString szControl); - - int AU3_ControlDisableByHandle(HWND hWnd, HWND hCtrl); - - int AU3_ControlEnable(WString szTitle, WString szText, WString szControl); - - int AU3_ControlEnableByHandle(HWND hWnd, HWND hCtrl); - - int AU3_ControlFocus(WString szTitle, WString szText, WString szControl); - - int AU3_ControlFocusByHandle(HWND hWnd, HWND hCtrl); - - void AU3_ControlGetFocus(WString szTitle, WString szText, - LPWSTR szControlWithFocus, int nBufSize); - - void AU3_ControlGetFocusByHandle(HWND hWnd, LPWSTR szControlWithFocus, - int nBufSize); - - HWND AU3_ControlGetHandle(HWND hWnd, WString szControl); - - void AU3_ControlGetHandleAsText(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, WString szControl, - LPWSTR szRetText, int nBufSize); - - int AU3_ControlGetPos(WString szTitle, WString szText, WString szControl, - RECT lpRect); - - int AU3_ControlGetPosByHandle(HWND hWnd, HWND hCtrl, RECT lpRect); - - void AU3_ControlGetText(WString szTitle, WString szText, WString szControl, - LPWSTR szControlText, int nBufSize); - - void AU3_ControlGetTextByHandle(HWND hWnd, HWND hCtrl, LPWSTR szControlText, - int nBufSize); - - int AU3_ControlHide(WString szTitle, WString szText, WString szControl); - - int AU3_ControlHideByHandle(HWND hWnd, HWND hCtrl); - - default int AU3_ControlMove(WString szTitle, WString szText, - WString szControl, int nX, int nY) { - return AU3_ControlMove(szTitle, szText, szControl, nX, nY, -1, -1); - } - - int AU3_ControlMove(WString szTitle, WString szText, WString szControl, - int nX, int nY, int nWidth, int nHeight); - - default int AU3_ControlMoveByHandle(HWND hWnd, HWND hCtrl, int nX, int nY) { - return AU3_ControlMoveByHandle(hWnd, hCtrl, nX, nY, -1, -1); - } - - int AU3_ControlMoveByHandle(HWND hWnd, HWND hCtrl, int nX, int nY, int nWidth, - int nHeight); - - public default int AU3_ControlSend(WString szTitle, WString szText, - WString szControl, WString szSendText) { - return AU3_ControlSend(szTitle, szText, szControl, szSendText, 0); - } - - int AU3_ControlSend(WString szTitle, WString szText, WString szControl, - WString szSendText, int nMode); - - default int AU3_ControlSendByHandle(HWND hWnd, HWND hCtrl, - WString szSendText) { - return AU3_ControlSendByHandle(hWnd, hCtrl, szSendText, 0); - } - - int AU3_ControlSendByHandle(HWND hWnd, HWND hCtrl, WString szSendText, - int nMode); - - int AU3_ControlSetText(WString szTitle, WString szText, WString szControl, - WString szControlText); - - int AU3_ControlSetTextByHandle(HWND hWnd, HWND hCtrl, WString szControlText); - - int AU3_ControlShow(WString szTitle, WString szText, WString szControl); - - int AU3_ControlShowByHandle(HWND hWnd, HWND hCtrl); - - void AU3_ControlTreeView(WString szTitle, WString szText, WString szControl, - WString szCommand, WString szExtra1, WString szExtra2, LPWSTR szResult, - int nBufSize); - - void AU3_ControlTreeViewByHandle(HWND hWnd, HWND hCtrl, WString szCommand, - WString szExtra1, WString szExtra2, LPWSTR szResult, int nBufSize); - - void AU3_DriveMapAdd(WString szDevice, WString szShare, int nFlags, - /*[in,defaultvalue("")]*/ WString szUser, - /*[in,defaultvalue("")]*/ WString szPwd, LPWSTR szResult, int nBufSize); - - int AU3_DriveMapDel(WString szDevice); - - void AU3_DriveMapGet(WString szDevice, LPWSTR szMapping, int nBufSize); - - int AU3_IsAdmin(); - - default int AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/WString szButton) { - return AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/szButton, AU3_INTDEFAULT, - AU3_INTDEFAULT, 1, -1); - } - - int AU3_MouseClick(/*[in,defaultvalue("LEFT")]*/WString szButton, int nX, - int nY, int nClicks, int nSpeed); - - default int AU3_MouseClickDrag(WString szButton, int nX1, int nY1, int nX2, - int nY2) { - return AU3_MouseClickDrag(szButton, nX1, nY1, nX2, nY2, -1); - } - - int AU3_MouseClickDrag(WString szButton, int nX1, int nY1, int nX2, int nY2, - int nSpeed); - - void AU3_MouseDown(/*[in,defaultvalue("LEFT")]*/WString szButton); - - int AU3_MouseGetCursor(); - - void AU3_MouseGetPos(Pointer lpPoint); - - default int AU3_MouseMove(int nX, int nY) { - return AU3_MouseMove(nX, nY, -1); - } - - int AU3_MouseMove(int nX, int nY, int nSpeed); - - void AU3_MouseUp(/*[in,defaultvalue("LEFT")]*/WString szButton); - - void AU3_MouseWheel(WString szDirection, int nClicks); - - int AU3_Opt(WString szOption, int nValue); - - default UnsignedInt AU3_PixelChecksum(RECT lpRect) { - return AU3_PixelChecksum(lpRect, 1); - } - - UnsignedInt AU3_PixelChecksum(RECT lpRect, int nStep); - - int AU3_PixelGetColor(int nX, int nY); - - void AU3_PixelSearch(RECT lpRect, int nCol, /*default 0*/ int nVar, - /*default 1*/ int nStep, Pointer pPointResult); - - int AU3_ProcessClose(WString szProcess); - - int AU3_ProcessExists(WString szProcess); - - int AU3_ProcessSetPriority(WString szProcess, int nPriority); - - default int AU3_ProcessWait(WString szProcess) { - return AU3_ProcessWait(szProcess, 0); - } - - int AU3_ProcessWait(WString szProcess, int nTimeout); - - default int AU3_ProcessWaitClose(WString szProcess) { - return AU3_ProcessWaitClose(szProcess, 0); - } - - int AU3_ProcessWaitClose(WString szProcess, int nTimeout); - - default int AU3_Run(WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_Run(szProgram, szDir, SW_SHOWNORMAL); - } - - int AU3_Run(WString szProgram, /*[in,defaultvalue("")]*/ WString szDir, - int nShowFlag); // = SW_SHOWNORMAL - - default int AU3_RunWait(WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_RunWait(szProgram, /*[in,defaultvalue("")]*/ szDir, - SW_SHOWNORMAL); - } - - int AU3_RunWait(WString szProgram, /*[in,defaultvalue("")]*/ WString szDir, - int nShowFlag); - - default int AU3_RunAs(WString szUser, WString szDomain, WString szPassword, - int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_RunAs(szUser, szDomain, szPassword, nLogonFlag, szProgram, - /*[in,defaultvalue("")]*/ szDir, SW_SHOWNORMAL); - } - - int AU3_RunAs(WString szUser, WString szDomain, WString szPassword, - int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir, int nShowFlag); - - default int AU3_RunAsWait(WString szUser, WString szDomain, - WString szPassword, int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir) { - return AU3_RunAsWait(szUser, szDomain, szPassword, nLogonFlag, szProgram, - /*[in,defaultvalue("")]*/ szDir, SW_SHOWNORMAL); - } - - int AU3_RunAsWait(WString szUser, WString szDomain, WString szPassword, - int nLogonFlag, WString szProgram, - /*[in,defaultvalue("")]*/ WString szDir, int nShowFlag); - - default void AU3_Send(WString szSendText) { - AU3_Send(szSendText, 0); - } - - void AU3_Send(WString szSendText, int nMode); - - int AU3_Shutdown(int nFlags); - - void AU3_Sleep(int nMilliseconds); - - int AU3_StatusbarGetText(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, - /*[in,defaultvalue(1)]*/ int nPart, LPWSTR szStatusText, int nBufSize); - - int AU3_StatusbarGetTextByHandle(HWND hWnd, - /*[in,defaultvalue(1)]*/ int nPart, LPWSTR szStatusText, int nBufSize); - - default void AU3_ToolTip(WString szTip) { - AU3_ToolTip(szTip, AU3_INTDEFAULT, AU3_INTDEFAULT); - } - - default void AU3_ToolTip(WString szTip, int nX) { - AU3_ToolTip(szTip, nX, AU3_INTDEFAULT); - } - - void AU3_ToolTip(WString szTip, int nX, int nY); - - int AU3_WinActivate(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinActivateByHandle(HWND hWnd); - - int AU3_WinActive(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinActiveByHandle(HWND hWnd); - - int AU3_WinClose(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinCloseByHandle(HWND hWnd); - - int AU3_WinExists(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinExistsByHandle(HWND hWnd); - - int AU3_WinGetCaretPos(Pointer lpPoint); - - void AU3_WinGetClassList(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); - - void AU3_WinGetClassListByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); - - int AU3_WinGetClientSize(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, RECT lpRect); - - int AU3_WinGetClientSizeByHandle(HWND hWnd, RECT lpRect); - - HWND AU3_WinGetHandle(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - void AU3_WinGetHandleAsText(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); - - int AU3_WinGetPos(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - RECT lpRect); - - int AU3_WinGetPosByHandle(HWND hWnd, RECT lpRect); - - DWORD AU3_WinGetProcess(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - DWORD AU3_WinGetProcessByHandle(HWND hWnd); - - int AU3_WinGetState(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinGetStateByHandle(HWND hWnd); - - void AU3_WinGetText(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - LPWSTR szRetText, int nBufSize); - - void AU3_WinGetTextByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); - - void AU3_WinGetTitle(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, LPWSTR szRetText, int nBufSize); - - void AU3_WinGetTitleByHandle(HWND hWnd, LPWSTR szRetText, int nBufSize); - - int AU3_WinKill(WString szTitle, /*[in,defaultvalue("")]*/ WString szText); - - int AU3_WinKillByHandle(HWND hWnd); - - int AU3_WinMenuSelectItem(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, WString szItem1, - WString szItem2, WString szItem3, WString szItem4, WString szItem5, - WString szItem6, WString szItem7, WString szItem8); - - int AU3_WinMenuSelectItemByHandle(HWND hWnd, WString szItem1, WString szItem2, - WString szItem3, WString szItem4, WString szItem5, WString szItem6, - WString szItem7, WString szItem8); - - void AU3_WinMinimizeAllUndo(); - - default int AU3_WinMove(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nX, int nY) { - return AU3_WinMove(szTitle, /*[in,defaultvalue("")]*/ szText, nX, nY, -1, - -1); - } - - default int AU3_WinMove(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nX, int nY, int nWidth) { - return AU3_WinMove(szTitle, /*[in,defaultvalue("")]*/ szText, nX, nY, - nWidth, -1); - } - - int AU3_WinMove(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nX, int nY, int nWidth, int nHeight); - - default int AU3_WinMoveByHandle(HWND hWnd, int nX, int nY, int nWidth) { - return AU3_WinMoveByHandle(hWnd, nX, nY, nWidth, -1); - } - - int AU3_WinMoveByHandle(HWND hWnd, int nX, int nY, int nWidth, int nHeight); - - int AU3_WinSetOnTop(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nFlag); - - int AU3_WinSetOnTopByHandle(HWND hWnd, int nFlag); - - int AU3_WinSetState(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nFlags); - - int AU3_WinSetStateByHandle(HWND hWnd, int nFlags); - - int AU3_WinSetTitle(WString szTitle, WString szTitledefaultvalue, - WString szText, WString szNewTitle); - - default int AU3_WinSetTitle(WString szTitle, WString szText, - WString szNewTitle) { - return AU3_WinSetTitle(szTitle, new WString(""), szText, szNewTitle); - } - - int AU3_WinSetTitleByHandle(HWND hWnd, WString szNewTitle); - - int AU3_WinSetTrans(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nTrans); - - int AU3_WinSetTransByHandle(HWND hWnd, int nTrans); - - default int AU3_WinWait(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText) { - return AU3_WinWait(szTitle, /*[in,defaultvalue("")]*/ szText, 0); - } - - int AU3_WinWait(WString szTitle, /*[in,defaultvalue("")]*/ WString szText, - int nTimeout); - - int AU3_WinWaitByHandle(HWND hWnd, int nTimeout); - - default int AU3_WinWaitActive(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText) { - return AU3_WinWaitActive(szTitle, /*[in,defaultvalue("")]*/ szText, 0); - } - - int AU3_WinWaitActive(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nTimeout); - - int AU3_WinWaitActiveByHandle(HWND hWnd, int nTimeout); - - default int AU3_WinWaitClose(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText) { - return AU3_WinWaitClose(szTitle, /*[in,defaultvalue("")]*/ szText, 0); - } - - int AU3_WinWaitClose(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nTimeout); - - int AU3_WinWaitCloseByHandle(HWND hWnd, int nTimeout); - - int AU3_WinWaitNotActive(WString szTitle, - /*[in,defaultvalue("")]*/ WString szText, int nTimeout); -} diff --git a/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java b/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java deleted file mode 100644 index c7c4480d6..000000000 --- a/jna_autoit/src/main/java/example/AutoItXLibraryGenerator.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2018 midorlo. - * - * Licensed 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. - */ -package example; - -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; - -/** - * Util Class which helped me generate the interface. Stays here - * in case I need it again. - * @author midorlo - */ -class AutoItXLibraryGenerator { - - protected static void printJavaMethods() { - Method[] methods = new AutoItX().LIB.getClass().getMethods(); - for (Method method : methods) { - System.out - .println("public " + method.getReturnType() + " " + method.getName() - + "(" + prefixPrintJavaMethods(method.getParameters()) + ") {" - + System.lineSeparator() - + ((method.getReturnType().getSimpleName().equals("void")) ? "" - : "return ") - + " LIB." + method.getName() + "(" - + paramsPrintJavaMethods(method.getParameters()) + ");" - + System.lineSeparator() + "}"); - } - } - - private static String prefixPrintJavaMethods(Parameter[] xx) { - String r = ""; - for (Parameter parameter : xx) { - r += parameter.getType().getSimpleName() + " " + parameter.getName() - + ", "; - } - if (r.length() > 0) { - r = r.substring(0, r.length() - 2); - } - return r; - } - - private static String paramsPrintJavaMethods(Parameter[] xx) { - String r = ""; - for (Parameter parameter : xx) { - r += parameter.getName() + ", "; - } - if (r.length() > 0) { - r = r.substring(0, r.length() - 2); - } - return r; - } - - public static void main(String[] args) { - String libraryPath = System.getProperty("user.dir"); - System.setProperty("java.library.path", libraryPath); - printJavaMethods(); - } -} diff --git a/jna_autoit/src/main/java/example/Constants.java b/jna_autoit/src/main/java/example/Constants.java deleted file mode 100644 index a8565218b..000000000 --- a/jna_autoit/src/main/java/example/Constants.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * - * Licensed 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. - */ -package example; - -import java.util.HashMap; -import java.util.Map; - -/** - * @via https://www.autoitscript.com/forum/topic/72905-c-use-of-the-dll-some-idears-for-you/ - * - * @author midorlo - * @author sergueik - */ -public class Constants { - - public static final int AU3_INTDEFAULT = -2147483647; - // "Default" value for _some_ final int parameters (largest negative number) - public static final int ERROR = 1; - public static final int SW_HIDE = 2; - public static final int SW_MAXIMIZE = 3; - public static final int SW_MINIMIZE = 4; - public static final int SW_RESTORE = 5; - public static final int SW_SHOW = 6; - public static final int SW_SHOWDEFAULT = 7; - public static final int SW_SHOWMAXIMIZED = 8; - public static final int SW_SHOWMINIMIZED = 9; - public static final int SW_SHOWMINNOACTIVE = 10; - public static final int SW_SHOWNA = 11; - public static final int SW_SHOWNOACTIVATE = 12; - public static final int SW_SHOWNORMAL = 13; - public static final int VERSION = 109; - - public static final int RUN_LOGON_NOPROFILE = 0; - public static final int RUN_LOGON_PROFILE = 1; - public static final int RUN_LOGON_NETWORK = 2; - public static final int RUN_LOGON_INHERIT = 4; - - // The AutoIt v3 functions return values are unusual - // for a Java program - // e.g. - // https://www.autoitscript.com/autoit3/docs/functions/WinClose.htm - // https://www.autoitscript.com/autoit3/docs/functions/WinKill.htm - // etc. illustrate the pattern: - // Success: 1. - // Failure: 0 if the window is not found, - // or can not be activated - // some functions only return success value of 1. - - // https://www.autoitscript.com/autoit3/docs/appendix/AutoItConstants.htm - // https://github.com/310ken1/AutoItSciTEj/blob/master/language/au3/Include/AutoItConstants.au3 - // TODO: rename constants used in this class - public static final int AU3_SUCCESS = 1; - public static final int AU3_FAILURE = 0; - - public static final int AU3_WINDOWS_NOONTOP = 0; - public static final int AU3_WINDOWS_ONTOP = 1; - - public static final int WIN_STATE_EXISTS = 1; - public static final int WIN_STATE_VISIBLE = 2; - public static final int WIN_STATE_ENABLED = 4; - public static final int WIN_STATE_ACTIVE = 8; - public static final int WIN_STATE_MINIMIZED = 16; - public static final int WIN_STATE_MAXIMIZED = 32; - - public static final Map stateNames = new HashMap<>(); - static { - stateNames.put(WIN_STATE_EXISTS, "Window exists"); - stateNames.put(WIN_STATE_VISIBLE, "Window is visible"); - stateNames.put(WIN_STATE_ENABLED, "Window is enabled"); - stateNames.put(WIN_STATE_ACTIVE, "Window is active"); - stateNames.put(WIN_STATE_MINIMIZED, "Window is minimized"); - stateNames.put(WIN_STATE_MAXIMIZED, "Window is maximized"); - } - - public static final int AU3_SEND_DEFAULT = 0; - public static final int AU3_SEND_RAW = 1; - - public static final String DLL = (System.getProperty("os.arch") - .equals("amd64") ? "AutoItX3_x64.dll" : "AutoItX3.dll"); -} diff --git a/jna_autoit/src/main/java/example/UnsignedInt.java b/jna_autoit/src/main/java/example/UnsignedInt.java deleted file mode 100644 index 1facd08c8..000000000 --- a/jna_autoit/src/main/java/example/UnsignedInt.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2018 midorlo. - * - * Licensed 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. - */ -package example; - -import com.sun.jna.IntegerType; - -/** - * @author midorlo - * @author sergueik - */ -@SuppressWarnings("serial") -public class UnsignedInt extends IntegerType { - public UnsignedInt() { - super(4, true); - } -} \ No newline at end of file diff --git a/jna_autoit/src/main/resources/AutoItX3.Assembly.dll b/jna_autoit/src/main/resources/AutoItX3.Assembly.dll deleted file mode 100755 index 1dba8004248bf2620d74848d5547370c00b899cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42664 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 H2=7X&FS$EaF2mzHDHMj=1LKZK4^XN>~< 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 diff --git a/jna_autoit/src/main/resources/AutoItX3.dll b/jna_autoit/src/main/resources/AutoItX3.dll deleted file mode 100755 index f7b8257cd96c877df6951037e6d79e65e73784a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465080 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 z 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

Z!R8+fKHqDJn~m+| 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

}@;)3yf3g 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 Yw5r#vfF;C@n-gB#juSGrQl{tr4}0MjTmS$7 diff --git a/jna_autoit/src/main/resources/AutoItX3_x64.dll b/jna_autoit/src/main/resources/AutoItX3_x64.dll deleted file mode 100755 index 437d74cd80d8e3e3bb8f76e28a4a634b6942558b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524472 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 . +06/02/2025 01:44 PM .. +10/01/2024 01:05 PM 89,262,080 avcodec-61.dll +10/01/2024 01:05 PM 4,483,072 avdevice-61.dll +10/01/2024 01:05 PM 41,905,152 avfilter-10.dll +10/01/2024 01:05 PM 18,482,176 avformat-61.dll +10/01/2024 01:05 PM 2,814,976 avutil-59.dll +10/01/2024 01:05 PM 431,616 ffmpeg.exe + +10/01/2024 01:05 PM 13,053,952 ffplay.exe +10/01/2024 01:05 PM 220,672 ffprobe.exe +10/01/2024 01:05 PM 87,552 postproc-58.dll +10/01/2024 01:05 PM 438,784 swresample-5.dll +10/01/2024 01:05 PM 707,584 swscale-8.dll + 11 File(s) 171,887,616 bytes + 2 Dir(s) 404,121,391,104 bytes free + +path=%path%;C:\Users\kouzm\AppData\Local\Programs\FFmpeg\bin + +-F +REM 136 +-f 136 + +-f "bv*+ba/best" -o "%(title)s.%(ext)s" + +c:\Users\kouzm\Downloads\yt-dlp.exe `-f "bv*+ba/best" -o "%(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLBu9owL7sQV9BRWQvGzBi-KkmqMR6qWK8" From 8fc768e775e042050fd95eda0db3a58612a0927f Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Sun, 27 Jul 2025 23:14:55 -0400 Subject: [PATCH 113/171] added custom script to launch app on Azul JDK, but not working because of java.lang.NoClassDefFoundError: org/fxmisc/cssfx/CSSFX --- javafx-markdown/README.md | 950 ++++++++++------------- javafx-markdown/pom-java11.xml | 3 +- javafx-markdown/pom.xml | 4 +- javafx-markdown/screenshots/azul-jdk.png | Bin 0 -> 170049 bytes javafx-markdown/test-jdk11.cmd | 37 +- javafx-markdown/test.cmd | 11 +- 6 files changed, 442 insertions(+), 563 deletions(-) create mode 100644 javafx-markdown/screenshots/azul-jdk.png diff --git a/javafx-markdown/README.md b/javafx-markdown/README.md index 9af0d1961..95ea1056a 100644 --- a/javafx-markdown/README.md +++ b/javafx-markdown/README.md @@ -1,550 +1,400 @@ -### Info - -This directory contains the replica of -[markdown-javafx-renderer](https://github.com/JPro-one/markdown-javafx-renderer) `MarkdownView` class which uses -[vsch/flexmark-java](https://github.com/vsch/flexmark-java) Java implementation of markdown [spec](https://spec.commonmark.org/0.28/) and [real time CSS reloading](https://github.com/mcfoggy/cssfx) -converted temporarily to maven and Java 1.8. Also switched to classic `pom.xml` rom using [JPro custom build process](https://github.com/JPro-one/JPro-from-Jars) - -### Usage - -```cmd -mvn clean package -java -jar target\example.javafx_markdown.jar -``` -or if you need to explicitly load assemblies -```cmd -java -cp target\example.javafx_markdown.jar;target\lib\* example.Example -``` -and -```sh -mvn clean package -java -jar target/example.javafx_markdown.jar -``` -or if you need to explicitly load assemblies -```sh -java -cp target/example.javafx_markdown.jar:target/lib/* example.Example -``` - -NOTE: on Windows, uses `;` as class path argument separator. For unix do `:` - - -### TODO - -* The project does not compile with JDK 11. To reproduce, make the following settings in the vanilla console: -```cmd -set JAVA_HOME=c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64 -call c:\java\init.cmd -``` -then call -```cmd -call test.cmd -``` - -Will get errors: -```text -[ERROR] COMPILATION ERROR : -[INFO] ------------------------------------------------------------- -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[3,26] package javafx.application does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[4,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[5,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[6,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[7,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[8,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[9,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[10,27] package javafx.scene.layout does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[11,20] package javafx.stage does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[21,30] cannot find symbol - symbol: class Application -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[26,27] cannot find symbol - symbol: class Stage - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[11,26] package javafx.application does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[12,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[13,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[14,23] package javafx.geometry does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[15,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[16,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[18,25] package javafx.scene.text does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[19,25] package javafx.scene.text does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[20,19] package javafx.util does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[31,37] cannot find symbol - symbol: class VBox -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[3,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[4,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[5,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[7,26] package javafx.scene.image does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[8,26] package javafx.scene.image does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[9,27] package javafx.scene.layout does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[12,35] cannot find symbol - symbol: class VBox -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,23] cannot find symbol - symbol: class Pair - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,9] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[50,9] cannot find symbol - symbol: class GridPane - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[53,9] cannot find symbol - symbol: class TextFlow - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,17] cannot find symbol - symbol: class SimpleStringProperty - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[33,16] cannot find symbol - symbol: class StringProperty - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[49,29] cannot find symbol - symbol: class Node - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[54,16] cannot find symbol - symbol: class Node - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[17,1] package javafx.scene.layout does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[25,9] method does not override or implement a method from a supertype -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[30,44] cannot find symbol - symbol: method getClass() - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[42,45] cannot find symbol - symbol: class Node -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[51,32] cannot find symbol - symbol: class Node -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,53] cannot find symbol - symbol: class SimpleStringProperty - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[19,17] cannot find symbol - symbol: method getStylesheets() - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[29,17] cannot find symbol - symbol: method getChildren() - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[30,17] cannot find symbol - symbol: method getChildren() - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[56,36] cannot find symbol - symbol: class Group - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,36] cannot find symbol - symbol: class ImageView - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,50] cannot find symbol - symbol: class Image - location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[44,48] cannot find symbol - symbol: variable Cursor -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[53,52] cannot find symbol - symbol: class ColorPicker -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,17] cannot find symbol - symbol: class TextArea - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,41] cannot find symbol - symbol: class TextArea - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[63,29] cannot find symbol - symbol: method getStylesheets() - location: variable markdownView of type example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,17] cannot find symbol - symbol: class ScrollPane - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,42] cannot find symbol - symbol: class ScrollPane - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,17] cannot find symbol - symbol: class HBox - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,33] cannot find symbol - symbol: class HBox - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,17] cannot find symbol - symbol: class Scene - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,35] cannot find symbol - symbol: class Scene - location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[88,42] cannot find symbol - symbol: method getClass() -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,84] cannot find symbol - symbol: class Pair - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,25] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,17] cannot find symbol - symbol: class TextFlow - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,40] cannot find symbol - symbol: class TextFlow - location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[88,21] cannot find symbol - symbol: method getChildren() -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,25] cannot find symbol - symbol: class Label - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,43] cannot find symbol - symbol: class Label - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,25] cannot find symbol - symbol: class Region - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,43] cannot find symbol - symbol: class Region - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[153,25] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[154,36] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,25] cannot find symbol - symbol: class Label - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,43] cannot find symbol - symbol: class Label - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,25] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,41] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[242,25] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,25] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,44] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,25] cannot find symbol - symbol: class Label - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,43] cannot find symbol - symbol: class Label - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,25] cannot find symbol - symbol: class HBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,41] cannot find symbol - symbol: class HBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[259,43] cannot find symbol - symbol: variable Pos - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[292,25] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[293,36] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[305,25] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[306,36] cannot find symbol - symbol: class VBox - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[344,34] cannot find symbol - symbol: class Pair - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[352,25] cannot find symbol - symbol: variable Platform - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,33] cannot find symbol - symbol: class BooleanProperty - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,65] cannot find symbol - symbol: class SimpleBooleanProperty - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[357,57] cannot find symbol - symbol: method isHover() - location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[365,69] cannot find symbol - symbol: method getStyleClass() - location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[367,69] cannot find symbol - symbol: method getStyleClass() - location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[377,45] cannot find symbol - symbol: method hoverProperty() - location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[428,25] cannot find symbol - symbol: class TextFlow - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[429,36] cannot find symbol - symbol: class GridPane - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,33] cannot find symbol - symbol: class ColumnConstraints - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,68] cannot find symbol - symbol: class ColumnConstraints - location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[468,25] cannot find symbol - symbol: class TextFlow - location: class example.MDFXNodeHelper.MDParser -[INFO] 100 errors -[INFO] ------------------------------------------------------------- -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD FAILURE -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 36.979 s -[INFO] Finished at: 2023-07-06T11:32:35-04:00 -[INFO] ------------------------------------------------------------------------ -[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project javafx_markdown: Compilation failure: Compilation failure: -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[3,26] package javafx.application does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[4,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[5,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[6,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[7,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[8,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[9,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[10,27] package javafx.scene.layout does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[11,20] package javafx.stage does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[21,30] cannot find symbol -[ERROR] symbol: class Application -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[26,27] cannot find symbol -[ERROR] symbol: class Stage -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[11,26] package javafx.application does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[12,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[13,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[14,23] package javafx.geometry does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[15,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[16,28] package javafx.scene.control does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[18,25] package javafx.scene.text does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[19,25] package javafx.scene.text does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[20,19] package javafx.util does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[31,37] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[3,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[4,29] package javafx.beans.property does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[5,20] package javafx.scene does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[7,26] package javafx.scene.image does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[8,26] package javafx.scene.image does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[9,27] package javafx.scene.layout does not exist -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[12,35] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,23] cannot find symbol -[ERROR] symbol: class Pair -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,9] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[50,9] cannot find symbol -[ERROR] symbol: class GridPane -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[53,9] cannot find symbol -[ERROR] symbol: class TextFlow -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,17] cannot find symbol -[ERROR] symbol: class SimpleStringProperty -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[33,16] cannot find symbol -[ERROR] symbol: class StringProperty -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[49,29] cannot find symbol -[ERROR] symbol: class Node -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[54,16] cannot find symbol -[ERROR] symbol: class Node -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[17,1] package javafx.scene.layout does not exist -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[25,9] method does not override or implement a method from a supertype -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[30,44] cannot find symbol -[ERROR] symbol: method getClass() -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[42,45] cannot find symbol -[ERROR] symbol: class Node -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[51,32] cannot find symbol -[ERROR] symbol: class Node -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[14,53] cannot find symbol -[ERROR] symbol: class SimpleStringProperty -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[19,17] cannot find symbol -[ERROR] symbol: method getStylesheets() -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[29,17] cannot find symbol -[ERROR] symbol: method getChildren() -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[30,17] cannot find symbol -[ERROR] symbol: method getChildren() -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[56,36] cannot find symbol -[ERROR] symbol: class Group -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,36] cannot find symbol -[ERROR] symbol: class ImageView -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/MarkdownView.java:[58,50] cannot find symbol -[ERROR] symbol: class Image -[ERROR] location: class example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[44,48] cannot find symbol -[ERROR] symbol: variable Cursor -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[53,52] cannot find symbol -[ERROR] symbol: class ColorPicker -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,17] cannot find symbol -[ERROR] symbol: class TextArea -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[60,41] cannot find symbol -[ERROR] symbol: class TextArea -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[63,29] cannot find symbol -[ERROR] symbol: method getStylesheets() -[ERROR] location: variable markdownView of type example.MarkdownView -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,17] cannot find symbol -[ERROR] symbol: class ScrollPane -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[65,42] cannot find symbol -[ERROR] symbol: class ScrollPane -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,17] cannot find symbol -[ERROR] symbol: class HBox -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[70,33] cannot find symbol -[ERROR] symbol: class HBox -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,17] cannot find symbol -[ERROR] symbol: class Scene -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[72,35] cannot find symbol -[ERROR] symbol: class Scene -[ERROR] location: class example.Example -[ERROR] /../javafx-markdown/src/main/java/example/Example.java:[88,42] cannot find symbol -[ERROR] symbol: method getClass() -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[42,84] cannot find symbol -[ERROR] symbol: class Pair -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[48,25] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,17] cannot find symbol -[ERROR] symbol: class TextFlow -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[65,40] cannot find symbol -[ERROR] symbol: class TextFlow -[ERROR] location: class example.MDFXNodeHelper -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[88,21] cannot find symbol -[ERROR] symbol: method getChildren() -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,25] cannot find symbol -[ERROR] symbol: class Label -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[134,43] cannot find symbol -[ERROR] symbol: class Label -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,25] cannot find symbol -[ERROR] symbol: class Region -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[137,43] cannot find symbol -[ERROR] symbol: class Region -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[153,25] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[154,36] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,25] cannot find symbol -[ERROR] symbol: class Label -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[196,43] cannot find symbol -[ERROR] symbol: class Label -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,25] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[198,41] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[242,25] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,25] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[244,44] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,25] cannot find symbol -[ERROR] symbol: class Label -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[251,43] cannot find symbol -[ERROR] symbol: class Label -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,25] cannot find symbol -[ERROR] symbol: class HBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[256,41] cannot find symbol -[ERROR] symbol: class HBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[259,43] cannot find symbol -[ERROR] symbol: variable Pos -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[292,25] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[293,36] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[305,25] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[306,36] cannot find symbol -[ERROR] symbol: class VBox -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[344,34] cannot find symbol -[ERROR] symbol: class Pair -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[352,25] cannot find symbol -[ERROR] symbol: variable Platform -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,33] cannot find symbol -[ERROR] symbol: class BooleanProperty -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[353,65] cannot find symbol -[ERROR] symbol: class SimpleBooleanProperty -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[357,57] cannot find symbol -[ERROR] symbol: method isHover() -[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[365,69] cannot find symbol -[ERROR] symbol: method getStyleClass() -[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[367,69] cannot find symbol -[ERROR] symbol: method getStyleClass() -[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[377,45] cannot find symbol -[ERROR] symbol: method hoverProperty() -[ERROR] location: variable node of type com.vladsch.flexmark.util.ast.Node -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[428,25] cannot find symbol -[ERROR] symbol: class TextFlow -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[429,36] cannot find symbol -[ERROR] symbol: class GridPane -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,33] cannot find symbol -[ERROR] symbol: class ColumnConstraints -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[438,68] cannot find symbol -[ERROR] symbol: class ColumnConstraints -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] /../javafx-markdown/src/main/java/example/MDFXNodeHelper.java:[468,25] cannot find symbol -[ERROR] symbol: class TextFlow -[ERROR] location: class example.MDFXNodeHelper.MDParser -[ERROR] -> [Help 1] -[ERROR] -[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. -[ERROR] Re-run Maven using the -X switch to enable full debug logging. -[ERROR] -[ERROR] For more information about the errors and possible solutions, please read the following articles: -[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException -done - -``` -### See Also - * javascript and JavaFX powered [Markdown Editor](https://github.com/arildyk/simple-markdown-editor) (need to convert from visual studio code project) - -### Author -[Serguei Kouzmine](kouzmine_serguei@yahoo.com) - - +### Info + +This directory contains the replica of +[markdown-javafx-renderer](https://github.com/JPro-one/markdown-javafx-renderer) `MarkdownView` class which uses +[vsch/flexmark-java](https://github.com/vsch/flexmark-java) Java implementation of markdown [spec](https://spec.commonmark.org/0.28/) and [real time CSS reloading](https://github.com/mcfoggy/cssfx) +converted temporarily to maven and Java 1.8. Also switched to classic `pom.xml` rom using [JPro custom build process](https://github.com/JPro-one/JPro-from-Jars) + +### Usage + +```cmd +mvn clean package +java -jar target\example.javafx_markdown.jar +``` +or if you need to explicitly load assemblies +```cmd +java -cp target\example.javafx_markdown.jar;target\lib\* example.Example +``` +and +```sh +mvn clean package +java -jar target/example.javafx_markdown.jar +``` +or if you need to explicitly load assemblies +```sh +java -cp target/example.javafx_markdown.jar:target/lib/* example.Example +``` + +NOTE: on Windows, uses `;` as class path argument separator. For unix do `:` + + +### TODO + +* The project does not run with Azul JDK 11. + +To reproduce, call: +```cmd +call test-jdk11.cmd +``` + +Will get error (after significant delay) : + +```text + +Exception in Application start method +Exception in thread "main" java.lang.reflect.InvocationTargetException + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1093) +Caused by: java.lang.RuntimeException: Exception in Application start method + at javafx.graphics@19/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901) + at javafx.graphics@19/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196) + at java.base/java.lang.Thread.run(Thread.java:829) +Caused by: java.lang.NoClassDefFoundError: org/fxmisc/cssfx/CSSFX + at example.Example.start(Example.java:28) + at javafx.graphics@19/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847) + at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) + at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) + at java.base/java.security.AccessController.doPrivileged(Native Method) + at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) + at javafx.graphics@19/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) + at javafx.graphics@19/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) + at javafx.graphics@19/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) + ... 1 more +Caused by: java.lang.ClassNotFoundException: org.fxmisc.cssfx.CSSFX +`org.fxmisc.cssfx` to `--add-modules` argument + +leads to build error: +```java.lang.module.FindException: Module org.fxmisc.cssfx not found +``` + at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) + at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527) + ... 10 more + +``` +adding `org.fxmisc.cssfx` to `--add-modules` argument + +leads to build error: + +```text +java.lang.module.FindException: Module org.fxmisc.cssfx not found +``` +### Testing + +#### Linux with JDK 8 + + + +```sh +java -version +``` +```text +openjdk version "11.0.27" 2025-04-15 +OpenJDK Runtime Environment (build 11.0.27+6-post-Ubuntu-0ubuntu122.04) +OpenJDK 64-Bit Server VM (build 11.0.27+6-post-Ubuntu-0ubuntu122.04, mixed mode, sharing) +``` +```sh +sudo apt-get install openjdk-8-jdk +``` +```text + The following additional packages will be installed: + fonts-dejavu-extra libatk-wrapper-java libatk-wrapper-java-jni libgif7 + libice-dev libpthread-stubs0-dev libsm-dev libx11-dev libxau-dev libxcb1-dev + libxdmcp-dev libxt-dev openjdk-8-jdk-headless openjdk-8-jre + openjdk-8-jre-headless x11proto-dev xorg-sgml-doctools xtrans-dev +Suggested packages: + libice-doc libsm-doc libx11-doc libxcb-doc libxt-doc openjdk-8-demo + openjdk-8-source visualvm fonts-nanum fonts-ipafont-gothic + fonts-ipafont-mincho fonts-wqy-microhei fonts-wqy-zenhei fonts-indic +The following NEW packages will be installed: + fonts-dejavu-extra libatk-wrapper-java libatk-wrapper-java-jni libgif7 + libice-dev libpthread-stubs0-dev libsm-dev libx11-dev libxau-dev libxcb1-dev + libxdmcp-dev libxt-dev openjdk-8-jdk openjdk-8-jdk-headless openjdk-8-jre + openjdk-8-jre-headless x11proto-dev xorg-sgml-doctools xtrans-dev +0 upgraded, 19 newly installed, 0 to remove and 52 not upgraded. +Need to get 48.0 MB of archives. +After this operation, 163 MB of additional disk space will be used. +Do you want to continue? [Y/n] +``` +```sh +Y +``` +```text + +Get:1 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 fonts-dejavu-extra all 2.37-2build1 [2,041 kB] +Get:2 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libatk-wrapper-java all 0.38.0-5build1 [53.1 kB] +Get:3 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libatk-wrapper-java-jni amd64 0.38.0-5build1 [49.0 kB] +Get:4 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgif7 amd64 5.1.9-2ubuntu0.1 [33.9 kB] +Get:5 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 xorg-sgml-doctools all 1:1.11-1.1 [10.9 kB] +Get:6 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 x11proto-dev all 2021.5-1 [604 kB] +Get:7 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libice-dev amd64 2:1.0.10-1build2 [51.4 kB] +Get:8 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libpthread-stubs0-dev amd64 0.4-1build2 [5,516 B] +Get:9 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libsm-dev amd64 2:1.2.3-1build2 [18.1 kB] +Get:10 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxau-dev amd64 1:1.0.9-1build5 [9,724 B] +Get:11 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxdmcp-dev amd64 1:1.1.3-0ubuntu5 [26.5 kB] +Get:12 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 xtrans-dev all 1.4.0-1 [68.9 kB] +Get:13 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxcb1-dev amd64 1.14-3ubuntu3 [86.5 kB] +Get:14 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libx11-dev amd64 2:1.7.5-1ubuntu0.3 [744 kB] +Get:15 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxt-dev amd64 1:1.2.1-1 [396 kB] +Get:16 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jre-headless amd64 8u452-ga~us1-0ubuntu1~22.04 [30.8 MB] +Get:17 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jre amd64 8u452-ga~us1-0ubuntu1~22.04 [75.3 kB] +Get:18 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jdk-headless amd64 8u452-ga~us1-0ubuntu1~22.04 [8,878 kB] +Get:19 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jdk amd64 8u452-ga~us1-0ubuntu1~22.04 [4,039 kB] +Fetched 48.0 MB in 6s (8,625 kB/s) +Selecting previously unselected package fonts-dejavu-extra. +(Reading database ... 244117 files and directories currently installed.) +Preparing to unpack .../00-fonts-dejavu-extra_2.37-2build1_all.deb ... +Unpacking fonts-dejavu-extra (2.37-2build1) ... +Selecting previously unselected package libatk-wrapper-java. +Preparing to unpack .../01-libatk-wrapper-java_0.38.0-5build1_all.deb ... +Unpacking libatk-wrapper-java (0.38.0-5build1) ... +Selecting previously unselected package libatk-wrapper-java-jni:amd64. +Preparing to unpack .../02-libatk-wrapper-java-jni_0.38.0-5build1_amd64.deb ... +Unpacking libatk-wrapper-java-jni:amd64 (0.38.0-5build1) ... +Selecting previously unselected package libgif7:amd64. +Preparing to unpack .../03-libgif7_5.1.9-2ubuntu0.1_amd64.deb ... +Unpacking libgif7:amd64 (5.1.9-2ubuntu0.1) ... +Selecting previously unselected package xorg-sgml-doctools. +Preparing to unpack .../04-xorg-sgml-doctools_1%3a1.11-1.1_all.deb ... +Unpacking xorg-sgml-doctools (1:1.11-1.1) ... +Selecting previously unselected package x11proto-dev. +Preparing to unpack .../05-x11proto-dev_2021.5-1_all.deb ... +Unpacking x11proto-dev (2021.5-1) ... +Selecting previously unselected package libice-dev:amd64. +Preparing to unpack .../06-libice-dev_2%3a1.0.10-1build2_amd64.deb ... +Unpacking libice-dev:amd64 (2:1.0.10-1build2) ... +Selecting previously unselected package libpthread-stubs0-dev:amd64. +Preparing to unpack .../07-libpthread-stubs0-dev_0.4-1build2_amd64.deb ... +Unpacking libpthread-stubs0-dev:amd64 (0.4-1build2) ... +Selecting previously unselected package libsm-dev:amd64. +Preparing to unpack .../08-libsm-dev_2%3a1.2.3-1build2_amd64.deb ... +Unpacking libsm-dev:amd64 (2:1.2.3-1build2) ... +Selecting previously unselected package libxau-dev:amd64. +Preparing to unpack .../09-libxau-dev_1%3a1.0.9-1build5_amd64.deb ... +Unpacking libxau-dev:amd64 (1:1.0.9-1build5) ... +Selecting previously unselected package libxdmcp-dev:amd64. +Preparing to unpack .../10-libxdmcp-dev_1%3a1.1.3-0ubuntu5_amd64.deb ... +Unpacking libxdmcp-dev:amd64 (1:1.1.3-0ubuntu5) ... +Selecting previously unselected package xtrans-dev. +Preparing to unpack .../11-xtrans-dev_1.4.0-1_all.deb ... +Unpacking xtrans-dev (1.4.0-1) ... +Selecting previously unselected package libxcb1-dev:amd64. +Preparing to unpack .../12-libxcb1-dev_1.14-3ubuntu3_amd64.deb ... +Unpacking libxcb1-dev:amd64 (1.14-3ubuntu3) ... +Selecting previously unselected package libx11-dev:amd64. +Preparing to unpack .../13-libx11-dev_2%3a1.7.5-1ubuntu0.3_amd64.deb ... +Unpacking libx11-dev:amd64 (2:1.7.5-1ubuntu0.3) ... +Selecting previously unselected package libxt-dev:amd64. +Preparing to unpack .../14-libxt-dev_1%3a1.2.1-1_amd64.deb ... +Unpacking libxt-dev:amd64 (1:1.2.1-1) ... +Selecting previously unselected package openjdk-8-jre-headless:amd64. +Preparing to unpack .../15-openjdk-8-jre-headless_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... +Unpacking openjdk-8-jre-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +Selecting previously unselected package openjdk-8-jre:amd64. +Preparing to unpack .../16-openjdk-8-jre_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... +Unpacking openjdk-8-jre:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +Selecting previously unselected package openjdk-8-jdk-headless:amd64. +Preparing to unpack .../17-openjdk-8-jdk-headless_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... +Unpacking openjdk-8-jdk-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +Selecting previously unselected package openjdk-8-jdk:amd64. +Preparing to unpack .../18-openjdk-8-jdk_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... +Unpacking openjdk-8-jdk:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +Setting up libpthread-stubs0-dev:amd64 (0.4-1build2) ... +Setting up xtrans-dev (1.4.0-1) ... +Setting up openjdk-8-jre-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode +Setting up libgif7:amd64 (5.1.9-2ubuntu0.1) ... +Setting up fonts-dejavu-extra (2.37-2build1) ... +Setting up xorg-sgml-doctools (1:1.11-1.1) ... +Setting up libatk-wrapper-java (0.38.0-5build1) ... +Setting up libatk-wrapper-java-jni:amd64 (0.38.0-5build1) ... +Setting up openjdk-8-jdk-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/clhsdb to provide /usr/bin/clhsdb (clhsdb) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/extcheck to provide /usr/bin/extcheck (extcheck) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/hsdb to provide /usr/bin/hsdb (hsdb) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/idlj to provide /usr/bin/idlj (idlj) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jar to provide /usr/bin/jar (jar) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jarsigner to provide /usr/bin/jarsigner (jarsigner) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javadoc to provide /usr/bin/javadoc (javadoc) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javah to provide /usr/bin/javah (javah) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javap to provide /usr/bin/javap (javap) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jcmd to provide /usr/bin/jcmd (jcmd) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jdb to provide /usr/bin/jdb (jdb) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jdeps to provide /usr/bin/jdeps (jdeps) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jfr to provide /usr/bin/jfr (jfr) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jhat to provide /usr/bin/jhat (jhat) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jinfo to provide /usr/bin/jinfo (jinfo) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jmap to provide /usr/bin/jmap (jmap) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jps to provide /usr/bin/jps (jps) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jrunscript to provide /usr/bin/jrunscript (jrunscript) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jsadebugd to provide /usr/bin/jsadebugd (jsadebugd) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstack to provide /usr/bin/jstack (jstack) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstat to provide /usr/bin/jstat (jstat) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstatd to provide /usr/bin/jstatd (jstatd) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/native2ascii to provide /usr/bin/native2ascii (native2ascii) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/rmic to provide /usr/bin/rmic (rmic) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/schemagen to provide /usr/bin/schemagen (schemagen) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/serialver to provide /usr/bin/serialver (serialver) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/wsgen to provide /usr/bin/wsgen (wsgen) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/wsimport to provide /usr/bin/wsimport (wsimport) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/xjc to provide /usr/bin/xjc (xjc) in auto mode +Setting up openjdk-8-jre:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode +Setting up openjdk-8-jdk:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer to provide /usr/bin/appletviewer (appletviewer) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole to provide /usr/bin/jconsole (jconsole) in auto mode +Processing triggers for hicolor-icon-theme (0.17-2) ... +Processing triggers for gnome-menus (3.36.0-1ubuntu3) ... +Processing triggers for libc-bin (2.35-0ubuntu3.10) ... +Processing triggers for man-db (2.10.2-1) ... +Processing triggers for sgml-base (1.30) ... +Processing triggers for mailcap (3.70+nmu1ubuntu1) ... +Setting up x11proto-dev (2021.5-1) ... +Processing triggers for fontconfig (2.13.1-4.2ubuntu5) ... +Processing triggers for desktop-file-utils (0.26-1ubuntu3) ... +Setting up libxau-dev:amd64 (1:1.0.9-1build5) ... +Setting up libice-dev:amd64 (2:1.0.10-1build2) ... +Setting up libsm-dev:amd64 (2:1.2.3-1build2) ... +Setting up libxdmcp-dev:amd64 (1:1.1.3-0ubuntu5) ... +Setting up libxcb1-dev:amd64 (1.14-3ubuntu3) ... +Setting up libx11-dev:amd64 (2:1.7.5-1ubuntu0.3) ... +Setting up libxt-dev:amd64 (1:1.2.1-1) ... +sergueik@sergueik47:~$ java -version +openjdk version "11.0.27" 2025-04-15 +OpenJDK Runtime Environment (build 11.0.27+6-post-Ubuntu-0ubuntu122.04) +OpenJDK 64-Bit Server VM (build 11.0.27+6-post-Ubuntu-0ubuntu122.04, mixed mode, sharing) +``` +```sh +dpkg -l | grep openj +``` +```text +ii libopenjp2-7:amd64 2.4.0-6ubuntu0.3 amd64 JPEG 2000 image compression/decompression library +ii openjdk-11-jre-headless:amd64 11.0.27+6~us1-0ubuntu1~22.04 amd64 OpenJDK Java runtime, using Hotspot JIT (headless) +ii openjdk-8-jdk:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Development Kit (JDK) +ii openjdk-8-jdk-headless:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Development Kit (JDK) (headless) +ii openjdk-8-jre:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Java runtime, using Hotspot JIT +ii openjdk-8-jre-headless:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Java runtime, using Hotspot JIT (headless) +``` + +```sh +sudo apt-get remove openjdk-11-jre +``` +```text +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +Package 'openjdk-11-jre' is not installed, so not removed +The following packages were automatically installed and are no longer required: + libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib python2-minimal + python2.7 python2.7-minimal +Use 'sudo apt autoremove' to remove them. +0 upgraded, 0 newly installed, 0 to remove and 52 not upgraded. +sergueik@sergueik47:~$ sudo apt-get remove openjdk-11-jre-headless +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +The following packages were automatically installed and are no longer required: + libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib python2-minimal + python2.7 python2.7-minimal +Use 'sudo apt autoremove' to remove them. +The following packages will be REMOVED: + default-jre-headless openjdk-11-jre-headless +0 upgraded, 0 newly installed, 2 to remove and 52 not upgraded. +After this operation, 176 MB disk space will be freed. +Do you want to continue? [Y/n] +``` +```text +(Reading database ... 245165 files and directories currently installed.) +Removing default-jre-headless (2:1.11-72build2) ... +Removing openjdk-11-jre-headless:amd64 (11.0.27+6~us1-0ubuntu1~22.04) ... +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/jjs to provide /usr/bin/jjs (jjs) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode +update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode +``` + +### .Net Framework Alternatives + +
    +
  1. +Use a Markdown-to-HTML converter like [Markdig](https://github.com/xoofx/markdig) that can be added as nuget dependency +[Markdig](https://www.nuget.org/packages/Markdig) +(modern, pure .NET) or [CommonMark.NET](https://www.nuget.org/packages/CommonMark.NET) to perform Markdown to HTML conversion then render in + WebBrowser control embedded in an Windows Forms or in WPF through `System.Windows.Forms.WebBrowser`: + +```c# +using Markdig; + +string markdown = File.ReadAllText("README.md"); +string html = Markdown.ToHtml(markdown); + +string fullHtml = $"{html}"; + +webBrowser1.DocumentText = fullHtml; + +``` +this would work even on .NET 4.0+ (Windows has .Net Framework 4.8 ). +The WebBrowser uses IE rendering mode, which one can tweak via registry +(FEAT URE_BROWSER_EMULATION) to look like specific version of the browswer, up to __IE11__. + +
  2. +
  3. Use Markdig with WPF + WebView2 (optional) + +Add [WebView2](https://www.nuget.org/packages/Microsoft.Web.WebView2/1.0.3296.44#supportedframeworks-body-tab) +dependency, this will work with .NET Framework __4.6.2__ and later and offer slightly +more *modern* Chromium-based rendering engine, but the latter is ultra heavy: + +```c# + +string html = Markdown.ToHtml(markdownText); +await webView2Control.EnsureCoreWebView2Async(); +webView2Control.NavigateToString(html); + +``` +
  4. +
  5. Use `RichTextBox` or `FlowDocument` (NOTE: lower fidelity) +There’s no built-in markdown parser, but if you only need bold/italic/lists and want native .NET controls +(e.g., RichTextBox, FlowDocumentViewer), you can parse Markdown manually or via a +Add nuget dependency [Markdown.Xaml](https://www.nuget.org/packages/Markdown.Xaml): + +``` +var md = new Markdown.Xaml.Markdown(); +var flowDoc = md.Transform("**bold** _italic_"); +myFlowDocumentViewer.Document = flowDoc; +``` + +NOTE: This provides basic styling but not a full GitHub-style rendering. + +
  6. +
+ +### Installing Azul JDK + +Unlike OpenJDK 11 and Oracle JDK 11, the [Azul JDK](https://www.azul.com/core-post-download/?endpoint=zulu&uuid=e0449078-aad8-4719-aba8-78ae22fea199) has JavaFX included. + + +* Make sure to uncheck both + ++ add to PATH ++ set JAVA_HOME variable + +when installing the MSI +Also, make sure to install under `C:\java\zulu-jdk11`, not the default location `C:\Program Files\Zulu\zulu-11\` +NOTE: install 32 or 64 bit Azul JDK (`zulu11.82.19-ca-jdk11.0.28-win_i686.msi`/`zulu11.82.19-ca-jdk11.0.28-win_x64.msi`) in the same location + +### See Also + * javascript and JavaFX powered [Markdown Editor](https://github.com/arildyk/simple-markdown-editor) (need to convert from visual studio code project) + +### Author +[Serguei Kouzmine](kouzmine_serguei@yahoo.com) + + diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml index 38657e15f..4194dfcd0 100644 --- a/javafx-markdown/pom-java11.xml +++ b/javafx-markdown/pom-java11.xml @@ -7,6 +7,7 @@ Example UTF-8 + 11.2.0 0.64.2 1.10 4.2 @@ -22,7 +23,7 @@ org.fxmisc.cssfx cssfx - 1.1.1 + ${cssfx.version} com.vladsch.flexmark diff --git a/javafx-markdown/pom.xml b/javafx-markdown/pom.xml index 6ab44c272..baa28e20d 100644 --- a/javafx-markdown/pom.xml +++ b/javafx-markdown/pom.xml @@ -8,6 +8,8 @@ Example UTF-8 0.62.2 + 11.2.0 + 1.10 4.2 1.3 @@ -20,7 +22,7 @@ org.fxmisc.cssfx cssfx - 1.1.1 + ${cssfx.version} com.vladsch.flexmark diff --git a/javafx-markdown/screenshots/azul-jdk.png b/javafx-markdown/screenshots/azul-jdk.png new file mode 100644 index 0000000000000000000000000000000000000000..91b1eff4bfa66f7c67fc29f7e65871ab22cd421f GIT binary patch literal 170049 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 vJmf>$v>E&ojyN9Uvqd>z)K{#8I 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 V;3qote+Yo4rmUq@^UNmVe*sJc{h$B< literal 0 HcmV?d00001 diff --git a/javafx-markdown/test-jdk11.cmd b/javafx-markdown/test-jdk11.cmd index d036d456b..985e3ec15 100644 --- a/javafx-markdown/test-jdk11.cmd +++ b/javafx-markdown/test-jdk11.cmd @@ -1,12 +1,34 @@ @echo OFF -REM avoid naming this script "run.cmd" -where.exe mvn.cmd 2>NUL 1>NUL -if errorlevel 1 goto :SKIP +REM WARNING: avoid naming this script "run.cmd" +REM The 32 or 64 bit Azul JDK will be installed in the same directory +if NOT EXIST "c:\java\zulu-jdk11" ( + echo Directory c:\java\zulu-jdk11 does not exist. + goto :USE_JDK8 +) + +REM the original launcher does not work with OpenJDK 11 due to +REM its module boundaries +REM if JDK 11 is not the default on the host, set it to custom vendor JDK +REM which has JAVAFX now + + +set JAVA_VERSION= +set JAVA_HOME=c:\java\zulu-jdk11 -REM the original launcher does not work with JDK 11 due to its module boundaries -REM if JDK 11 is not the default on the host, set it to custom vendor JDK now -set JAVA_HOME=c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64 +REM if JAVA_HOME points to an empty / non existend directory +REM script fails with error: +REM The JAVA_HOME environment variable is not defined correctly +REM This environment variable is needed to run this program +REM NB: JAVA_HOME should point to a JDK not a JRE +goto :INIT +:USE_JDK8 + +set JAVA_HOME=c:\java\jdk1.8.0_202 +:INIT +set JAVA_VERSION=1.8.0_202 call c:\java\init.cmd +java.exe -version +where.exe mvn.cmd 2>NUL 1>NUL call mvn -f %~dp0pom-java11.xml clean package echo done @@ -17,7 +39,8 @@ java -Dprism.order=sw -cp target\example.javafx_markdown.jar;target\lib\*.* ^ --module-path target/lib ^ --add-modules=javafx.base,javafx.graphics,javafx.controls ^ example.Example - +REM java.lang.module.FindException: Module org.fxmisc.cssfx not found +REM Caused by: java.lang.NoClassDefFoundError: org/fxmisc/cssfx/CSSFX REM fixing the Error: REM JavaFX runtime components are missing, and are required to run this application diff --git a/javafx-markdown/test.cmd b/javafx-markdown/test.cmd index 67b4792f0..85c1c20b0 100644 --- a/javafx-markdown/test.cmd +++ b/javafx-markdown/test.cmd @@ -1,12 +1,15 @@ @echo OFF -REM NOTE: this scropt does not work with JDK 11 -set JAVA_HOME=c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64 +REM WARNING: avoid naming this script "run.cmd" +REM if JDK 11 is not the default on the host, set it to JDK 1.8 now +set JAVA_HOME=c:\java\jdk1.8.0_202 +set JAVA_VERSION=1.8.0_202 call c:\java\init.cmd +java.exe -version where.exe mvn.cmd 2>NUL 1>NUL -REM avoid naming this script "run.cmd" + if errorlevel 1 goto :SKIP -call mvn package +call mvn clean package echo done :SKIP REM the *.* mask should not be used here From 954ca164a64e586d5020022b75a93088053b3c24 Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Sun, 27 Jul 2025 23:42:09 -0400 Subject: [PATCH 114/171] intermediateb revision - aadded azul JDK quirk fixes --- javafx-markdown/README.md | 9 +++++++++ javafx-markdown/pom-java11.xml | 2 +- javafx-markdown/pom.xml | 2 +- javafx-markdown/test-jdk11.cmd | 3 ++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/javafx-markdown/README.md b/javafx-markdown/README.md index 95ea1056a..2b0fcaf4c 100644 --- a/javafx-markdown/README.md +++ b/javafx-markdown/README.md @@ -82,6 +82,15 @@ leads to build error: ```text java.lang.module.FindException: Module org.fxmisc.cssfx not found ``` +#### Note + + * to check if cssfx is a JPMS module + +```cmd +jar tf target/lib/cssfx-11.2.0.jar | findstr.exe module-info.class +``` + + ### Testing #### Linux with JDK 8 diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml index 4194dfcd0..7f5945e65 100644 --- a/javafx-markdown/pom-java11.xml +++ b/javafx-markdown/pom-java11.xml @@ -7,7 +7,7 @@ Example UTF-8 - 11.2.0 + 11.1.0 0.64.2 1.10 4.2 diff --git a/javafx-markdown/pom.xml b/javafx-markdown/pom.xml index baa28e20d..d1db1e3f4 100644 --- a/javafx-markdown/pom.xml +++ b/javafx-markdown/pom.xml @@ -8,7 +8,7 @@ Example UTF-8 0.62.2 - 11.2.0 + 1.1.1 1.10 4.2 diff --git a/javafx-markdown/test-jdk11.cmd b/javafx-markdown/test-jdk11.cmd index 985e3ec15..1c7f25ef2 100644 --- a/javafx-markdown/test-jdk11.cmd +++ b/javafx-markdown/test-jdk11.cmd @@ -35,9 +35,10 @@ echo done :SKIP echo Launching with classpath ^+ modulepath semantics -java -Dprism.order=sw -cp target\example.javafx_markdown.jar;target\lib\*.* ^ +java -Dprism.order=sw ^ --module-path target/lib ^ --add-modules=javafx.base,javafx.graphics,javafx.controls ^ +-cp target\example.javafx_markdown.jar;target\lib\*;. ^ example.Example REM java.lang.module.FindException: Module org.fxmisc.cssfx not found REM Caused by: java.lang.NoClassDefFoundError: org/fxmisc/cssfx/CSSFX From 6b01e1682e466fc362d18584bed029ef895d47c1 Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Tue, 18 Nov 2025 20:48:31 -0500 Subject: [PATCH 115/171] intermediate revision -added placeholder for image which were not commited yet --- javafx-markdown/pom-java11.xml | 22 ++++++ javafx-markdown/pom.xml | 22 ++++++ javafx-markdown/screenshots/app.png | Bin 0 -> 396351 bytes .../src/main/java/example/MDFXNodeHelper.java | 7 +- .../src/main/java/example/MarkdownView.java | 64 +++++++++++++++++- .../src/main/resources/images/placeholder.png | Bin 0 -> 1491 bytes javafx-markdown/test-jdk11.sh | 49 +++++++++++++- 7 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 javafx-markdown/screenshots/app.png create mode 100644 javafx-markdown/src/main/resources/images/placeholder.png diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml index 7f5945e65..94e46b11e 100644 --- a/javafx-markdown/pom-java11.xml +++ b/javafx-markdown/pom-java11.xml @@ -18,6 +18,8 @@ 3.2.0 1.2.17 19 + 2.17.1 + 1.7.5 @@ -60,6 +62,26 @@ javafx-controls ${javafx-controls.version} + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + + + org.apache.logging.log4j + log4j-api + ${log4j-core.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + ${finalName} diff --git a/javafx-markdown/pom.xml b/javafx-markdown/pom.xml index d1db1e3f4..b5ee95487 100644 --- a/javafx-markdown/pom.xml +++ b/javafx-markdown/pom.xml @@ -16,6 +16,8 @@ 2.7 3.3.1 ${project.groupId}.${project.artifactId} + 2.17.1 + 1.7.5 3.2.0 @@ -54,6 +56,26 @@ commons-exec ${commons-exec.version} + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + + + org.apache.logging.log4j + log4j-api + ${log4j-core.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + ${finalName} diff --git a/javafx-markdown/screenshots/app.png b/javafx-markdown/screenshots/app.png new file mode 100644 index 0000000000000000000000000000000000000000..11b6b264e2d7d5e1cb0b165632c9be459d0b5247 GIT binary patch literal 396351 zcmd?RWmr{h*EYI92}zM|0TrYhq#FgKOBx9Qr4gl3x<#Y}X^;-3q#IF?5CM@6X#u4q zzcJP4dB6Q@AMdaIV{_bk3#>Kgyv8-gInHs8ajh_QRYiOpDjXCFg@5a&oF)o&z6k!T zVq?Njl0E07;eTkZnu;>0(oZxi@Xh&q(zoG<6*0KS<{0q(1*e;LTu~^>5#$dV#o&hx z6zVMZmYlTqW0UpCNBSgs_s^l*C*u7Q>r-C$^sVoOyn4Ho7MuI} z^?lS#SIIYWBOSvR8e{FkH)*l)9tDZHk%Z(TT4VAnHQp73fi->tI7TQI*;O= zG}CE3jB?sLl+CePMB}~PijT6SdcP2~zex4o62tzPEqA58>x&8j#k+U2Eagdz41`hj;Ei?B5o{l6KgoN;$FBd-$JG z+Fp(;Vu&k3W5Qo>!8gmnTwrD26u%hH7B8)&6wab=WosK2X(S+VU@qDF@ud`pT32)! z{hY~wto}<@iekpUUs-yrA|h0JWhU~vx(Ss8ZOYnB4yQP8RWQegEBTY)@C?A*6pEVZo{$n z`Sa(cN^}!h{2z6XlB1!a*$iYzhjmdiCJItee|%QbE350v`R1qVvsdX_TUyCc>{bMC zUVMG8xp-MQ9^b+O{{<^4KNZ;Uh9z(Eme#d6>2m@L-<2qm*%anbjXE| zC?)M_(vIbod#@S9xp0$z-wC>-d*{8TwQTkvSP1v4cAd5z=^O18^$%}jb3gbSlwexu z{KtD86P7TFO{_C;f}iTRU_48WkA7`?>*mLgfl3L4?_#NVnQqUj2`nhsy(Qw!UU`_1S-b zZ;B=uUB`e+)a+_BjV&rl1tW@`p4Vg6t+`ERm3L!U(nESc$sy;dQ7IX3kv1#o3#D8q ztpaTs_jrd9QZCG!{}z`UZ%~pT*tnZUoYY$}qxDRtdO3D(Tw$1=`qtm++~T|7Y*Nghxkr zeJRq51;^cBeI68qF)=ZrUZ8o^cGS>zv&kplu;vFYM%s^qL&ht@6xj+<&)wrgS@geT zNHZOX6UZy+ifFT1wKhnRlF!!R6!Q(3mr}{xu2u0*si?q>3O1{rSDo;&PjR&9vh{lrKNx8j&!Cv$w=-H z2`5(m7uHt>IvA2njOlG7;mQ9+mmD>0U2#vEXn%h%^#bi79W!vC+GLi2~s%ESNT zK>r{A;_KJ9_XLI%5CHLX#tA|f6co%isA4THE=HmDe@w;^Fu`xKmYx~cyGOOMBClej zq@iK+rinxUJBe-@)bqi-r3p7z{RDu;}I$Fhm4q@GchqiDuxZu zG^nzB)?*nO9{&9AD(-Us*_@r{@I>&8V`F1dnd+B0IBtssBD)dZYDNlI98}JE#b{$^ z7k+%~Z7YP_gEZjJ%Cq$33^HE*d1d#XS8DJ8JUBz@pH=chHhpLH-wkNg(!^R8u5oB8pB;GI!4 zgKV%Fump%2PPotPj~}1>|2!XC+n>9~%4utpd`i7>4vh3@$^$E&O)uDpQ*pYeMIRlYWB{ueuxRI~4idXX*%gITU-K~B+SWS7s*1^kJHpscJc zr@i$%D5KHKoCv&PF@Rz4aV9wy1m%zWS5 z8yFRZ&(6W2@z(nGN*Tf^JlFnbkN?K1|3!avRFneKhrFR7%(6-$-z7!FggM)~rYL{&1|9X@^37dGswm9y7`5@EIw1%H0In_a8qJOT>tK?u7m|sN?h3D{8ab9kOo9{mO|1UK>BUCgqnVUpZf1_HUIUMd?!+ z@~R_lik_<(wzK2*7s{3wKWHtQ_g3(PehiOu4;$vvGaW}P{q+h2>z_$U2U)M zx?ef{w5Lx5<-L0|A0tff#_zKlMb?IT>omC?G_#6br4dDUH~U?+nB?JpP2$G>g#=T> zXj(MUi)oiQX%X6ThQ=GUSLgrdddcPG+<-X%OK2!d-a8dS;J-$?cf3sZ^R!vb0c{2b z)Ge*8+q$|ifnMg{d7HOTbH>*^af)GTbSN|I?$K*iSv;&coJX2U5lQyV06V6BbU8Y^ zJsKTFcSWp4Pp`S{clT1}P`+EjVM(>%`NPhHZV~QUhBrkyIWkgzg+Eq z)Kg|tMRa`Yz4Bi~L`2A% zn9xB+corM`1eRg_C+{{!2_D%ibQ{w;e;-U{Jg39Lo^U$fM?ZMi5I68j(9L?&x|Rc} z+6}k%7kpab_}XYvH#M>I(vrhRz8TI-%WTgh*WR)ClLwbM-tw6-ONgFPy1ckCRLUrS zPcD1_cld=h4r!d}k>kQh$9pXg5q5U7^lD$iJqUY=H zBcc0dI5z*W+H|gL){ntS^Kz-56RjxLy4*h1r2NNBZnLV@E>>HL*>cz9!Jz|{?tP&rYYgHtC#v^);@-5%R9gT}4 zyZTtKc~!G2Ryx0d2Na_e|XL|0RMxKzu`lnS?fG*;$6|NH^L4l z3+r23hoqPL^%gC9O)Z|KC2|@#JpXuQg6a`2@k>=HffPF#FP)S^ifK17hp76Xu-nYx z2|d029b?U1jBJw1f1ius-*d@WP)Bw4i~9u!RRmQkZ~4ye^OW`oYZ%J7qkG@=ma{)A zn|xBg&9WGqZ-4i5nEq!Ue3eKQxs5vbdrK=OojY^oyoML-r2F~xi&YRogDJ9H`nlSy z&OaA!9UO#827(c04z}k*!@`KFOzYk8fBg8-rsE7T7@F_KrA( zo)a>Z=ckfAIODasDQ~Z8m8x`nj54!Yig&7ZC95j=bq6cg;7?p<2?dyxD?zdr6eQ!b z?v>KlPa60!GvnXrwLe!>*7Ve%glwFHoxR+$=Ms&$fzt&`a1BP*Nz4&CY*9W@+qcrY zAHD>7NR4CnJU)B;>;M&O8=F;Kz>(KBp?@rz-aRo!!)Ng6VwHTJd>ixOqP0J= zx@K4%25P=5O13+iwgRrs5|1%`6F9K>mqMM##|J!n8{e2C?MI3!CC-jri|@R}92^`J zxsTLiSws0cxw=Dnj6IgT8a~%iTyCVTb4FnejGpWPcucD?7pvksLJyhDuJB!|@{rgj z5x)lS5ejHEiwAoC{HpRZ;8GjkYH&9ouXlmmQ0_dB&`j(NCWS~Tpz{@OE1IfUSCDls zBG7N|$*F9iJZKTGU}Sc3=DhZmV{jhg`GxSBaw6ctYGN6eT|K3b)*nEe!h@{Fk~;Nh zrUgwUm8GdoX>Furc6Js`QBhIj2<~2P`}x{?%Q?0#B&Tbv+`Vsy++by?KJoXWrMGUw zvU9*se7P7?x%Qv<@-ewl7%eXTBSu?;Q`q1!tL@;Tr0!s!z8R-)lu+AjZn#YjW(@^g?eJCyKZ)s1-POMkcK zA353?uPhnT-4Rwy4)_(*A2F^pcRc^gQ=n*E+m^{w1$kJ^f9bKxR;vL2fyx6pdn8BG zC3ZOaHiyx%E#TDZxDx*jo+p0|=4sD#zNG9w1Po~t>N>K{}m!5F9X5|bty;w!*!f=e9mzvCI$Cp5D;ZXlBOAuM0 z>wgxg10ZowaHN)1{lH2vn2s{sBk?-}C!gvt7Ha#>c9Nfm1oFe;V|I<{r+c{SWk%u} z)W~+-_?J6J9aOS;l198==HD*Rom=`Q*>0OnEV8j0=*-+@ejK*F+)&S#Dkx(9s$Zm$ z4a;}zK(^OG)NmMa+W){}zV<=s+9Ulz4~zxgZAEQ-{#sgBYODZ)IjI4(1Gyuq5{-y1 zmIWMkcjL(2#*v6|$PvqZ?SH93JQajzOVxg9reYr*B#B+u)sXv}#_g%qt~thVj~&eC zP?kki#v)d-zeq-g3B-wwjSc0ma*b^-Z_p;=pm%u>c`r4tCQd zQ5)0|UCW1j2Wpnz@8QH4>N!L~z=d|bkaN1r{YgS1f-P3>VjN{a&iWOUe?jc^)%c>2 zYMt@B>KoGe8hOEP8p!s@cKj(|2z7OJ-@ktkz((i^3-j;C7-U%VhWI5@b>z#u)YlhfO)VoN-z9Gj4UNl#DT z(cP_FKXsGqr%BKI_x>?4gm>@Wg`GIl*VQFMHX<4CfccE@%$|pbXKQ=gBh%vJ$GOeT zn2e0ewyv=tU7QUzy%s0y>grOeN0zaSZ(eEH^ZaTZep*_Zu+JgC!*tWhgrR~0rrmJ< z6T=z@^R7tBe2r|()h|V_>sbRp)eP#1W6pM2{E)BpI=V7t`D|`&EdsQyEU5cHUVTz| z6!iumo86!i8U1JuF&zcq%F?IS~{K^Ya1iA%ycgE1#VnJ?aLS z&eUc_3Z?gphtB&Q9dhdv?}%$0rxl{81kB9M8ECVXrW(Bte)UTd(a||Loo(;!1t%tw zQwcs`*?@%QNwU4Y?d0b6!oATsP24LOG`rdFeJRV+&CQi5R~#m4pCt3$%hD||fKsru zvR+&G@z!NBE|bVluS64W{jKm@K-rk%d^zfNGN%eUcPLD(%#+O zeJB%g5XVN?cBuZ6l9DcSaS?(Y4wH3EOiacaJX|Yk*z`(ol5-Gkgor`eZA(tHGLS|> ziPLeMA|os7yzrjL_HAfL2v(_SGp9W!Dplm6lH2;h%IoxUNM0)G611QybgqAWOGHL? z%~<6k9bGh`V2b--(QTo!IlH2ay>Q9OVCJaF0rGM8vDfBgeTdd;)mtg@V3rWkM?Y?+Oy3;$QO{JrSs!Y0BUz=ZALq|{t~b7& ziIF^|@H^Q}bV?ET5=70!sYwu3`Tgu+9+FqK>`mg?`uS5PUBU;vImcpquCvx=1zhzR1YvGH;ApwE$-T3SI5(fo}#$!R5l z9)w&~PRIb+vex@I@08z}&tp%|@B}pf?ihNDw!jOuerFOA2Q%luG&n$&gq`Qka~jq9 zt4aJmUr|wUa4;W(k6Dar>Fvc+jHZ!RRgJDxzH<38>h$!K8>+#orKP3$?fGt$Kd;pX zY`=SUc7@!FybKIzw{G3?w16t!uW>q8$D~18bh{{a*p+*yC&Peezh+TX7gD0QWycHyL0D` zeytOO=k99I!?h7KR5Z7@J77(AIk&zwQiZR>|SG9LGr|Dm-r6-hXx*a>YyDNZ{ zu>Dz0ayEqC*Iy~Ot-<4$oPae50^j@7W1y?xeX={6#A6X`GyWW&WXfw(yx6#&%)`SY zNzzXORMUa7FZmiw(0d?BA*#AR%K3uBkPMg+*&mV#vDgjQ4TW9544oI(rBCvkQ;ii5 z*K|=W;0=Q{j;6gY1#rQlh`q0=riQi#V9f)NWbHQEnv6=^?C^;}AZR03@2wImJ3AgZ zmxIh=FWCR%+519zo6pNdkTGV`2z&q`ZB60B3ej=}1O!L>~R1@%HwH z9zoEDcs5+E8c>y-_J0^d4Vh*1&LwM6Q&STW-$1$noh$S(=Y`T$c)iof;lqh{u2?H8 zEBTta;Zr0$rlzKrmX;ato|~$wT|v0yPAfxKuP`%b-|Y};TuPmt#ab1En(aSRED6Meu6z11aL)0LB3Ik*!O` zI-p(SQSoDgrrn+HcN+Ho{Y|&k;S1^BKQ9Cm(jyw3b>GX(`=h0>{cV7`7m0}jE)ZWc zJKR}udiaoZZ=0f5jq z>yk1cpCKEuyEZzzyc{}Sb^lz@XB4RRk#K!RUfxTst*sOi-nFeKtf0G1`|Q&~k_iHg zYykyLHiQ5J1?t?nlcRmbcvc-J07*Fo1sv%*c(V*=Vm7RGdEy-(C~&98ztkXuTYPwN z9l{RNpwfon`o*H@xYyMWR7Jd2pGQL`^C6dJAMyfY?dkiLlC^UOwXKQGzjGIcU#SPIUVH(@M zhah`=xN{xuh6S8&@J(HJZ)7AMWcdpq*GeObED_O@xA*#S&bT%w-u;?53o*EH|d@LhSgyeOIn}Dio5dfJW1U+)$`*(CyR}6g& z5H6gLRJ@OV7^O=3(bc z$VCV;Z-Q?2G<~jW|z6$ zXf&-TGyu*$_VTg-gh)cHKk+UAmz*l0j>0YZ+_a0sLN5N%BV; z2Qc|Cq+|ATp$8ieFR;E|6eRUb&4P0Cc1++>SW3B?mG(wPM&&MxN*d+JE(^OYU!0hn zl;1$o+Z(Hop!G2{m_D$#=W(8sD>iAQ;=A{$<7l&)kmN@;JU|D;_2tBm42d5hBh9X^ zhNt@;-qOFP0sV*oSbsJ!>c?9%Xuc=AdX0zjz!E!v)j^j>quJNT`*7uT)+zW+TX#2> zkmD3d)!GLreW2TfP-q$vH*8e7)2vLYgpa{v`*da&7HoiN`4~F!^1Gcls20F?9?u;c zm1JHFC>{`x@IC!~kAWg@4JbehxPvor_efe%GOLdXq|popSOhdJKPKx33w78Kz=JsV zY@Gw^p$ADH(}{bAPKnBI|NPkoF3JN=d>#vHzF+c;gto|_`au{hC1Pp`Xhlcf?G#XC z*gWas%DR;&KHlEk9zQL;Pk%3M?e2DhHGmb?ILLp_yN$3MbLhf=oZr@@ohgICz{d#_ z8l|PB%aip&2^@ykifdp&z{D?j?kqn6uSE}PHAW%0+;n#8HCTNM;2)$UB%7ly`i=tg za)y6Gok-c+6{pD>uixk?KtL~1{Ky+B82kh-(`aCS(5ue!J3EEMBJA-qXKJnT(WVKq zZAH2zGE1LcJ!vzr01Q-APzWwRxviqY?RV;};q0-&<9f8WktA@R48bz!4ju1~ngZR$ zfxH&v@#}jl;IUq*5fQCl)8Q&xqs;E3%_-71I8_!_yp%}rU)RdRo}ZhW+v;IX$NubE zRp!+hPPz?sPBvViO+QK@0H0dW474){hPFMZDHH%8%3YUKXOoOI6S+*g5MuAO_aKr= zK*^@Rr$-u`fFZ8O2_Ro%<^d2&Y#f|6pkLr>gGG8=2&^(GMt6*w`r%g@aI6bKUDv55 zd2)ru6zC0r6q~2oef#MqT8N~PZ)bi-8$$e!Q#3##l7yWZC4Mgu13Jz?)z(%mz{}fq zFWu+bA@%?Ct6p&H=MLHgvXR<2Oi zBFpJ;XKE5042YlEjg2TkH_E)cJY<`Il;yO`>lW)j0T4vwK>+#oz7(Mf@Xbrcor?Dn z8F7E|k@NBZ!)zdrgajRwFhQCH9e{u6Q2!X!I-voscR}@tD6Hncfl<%B?Ux9EmKxA` zLddqjo$i965a4>~`*|9v3n4zu;77ni{a?RkPGG4&^Li7OEfI_629CaGaI^z?lc;aj?}+=zMnS1J$gS2n~!;AWLfc{hj*p zVEk?bJIRq;1Zo2V z)h{t{1X<9c_BN*p!42U#Fu@IjV`5^acv$%PNwo4*T9K+~WhD$UZ);~K29o&UC2|&M zGr+SD1`9}6ey^WSyTpJLNOw!AaXr#I2G^MZ(*j6YhM_-T5o?`(=gRC0fr|KCM;I}T z%n<<{iG<5um`BP(a4vs;6p}NL?T6A2k*1BByeSzN7_xRH`av3Z+M1DW`1MIt*lUj+ zaU)1KW^)~3Fa;Itw64cOvi$iq;oST@K3Tn_$ImOkAGj=0hX)5pj?C97A|s#`IS-4Z zx#4nNRaF%jNOCJK3b7Z+CzlCmg#8_xek%;`L-K0}VdUPY)F(ihMoNuwVa%xUEJQ;? z17Xmx4G`62$T9%bU_h~bq{Pq}sIU10P0dT|>+4(J9Gho>Hz3P^1Pir7_I?u(TcK*l zX#yc3p}+YK@H!mq7~Ykjog!#&1{MAO*$li3vdQ~TpMsm4n+MVo6S1Ibb6XyeCSmsm zMl0wr5ekNBgO~$XwfXwyDtMawSzH9%hOF4MnU2G-x+9iJ5w`0BAt51BYI{;@AzKX5 ztC}Wu0aky!_stQZpP(AWCMB^@DI;1*Zh&CKSuREq5R{4sUwLOO%YevG@LFO6u3e;{ zV4>ywIn#O$*z`D9>rhVBgy%7?)@IDqn#2{w_fbCkRS#*U+iYJ5;2Pp7(b=b@4 zX34|-O~fmau@Dr(j}S@;)w+zC*=0xrND>_`Gc|qh?~x|qb7%&|HRunRIBFf&)Y9;P z`3Eo~ysjNsP?OPu4v&zjrSL=zOZMGdiMSK}j97LI72J60a2wm@tG|$N`EGHT`~nv~%TVt?0vr zI=Cpa2M;0<+5>{xPK~_0yg4LB8|WP&Pi$To3-g4S1T>*`UkWc+Xy~t5LMm-L9m~5- zjYls*1E#^o#=aOOkdtrkU}bgH)8rf`o|K&(D{S?{1WZUhL6B6GYzKm7(0W zU%Wy>-B|SA{;>Cq+}s0ZvChWeR8OJ71f^);116Biy>|u`m%kJxy49+?d5@Kw%XB@3 z$(_T!4K~Vx{!gC>Hk*z(VL@0xNWFhACfa-{jJJsd)IkUWm4IE#*RPa7{jMWBO{Jwd zej@M1n+`%ERIw{oofKK>EN1ubM^skw+mfSNAd#NKBItn9c6)h{Nn;wgT5MdL#gKPGT&Pd=Jv zkd!o~I1&SqK^V{$E*uD)>B8qDAlp0uaCj8lC4kck<9(FS1R zUz#EY_3{a*UB1WLisok}CXFJHz44&7kvu!rsw6;xLW2XmGZ^&jmD}}I<>f6x)80%C z60{<2EzcNapQWX7K6r#W0Lm8o>QxlI?}7AKI_O6cP&2`x^QEKxP4cc0aJ=T@pSUlD z9642Rfd>l#?Vnj&V~hOQ)6)uOgc=0D*yx>R(#s`is5&;E>;>)JGKOG-ttJHxJ_;nN z%o8Y@k?$c3$+dok{Ef^UJ2*JVP~!wRK)NT1z6u%@c~i$TI>p?(78VE+@;?~6Sfp1* zmUonrl7bAHww)1iz^oE@lI4!2h+v7$0uc84~G;R92Xa75}c5nOu0H*76YNk5YhhmGqHf(u+*>b zeexD)89>K}uFX8}V0 zk%N~2ItRXc_s&T`&=`hNG0*t`7-OOaYo-mx55?+MM@n#+nVHR3qf5b*YhT3bfN!8k zJl+(&A}I8d$vUc8Tv)ga2@*6ODE=;<*h4u5%2^lWA|;ZBNYKfc(kBjkS*k1iNKt~L!DxM4Q-(!DCUqEVw*@1 zbe4s8K*FW+eic3hgxs9!c>+*TkTNlHHLv5iET6uzwY7zkljMyb9xZX*!?nB`hmEik zKqciD_AELj1_F)6HHeT3QrZp;Fe-n>=y-f8{sA@{Q<4pyn*8~Q9dT`#{o=P9#s(FZ zWa9{s9T1DS>;8S7hbu$!TzuVtIRLeo%}#@yj-i=nApj^?Zm0Bx+N?&6o}^LKLS(DO zws#B-+k1L$?YvwYp@tc1&~XESf&rs|)>DvF3DnI)pFa;a`}s94AyVR&pX@EzcLru= z#RK{*-6BN21Y(c@L_MpR4YCcWJh-N(Ht}4hNIE5{x*;OcHZ=5R%;Fay5LC9?tyuKS zC-%W05Z>BcP2>9M=a1A2CNUt0HZ+*&0Gj9CmPv@NPLtDUI+(*n6dZt&cG1m-0Pr!K zhc}g!4(**)RS7O#x&-aZU_kNJ$%cl849x;W8(D8PLiyb@u^ku*0hfvTh+BlEP?)?$dAiNk*T z&Lkdw$r48#4D6o2RGIUQI_Rq!a56r*l!^@MhF(a_Ks}JoOKn}P4wDiU%L_*J_Tl5* zz_*{=Rn36Zj1#Yvn<$=fReVsve6j{^g!{Qs@WGfrh+`||qpDs%jlrQAE?PjUMf9@k z3Be#bF>-K}ytnmcnYdT)w!-*9)8)}4MHw0Nu4q~|+S4+&Rq=fB>TAr*xb{HH^cx=Y z00oW$>NyucDA7`=Q{>-vIrK&5{(Wc<4Awt#L=<5Ny>_4<5zvuQ4k7JPmv)0zmcF53 zgvncQQWg>%bNWPHH*bNQ+WlvO9~Jh+`OR8TIk~wPq)Dm_qJX+*Llr9XOr?Gbf$dHG zsW(>2pr~IK7dO^_J@V`6gR8&&k{~5Q)`!wz?c@_|>>Qv6w0kd_s6mO06hY7mlKK7< za$OJ?apjXqxbe)5Zgbi0u;)Y8lK0O&1u+pgwE|S~gH1kOAX4CNmH@}d06EXo)Q)0Y z5M^dzk-hJyusVGzDTQ#ivXJEDuOD%BPbBR|io+o9nt?V01DS2m_TahO5lUWY#dsoB zeBy5kWCvid_I(O)j4iaU>Rq^QI9O{#rGBkXF+A6Xrwo*u#H-)FMQY9$N>*WN0}w=c zs;|O9o6UBf?>YcHC`XD$PtR2=0UOfYsJDXkE$VwczY=15EIsci)dlreResCK-^kDH zi-fW9Bry-((}Q_J(5ymF1y{ln+{bTe^#8KbEc$|IYDm!p37xdQ4-1dNAKaed?fODb z9MbRN{hIOCKKvt&mr3*9E}I=S#kiXNg9qgZ%Qbp;32M!Dcr&-#vbqLG>QKw{G(Gge zve+Y`{9}X}VSf8c7O*2QX`6}Kib~}L$l&r04xG@xLWgaDQVs+>s^x*q0Jr64RnJaE zj*Yd_zG9EPb;>E9ePcw01A>GIPSJGYhZE?FL-R~H`&EDt<{3}if?SNy&$6aN97LG{_}Sqd2^ZC+!m&=! zhC);wG&TnPhtSO!h6F&$rYi>|J9E%x2DAy_;n2{&(8^&fZ=aGi{*ZLP22^jNLBEh$ zwUe?Z)e^&*vLT2nib!R@e=ZK0U$q8RABZB%R0E&Mc%K4|D4+ou>MVhdW4U-$_ql#g z7T@7(d}!xbr+3oR*VmaPAAzv)ogb6b&>HCk%yApB8G9xA2vM{msf7rTf;o}XcxHVa z50c-Nt5V!Jk2KbNlR+6h=jZ2#T;J4ZH-6b;#k$7Ec8%f{*crM`ki)*D4CPJ= z4td@(7_zqr6>Ryvv!Z27zLn|@@$R-cMGIH%ENec+fp1}E;HLJY?+-up_jg0J`lQY5 zc|tX|_pPVQ<83QGhdZ(EVf^;vB+%Y(0}?w6;{Y(e31vu~9P@{=mu~5!LrsoV$+tjy zMD$;T->IYu6G6Zrf(ZVPl&gbpw(J6sUsu_EDR-C@3Bc$)yDlm!3Su;QvVi`uFI#Tk z^Xsb=X3OH1R#rir#&t8W?NBL^;S{Z5YE%lm0x3HC5#H!j9l&6u-yJA0VN2k@9pCgH zw>cAG5$B*Q6j)Tm27?1Z(4WorJvoF5Z{(X}WmN;-$#k3Rxbg=e+|aAJsiM*WWMQyC zi#cP9VhQ#I5+2NbfO1ZO2MBW7cXkfJlpRk}`X`U^F(ED?hhJc}J=2C1h8(yQ@I^ZeyQc(&MQ&&-?}7{;CJQCVgjhTA#qPH~;8=yOgm*$j`l#~I72B9t42HZ6E#fzN8jSQdDI{A}_ zw);%Bw^@vl(125fP8;I_jV*x+**vxBN>w(4=uqFu0>KD-np}5vjt{nx z0gQoBP^6IEM}{D(?Ne-S7<=ulw<7kdy04eXIq(Y+pP|>RUvU=$b}0btek-JbY}`|< z4r$Utj|Ou8t)x@k;iKuGE(voVuCrC?cPNMwA&H0(vMSy1^KBd~I4xLBG7?F?qeF%I79)XorgOd{HWgyv`1RW zz`3ynI!rJpmvZ}rf9>ygKgGZepZE^X7zldqX7gDz07*7vhb&*HAn<5}FA6zKw7{rk z;Cc-tx%IJ%b6)#DDAC87d_-YOBf$nh@8&?20hPJx*#+%Xc_5A^!dCzzwOX@L?}Xfl!%hn_#8TJUpO`VVgtg)iO`V<+fI+zI{94Ivwt#q8G z1NB=G%7zM?LB^E<@*$XiVK=TLfzb`1NiWM!!Ix%XYqGN1!S_0#t3gCg9s<-q3vRSL zQbH{zE*{hp_d{D4nz|r;xAgQ}0EWs3XYyvCVQ13li3~Bf)qVc_8JTQ`lbE=P35v6% zC8@7oRX9x6Em_whMHsMCc_}HB=iYi4Sb8=)MxqVW?TA#~@1UhXg@h=rz?sg8xUYwT zyq5)JSijD#z)e`4f*U3U#Ep!N5z30#9OOIwdiN6U+j&=zAlzB~f{Ua;s7?nU^B|KI z&1a{gf7-uI2Qn0Ea04hF+M%frM^&UiVMbbRk(7L0W|ytNE=b1=@pOR7HfZU>7PN!Q zD7!t^(FE`AfL)q|46%@KUyZlo05i&RzNzAO8 z0o^Tt3}R#{Fxiv|nuY!w%P==0acDHOLm7n-7(7be^B}-TK?Q-F;6fVJA~c{yBN{Ng z5gP_qz!fO~NdW(YTF0%*!eNd92rQxqA+29zW&`qhAYwZJTVyX=3m!u*LO_C(1U(&* z5Mdq!?HndDNPJ8Fd^k3q~EX+z0}%TVc`7~;4MMG5E`|QjTLS% z0j-@AH5{))roX@_h-}b$_t$^svmjaHkbA*sOeZM)Fy-LL-SUgK((VfmFg8-8jX0=C zp9v0x_!Bg+0wDS?bV~zAM5ec3@{r<&%N0P;5b%m@kV!Gi&_$q+33bE_G)X~RVH0s% z_8-hvM5vDEophGt=PiAGx61@G8F-WNAV}nlj8aX=41uk~@w6aNe)TRD%gjm)yuGJ} zv|Jz_gAq%(Z-j%K-ZcCl($mA=>0PI+q|^rCtqyWofZn*$ty|JIHuypWdI$L zDG56`cnmBl0|ph^daPiu1?C>3fq24!S#(60f*E`HHP#Ps6_^bRgf_%u7G9C$z+5zq)Kd-||3KLxyFI{>H@Fy%H zk_G$PHl6b9nLkXiYJ+scH9!OdNdRWhH+?s@atWpek@+{6{sALm!KlC3<1MMO{7P6e zG7I2);&~nuvkgYvz*<1!F6D(RLlc}5s-1Aq_@KiKr!UXJ{ALxj==BobxWww&z*x3WQX^KdJ==v(kEJAwV5zs z1~S1bry#bCU#@O$!?9C#x{Fa<5;?JWkMb5Z!{5+xN?IJk{8bmsuBKqwP<^XAP(5|ThD{&57}xVXAP ziYJK64Z^wF4KsZ}OG2ZggJm+MfFTaRn;8SN zzkdA+(v}215NP0lVT43a=4cg~0x+MpN)L^x} zVSt|6=O#T6I}til`|e#U^c`SNV5*5cF9JT#gGpF;Z01Pk?}QX`@huY<7$dVHEc{}J z4DG>~2Jx4fU%R_OFnHIBhfpf;nH8%pYisK{*iv{4Pa*V=fSa^~bPqW9^wq0L+}j&N z;!TL$#9>g$O%XUWL`Uv6O&yF3ror@u95fyuJa~W%$xzf_vDerj3(Q_s% z+ntw_b7i8z134~-jI#ig4ra;YHtyTX$(@HRf#^~Q8HNcYqG;lwCHN>4C!mkuSxCbM z>29nJ7cd=97nn9nfGm!rD9{@3!VdSp3NBVY@+*N(0*hX0YCaciJRB{Ck285^QX&hb z984mwZcwu{+A z7ir1=ohtS*y%tC61@Dz{Qu&|5cK^@L{yvg{iAY2L9CS-N_@(dM%8HI;7Lck5pqVHK zq%3zbH{7AT@QPc2&bYEC@nEx}kiGyY4YvD!24F#?=K~0A0U$W!a7dmi?xmYV=D3WT zT7&j?Iv*yn%ybHpF!iZG8^Wd+dw7+Z*#ZCoCI^vN%9(`fiiR~_DSw68e$)ix4T#-v zp~Qp3L&$BrCHUINBWkR4nCWDKsD2lk=3{`j$TTL>G>0k-h605_Ipl_EipH#IxSBV} znMmgonLYq|hI9v^BhU?pvz(y>aoZRt1p$AkbJ_GKRAmr~a4rjGO&POB!&?hwfcnGS zB)Xvecpz8P0Xo$1UC@b8&s8EtnqV+qn8*nyb2_;N1rWEK#j zNvC~}I4tFdsgXlUj9E3r_jPX}3LXy+5o*C^qOwbw{emnEtvxbpPIA3mVZJnoQnY#SYybn2wo;CVWy^rhy%G5qgc--pb#!*iB$+s8W$##PRqe>Q(z@#!8+x6X)SnOkXY`TA;6jQj0j z{^*SM5;bEN>N0IVyRQY2%oqONf?> zR%yrR-+^TxIty!32!g@pWz}BV$70(oKdYIY2;H%Mbj1kyb>wGf516^0qrtzyYK$L` zZWl#mcv6$qoklmrc}NZ?N^v*o;V|I_XVs9)=dHy~uIBB#TcGVKkmv4VkupPZmo^~mE){mh32^Ln4ajveEHwu%62G!4^w!ngX+|zGL7Do*e zkr&JK=6_GI3Y7D`ZBGie*l{?Qij`qe741~+hC+4R>zr?Fo@!54yq8myG5X+ZmDRz* z1oO>Lw-elnNY`GqZ<@8g!gtj6-?%-p7gH@v;if)*Jif@{I^g1^oJt_dvBCO9@W??S zjg=6^UElX06^^MY2GdA~6w>C%hMf}qJ#1zYP&lHqeLvlF*TD;GvvVc(HPNv%chipp z0hH7^e2M0*8^cspZUQ@0a3uX!%CZ23iJve!GX^6ZkbR(HpEH@OYwep?8D^3h*?<$%0F-Kc16zorCOawvi%0)8lM_c-B<=C|9%L;AX`R>^RC+U1sw0G z@2+@GbSPBl%_#qUEyoq^teP}9ct~SUJ8QFs{VwvgklY!jeR)&e?T5DHgUWwT`~1fx z{~SmWfYUYpm&o+FqG8q?GB5lP3HrNt(f@v+3mVGz*9m^u*Dx?_i(F#ZQ0MMK!A~c# z9bpvWj5gl~@KDd5$2}eE)n6!dF}J!K)O|gs;@6ZaoaoI+^|jKQAK})>@HKnv$mD;&o@6R%ijL>((_4B$GTi9p=3-15xMi;;GOf= z&NE8z(d{Mdacd=ob)oxfmUP5bGT-dG9R#LX;JuN>m$j|;-cOPEoUNqs7-!K6A$ z?*)0Zq*ydA5&5$hae=FXUz98HD|vtNUVKFqg*!{`B=m!mJ(7dF_LCVLca&k!Yw5^0 z^BW?ipbv$}bLQQ-@`HIoQNaY0)le@ucH*YUPEhVr?tE`HpOfDLK|ga^=%>)&#vpOH zMviRk%am}i7jmIo4N97GsEXu@o4u+eCXy?^di56Pb$2+7q8lRT31jBJzfF1k{PcXD zLLMd`Tjg3@k0mUMK`kB&%q2|fiPKck^!`J?4E{H&EUUY`cb)hbSde9e^bl%{6c@Li zh=_C1@=)?1i;pUZ+LGwgT4Z1q$3cuKP!*(dP1a3;Uo|kTB`kz_>+&ob&{WntI?qcr z)tXr8N3%*>Phv$siHQU-+p3wFKX~%yyH&1iMEtXO|AXSk>-ZB9VEJKIEnE(^Dw2)v zG>x>{!v)sJ1%-n*lQ5fkrte2XC?4$^(?5G_ocIMF7uNmHa}mz3zvs2VWhdGvW=R)= zmV0dg*BV~n3V~7ukT556fRTzL8Z@w=o8M9flEq$f4+fd=c4BTA5MFZ7kfaS&#lf^G6dU4M{ zXmo+T7FLQmHn&fPt%{=n2i~1e0@kvYEZ+AF#8G&-T|t@YjOrv!c=M|3bJ;F}TCY|}n>6Z62cNaEJsU>o%y*bKK!_qpAQ%(1;WE&3;IQNR zFxAqSlVGY9{eGYxV_7O9{ z-$14v7UTpaY!o~%|~a^$xGJg zsH{B23w|+v#gZcH?D^@$e0-RuUcOOLj|5jYEK1m_x~fmV&DgB5*o}&8&7jDP?)Wc9 z+SroUiMV&x(XFXxM+y(@iN#GaTZ}e7^)Y2#n7^o9T^bobs&^MsA~z53le6=F-rk26 zMm{b&{JNNw$R}8Ye_}H$)2yY zNJsT%Ah7@5u4{@~qq8o&5*HZ2UHE*CKc7#MX}?&Fe4YW-H=zXgR?m0={(+gcdh!|A zlOR2EM#E$dDy{ZvOy9L%)Z=>gT$K;Mea06`o4gox4h84xJA4_Zu=b~>Bg#s>b88&Y zrD9%+mzQ>nXumDEW~cV)mO|AohW(?i>DG#876&71h6_c%7zY=PH4i z@MX`kOegx}WnLm>QBG2fDz?&+&`9rgE!L%~ln@MBvYRRRI7)bJiHS`ee?AifB}Ms} zSAW194f%+LjjXfFvU=w%|L~^9s;R)zA)>}QZ8Qb!u2{P z+QQOw(F(NsVECf@r|L(*pQmb-gms%6(d7%=D5=-0uLhfxqBOZ-248&W4vFVF`hB@2e#r`bFF#J>pJ5&e}@9K zzRC>iNX%$rpgyT$d2WdDa!*)3YwJH5Mw-`PvCX;vcH?B8z7CH5g-Z98xbI)7a(q z5xbf1iQ31mzybPFPv*YN$L}v7Y`Q+rleBW`uEqzh2DT^W-2$3(9R)}YO83bHxA&CRgzD6g`}@g&34FRh(DFVwBbCRi5 z>H&TU)W#i=2gRm)0s0&B9RP8B(kgYX zZyvA6XvK9zVt$SWLWsk&$6vPbGDg;^rmuTjnoPL}$d0 zZ>^!VuRr->G?u%ij)7|J?D(l3UmDgiZ=zgC#;dsQdB>38pLhR+{}by?Q!mDzHhcTt zY9|n(NSaB6Uw8HWx*@$5n_v|4_4bg?=Yn%5u0|?zD`mignKyy_V#%aeyFk zJ)Fb~f{;6SydU6^6ID|NvQtiFB{qHM^U3+@D-e;HC}k4E!4n*Gil4HOcJCe^MvHLB ztPd?U?)Xo-W*lx>Zl`~=wkE!znTjh(?|R+2Gt32nCT zZO)}K@^$pLTszIP4yTW>T_9fsWN|i0+Ba=uY?q3vuRcq92J1SQk+T872z`Tz43JWV zMSsVIbM4Ki3eVZSk5|=XhU2tEh*ue3!QKd|%R*O2vS=y^g1>1oqZF;LNV@zGJMkoL z10k`zjk&{bw*TC?rQ1Zak_%SW4cJ=%Qqj#X;5X(_id^wBAEvV)d?;@-#m0!&n})Rq<}2xH#Im=u*>(c{pE+~v;x zwJAEheS>*Jo#WBvCq&4wQCW++lnJlU(zLxbDQz{W!P_p2r?<4L-B>R3zm2Rs+&xW) z%`Kh1HlvdfWul$R@4j@5$*8XMGqROwNv)W!Jvy?UZc(6K`68G73&mV-n257bEZi=; zsUb4hUEH>l&IHH|7P#UyP-a?7JeksGOkOg3@W_-FF*w%*7-6 zkCdlXuc43t1$&r`d6(FDBehc1!-YRfRYhp4r9P?lL(XN+(f-S(?@co-l*s%(-nsex z=flMZ`loGwk>C%dv*`J~q0LmBc~6z`GA3y?YjX~F@e4I$9O^qiQwAau6qz2C9x1v` z@40+W^(yoTZi0sk<(VuJidP@f)9vxG%RLqYg@aA~Tzj#$;c zX=i2f4GQtBK-o}CyJ_4B(!(){HCd@0SGcYHRhTsQ+?e|sbW3Xv9&LPHPTa({L`Yj^+e+w?@T&lUG7BUV zOcYXYFe-_@hgY^)TTY?SBjqcR+_0D{*fMN|Mf#53KRaBd@8Eg8dtdHLp3}YyLOF*i zC=0N|#iFjSyPRxnHvUw=!Z?Pf6G_5F2evkTPSh9BG+vJ)_S^omFw4;`MuZwPQpR`= zd3!`RGH#akj!<`@~)x)WWaNB6*CYfp17>1Ix5O9d`=~gx33AojSoZ zC;Vyc=6(yy9m2k??pa5mieQrBkiMaGQF3CjL%w_CuDFq2b02oJVy@g=V4${6#3n7O z&QY`WmSK_6AHxP+&H5qj)Rr08#s^0gaTtT~B;Q2oIE;@9Q=`7QxDtqj;`>563&gO( z6#cfH*Vt5dK0ywv`+%bXg10T92*M8nr7werc$D=s7v&SS&^z!kL3duYv4QNZqH0AC z_u#^8HvT>xi5{8h%;0d2vEzxKe39>l4$JTMGgnfn2z^VsH{cPP*vY7T7byukU)vr! zf@(o;^-H}uEbGYO)MOP)_H|KQSn_xkIB({QdWIDJkAkK}XR>r!7Wb&QSt zG%+2njM8+VzXTq~(>Eifb=)HtA#R8 zV&ZJAu;I*{q58vmIV+7jo)J$Gqs}V<^ZD%Rkz3T}-X)Iam(35qUfO*Z8t>~y;5+cl z7*_2wt2c>{+*kfan5@X@pENJ6DsH(#4S;k^GRxoXmc<%cj!5y5Qna2@xl)7vvSJsp z787jXT$bi~EuP*v%$nDjIDdZB!pd(%AG$mtbC4grD3Y>%N(p$e>*(f?vXH|fOCgqQ zILj{m#{5tVYbX)Bzk+s-y?8+iozwd$xEWU{T)H+k49GYu9#odSO;Zh2eAsKfu`hX( z&T;XxdGP7KDW}VmO0f+Xy?i?URNv)d-FYwRtBOSkC8h%kb+hQ!hiMu^LknLwp9B9( zN+@ zhXzrG@a(&|0SAI9b47O1_nT*EVTX+iCIKd`=wlxAf*txfG2SYN8D`5p@q7JN&XWHF z&XFSr*ep;Xc!s~{-F7yhcdz*C!(M9bxr6GoPwpWE?Q+URfz7Ip4P$n$$5?X1^vMC7f616G~mT z>c+;ruDW%t_Fh%#hZH!fk9qgFR9#xy@)F`mQ21H=uLk`ZJiqT(qB|wWtNn-#E|ui> z*S4ywexdzxm@z8$eD?fxe?(DnXb+ys?|$qQe6nGKJE*(Bw==LYjpSluGLV1>(EBOr zqRvW;w>?*>b%6Cm?Tug@&&_IA!iy{CPxy{=rrK)0BnQt{$*TXN{e|uGPw5(7n#`p- z&oRthZ)?;Ca@FO^<^DXqYq@-bGrUY{O5SKuA#5Fq?r8;6eGdKEy}_#}_S)sc`++YH zGDbx*I_yq$>wT|laZhHNRlT|M=EI5jsCa`L6y_3ZCw8Xd$IfV&1h0}dUgXgoJcDrO zUN1XD&uGtxU!;~l>Zs2y>e_B#Vbsk0)cKG~beT`UYTq_|e4z9zle!XPMybl+{+d>C zb^V44)8?*GiJ=nm-)ZY=_i614XT>WB`uMI&2T6U%%&t-> z3sk62^0x7Sngq5_!1%FsV~m{f*8A9=R87%-nGWSv;^?uYCH+?8TtQ4cj$EkDggIQ$ z5HmC0)ltrHLySJErn?W)g&`H0|c57Vqe1P@HSG9L|b{rfKmfCV{XVs4v2N|<}Asw9A4rFrDw70ik3s`1J!$dhu zjr&*RJW(anm<`47xcy8ws?ETr=-o|2|I9(g543*26_*%X;bF0PjdLUsROIV={tq2 zNPvcM(NCjtnTRh}U*I3zDs|8FJ;yoL@9N@8vZx|Wbvp-2pv%V4<<-x*G?$l7_0Li# zFQUK4P{KaN+TJeNDf4rEY5Z_*gBk&TLOTNsg>Kl~-Tx2fyu_8Eltuzf$yCRk*crb% zaj#F`$pQyxWc6R1-M}vXS^@|~9n}hQ9x!_e!)Qpux?u&~7qYmp|X8 z1idhApBbP>e^prJt;}Qhn!hy8o2%Dau7zZ5zazFA8O4Z@k#2y3!8I*QsjLiqLKb}* zeV-Vvd|~H!(8PYiEQvfBpqT+Rq~2V82$#_N1AeP^u2 zQ_FXjfkKBa)b=Rufp&J5o z=D+@x-0xmW9E`huOcc|?^t)ohfH_HuVQlY57r(6X3j^92(plK10(`k|&`Y*;}n_-D%E4xIq)IjeGQ-%sbWJft(VL z<7(>oKyR*E)9=-CbO!0DM@dP3JU3tQ1D@r`gMg%J%^-t^9zE#Zzqq_DG?;335Ba&j zeBL;ps**QHTk0?U(YrVxlG0>5sZ8ARz8p1${s1Aqo<(wD67wM7ehVS(E1CFp6N;Y< z>KpGN-H>&Wa?uo+$PhRR$6-53s(=h?X)iz=L?Ipz1cjPyHRZRTO1@0YdC zClx$~@AQUTrm?9W!yB_VJd!`JPrCE%cr(*a-b#w@yggg1DD|?>tx3E`vSmp>**BZg zeQ1{HjmHJ=Z$W>*1HY+}F>9tN>(kndf||sL;r^FA5jhnWm;1`tXfdTF`RtotSb4(( z6tzT)eoT%h+fVoHo97!PRzSAi^TBtV+xQ)8e!Q23(wQCdeM0R{MW2)GU@`LOSEiU`nxh1^ch*F&KZ|#f0?`F4UKbuv^tp{Wm9j-rUeQ%+Q`vj1${+V zp}}USF&2o1zBYY9P^C(%kbR^&(0+Y=`ptwn#`odml$P}0$l*#T>yDJ3KJ&1JLaO5z zOFi|XA^l3l{y7(fXE&0`gKnOC^og;nv|&L9RVK0 z$(2<0niXsdXM-AJih6WZao5u*@|J6{-;Kk_+etG!_f2Cxen}772{v)s;Z-9;y@y1; zY*yo|`@;+x1?zzW39gu^=jvMIP*qQvyaWL~#Q1;NmlNx=>D||lN?#usN&a9FE8!qNKw2SG8nVOM=0(CyN8!kZUNJW-!^bx;_jvj>vtWeAj5%4a0v^VOlo16{jWvw0;s z7eJ7*CokZCqi`eG8SBEtTm3TWynj%5`o1K;rYd4Q;A0AO{d@@Ip7wHoLVq-Y2 z8nEs=5KQ=+vZN&n9br4GnL_#Rl6C8&c&+~d`p=V{2iGu&u#@9d?l@*oE2BIs8}6)U zk+>>MkJLU|iDGK~=V+mu4LkkPpX}|wP>@dPdPovS&N{)C^~ojVF%DhBc`aU~!?A>E z0>3HG?l?=R=@B zQ}1Q6@4{hGT`fK6$hFP*YfAkp>h`q3Go+FZ4FkE!G+xeLo&IIUc@MrcJ~6AoJ-1 zdZUXGM-OVq^>CwdSx0VFh>cmkhK$HWE)xqi^Sbw*&xru)8$O?!jeVa9wPI1$2c(iM zJo#h#4Bg6*5Akrt_B`HeCk)T1%#8KP3Ss?w5q8DXf9_wTL9)F&GK{%?ZsKQZoF-m< z@n|wLu78^UqTRLRESUvJqv{5)GofZXTf1w`6tI8zIk&TUqi(X_s-EP6rNK=^8&6;UfMrQglA&~zCyqbiR@;&6?xiab_DVf@DwOe_Gxdl_ z&cl|O2umdkUmTCYHZ1YM*Abo@m-r#6tbu%9nJU-gL4guGATi%n+I#oY8WBsQ!dNj|t^F`q?tOB$D7r zj8W}eb8xcPRuDSzbFv{~>RLkkU*&T-ooW&<1pZSuoF^mYHUwLZ{}|xn2@7Rk5MHgr zoRzR!5_jY{ZaqV;kUjP+O_X=0uAdKKGP1{@^Ld;%*8Qt~{A&8!JC|Xp zqH$YWu?*%!hBw#-Q`Bq>F={Igv7lwz2+c{=1vFl6S$V@b&WWf>ItP)Bi)M*v=FZTO z$%&Z8?!@@5>W%eFc0hx?<~sMb(9PQkv|DQRLJXlEZZ)b?lj;umjfUW zYBhXou~dnnOe?D0Bx9zE)@`UQ*#D(&H#tchyJ69=dH!RrcqbltQA8f`Fk3?PPnnde zl~G5`(i=1fN(bWZrIPAf+!Irtng_OZ`do-#eduGdLEx< zpSzfguJhV1$$&3v8g@{zYRdJ3KYz&As>-iUJGo=R2Das{%)ap6Y$sDVHzP`jH6r<| zG#9EazxGEGgoaC1)iafdge6}c?b%RQvMQsJv#sR|Z#>&VA&C5ju+d<8t^n~6xhoa4 zKOs{ifaD8QP01}&REJBuVk0*SFvmBn8eKfle!3n6BDK8K`y~4#6OP4p#1|tO*vTIP zt)zIluE1*eZLlPM=jzjsNLbpm$zt>9w_Yay#=sB1{~hlIH}=GIrf1wTOw?|`sj0eH zOn@{-_nSs5{;pvM8N7_1e|&{b>>H5M`6Fao!kZ$`ICsv_1Mt4XYR6k|w=i~LP zzgU`9xTIa~xKiumys(0Sg3>sWphNPM*Rms599mGhX#^SxKPa!C+RWidIm8E5M*V4k z3>8{rhdF!3Pqwph#h>z8X%h9wZMgYbLMlP|F*d8bt^Hl>*<9yMXw2vG3DojaR(9D zUDR5fJXChnV9~5m9ng>=1-h1a{Z{avsLrWikK&+GQxzUuGyZT^9?Fv=w0j2DsBZHp z*~sr7Sg_$j|4IL1=4@$oLZ!;7uxxkI8?xcXS4JP8%K7Nzw?*eOo?GxJ&}e@T1znV_ z^SmiYgy@;|AMi9lz{y_Q<^+$$gny+E8=ISd+eSp;akJS2Bf6v{Ls6tSPR)JvdiO-@ zBT_mX4RkMbM|4Jn5!9D_d)7fM_o&VACft7T6QD+V!v+U!hutT9(1^j-uY5#OqJ8&r zqIO!P zal?1fR59^Jcc?&UGcmbHs+_Lu43!i=2Qf!?cU}BFEESS9{!>XP=_ZxG z_&;$WUJ>5^`CLe8_e~9>86qV>(fb?Z`G~kMGLraz;=+V25l1sCMp(AJJ(W6)!-BKa ztD&BUD9E$=i1L#R7LDgXPvgYDCk&D%&@9auEPl|n_w$#b4+PP~EcEZw$z*lS%>p3` zY8d-TzDOP4GSldTftsRrN|y6|*>LD~aDd@!FCG{55ZK*8(9)WvSiPF6eno*sp(JmD z-0j;jq7F;2k&uAOb9+pb2z9yu%CoaZYBr_4G>ggXGefIlAMtfk)Ws8z+igMYRkJ3h zJgAvhTQ>|Aj1%1}kA?Z;{%LRTX@EwG)3@#0sNPyL7rAR>D5Osf;vM9nF4`{EvDCX} z%x8?0Ll;=iFPKxt`^s$vPM=YwK7%7=r!;F24=VjcX#%FE2ZBUK-OENw%Xq+`U-`zx zJpDRaD+Q$0@asrh;PV6#%Cq=82Y||hp&p8XB8;H=-CRro?JimRI(GoUgRo4lE$g59 zF&@}8p4@Z=QVs}3pzE;Z-j_PL7#tjgbfXhBPflLn{x*co9Z?iv!?;HD+Noc&ZDn&= ztm@qPkQDlQGZu?)<`vUh2VZ@2wKM54R=nV+OC!HKHNgLVlO1+WZahZh1?z@!(4^nnQ*()t@ zFbfyjYba>g<@ZrSFVM*_4B>`nr00rs3JcJy;8Cy6H$)Rm2b-PBN>0Nn`Eu!azU ztn&?+*UZ-Wc%y6(1y%Lh^k`aDfD0kyCw{Oi+!c$#q)?y$)q=X6D~PXJKwQzFD8%7Q z262~=c6#l_us{af4~FfVtRJ;sK=cG#M{8&W2l z0@^;+C(elAeqw4(E9NYFG0te&H=LOtw(R(1iM=Rt^y1L5HqRkpsD)Txu9=+ z#r|^k6cJoGbeKdetH(05Yu&>KK7jK|Gi;uisAsW%@wwBu`|lxDM$yMaInITyh^+y* zbip>{>Tu3sH#&gDl$RgofayD`FqYlP#W?-R>t7!)hW{y}eM~goo+GpM6OIx56UfDPCb}NX9arSNIdXL{?ql071;HmA=~mC zc@wl^Ct~@TR8GQ?Eg_Q&({4}k`^fq-Oq6bbvwcfpxqOw_vKVnsmm!t!5#EpEia@c++W3uuo`Q(#?HLLFanU~dg$ z?rCXhPPB(gp22-ez24Fcb5#dRGL(+_bZ&-)rW)^jnRtJ+Cn!SR)$jspEOyiR~uD5yOrk=~o{L?#J;3~44F^UPv-iMX4A<+&~ z=yK12GtVUy_7K&Fwk|qJza_b>$lE}TMkU1R^K@EiY*k%){+|rw7uhwWVBuiokW`kG zgDxf62%Ye4sm9rOskT$pFgJDLjBE-5bFQyJD%N|>Ya0K~FuNTpQrRUGsIbr99~|@j z8=^irIb_aKS84iF8!PH&jVI!vB925lzA7XQg5BCCC$$|1(U1w5Oa!)e_cVvmh@emd z>QW*ei|4}AaDGF7^EvqbL=QNGbj!bJ`p--$ZfWN>NA|xX)ur!206``DY=(4|&Wup@ znjfgq--K4NnqBZ9$3Cb{x14@sfGBjGRbE)xyWmaPV~w#hiPVMED?j*H*reg-v$rRt zuJ4y6@4d!CL2n&`4@~%HxH9-8!Gsd{-tdBl&Bp;_7t-Le(=^&*{3y4n1Pq%HU!?^{ zQmJQLH_{tr0-@`6J^K2mc&oDyU@tYpGd=ynO&!WVv-a=5ZL5x1hP_O_@#TulO=~{5 zm|atA(76UQ6Ny504EauyA*4u2kC>`+Uce!36c@{2=JB11mj46t<}XfORbPjNe#0ZA z4vN>Qnvi37!Cy>-RD!sD57uwl^kj(951t5z$kxeFWbqUmS*uF`W3L{Cso001OXG&9?c0ztx1`m1rRL$LwxU$!9 zP(hYYNE%lO#fk&EkmLFene%0@h)aJphc{CKYm_0AzsEp#1=8^kxtX~o6mhc89-Xb( z!G-}*Yol8VA3@DK)FziZAsjh~_6ZaveqdhJFvm{_zkrD%aba%mGUiFmb}?jBCoyPy z6HxI1PHofjI1wQ~&jyCCJskOG&*0$bM01jYY6jdfCgsahala9Lf-SV9nBR2t)JL>yb6TSb8k5{URq1H%<}_uq;(A~0tNObvxKmitLFU5t@H zKY}T&85m}L;(ExA%+7XpCK0v*Y07yuBp?77+TM01h47CM@-M;<2H-@C4-R1pVlVgU zdib`^iDeFXPPK8D!OP&ieR=UqMDs);~(* zHgvw@08cg84ZV{aLmHq@XBV9SG36n8dK2uzIaPlbzJNV(8B|6PTY$9D_V?@+)ACOs z^9La)%2PnbEoJgP9DayS2)f)`Vs+H;t!g6DyAu0T74tguGI*Y$UYo6i+&H_{M50P~ zs{LwOb*|e0x3{OA|nN$K!BV# zNu-p(L?!jR3Hsluk7`>-KnM30s*Aw`0Y+Qiu{~BG>`eM-c?~&5_P=0_(#ap(+Mv0| zgaI*=jjhd%u_$NeCPE%}&;(qI>mnL{*|z{K*-(1Iltq#^eYr6r9Cle#nIo2;8oqLa ziQ|244iaTrWza41fa6vm2+x~xu3`-|-V~6&ZW*;Gf;_%3M?t9m^f&&q zC)Y`7Sd(hrzdw}OBF2krF=}oAM<|qz`i|+t_QxG63yoIN_1oYzNJ5O$)7|sZw-l@X z2gu54?h2rcslE$=gnDbSSJ2m1{(mXkEW`%~6zEXswV_bZTA9&VzDpVMgX-MZF%*3j zbgC2IZAf3frCGkt4@Fm}ujfQ>V`^Ga@gP%1(ksy1KrWOz*{bvh$%UTl-Yv*^uLkwP zyR2_cv>0L6FkqiZcX;B}ZZ&EMpPhcvtq1H|q_zE(&Lpu;c` zRC@)$Q2%x4Hg96pBTkFHpRT^@5(k@wqHJHQkja2&dHgc(gJ38HN~%cS2btkr@FL3? z8U|scg|wyb+%h!!km>@;#_UBsXUkVZvm~fY_3@_U!Tko|aBamd)<)B`$auSDVQcA3 zX&xjETxvf$Nr}pKS)4YeWYOX2?M&NyzuF-z$z9Swd15b6B-Dt$U%q}E%Au%(9?=jxKm+{?=rO!Ab(ocH0)iXD<3&)gFxCnK#dqYvY6ZwX2t@`#X232A@5ZS4 z4UPn@qG95kDyY05>fXKd$xZnIEByt0&z17y2-&)DWI1)(cG#M42neAB9K8p?>!5 zSa-4Rds6nCW=KU46qS)mQbMTD)<&VDZv+7gR3JJ*YkF0abcMhCe^N{nxk9YGAoTqb zQqmke2)2WYIczx8J;s#a&^T;fr>L1ebOV|yGHW!@Bh>_6SZQ>{Eor*XhBM-$eUX=n~8(%meR0_ zD3od=a~Ww2iq2PEAb3N{*^gVdY_>%p#Qd~uoTl$m=kO%b*8Ae8xA&~u{s9u5F8>BG zFU`@8H$!+;eU`S%MSyrZ-965yikw>5WJYCQ{b7>ElKn2}mpdO3f7q3X?0!}VA^$@0 zy|83X9*tUo!lbI3K39A67oou*db#*t5PS96%c`I}PhL4zD8Fk$^ur*|u%k!m_^;mV zi@bL&v#eGUz<}kmA@7YZ0}o0sD`)n z^Lx2$!6?t&s5Y4QESUNme13wDl^yUM+X>JooEC=%sn(d7n0$|N9d^N=R_e&*M zya3YqntN=9J>cE@cvF8A(*s1b31Gz^Vgn`X%WVNkK?>G0Nf6 zBze7-q=S`{pqF|@o+u>>t5)y}<>)Auoc|;3sl{(k#r}L(b1*g*`?G;Q$OV%mFgZrB z#83G6I9v~HfE;nOr?P$#0}N%!^}lq|UlB6~gjEhSrhlUl!acEWBLE!I zc0YOu1ed0u6G_H14g~M$BfaKE3Qh&BO z8%&|K9e$i+u$2EAwaj+(`;gS4IyG)@mhz7@U6jnkrz)>F;9+F%8$cUF%7QaIpo!_9 zZ!w)cr0#!UxG+`c>zm%4yUv^I(yGF@*BMJ2+v@#4E_^PQ7Nr$^+~9Uul9f%j`{?QC z$E?2kTw>V6FC`Y zyDwU5?J2h+=Bv@fKVAtU*A0i%uKnJ!3Yr>{0)w{^ZHlaNF^ic!F;1@c1KC)TPLcU09>a+R;b)Q}#zX(~G?eJBxnpaBke^~|7KBkrA4u0V# z);8=NQ5)$ilh+tiHe)g*K{FiSY&_YppFa;gi6)Q!JwNlnO`x5GNzz1^KA!57XqYc= zTT^@W&C=7Gk8k!4^d;*rgly}!uB(Vz31&24XQ9?4N6jy1P5H$QIqPK@f4Z*`zM12> z9AGy=U4gkJo+~@ws7|&@F;JEC`1bq5dflS}Wonf(RlJw+1OhD7%CT_xUvZY2sq2{9pdas+8Ra(0VF8jJTVRhH8c&QbLbW--VR$n0i}Vd}f- zzirh`-IO@rIuWU*@OtD`GCnGUr)Zxw;lHWj-ZM`dQOIU0Yve$ieWo&CtWDidy!lIC zqN$_Uw7+YNFSRplQm z6mS;Kuk{wMZB)mqWL-r)Xwik^Ss zAC-5#xzvJPRM_&e?5WkB{*!ds4|(tlpz%fDX4rcsjPM@(ky_o>@YUx9wY-2Dtc*ct)SM z?;jdG(8)0WbV9fB&7L>#oul#o?s#Kr539JEVK>jWp?x_6CL7+hpB=kVL_Eyh;j*DN zhY^jPR{XK>C3;W45;WpeF?xFR;bbehC)DiZNAB^$%G}e|h)36&U#%*}X9|^KXIf@= zO}V@Ly)!R9`M8}indBEs%9&t(y4ul>PnCUiXpb zkn=e(17a!-ctOux55Z}Gba@fNVemnb0hm|}P;pTJXo+eDXr(lOs&W zyAO;#05$>5SQ@N_+B!Q8fWQZYRSm{?s?9(F6>4&HrNWpEu$^;+1D8j37 zKzeVnIdISCD1Iy|8ITX25{1%z&Z)`6`6(UB_bHv9M{M+cIDL=OsA4&-Qi6AbRnPj& z$Rn*U*IBE$cO1l?Kh0h2ov5lDt7?<}>@g7T(pZ_;f?cYX+)l*Q_}VWqjIZN!**2%= z7h?5oeT}_XZc0i@5_{DLlMgQ3_Z&L zkVV$yR~IaVSvTwV)J-03SQB~cGrGJ z6TKpo#HC?;DnUN(Vx4c7d!D;vT~cn!7L2j9yz=PBx~sF|I!2|}pCsJ37eD$2hV(x* zUT>)r*X299$cyUg_8Uh9rEq^nxf1blplkykPgnfW3TwcVw ziZ?u1zz(#3e_vlwFT)_lU~-0wk*m14VT5R9;CJ0EuL+-+zS>)qYNQ}4{Dc>E(8IB2@7PI!|p%!XtoCKL=Ub~D5p)$XJ;_|4pxs_!u z-}-(tw~t3cbO^=A7JHL>X_+3A<~x()uQ8Pr@6l|vRK?)Qg=U^Rp&=n5u3Xs8*!a1* z_zuW({#bJ~<SZ~Ttgz$6mkbQQ4aQj2X4nGWf&72aVyG{ec`FH~JQJN`@+3!@eRZd>W zZzfgf+Cs#kRb7+kU-l+6i=VxZM<_hEZZ6T8>7V%^gJ;xC9r@dQbUP6TPug7g7sU3a z9vIS!2luyi#Z?}hQqdmM%G*rvb!xEaua3|dDk}xcb8WkYPJM(3*3Eo3G9OzF`}@jO z49{Dkvd^u0w+GbYB~}+|&9;f>zmRrtv|LWrC1`}1*6z>8^$QDcTd+JaxNuC)euy1z z_LJwxgM}IaPzzHG#0|gZWJP^06BI@PQvdz#QuyEmko~_M9y+ZI%B2;X17DT0)MyFV z+rD_T=u9An>48N=Sy}hN(V|jW&RZitQZ~-yANk2+Dv@Nww~~X3R5D&yWQr)A2zs2a zcr*MPtN(~Mb4WclTqSkln8<%ANdDQ}GbXX9Z>h^{Yx~@;*B6xdSDpup741<{8I~t}2?UYK>AzhUea0dLQOm(R&(yBw{7|9kRw9 zO+__=01IEc2~0gLw<~I|W7HLx7J~FQ8@d~0YVqENmacqcR!X!8#js&nQA(aW>De@| zp&BYWn9|DhFDpB!xQq2&kc-7!FDd`q6~0YdXYIIj0lIlZ-1(`&c5TNgQTvI8n++vK zW+o9~anD~WW6xs;mbQ(X)D(oC&K^tL9_&Ffzhyf#rz*Ru2ArNlx!S4&3XgPtw6ke8Y-DrAggc zjG8%|P1gcDR75uHUp(a68CsOv8#OZGNef>l-Rjj>=A{(5OTcWgt`y&TSyySUVGO9qC5-*^}v zNhqX*e~ZCS;OhOXG6fQQ4q;-Re)q;NQQ>jNIm*_;L$NPnYf|mAYM)y(axf{hw{Ls= z>G`04Ygj4jFQPQMffk?NR%RXz94BDGggqae`Jx6 zixSJ2j*|PPqmZJS@|clCXUD7QSH}}3)qn6LvPLc0_|Y$HTnkFHB9)ZTiuRdeU+-p^ zT+ZgUo?`BL>v(!-3pPHf@c?fg@)RaPL#7lmU0otWky!fdb-n2jD}4o~?B-uFy9zQC+e~1(F}Q z)PW7_cH*!+R~(zd%Ok&x%F69aY9q|K6;Bp?H!T0}F69MT7#fL9y-gl&>u&pUepYp+ zHGH`;0pH6pH9MIpvfMP{zB20A(vfPbS#vv8Y?rU?;V)!Q zjjT>FJyrTeSO=#)dA`ti|7cn9n0`(7YKV(++4knfu;qbc>&aAER7Vk9qIxa5 z&A(l29AVGY?0J%`!lJ|Jsk?_8EBsvDR?G=5Q_|a!$jcp%Z0Ji}lY%%dMSk?K#7PD_ z{)MbqsQb`Ko8$Z3nilaXkF2{{wMy^;*JE!=I>>Mvi*#S=t$(T3oU=lmx}ssf-6jr^ zD}%Lq9IZ0e!J(T%{z;8_a+MbGpLeHKt5)uKyo48~)+b-LITD&t%f(skdF_yzY)+!@ zf(F{vcL%)LkbezyW}mn?XZT0Uo|$cegzFz#a9PYgQ)Z^jJ-(j&cr7X&rTWWjPM5W;iRMyEaKKLq0XznA$$( z6t{o;LsT(JkWY}>ss@Uk@H#qIce~4f@RF4a~a%18KHc&@Z7MX&stH^+m7^x zr&;rzeN%GCT~wrx^S~0*df!op$4ij)Jn+88y~sS`k0+Rp+!G^pHV3o)K@OV{{$5x3 zvmtoZK8Q^9q$1>RZEa6LOS>@WoX~DlrSr5AS?Eq)g5>vY>#S5O*(JS8u(hS8*ov=2 zWfR`ro2tIZGiVbe){A|GysP6EiHq=stbx~B_@5s8)gENUQ7)rg)`uqn=7P8~(A3WHGm<`I4tw|5N?EN$;Gl~-le!Mxw+U|_A z=lY#xA!)Bdqa8e4l9S23F93C_d)g1>y51NkS#Qg9MXY|7D+{dH-TlY)RhJJb;gh5J z2SPnQuN3Gt9%t-7l-*>qoGKwzlzZJ(gKhKlchOk%M7W<=1-Y#f%M-QRSm->@XcWUq zMuNMR2PqQ=6N8T9k!gMY#c}cKw`)&3k}JgIxkpw%vnVUKGc(hx4nY|$)9Vaxn%IoY z>qxv!s{W{oV?J&=%X9eT*N?O!qAjT3Xr&=(uD+gqc?@jxkU z2Ak3k!ioF=xv%LDj~3(Q=!p>1Qvv4xf}1y_0wfC8rX+P@S+170vPOnXyK6ft}`6X=DI$0zv*-oP1PFA)2hjx@oB1SEST-tNm zPnlRl*C^ps??CoKa0gwFzV7ZNgoD%9mU_$M@a!HnYwvl&*#l$xllV5v+Dfvw#lyTx z8xN?@$CsCudWXuG=DWWhJvlFQz17-7T+^| zG|2I@PwQ#+Qf#}+H#5~*yq`oL8Fd_a4>=bbKgSQ$aKxzJ*67Wsd5gU(N=h0Y7VcS@ zSUKp5E>NszQ>x3z$jIY>f{N|G^*)2My}huLXWQ;pio;f-W%sAw9rd26poiyo?X;Ch ziMj7;s6Gse>|x=3sBRvg3)|!bHRCOw0C|_#{gLQ#lnuOyDYvZLCHi@~X&ohqdWf8o zuGeQlFqDv=FT1zWZru)xsi3fsp97^}NhL1lV$X1J($%C)JRxn2uasUV&ZtdmwX@3njZ*ODhUo&QG zBWrWD|IGyZ`Xe4rW1IDQR8XFvy4lTV+pVwSehSKsv+>czR!+UEyzY+S$snDsV`h?7 z)^#%DFdVFjQ9bwz5*R6gr!iqs_m&bGdAfecQFtimuY`t&G({)tS5RbI#D@)UGj;sM z+w-2V-chQ@EZartD2SdMp5dL}jC&>H>f#;6yVvN1j zmzOWaUg%w(<8KkM($0nA+&HPS;#;B!8L9py!IH%ds5&<@uKzeDA{px1DiH+COCg4#GN z+iZcSTUUnT&|h=q7UU*q1o#gbsxL(@x|aSkbeK3qxZO2HLE}baN{jX-B}r;k?#-3p zVX)awQ*6nEbc}(iq<~jtBPcxX2COJ?HH9p9B}Pii&u-a@@k3S)lT#Ji-x#;t`2Li+ zE`4`ZUsYfv$;Yi5j8G`;-aSaah+jjeuT}1zCh|4cY1coeM@-OUU_8-{y(h!_dnPF`#z3q zFQr|mv=AvIL`J0~BeF+GR(AHL5*lV@uVinsvPmI(WzX!Dz1Qcs^?W{G@9!V*{o(n% z^w7P#+qhn@=XoCIaUAE`#@TCh9}e?VKaXE9E0XNpRL+-K#E{2pn2S9!gpmw&shS&f z3Gi=MN8x^woNjeDro?+Az?88|uwcqH&x*jZNT{3J0ecLvrc}R{=L$FaWSeCp7Z(>| ziZ6g74GbMY*S0>(SaV}-R+NB-;A%~$tYppWh%c@Se{cj$5k3OBx~_E?Jy%4-SFmBO z%SzQq72@XR{x7aIJv*z4DT~DP4h$}N0rn1T_;+KE5KI<$;Ro566N~lW2HD9`@~<(a zG%oY5dqj3eEH@1bb8tACHaAT>G?QKLs+Y}vxtvg8ATB2<*YGudGUW{SX>J^n4Z1ok z`CJ>+)y+Y2&sDZSyz^%(BrLM za#G!COHL)y<-x%QaTpkf+$St5?EYQx?f8)(Bb&5n*o5{ax>e3gYZOafmU9hh zUysk&Jh8uk$W}<~rdD45)$f!W$b6^n<5OpLUm-B*rVx9~WP7}H>NEWW(&+dZg?sPy zuJ}%Jhu~J2CmOF)=;_~`5*iSehZwsk^7S>L&}8&*TCEKjuViNS`@AnmZnI|%Ikoiq z(S3eTz5}im>>B*DGQYP>Ds)~mU5;@0I>&mJ<^_KMCG$Z4(I#c(8uu>VdK(>My6C3J zr<63T!56JxzlwQ99l9rUhlY$76a7m-q2kBi3|$ayo6x=QAhQ4DR5Jb@yS%u) zge@19<<=((-@P5S9ms!V5LHn80vwj`!6^fleV^aOHfHEWWEgO9IK+g;e0mU3CM}j? zac^9RZgnZPzbfs#C|gs2n0kdJ&&&_IAnx?$=Bpp%%iL2cS0@1IeVwIk(>&$JIzUuq#%!mUU_T|4{v0_BvRVJZWjF8usdxUPI zcunNmb^Q+C!_=QV?Z6`NzpizDM@|<%My-(FG#l5kH^3Y{;>1QTWT?-bHxhjn$t0zq z+YUQZtmd^b;8yVGJAeCd$!M{c$OU4rAoxG|^?^E&%kl$Euw7vvUvB>KBsn=TVcu-A zs|r*$t=i99FwiFwdkJ3IUZAU8!|dfdQ7r!fUMCx3pI&yevD&`+VF9R43SzZJpkEPv zfz)eSCsh@-qQT$*R*LF{*rxXm+sMQt?j93A7NeV!=Qe?zfc(Ive{b`g=-g>C(pdB5;3?oSI4Tj^rB^oL5x!16~Qm?yacn^2FCY)l|8U zMpdHu0%%(ed6Bl(`?*M7Oj+WeRjaL{4qih|bRC9Ah7D;K4pbyEsFwJV#}}johgV({r0`MWbKmcx z#l)Y#sw0AaYOs{G(d06>UDndR?vV8}HTQ!NYMsjrtv>d<#~xqJw6NIi{xbOM;zO1B_$CQ|&q`>FdE!f|zq{=V zQG6o2&Mcl$gQAk?T-q)!JZQb@WaZ=%%f2_Hm#0O(rTomm`j}+a$4?KQX*^kIy6uei z4qd>w-ZrIJr^$Zr7r)Yz_0Q!|;opd7%?9|kYDdnU^nBp?n&$Q4IWB?xRt2p`p*zsp z2?s`rrpb7IPQYZfU8y?{uMslYmFyK8rA6b1WZVg!zha}}oE4PWV-|mR4w)|(Z;~}B zDicka8`8#VG9ik~8ap$9=~gZH#R^dOtC#6mA3yGm%4v0FGA!0{CV$?l(Nual;c2n! z{@2v6nRBb3H<>A1#>&TC)F;-*?LCh~<>*~n+JaXW{|?#Lo5nECzY{7Z@Ud`scsSP# z>6hoqo|ugwb0nl#pwmm!svkanWM*M0ZfyKSFQsHF@lZdbD67`^vFkU%sfs7SjiZ$l zdE6GuDDRVR!wfLk(`Pe4eSPyWySPLMQ;}p1_s!v1Z)S)CG*D8nb zD@Xsb{4y}>>^-`VLLE)EO&LM#m!vO|# z^+7E+e?2oD?nJ=h3Vc5a8omAoC52;d ztXX*#54kvsP}6XU+CKDqs{TwYaSM0sLT%gZ7&@;pk}=TxXqV=UmwydcizFP7G}40| zMSaO=9Yha@9Ct@+g7|cq6I;u)Q8mi zjzp5CwfeR{<35fm@`%sz`+LF;*NIA{zlu)e6zvI_;Cg_My3wT z(p;lEd~@GT&UQ2JVE0k^vzwKJo$O3(9%$JB?mfFBS!oD%)PEZOq+Cz=5n377#A8V; zz(2qCT)qEz&~nsxT(G4sK^x@E7$IphZ%OGcT!Bf|ubi&@Pu$WP()E4I_g6j!`o&LM z`UKeOvt7245lc{G)pxnNV#L?mO^2f2#f5afp!9CC;J=c4Gq!+5b{=Dbi7mm(`kNwt z#r_~vQzGz5tH7@S|bueDG5*k7IV|Muj++CD3mI&S7cm1tS@FOB_5#w9Tg@+2Or3r?@3`%{TY3-Cr6U@3A=8Q#lT3{)YMtq( z7sF}GoHu8^l^!kV26X9WH+{Wv+u{g%yFE6;mKmLGCD9kcNKQVsp3)JzwBz>nxPR3G zQ83g*E5&lADpb+1u}b^jlMu^3ZA{sGO9nl?AK^3xZ0%ppK4TeLJ7qOKQshIMf02%5 z4-lHc%pk^Y;e*%TJn{PPwKO4xOJU9|D(T?Y3Df8ek%_UOMkC{rN_^h0b^E$ckrL0e ze}DSD5r@XfC$de=Dh~Et==G({~?D7qA44N}=u0LR5GkOk~+nq!EoBl%* zs5y*3^%h)azTkNxh7ml0AC+R3`)>sB@VQ#UK9Pvmo9-&&l($)c+pu ze{Sro4by*D#{WLG^yL5U`oH&Hbg+p2|9&0*(CcvSmDGP<(!Y;<-^KU;p7_62M&|VY z-s8WIP?7%s`$Bphj-NPjUqE0tc$YJw_SBAdZsR||>%^qAa_1eryrP&%M|(eCoVcLv zy#+mBhGOziY zP@D#VC5oVFHUxA0^1|O&@m^><0@mX zn;LIr;deW=r?98Uft>k{Wz}|zl{q@q5*JT9w(Hl`(40Sc@}$7n-kD-D-skHprX--j zV1$>4!I$5dQ-+x>?`=#&Z81X&&HDh1p#h+{s}O@spVfVFw2?S};X=w+@y!Ba{E%=6 z&*>M)5D6eL-LQB4y_*}&g$sNWlgyrS|5=q&RL^v~s* zEYDpun7UNDESxRT7rjEY@k9~cyym{_=NS3=`M&MUu757U_eH$XptAdSLwHnuN;zPD zvQ1iWJxql+LLkklx}QkZdwBRf)%jt|gZQS$?&3R7@<;*?OVep~!*HWNgM*QWqPKnn zR0efMIHUt;2jAj(tcHGsdsx^7jF6cLW&disYKC!wRp?Zp5|r2{xrNJa&6g-3(H}M& zZwY0K{D5ItnVIZeU0sgVOhO_eUJH8;9H=(0Y;O;MMx<|GARx#mR0ZJ#kC7=s^onVXwqu5<|o`VkFs3}pLWR`v$g_h2Dbns?jM+DD(S zOHg1Z1_~;#^AA=BRbW{?5D+M=t@R)#_YDr>)w5%sRDa>iZN$V-TU%Rkaq*=;?-^Ti zEmPN2y51LTtO(@`UdAAJ%nj|2+xHWK5Ny+g_w=bH_4VSa!s!^v&9~t}VYj(%ZigYW z`1k#M-wR&t!xkx;t~S4_;nO6`xkc&zI3hwB&KhLb-apo!(FU1Q75H4pqfe^g4d z{BGI|=%(#0_VoI=sX55E2y!>b+jqpp4`*j*Gd%w0fvH0?7?@m#;is`ONp8TaF_iBK z<~U)Wv|Q>El9@A#dZB_ep+jeIpd3?kFAanWBt%1854&Hg@j%v zF`hY6o|v6|L16ZZQl_umufNnX9o#JBoW(qcx2=k z`$tUCBgR!@R_HnN5V8l4AD?2;q<5&t80VkG#STQN#{Q8g2C+uBcmS-!IOG0+H9cr; z$g*mdP5sm`R@K7NG8D}M94-CDuf#6Sfy~CM{C}tC*{fIG(BvlFzdzJtf0Hup&6|{X zxmdyA?fj^%J;=w$C+N*U*ZrwNl(7%!8jiz1M+W(@E^%P`l55*Z06}5{K))MaU~lu^ zHVwAF)7`(s)%d06^uR`aj`=6&s!#NWb5t z;IF1W8gTTW3!%W#eq1j}!{&r9dsF8c&4oo8Y@$fwBXN;BNHy>wTf zRjJpu+q-V83|}Jqb4ING+eH{i*0ULE87}cJ8BLGeiz#>*@J^4oszkS|)GmS^i2_4U zm+mE$_Jb!uB-$}A>5%vx@;myg`bE%qPL4a!+dZPYqn=K`BXH@7FcDor27U9+7JCC; z+K|ADNca@?DIi_QI%fO+^U!Ugk*pG5>2!%Sgoz5^PME_1Y8T}^H{jnKRAy&h&`66| zc&@wx7dE|bCIh^_0m&&kl6;-z)8ul{jtSrV6-a#L1AV4P_O-*97dLcH@v-XSxn^_8vH3we_Cv;aoE|}VZ!zE)df97Xhh!~$c7NQ#d0kS(Q9qRR9X`B=%U1_ z2Zs3mid3KI?L_naqnB62#-gw9ezAX<+h(l2Hd~=}&E)jY6vipnIj^RelOyEJ39Z)& zfk0w)+{GmjpX&|mdCT^1J+XAJi?AJGIDJ&c3B5Dub6fVfp&^ zBj01Pl;pOiWesVhi{HxOop|%`t%iAbCzr+a3o2W?#!IOzEKI6$L+Ye)EW&yy(JO?O z=Vy|_>FOJseAwt*L93KrN-P9N+`!+yI5%UqF@x^Sz@&G$W&}&zZwB1{0~}}RP0b$+ zb{4+LzVJ@1DFX@r@<#j&|4gHYgbUZT56Q2Y()FW&`30U^pLxV-DyOu|P$oz=-8KXz`IVrAYX=mRuxV6J0+8VWw?X3J5-R)!M z&AplEi*ng!Pd1BjQ2IW`W((uuH)NA!5mJ*4QUN@n8Jsy|E9CEavAaM0@m57&Q~l%2 zbj&m7fI{_`X7FB%-MF-T@U)p}A!EHey{a1A%0P+3Bxfau} zu;&Kb-L(LruWhVO9%bC1f8GWPNOj<&oh$<%KI}EmC#0DempC^+zlV&B(d1VL)-9b> z>?eM)ehh^~wsznJ@)tptZO1V-l(sQJ;lvAr{ADN0StZ4|Gdwl|4mS)va=O&8IyH?Vi@2_5Y`aNZj_Nr+@z1Q^q(rrCQ{uY-6 zQ2s7qbW&Cu@rob;(ep}Yp*=F1m6k=%3>}%6)1c(r=q{$DJyh?`v(CDWY*-*55x99Et^7_#po}^U{{EA*@XPlBoP!$df-F%fH;8 zbF2*wLh>OFH{VYu8AKS!o1dJ*rKvm(dkgk}H?DyuB(M_wjB<0YQFfl1MH^l-Gamo&XVRl=mzqgvchM%Scf9IzAYW>} z_2om@@Y8ljbTXMhbhC-J`a0wfb996>1{Y z9ldeSYrUJh_{jF#_Q}yoy*!6%H-`3+3WmSdVW@Y)%UA>!OhrGx;|%y2KTx_YVSfGc zlInmd#zS|`4c9p|HcDz0pn~h`@4vW1mzaObx^&eAKaF`{0|nK-)6rWo64#&q^Qi4` zv*@y;0LJ*{r*7rHd-wVDpL^K(&rKRP9KZ9%U@GSg4vq&~IBjj$*|jS-GKSuZ&E3`b z56-eFH+eHv&@=iOzYn?3^P+b;7EB(YvJV zqudU$DB;s)H~tm^NHbTReEP-URf6LcFruf>`_fgI8QS6D>2*8A))pw<&Yq2>RoN4n z-X&7xr$NC)C&+7q_0#$z$;cr8k`>CaEjO-D9SqXDxh?t6=w6MG5Z42o7puiW4ka`B zNs*k^=m9>tZpG!CEs4B24|9Sh%Fa3G|6ct{M6M5sVPx)q zOj_Pn>Z%|4V_p?6ZfM_A?ZL-K@{M)yxY=wfkFmuo8iu+za15`Dv%Jt2Iw?+Bk+e@5!?IFTuW2KRXz)a%wA)DQ;}6YKcAcljHlF{v}mN^NYln7%($3 zOS`;FFmH9ZzkW}*fHFcG$Bn78Rq+82`ba1Zbk#;jKX4EgR@VE1Qem)PHWwpDL2}=Rgsen|7)-cHA(v+DgDZM}6pP-O?kaXnW z!Lwc?u4lOYQ9GBjTdLv(QNZ&iLB5UU+N_|U;Gf!a>g3c$z-KKNH9>a5sKSe&Ku~X{K(+A?$amVp<`gGWj#yB@|G^@6ZKhS zSr>pPqN$KE*C8Hl$FkhoqIzK=Vth-qRQB;izMlImmk5F@!fm} zNBuXzo|Gmd+U>{GCf7mkB8gUrOyswx1N%ZFGgyQ@N8d(i(m37d_Z9ZcgC7q& z9N^TQ%u~D~c27U6wf><{$`uu%0~`zmE2F6&umYU|D9>iPh}-4+o%AI(q9A#J;vmw$ za#DU{K4Y_mu9#^{7WQkJIelgz5mjqv^v@hlpU!2QZwWshz4e)X=i|MXx?Qqk*rY#s zn=2*aXVFg|IYK;h>+h;>rpYYGd@&}LT2T?iJHU@?h__LA0LmX4O}vizu$QJTtW?azi-yp7mY_!h2n>276#;ut|TakXZtQt{-p3O|KRc3 zWI*Iv7Wq?@zppzE3+lO!|H`A=%q&kTl|U1%9`0Yi_GsDOn|=4=q3b}=>s_QtEL=5b zMkW1BEW53xJVpxFw~goJ_*62ev-u0MjA;-T6%pheyQ2sNu0Wq@#ii7(1Elk$>zP^f?5F@9*W!X0ISM91o!P~JatP>V&dg7*g!dPk~(%A?p(TF z;mp_(o)E=nRra%lHQ7D=G_JM70N~qQw*o zP?%CftHKj6CEpfjT+%4Hs_E8I&&k4)y45F_To@vKuWKszUF*lGBClB_&u~OVM&`2x zL?zG7E65Oz&U|flmWL^;R zrM+vXaTq?z)KwHF74GLV5b+|9boG1rwd1To-#nlOx?3KZ%HEHO*GHJiazbT%_;@tLfe0{vYS;Oog!8alT}^={QGfNx=xd>&Ul-*CHTGU`cL}c_ z6(r@j@!FN0?eNUZZ_8krhY#JZZwn803oaSDFge3Dz(F!1H`3uQp<%zHWV@idRDrJT zNVkzleAhV5nI6M6Rfs3gvTpXRTITYoTu zv=t@uBFchxBwzY;d69l;#ayi$xcE-gYt2_SCk;j6GCiwhYHj~eS5wBwDnvX_?b>|m=ivwVeU{s#}b}AvvY3mg~^4P53C$g zw+1#Jbj4q~kSD_uhY07*cC(E@)XKsINKjMUNz%^qZ8f5y-5K)4#CAZ~&8T?n0PV9o z2dk-WHk9U*{oJptUbp?n_Nn#O$&vATIr`Gd_8|e*Fh!N)Qd7yvFVEO^%BaiRJLi^) z%T(w!2LuP)i%BlM#Q1xt1r5f&mZ3~ZMk&P&re*Cm$yUCr*ROv92^Z2*D=RBfN;YBD zkxm8M`rTgf3KfgskISmBu8qGz!P`^8SfGYX zp36Rw^l-i?V$eMq86VKY1yiqg<(Rv}X#mcpBaII@!bUd({;g~+CDwo4$%C&89O)&Z zz+L#qqu0_53tXm4LhC&P%Q&xINi1}#*x{PTNOZ6ZijNfkF6lpicvG?UaQ`p2 zU+(m&!ZP=L#A(VGCo~#G@^7v}8u>)IKDg7?{0Ilfhjvwi)SO9ukQDC4y-P^bkd6Vo z=_YZS)@;7@XG2o3k;X9GECL@m{we3tYz|9IEwSIJOd`6y#LMV!K7k{oDxTe-E1qp3 zL(of{M-!AP$Q$;hlTroSD`&7r_y_$(GWa;pN{T0tk)53#XMPD1x!t6V4CmH!kQTb( zCwGFyZ%Ii@h49!iF)@j?Z*2bLwawo>`hSfa?iiVjGyM-ml*OLVKxJh;`FB9@$FUe* zH$j}GsL}aR8lkak!C_ffDadiT`O`;<4R4ZijBx32k**eGLurbMZ=vbk54$v`EK>y~ zMcNxu>$6tZ64R9Q7qVJEDag6~)psl?x}q(`5GydC$kWR+qw?UE@U2jxK%R>!F)7-& zk7ivyBtsIdC#Nu~*l$%TWyQNV*UpCp-}p65@{Y38o#0#Q{^$2^3fMp1rue&hzv5{{ ze>rwl=`p#-C+!G7tTMg3i4-!d%lQZGZnudB0Juf_vyiu5nVwqGwwff7zn|*tw?hfz zqO&xyUhyW(&g5=q|m*L zuxFI}uo>@RdGGGsp3&Ixd$K7{?*Wdz(%qjo+^x*9r3kHI^f5lYlHN?Beqlp0^#1ez zbzQnX{xvH2YhS~myh^-R?bdRU73VckWRDqBf9!U)V23kI1EOV0i%Queb)YdB?`pw zjoP68O0{$)-dMRbqq0Z)UaSW>-5}l4Gv!b$Zfuc7?X%CkZ<%H$U({Z6q#riuGg2f3 zvhSgJ2Q4)Uq0y6BFj?n(!c4=;*xA&KF~nQZE}o zx9zB9g_smM2eyYXkL0SZ0tW|&@C~+?y?={GvZA6)D*u^R%qA4%D`ohI3u*}F*TkF! zN692*Vr!xD;zl|9)Z+Ph$Lq_tk*`g%rV4s_MV8UE84H-MV_SXg9o)H`tk(O}(S?K4 zDKSye^3FZY3FC_MVXhAxvAUB6O;>r zff_dCS)04Ic1kv%b^KH1t_hmsNOKYu3GKtcC#_#!RisNuNRYE?AB~AAf6{}XUE5Gm zz_mKr7$r&t^!tsw`%n$op)7nN9VbT;xQCHGvhVx$WzD7a#0S4($W9a3D;RT^`abj8)bp=KUz3@> zK6zYhSnoT!E(2kiF-sD7?l(>weXz2K=~{g^cr1c^)>~1oWa3#>Ve#8i+TCyVkbH*w zNc{>x$$vtPFgKU_7IskR<%TpKur#{r-H_(2nKzwZj{M0^LZDd#GTw0$0iIq(KBWbf z=67B+`*qoH0w4jslexe4U`%L^pp86Nai{YvFn-QqrnvN()aCqW9+rFSmLqZrQJ7dwM?Gxbxxmb zvr5@rO;XHR;J1yEL{dk?su03!&%@_L`Y1r;;lQ7t?@j)8kW*2q^J}7ggr)V#CUr3q zP_M~w?Uont`5<9>-gAr2Vlh-A&j3b^+qYjzVos7c3INMwY!AvL=p!xV( zHGkH+3uEJ2Iee||;Y?V8pB-FhA_rRfR80&gzJng2TaXvj zI;0_iEVAjb0$;Jwe&$-Kg=>36#U>Zi!ut-#`ounzet7($bI@>JCi^}{1~mXRXAu4G-@u*3(>fcgTkQ zJgxI7$ls$`pD}96yY25}C%P=D{hDd5bvvW@9ug%BGzbLL2txagTX<+h*QP$722$QsvLuGMpriWr!#MV)u-rw z%Q^@AbqiDKZ{ZQkT*la%%DVgaV`emu#U>>1`=1xdZ>4PbU8f$<$A_Vj&Fx-ZRbl?rQ+z_haiAYhTN~Z`md|T3s7KA!N1O1@Kk4K zr&e>~>ECfOQK)%MCcA=wZcV{G%W$me3WZjQJ9Gpl+vMb*#}%N*q#?5#g8x+_Ej)yf)tGU$$c z2~cEzxSu0J`T+a%(p_MB=Q7tsdFFFrj4;Ndpex1T{Jin6bVt$&f%zSM#$X&>%=iwp_IfPKjq`P;Pir~_hpJ>bk({!5E~aM>nBd_7 zjt2#!(xo3D}T!Fxi9QAQZ`Dgz;uWf%iX%VIvFLCuB5#xc}4D+56@NElX9QSq?6Yd z%uuV96V)L)>QaJ|y|smW@v9a=X*ETw<%w915F0^C4B4oS? z9w`X`@4+crXV&VGGrz5Rrr+*LXV3v9<|l$2akFu2(hu@#oEp!3hi}Z2r%%3QB;hH8 zj;#t(`S93iALU5JAEEcl>!XwC;R{o(@=$E)W@pa&r3MV~j%C9PT9_%zO&TMzCE-7w z=xJ1CD77zzdRZNuu=Q=$2yT?Q3|g?}ubS}sUUR92uQYgKf<-!LOC491uY{}0$7=`M zrL`;I@sms!T6x}<605b3kbRxuI(gy3z|iH(m*0DM9E2loc+XqNd*G%x1bR^*k1d6@ zwRP)-+pS;KIjk4r8y!Yg=Ev3++6@R*Ib;flU!a-s96EFgc729+%E3xMhpa3P62evL z{(a-g;Dwo18ly|=&t&LwOrBeS*`3A zv!eV@EBj@%HR$1?hS4a#^)2+9ydDPkyJ@aoIbcK?Ff`$H#QUHVxNzWxpcr}xg!Cjv zaZ-(l8fjb`5UzMsEN(4Ie+&$iME=JE>Lo&?ru$<6`6}w>Jkbx&^|MBPRvxPjN3f>& zFlR$Dj_IZC=p(~-MFlDvsK6Ru85@CI^9SVMvi-q?Hv^Q(jkGbS3(NiKDZ{oAEo)G< zVGUBr?l6dt0XzE%zkt1Gv}e!H?*MEx{5ecFS?`%3ZbMy~K4fxI(N0s>A!Vj>W&lhf z2yLOJ2-cCv>eEuS?!&u@=J!2n z4i4loRDZkjD$uDAyL41mUS1r6`?gF2cSlD@8y_2P%bC|;svS9Y>>ieHgrL_K$T$h@ zcYcgNdVvo^ctqsoDL{ciBR=@6y0W4{*In@DhN^@5y7H`ll$L(<^Lq=$_2%(7xX>vp4{TmpSXhvi%k$qa z^%G&bzhAA~`-)JNe-cjvJ-nCU$+i`qNm@IL%zMYigtWEkQB_B&@D2D-5uBHz8d36E zbHu)SaSk~?CGac7Q|AziYSXkN(7^d-$Y<$_^1&|uWl<)#@@w`Jr%#LU^E<6{tNxev z{N4UH@9Fr%Ji<5iCktVq<}^StNST|1_uh2#)4;o3yH14*9hAZC9|#4pLIaP1~0t7#o_I9d95npp}!8 ztMp}d0J$l*E}r+52bH_?8KUs2>ENwc-24u0B}t)JjR%-!{l)h0vFz<;mfu2ZIjq|* z_aC+PCObTnKs-FjYiE=HUfb!_;s|Uy2q+Y(ny`q-+xHTYnFVjbG$#DDV+>Dc6~*qS zWD|(-bc_(Y^xWKB6W2yaE7Nsk;N;=Qq_XvhEFSvzACs1-2UA%DL?INdqt8(NeLV?DZzx1lGP)6kA zCLO>ojkTp|3Ru0MiAVfyKnPK3`t{)tC^n;>DV*UFTWGpr_-8w$&BV<(9=OAxnEeTL zsLu9-=6^eWElu~mb#;|eP?q)c^TU&If*Gf$m)AXP3liS7scj!=ME=xA$gmhMudIB< zLpl^s{~8g6M%Y)ZCu@!q&>h&%LCB}R8usxoC->v|!em2c#S#dGcHgVd^H9Q zX-)-vZerj8AL2nNZOZCjeG)<)cD%%qk2@gM-Ppg7wPeEd7bW~Tpbn`#-i#ndg;y$$H`udT07FD`1LBc-j{2Irg<(BSa1 zENhuolNnPO3p_-@L?d_@Fy|Q&ZD*gRVgR&g__k zOJPJ^c2i`P)7#mg-2a!1bMXuQTo(+94QA@kK z3kqAGe@#url?>HgP_Nlj%$VQDkmqr-fLfizZ_S^dEsbqdO9ns zPLoE7Fq{flbD0)|<9%?a+OH%Q+uMh;fz*qF7}k>cPP1=*=mnb0I!*B^*dp3vn-B2E+o57irlWDK&acfEL6T0c6tSLI}7!Lj_3@i0I!$1KnA zMRGD$-tJo!-sP>el7vZiYATC*d4Kmw`AaRJkux(fJpsuQ^!j?7<#rp(nsh>vSDBa& z?%K7hY=7k7iN?d*(f%cj5B=SnYJbG;0n7lonn$pg8<@KU$0EI18qM6dpoqkM2E*z@A;gN@XWxnwZyG$>g2hAawK&xhSt*B}uxz^AMnf-)*5!CD3! zc77CF=95ax9{#v^6&)R+81W>H^+T^;fxfmCH2IxmXCC)dUU)Sns?+g}8IFd({S6~$ z)|QQ7q$?Q4-=@iKB|}xdd2iDljA=t7qdyRFfa!_X$PfbjP|}_!yUOqvu}kJ=a;CvM{clr&>ji#VB+55F3NpU*7&o{iGOM3yEk13Jwp{T zK+#elMF72-gSaeDIBXRkk>vq zK_T-n?3mEaYRr%@G&b&o18V(#L0w%2Y!Dnw&PcdHf52TwT+e?%hRGHrv+)ii!@wj^f+5Z^@c9 zXP{nwnV6U;nZJNn3uVWaTST#8GJLQ-L$42N8MwplMsoA+1mjg}N%gZcXz9c0$Pb&r z5dLszsYDpxudb&40QmZ zM**~Q3>Gv;#|IqZlxKD4)4L5v8|k2M`i_MNDT)S$XN-4becX5AD)aykpkYXV7<%gP z;qL(2h=;0K9Y}CnV1X|*G!6_E!lF>TGK!Za$;fbb{l(2fgcL0mcU(zH2@r!PxAnpl;>-B>I1}sdKr0Sr=0h?vGI*p!99L0M zf$GD7NJz=af8ikx)Uvd2T$P!Q8G$X}9f+Dg7xfCcpgx}-7 zef!FN7(<3KFRQDo_d-Yk?l)c$+3nl6Wfc^ToH^4f$lSzE60w#JOhp`j9P*Ee&cay$A+1fWW zR4Suv`x9%BHE}FfE6Ew71hTTS+VXc;E=`@YUi>=%q(t1lpgq&zqqnz{tLuIu;YQ+7 zzj{}{CYF+2e+pQTwpz~49XnEh1!Wj?yP;YI7Act^FEwG4Z#hfjeBksKaO|*rlGQ7Y z;{g}ptYE%=JscVpZTCF~&z!lccprF9mi6LQ)SLAd2{~pH!~{dUfo<5RY!R_(|^`3V9KMw}Q{>?JL3W1gGnzfyckN15`*j#5&UY=A;+#GaY#J4CflqN+cxW|5 z8p1(+Yd~!5M&ZTG?l(9o&zw0E9u+l9+_-K_A+Bv8=MeUW(|*c#Y1b#9lp=B5yY*NE zbg+nHf;Ki>1QCRcPrvVpv9U3pn$$4OkN%x;Gi&i8=d*K3Rd=#HMi$wK@L;J@_C$V;fY5oP%s8j!Q5nb$myGA9=^VB zJUtJ=ifa(a_|t{)Ry9pcq4tuJl55Xu&)Tie%ix@K!aNC+*)Sp+5tonDkD#nU>qJ9G z_s?`kubmC?E50sJ{`Yo!X=DM3XNF61Sal~q{kaz}Hu}+F zGeGjVq!-xo$Xf<_i=FY9`+9qeu;sJt*0b9dma~io_QIl~f}N>%Vxo$WQ;-kCU*!if zA3s(dZ~obNybc!J?80QXD4e52LwMA2Cc}5?9ZJcvi2*{QaaAcdI)gDQ?=A5}(l_+k z^*cVJC}dF1$E1wigs*GWUQW~-u7kg?UcI_D->fXIr4P{*@=Q(aIGcr5O^S7|R}K!# zu*QojR)NaeOsC5h3+i&Zkz_JDrKP23dd-pl z6AP-*dJF?4pzP^7JffR<;*GYJ*!U`T5h45a}U3n#JWDK6dOUb~CHK zHW*k)g9y$YB83Zdb1|+%>3EqP9UW&gvyx*&e(~0&QZq4m0GO0We9Qr_!aQVxyu1ZA zK0kikUB0Rftnn_ifrh50zi$LXl1v1P0{hMLmql?hJ;f78Q~LeeDy-3R(k z$)-zE*wJwc`J~;-2rWte(w}`J>%ZC+7+^(;l;JCmc(>CxOHiV02@eQ^Akk>5=QiQd zm}NwbBPU$ZKckR9Mur>35XjA8=q&4S>{-8IM{s4X8jX9K^~cCQBgd zdNat~0kDEzfy7Oxea9Jkni3S&)@EzQyYd2nDj4?^Zb6)08t_qW+F7XeXrD z_tJ@vf8ocY?omL7|B!fERjGHeLJJ-@ktmd(#VzQZuKK-(bBAx20bu5+meP#487u zApwdG4jreQoSWFu+n;oNGprwa5KJECiV_HtV&W-a_oW&Q2%^44)t=C1Ml4p~9&p|f ztm#WC*mw$@;uMF`UA^}2yAK>_`W77H{e7p%J{_DV;XxT6`8xIOU47^c<%!I%bh%j>Hib%G`(6OUO@xpol#Y2+ngxgeARV~Kz1CRLt z_82#k7)>N*@$%{KAR*4sZT+%vQplU32Vl6_g`oMl$84E+eb*=CC1@GgzYKTl>(juqy_a^sn5i({3j1MN6#c{ zio60|M_)41v>Ny+cr9lx0-SfDWOu^?i=JqQ^%rWDQXBxR`m%u5$hj<-u#!oZWai3Y z7n5tVEKdK@S^|Fc>i-yN$OUH<8M&AIe98 z2wLUO8WAD|h|Q1NI-@P?cZ>ur0jNBGp8V<1p;M!V_KIPY3}3A`c4e zC6Ak9GN~F>h!5Uh6C~k`P5c}SX2%n37d*rdlliL;v!$bPY`EaTKVO;CieV6<#*7Z& z%rQICuzlX6uxiU1>+35Y6Ay?BeXK0So@yAQ;Z|i{1X8KpVgH z6sL*6#M&>E3pnK)*cpdfzXTQBZ*Mr`3HHU-e_pflBgn_lQ^GqW z>l&!)N&8=y#Z>P&=6L7aJWajyS5-B&yC@gYd-L|6h_&*yS)ItFh_Erj9X3#Gm*RGc z<&u;N*3{EW@I3Z~ew&0>gd$Q`h{fr0zC?o%cWm!8#|NJt4{H{BO&}>68iP6&Et2G_ zGj^PoTC0IL-48*2kxnv(Q~?g^G}o?)_ucTm^yrnZ?@2m|FEEfsmS~LBQEL+?^1)N5 z;>~n%dPA}vij%HBI~T~^EpUpDT1e6<=jZa1Btl^epC`d9La4pTj9AzPaNjc%#d8^W zA&vmLQ2!C<76r?_{5b59a+yb2M(PlYSS-&__j@0YjEZW&Igwy%-bDjZOyecjF+VVg zA04L#s~RBr4V$Ipw7ggK4!R^UKt~&~ezLvZed`_L==2oM zqLi?{d#_gzWX}I@CXT{C)0H#i{c)c@I38uxl2VS>_xtm+E%$^BqE@TAfrG}=DjNQS zw(zsU8Rb}p3BGCpG;P9?9wXmH5vqVDLvvsV``%-_m<2sd=$-9{ZnwxRsa-8%iWrwl zcio+ll#bP`HEB7$JDht#Mhh8 zvR>b*^^R9eEE=v3wT}!(`h9Bg-j$WI15$U9UVp9UlDalPi{}Ah?ZidW`aw2vSX5Y3 zbNuP@zsIBT5lf2=ZrvH8c~i&66t&K0o_~CDBetJBWbO1y95{gz>IG&@Fz?zv+id++ z7p?W4$nV>VF0``sdhF8I*C+d+;aH@ChE+!%FPdC%Qu?k2*p#Vo;TNgG_kQsKtx;fOdM7LFB5Nk(PP8OH)EkO%2J#kja_BpTlpWy|U(BdAaqbht8S2lo!q2 zwY7d&`#-lbUg|@i@00UEILd(IU-eLBB4Hac9%N>*9JvcfAqV_JkxQm|NP@#cM3Xs?TWh~HPQKV_1LRuc?C7vdk=_FzdopC z;a!w8C9yG$RU6z{WmVNr{8!zR5#Zl}CxE4fHOhm_Mk_t5kag??c%a}feEFW!}-m$R{C64_VmuU9(4m)Yb=SfdL8)irom^?2X4iDzAFk$?n37Eh1 zx$T{HIogjx3(QRXa3^~_jq_(RD3-DX!f&bfoS-n$M{k5rpq?1jV~TO zB8yb@_3J$pGhuB>c5P60U1L+{@Lx<(@O<7Kc#A>6>Xm22zIdIO9fz+}p?;)S?o3K< zM1q_sjri18`VOx&j~7D5yg|nU&h`5Cqu2R~mBx`q3q>`5tRY)$4|Cg^8-nom1)Bkb zZfq(Vl-eM9atuwId-&@$7$gLc8qc$S6hCs6Mi~9knIXgc-^`y+bAT#hrG1g!Tt-oT zkJoZF?EjGur8ph+?*jzsNO*(_)-wdEL~;=Y8Zoa`cf{OR5Ht9!Q2!5j?e*c<`bF`(g-`JV1VTypIphPx?7Ae$q!d8pu*N%vn(M+SYCgjr5@#?(C-6^+ATBQaWUU%s(*gYAQu#M$R40dz_@2mwuYe|WR-Bxk96zD-l}*VBW$$$T2f6D%5N*S zgYu}`k-{Y`=TzM`BQlHgMOfk5<_t9{+d+!~ai28_GN=z7Efah)ipX1l!G?s1Fdosw z$|^WF_Ym5PJCei7o4%J|kO$&ElC{9%6~1=NxbyLGTG>q`fL7%+ZCovMVkn7W%~9wT zxm-noxb+>HCv8O<=BkbJ9y)mC)+_0#G9R4H{-1u9%<*y7tn;(q^eR0olqUF)0V9=C zjp2XP9#g@eZa0PG{!9A-R=Pr~{7_X$u3!0_#(+HD;=_HZ9X+&}1Gk(ENZUgdsVnS% z3iKVIU#tDP!R@I4hzh?s5e(Lx+T(E&;t}oh!ze{AEG>OTJM|9-28*G8!HyJR!@+mU zsD$iba5XhCfg2JbQ_&JDkR&mqTn-h^7qcsxv1JkZuPtnBnvtRuSa1(Al%-RqcNRte zMPh<3B+h|eztnRJ^TUS^3r;aV%QJ5>v9o*Gepv5ATbtJF5LnVD=lH)QR^#R$ViUc{ zZ@~Ik%`~I9`^2!q6{S^5b#(yCY$5mQ(w$$j~U)!9k?+lkMZB88L_LYuvA$?k!kl{<3Jy~_h;Z4){aOHpytgcs9S}kUdn6r zIHUmn2A>Gr+*Ts*(gP8o zJD|y+JNyf+7}O4|y6#^QyE&qZD4-q~KvdG!L)`<`i4#MPrSj!fDSvpNB$YDrazF1b0n1G)a^-%GPE5oB1Q^ySksipPX7crrYf z6NYk=N*aQJbp2u>bP8gMI1ZUmqiA7KeS1BM7Kx}FI6}~j6v84nPax~icDn@GYtjWm zm*PlXMm>Xeq1ERABmhLv34_*aFqLd#X2uMmKx$f=sN0;)i?BDFo*;rhZ1ss6T57M? zR^47+Dt%LU^{Xz*DR8y|Q#60kt$^EJhy4vT=aTDxqBP%RlsWE`@NKEDr$zk(toDhi zsZX>fuMYx#t`xre47AQk;R*>&boVnj;H%X1vSw)Q)K*n_&&*th;1m}Im7#orM1M!< z^67hz=V06}o0z;ofsOz>Ah`4fIWa<6l>{aGC#adl$H(WON(7;qH)zz6b__~2PZa#= zrrwA8!KGs}@d^swK~IKL_ADek{25?ppCC5Gj-2L9_tB64mrL(mUg?%<1QD4YdOFRRl8)?= z25qT+KsiVe2UC(*UBrXBF#qs5CTO8sm4tR>HASP~dAdrBVA~CTZ6htG#1kEmtb`L`UcOMS*Lb08}>O%jPuwJul z!wM3;qJQ5v-6CsAislGr&<_Yxt90ytJK3gV#DrcC&JnUu>K^xL2J8a&e}A4?f8Pvs zZvelMAy*?dAm4`DMTPj7by%6(%x`(5z$660(f^oO5&ac!f|S1DUftJL=1J}g(=`b{ zhP1U73CG|o)?gU+X%vc3Tpm0@k)@k^8{wk}pzR2jYDlf@_mgn!$ETf#gtanQQAd4- zmMzir!<`<26gmk4ar6s52(`mEsHv%;)@VsMKF>`PU~9>U$pJ z%AYXi8lbc6LreXCNks?XohyR=rFIpejj;#vaa-^rq^bnv6%&+OfZpE&MCQ2)*BgsM z{_yDySj{^K0kQv0VKzv|64BJ;i_@Dnowz~N11+$cB)K4%1{4JguUdlt25SA_(s<<% zS#8`l1oS4bYc&e3wX9yD{tsAOruZf+O-)vW3+LJTzUN?C3hIs+E@kja9QpEryw!y4 z>7sT2r?Kg`Ci>w1@(!AcM_E~dShnEM(3-bz1K>6rB^LGl{ro2S>NaIy&cQ&15FIlM z%ZZaGseurJZZ>C6Lfz^nz|vqjzIJ8~+(7P_>K%-n;!C-{5WsTv^~xytk)-wQI2ld~ zZ(xp7bZ3w3LsS`eOS_(&?5l&@z3^T8?4xrN&@sk`VGelLReNt=UtbppNulVy_<9@$ zniO4-eJYFDR-kw!f;~uhFSdG20=O9>%n0*(TFlvM8WLIf6rjA_Z2S9>0b;@LL`Jq= z?P)>~^!c@i8!CbPpkpPP$Y4MtPIKX23k^c2fpLpDpmX-gsf!xt`B{Nxxbyru|DW=P zaV2p)3#Q2+0!(pyxXmA+KR`YBE7WOdXax20{9w^@yw*J7;{vwIXTMyvQPehV2LIxNA-bqKPgbad383q;hrw<)n4g#44 zD~K{Xr@0w{1>nRx_0Q@Jw7fzG>U_PP+nGI?lY;T@iWl^m#f z-Z2Xc-N`kgqwrWv1#p;gLU#oqzYd0PVpKzJzTL(EzHqKf<3W~KEm6P(CK!?WtH~I2S z<-__c=GE+==8R&LvYAk-}R_qw*s za&}yNq%!6lrM3>vFdrM3jZ_nRjyID>GkMP#ifI)GY9G?ID6M z9Hs2hOrGcYFbA!zllBank>6`b8!hIbJ{xp8n4bUJKw5(Y5{umqqz{akPEKB4AB@dA z7!c|VzxkKQV1R>M<@U)~i-PzMw69$f7oY)~T{J&th&c&F;BM*>CB&;)5*bw?{H>Cp zGWByyh`paMR8KF1@N%C)IujZbkXP#KUGcqs^G`D-YNUs)e6~B)la_f^r>Lh}XpgI~ zJGcAO`BJ6y$BRk*dY{COjt$o@nD$F84y4X3NIbF6gJ3=(c8|t?pZY;}xW`RK$Oj{K z5`*Oci&7B!pWf;luXZoq{NW_Ao*amVl1aa^KVQ2q82th7_Tu;zhAMCZ$~D^6Abbk~ z(z;Z;7;@l9!yCpyfWU6p?l=&i+=;pQ?$n8Y?IuW8(Id;2(C-U~(6xOcV?Q zC`2mXyMvU<>6YphP)yn2SW{douJ8|4eB#@3e`19o#vEPV0B z6kKCVW5O*F=e5~xcuP{I#^brU-X?GVZQGc4X5TknOipX0yn5+%uKVu_-F6ptd}IjE zx%CrEZ9QZ*<@|An!!a^T{}>Y) zGsN4!ss1M>s(F$<<-aEBn%n1`8R{@hPp>Mu;;J5Hg=~n^p<`6NO$!<-?tk6v9hmEw5oM7+rXx$&l5YMG(%fOKDu#dogc8YIQ;K*=_a6_{bnAQ5s}ke|kgFJi*v7 zaBL6PA#Ns6mx&z6o;V&$9;e>bbrhh$CXFBZ^6S+29z9p{{S-uT>{VP(gG6ga>o27) z%-L?=s_*1J;kYPb6>^wJ>_442U9Rl5P7Z4ISD@LpOW;<7{Y$0cn^jQK|RhKb6+u{CJIVxu)IXh^Q(ZtAB(SNULTkFM}aS91n?>}gGl@rnuv!ZAuoF?$$z6nfyOt!^raT^I5{MGS1M zlR3i}6GVXM-@fP;4n6)f!Fk&1EIW#)LkfRj-+jw0u|*)5vz9 z>2CM2!?y(&XS1#`TsH@ASs+2j#4UT2Uh1$PXhdJ;+CI0MLS0R8B!|&p*KF$Y+_CTd zYt702quVf^`#so@*8LRi7VS2-y3U5u9UM48aS2=x;kzEy7>_Z7H_ zOFt}{V#e=X0t;JmxxskRn!&|a3xh-Y!MMJ^<(P2K9WwO;zSY6zg7Y;9eXtmb1HwHgGjU$hD_)CZTDXb+8@9E`)$M;c8YDh9LR}T~ zZrFtkrh#ME*BFhG|0Vv8xl%YQz|eT)GW0HY`0VrM(2&^f?jZ6r_$MlUudmFkC*x#X z!xL?7(^_W?A&O9+&2{L=;q`mLse z{>+*x%No2$9~O$7TXwZY({jHmuhu~9HwX`x2@2B zm3e9N`?b$z@m=+e4SieIWaC}0Ww=W;1aNTZ{&^JzUz7(q!OirNRglokIh@PGwV%vz zTTuMhaH}68>#n1J>aZ!u%yfub5tSCWCN-zOzsxKwr~VEaC0tjikSdP$jlQUT0b}SO zh`2RAEIJvqP$>64#Ngiil718In+7USN1%|zmv-Ap!+}K>?fE4_?+rH8ekWB9DD+T( zHGlrM+}0}4LGk{Wy>l7fvK@t56}#TCq?&TA+IRg zRTlDUkh_J}X-0*%H|7KUMnH!B@nye3pq7D-X5aH%fBD=Cd3)C9l<|L#L=%5Z>b%i3bJ!_*SeCq zksU#vWRk#+|5wrMKLNnuS7JT6zdCo|;P*8K9f;>h$dpco*j&H+4|ebGrgj(V6cWN> zCGzQdm*RS+J(|Yb@)Ul#wO9gnPm#5H7POGejI6g!+;g}BPXi~q?szTLSK@x(pT!A}_W;@?{CsGY04P1pY7@_~Ru?n1v zTp=P-5eALyN0V`Hp;Sw}irdm?>}@513_%g^ij}#H^^{)?^_wItUq8BUC1rQ#^&@SI z#0Sx5k}EtUIb7pRXzFMmZWny-eXDPBVwgi5@&w!rKjgs)L$`r@6qVpqS|NgK7YyB59K~6_QuV9=7X58rlJ6b z*ycbtaQ`vzG*&NTj?&coBarI8VEJUq#eS?bLH(+SK+j3UaI*4d|C=65mDK>kaU*!z`oNm^l~_|&34lIPu%~!V(T$Zxk^!mu-Dqu|4{juLm19o z-{#PC-An8z|9v)+`ko-p;bx-=)qYLU?ApG~jZqnp;x5G?(ZfYhLWN3dgxeFLEt-)_ ziO_4Mt{Q(`*%TOh60`JlyUj~4rqEqJS;2HZpe-#ai3pCp#S~?ba(D*Jg9;4mi2e}d zzRftLm5dja78J&E-M-@bM)F>S`c7tu4VS8LpIiU2p(uK0-0u!`;i0zX+fdiSm`X#> zbPRE=eapgGOfB?#F;j1T`QaiNM>G1VaC&5&zMbvQzR#f%--Xq7Kc^&2Le}^$w_Dkr z@d7L=gLgi&7s}Y<0x;RCEs8f*pQG9%k{K)dYItn=)&0#fXF$6=v6+EWM*1PN)^lEA zQZY>ig7IPd40UXAjI$t9hjR0C`g^^7{pmEGf~~SJ-4Y~ZZqX?yJr>Y#lb$oteUFL$}ynD#s4!M$fOYYBoUREmrN(4 zXrZ0v&XTBiS9oVgxTeX#hI-6z+rkQ1k%Y2Ue^WbQsNca1Vf zcu`>buYvoIk*j0sCF&zzbP)^=)I{hrKRXX{ec_>3Q8yzvz7YlHa%C-X3!OhU-xDmO zlOr)pAYd@o+-HEs1o2cho926@&;Jr{WOS(rZ2h9Nwbm6Wy0b}))$1ATd_(LB- zSvK>M*UbkzV>-e+KfHj5?P>E{ppaJ&L`QE7+E@kuEA27=e3rkdC3<0B%zkYery3pk zAx*`M_Py6VHM7YG;EWjOBkOz-lb@rm&OoK~kms^9YRy1%X@OscItMViEW2J*I1U63 zdyV|KrOVR5v0*~E;s6)j#N7KkAqTZ z1r$TLKE-yk{F>ij)-Xm>d+k>D_^;{XOUFl=NBBBy6y|;;+?tx6&P9W_++A;y`*$Uu zxHuab<&0)fsTQkNI=YoLpFc{bn8Jj?aJ`#O5Gft!j(-)dAn!#8jWuS4JP*N6F=VJT~#Y*=afEkb=WC% zdtXY#b4}OmtVaIE{dob_j=@wKQgu?w&1VL*pPa4`>f#D`e4p!LyWK{Lpyl(e)4#Na z52Ta_HoC6O#tL!n=WG_Y|I{twwI--Fd*#o$Vyfx+zXe~LdyZNk&9SxFL{Tykw=2sv za{0E)gTBi;H-c3a)hMEmUF{ARU}fWy+`nCiE4z2*@8@qE<=g(Qd^LSDyK(#9BXL&m zMmHYGn^oqE=-d74u6E!><5piqweSOqQi{(HOtExVDtlHRD|(dvD5xofio)>hKB0yb zbvqTI>01ux^}L_GR`O_Xj*F_5-|M31((cA@<-bTr;XUtW&sX`)_*KpC6z&RX9kCY{ z&VQ%ak}W*mB&@Scd79;)+Qmb^;=~_yExP3WQ)bzg4`mM^{aEuNjX&g{djI-Nfbprh zxu0YUk@^(H-UA0VRaaLltKXA(^4@3^{qA@m3~X#{dNJr3=(;x_K5X{*H{)|pr-QYH zf&j6$v$J!eQ&d=y3dA)2Vf>>kuZz|M5YF4cmJ=*nUtfq&Z!8m?KhR8p_}bZIp(d$w zTLCHnu8;sCyE4}9l$RgJrd;bWcz)jN0T6zGKoD8`6Dk|mgk)#`9@xLX8cZVeASlp* zB~2Ao)t+{$pE|{8Z4f#}b@f*1b=uK(<2t-l^UuwJn+F&xd%| zQrI}>trNGj{dnE$g5b2Cw)qw=M>*Au@$&Ar^X+{M2Vzp6UOLqOpkydKwaj{?Tk=w0 zRjBj#^XD69J_au{2ZyOkXqR0IdA^7TzA&>Yg)Xt*r#zZhgH$B=9#uc2$&oP)Yc+gwXm(Ch(4~Z$BiYXH zRO*K5*M~n|srsv>c_N)=>~47z_0W{+RL)wR=XJ@>br~G{S(ssyBY_~>w(8k(N1H-I}8t&!x3jnb`2EM%+gH1bR z6Uf-p#$(r?cN+v&s>;i+Lp?VLy)-UP&UGj-*8#zti!J~lk((0}6NB#lQukTre(kC|9q;CT&#|J$jW3c49GVGbrOoF7`YSgW$wT)-FyHTG) zk|;j~6gIf?s`3eLrKE@%Y^2=a$H=$cRJ(`%rNzs(i-}e%_a8Y%Wzf;ZMxFm^Nv1991({;2xZhAM+%?qV-_jgp`SSGprJ_hmU*Ropa}LzRcZ^W%6&GWRdnV{8 zvwWP+-(MudlKS3VA>FHmY^O%<_P*>laKFD8xlugvcY^Xru7dQeYl-Lp-R>|~KhA>z za%Yt`b8)>%kg&WwV%OZn&AXY+(M{W*}X zwFO)WS`eH{>(=6pMi-Z5$!CEDRa*C@(ywHndA^10THmyev5n0g>=$_r4Of|+!Y-B>k z=(PcJMulFMao?HS*XtYWP0W%av*y}(J;Q`A80JNl>C{PdZ@bk$)~DTkkdNZ_R0r?p zO`je;&023{X|!->s=Damcaaw7-8=PHKdz%71%^sXa3gMZ-|yPSRmj^_PkMxD}#wkor`nQDqFFs-4kWq*$6ww zvm$nRo>n|m?y=J9A&;N0i5lh%_w)jG?F`Bw;1Yp2!wPzOuJhf52oUNS1V{)PhJh(5 zd0sJ}z-HfxE|AEP*wrmDkNHCcxLM<73sR)}pRdswr!$7j%Djz?;4Xi-E$lFd@wImi z&XU8No!0l>+ptCGx(we=exa=CC-EnC$d_66p3)JH$=l-m>Yj!PE$fpfh5C0<d78MdrAioulH|<7D2$FQyDd)+GycQ(3KBKY6YSE{uBLhJK|P zhLqzj&gKoxl}h(@k7x62xyLQ!l<5+pSm!Y7xSrw)zxCyS%QO@zDXA3m{bN)V7CYV# zFf_2R3|*z%H~;O!(6QEk=dNCt{rq4*%jfL$aPGNN@u|y9$=r<5>@{CPsSb7RcI*3@ zs>R^6-aGW?wn#lq@sacQFYjTN&w(FFNsF54SB%?$5q`YKYNYXo23~h{4W$ zVUE1{qbo;Vo;3I=eoD@S;?9q-LoECL5(woA01zt!`52Ux#6i$cb_yrC zn2075JJbolRM~{i94Al@gs9z>cAjCUWCZ%((Qu%4TBM<)NKLuU1?ZIGkjR*rllaGf zsC#!<+>?75BPJ#sh{OV6&udqt0!JSWL{2228;m}3a`^2!+c(kpHSm1u(VK|R>*~4$ zz=*=x`;zkD$OQw2KrRp2Co|9hcrYB&3J@0q@+0WP2FvZ;3*ZY6I8kKin;M4#t;_82 z)&wahzTCV#E(;3_LJ0#GH@uAxqC9|3MZi=e1F!wzB%8liY%r zi&k&wm+3_S<;XP%j>H^j4K7@hM_fD(D4j?ISWy6eM__bW+IwIF@Ee;BNl1{}H3NcS z06k1K4=u2B)p5_t=nR*7EQzBxDEX(SQg*+fpjjsl?)}BABy0g7hN6Mu$)Dq%13*9& zdKtiFodpK30oa2EaQ=d@e1G$`FJ4q7>kA5+-uFADYSsOF(l*Y-e0lF#W^Gba=#YBAoIFg*Z6 zi%1U-4(24A10rcSprT;=5#*Gs*J)MNdc5fd0N}}f2QbtOT~Hoy$E{A#a)KJbjo%so zCTakIl39HOC;5{lPA(^P#mY(rEm3)Nt95PBHYTf078H0DEPa(RaD(48i~^>>oYH@*0uQ`KNE8rQHinAwGyR?gb(5zZbN&x{~_*c~D_8$YU(H^ff0Z zy}?fq*@_0*A}S(64tRrl>|bSIrBqZ^xgdDO0|*h$Qxu>AQ4b%UmGN3t0~tpJ*hrPr zr@7P9)5#Bz;Z$TEUVOYV2F>9&={Dl(;PmbVnvDktC^Iv2#(WD4 z_PbF^M8v()7d5Zmb9-Z#TrbTv&H+k$j>%6q?e+03rfo_&jn52{lzM3%7b}Kqc`kGq zTU4^F-mm&@WM?N7tQunSaDL=(zTS=7RFoD=mX0mX-*K9ww$5vd*mk?S*2LJ){b-Ka zaZ2O0**}pjKp1-85PByOD=SY_Wk>)2o47%|$Qf3;58zDHlfrFLmYh z9PZV2uHa`|=r+fs^~G$A6$f37Jfw~ExuUs(mv^|}29F}@52~d#~c%TxHyyruC z+zU_rgrf~#ONJVDcNg`EcY0l6Deebl#n&*K$5)${WclAW3EQ{Sk zN2!w!%}f3)jlB+33Adbfk5AS%-PYek+a+h#Wv1M_Bxfjn>rYNLl@CX~w-}Z4jq8s# z8T_6y(#P?3seI>oF~=H^=~`&5gWu_cQ5!J?JC9@A9#*a z{1IQRzOMzSccg*v6io~S0N5s$mZu25ifDL{{}UtGmbnd-AwECGzVUH&5Z2Dn&~KL` zUK#i^Jy7VRZjJ5CuS5>Z0{Yu0&b!Nl|U zA@$dXbO*=A&f<2+Q3YR%xNTx2I_7|)GXubtn8cakwor0$@@HcjVW~)Uv$3(60hnwC z_!JNLx*J6S?@YdbikC-HGM>aU0KICL0y}s}OpF_rbpZN2dqG>?3o1KYpZG~0=G=$j z(4iP#B$zFjH|2`$-4LH(qNOIbQ>_CYoS0XrDhV!~o?X<>CCra84?{u8b_6Up2v)MA@ai@w zyqK&v5J2cv>;4+kQVC;H{^nSh3S>~KZT5hPf;A#CLw_(Zlz2&~?rfaiwH5Mfu5%+Q z;Mdd>uZ;}39-!@b@8<(UNsMpYv%!3iLCHldeBa_jq8^26O(Ze0D6f$rw1o5z9hVQC zI$E`BEab(&Z8QLkNB$%vF<_Pr_}zCoh=n2qZ_Rs0Y_h@H|aR zBe5JD<2HiU>ciOpzfT!uN>$j5Q`D3`Unq`!1&1yOW{Xee6fow&+1bLM`QY(La7tD= z>r!bHK}s)H_9I@{=?mA%h@)*7aW6*pEErJAsK;^+`efk1l6!%Uuo9L`iTodH%#Nwd zAh#PAtzi0O{CqwL(q>>6nIZ7^Q(iXO37mBYDD+a$bRkC;W?^dtU!_Bi0L^X&CLgUvTN9jMYvbNPZ* zf{oiw(_~&8v6hDu(VMk2ddM4cbt_!o+cl|&TKA@S{Wp$%`F76tlABYQR&wkE#a~_V zH6vb~g;rVrFt0GpuJwgtR$2DJD4(4rK9X*d`M0^?vCNtW52>v*^hTF^1Z{Kt_~LEA zj%G*I7PX;S`I?m7~cV9>v(fv^c-@o6*VqM$UxB0?7bfB&6vQ&C$^4{BX*!T1)F5fTPJ=U1%R5nn1 zy!b@R=0k(ejP6@BhEwnUX)7_+r+j;gBK}s4M5YiH*k+=m%0{-sNz~qLEb3vx2WlR# z>D4eD;nMQOnE>+c$)BBYl9|uooD}Y@1r7=`XtQ&0d}7II+soOb~1cPFYqs z^$Ex1>1yx56w(wdB-u3jTD+5rb%2F6APP$rLLr~`b~bfptT<#5SeQXW!94)1aJ8B7R-- zfep8{pl-yA8n9_$cvu*e-1vxL&w5A$P9X8%0KesRp61@H4Z9M$t#)BylKaq+BfPLQ zmJcieUE%nbMKsj40K78Vf`Fw46*s6{FBaMjh-W#wfAt?eV^+-=Lv_4RwJu&ELBo>05!On$SH3^TMkayQJsP8hs7sm{K^}tXLa%y$4rC6rvXo;<@5sy+84I8 zyEG{|xuuJm@jKWBWM2Vto>fG=Hy*&*)m7BI?{X}LnU5bkBrF`hO^_}4Bq0QQCAT|#g`U}py);~vN`}@|N;|Wd?K58+KDbjZ86{X=7@@l--(v2^O?CaL zLo3|&ZsYv+kMUhAOW2F%S5o0>Wun1{zjxf(KaOBA^Q*d@i!i%mxNyvd(9TiYcW(4n zp=LQ5ZDS-34J(%5`~30@x7f?~42FIIRm$Zu9m6xih2YP8lCmT;1CfOTc;!6TW zuygvWbfMhi)+%MY{wmQIapVl+nFiKBxyI{ys+u9SfAwzd=xYwWH3w;SPftk=-6wJd zo?lH|7Y=u|M-+REM^_|_CXHL4W$U^qck_6+JX?=pbGa;D$3Rz;Q?s~mpOMJ-8QCAn zl7`pKMla+^XcOCr*$`&FEi`@3)sa%+tnK^}rY+&QMbTZ^_65S@r6JoUheE$^a%fx8 zYM#q4x5ypFovQqmegVTxe{07SrITa2W3v?JQj(yfX2k>l9fUz43V4 zV$`hv{QZ(pn790}uN=aL6$5=7qfG@bvgWyAzP6Puf8S=>T9%A$Q`0ufEnnqOS&}o~J@> zDi6Cc;2r~!tD2fNk$Dk|_yoesL6RzeA>W4WUh*Rp5Y(dFauHEcP>|{YsyI_q3Z9-a zpiXW&QW)~*W!sl8A1l4QP?X^m6^$wk3kjhk{3?Oy!IoeuS(Ae7Ac6&nR zhDJ+EOFKa_SqDvo%_9KQ+JIs|ayNHIx^$e*OHp?$Nm*G%)g*kAiLf1RQYLREP-e%xP~=M5%f>e_-0cL?=2i0km!pNLx{F3vg% zi`Z_-NCBFHFKS77jfBm!y5feq$YeLwjT<)*_3cu4#E6oMN!#GBDW}q)Lc&P;?}G;q8rxioysQhmIecpj zAu2kKp*@~UVe`9mezdF-w@|tj93uv(fZ?Khj}+Rl<)EC2Dhwl{PXEFiic!Wf`_i__ z77u3(-~WIu2!FmpwFV12E{}vWfQc@_usBxR|veL(gz;Q`=@&4g{H7%{JKgx0~*P>!${Sn~9wM9h~trldN@uD%8zX9_Qfy)Ik}I;Rz_XB9g`9sjgDXY@N*{`%E6?|xT!1PLbf{R6A`NS zg^4vzLHlTm`Q413=GxkX&bI&6;1PIJT0E39*ui!@#EV*rT}ra(TCMamH#LPDDtxYd z6E~*<6n*o?Pxpks{aZ4?0hIp7|Bs z5O^uYgSN<_#T*`|>jrd{en-N;Qc$=a9`?D>{x|+;%${*YzEBE^R`yoOwYlS&ukTv# z>bh07WhrfrpZDp+ovGTl&p2|W9gcOUR{A8~-Vt}p;O=Q(A$g6lzbw{4(^?I3X`e2c zkapRP*LcA2x;Ee8 z0ztGI&An+<(Le(eG##-bqKdymcm0rsd(nr{>@%}{``3g&f@)wm@}T|ipPv@F{Pnk z2dZIiBWiPKGOt^|etox-EQq4`$caA}I$}B@OX3YiIh5W+Y&#Dh_xKl6n4Lkr;oeI8 z7zS4st7agQos{YC^S+B(Oy;F5r=h$(MSU&VMMdJMP%v%Z9)xs~i!e&p6LszaaFkKI ze+v~+CN@54l@XBB4ncXW{TdYd?ZncDlAV(=uD;xK`PUh}K8vwi3_91YiJrf3;Soy3 z$R=~=9Djf0gacFgaSADns`ifVenUWYAW*=voF{9i`K!H=(jeOGozx_rkywT zufWR2Hg)$ani6}3g+1|`_Pf3foYez$nieWLDPCsF4G-&lWHvZhedO)Fm2tRG%UbMRzU_k|$zv0OyTd*2^t@WztRtp# z|Mx9QjSEjiT1s3cbQ0SHlG+MNwVmRBuax&tn|=>hEIBQ?`>3?phpqV8onvm>v-w`X z@p!hB^QpMc?(MmV3sp?7xSfyw+TX699hjMLU~axUTq3%s7Y}>o+>>>D*WH zTHe#EI;E;>U$Hy)vx%c!uT<7yqmB5`k-Q)4?f2Q2KV05Xk(5K#nkSkkd8C(>H0fDZ z&Q`tu6sEO>q9SQV33q~5Wt{)sA}ddK{k-QGZ4zrhsISmt4};ZPWiB30Uw#2 zZ)$p0LwR;oOH)ePx(l8eYx~plXBn)d{H#8!JYy-|0gO?J$Ztvoz5tQ&I=bntl48B| zkDn>l6lP|ASyBD`Ol1%Gs9UGHUmVsb*9G3Ec{+8Z+p~5?%9yvrd7U5n*{w*K{N5!4|&K z6)&wg9^TiTduq{tp_p;cJm_oFcNalkI|nLReM9bAY5Plqq(UK;PPeeBp}LjGe273I zyJ3V@(py{&W~2I**y;<&bo%4dIiYR<0d7T9_8kZ5yyoJv(}#~}e?_>b@#>~+_vF$s zWw%v`bMhZNI9Snw-r75q_v2gCZ)g^I#TZ3gn_v4`v!Q)eOjI-_J$<8|-X9~eC}{&v zaRd|Hb*kFhZ0B|t^vTTQ!YB0f*kK^MW_wT_LnauCaPu+{Cj?^P?%}~Z$Nyuf#r)Rw zzh8c~#PNm|^b3xSaxc2`q-SQHfacHE6V9xPZP&IO<)O zfqa;lo~{8SkFaOUU1vkAs3;yBy`g}FPH$83J7xiw?mkm@u+_UK!-9e${u$KpcArA> zX1@oI6$qiJFa2*u{e7oAHu@`c%e*wIyc-k43R&Us`3JnCOJ|lJ9I(^Z)bs-y!@BZa zZ2AXNkHz!i?_U-4hfNtax6QuW<0Ue_NNgR1g3=^7d1QJJ&h+of#`!#2y%bY_tEnU1uZ-1oxqS)}CjK3yw`Rg3){@xj*`SEm4r0;yp1+%-)%1k<3erP=7 zwxF{xAwO*;b<$d0#EO=)WV<6%MEtG^%c$5$#cdTr&82x=?ovuc?7_IBYf0J}20w1b ze>UHY=Xm$~<`d&{pS{yRYkW4o>mNe7=C+Z-n!k<2AGx(Q8_AFOZDx7xDg>B@Na`Tt z;r5u-@47%%{a`3Fy*Om0Yg4xUg#P9i1qT}~_ZECAHhItApmn;GZTcb)Rq9*Uw`wlt zKI#ah5Vaq*Eoq~#xfsywmixtKKaKbvU2_rb9g{sOOEyw+f^_211lB6kY=5$W0s{pZjvP4x!R3`Fw=_;6Vn87U!Y94RZV;{i`%{tO z$%cw=eSLi|Dn#X`2MtkH(f#h;wEmnqgeiQ{yf#6v5$Xm+DG=v1lra30JXuiMfW9dm z*^dAf#KguD{r#QCw8du~Zm29x9uzttB=k%B5j?s+HGEaO!^d%rHd8jXyjT6Fqu8j= zYiaoh1kjAH#9lgjqp#;+j8f;M2EGR8X`dVw>Ky+Jp$#1!UCFDjVC-+^oq{2O z-2(iZyBr1w2jzK~A1Q@}?CEN3Y$WQSL{1ylRoT^t5eq(ER9 z2ckLpd5M{V)J6X4wN)JR>YQr)AR9A(cyPD=E3{NDg~I5#kUDIz3Pp?<HMeN`2x5`eRH$fVDM4`^s^(AlZ{@uTZJJvoGC^3VB+?B zD0(4SzUR6V?YgJCU)i_j7@y$ZzuyBlapD9OwB{s%52H|)Zs7@bb5Z87&@$-byc0Xx zk03~Hkx}6#ZrlWoYVxMeJv??N6M-Yas6s!RK2q5aEhUE}_j?xa8^;zr{~n5iB9ip; zj0_TP>Ce6=cXa>0;OzZ>OelInA4#ekD{yZ^7Cn8VtE{HDO@7`~20ok$Iub+>XRqVg z&_GttrrdEv(gYrbB4by%3k$$2&F7Tdhh(1a7Z6Z@IQ*TkFqhI#p6zR_A^+Gc4U?-o zBrGT2eU=qj{AET_^<4bP>fCWtvTCzy!}bi?>*UZ{gJM13kqwP#YLOh>?obQldRtKv zL0(|;qwL0cw<7ekS0}>zGwPd~h%2I{rw4JpcFR25Kla+-AEiEQj_Lu(J*Kaz4h{{8 z$v;g#)5R?(TB)X?!Q{lWB2CL#PH`7eK1qhF=>exi3w*jU6R1fRf~aUz>~%a=z?Y&!6^H8KQ6V`EODe*0Zw zK7WlnQNn&R4lyM2x%r<9a%RVqM$duatJp>H)B0K1gIT-Pkd*y~9ww9)c#f#+!}(?x zr=l)`5hu_D=RK*YX#6oHFSXGGwIC4*iBocN-d~3PLGB@at)>)rMJgdM^6h7Wa&kln z>ZC31@#^MNM!Wo*4sOeuH45d@U>Z*UT4Ntq>6oPP-)4HSI(NCvZzId)D_4S0l`;zEXkP01f0D{dk%UqEEuLNX=CY3M8&i-yK{4GJxWf8r!1Dd4h>TV&^Tp*-IXbR*x?Ck8e zAHKqf#jE`>kc7fFWO`Wvx`CowEh<=ohVPLj(wUBESVH%m5n3hZ zG&FpmZg;gOBHqyk`YYdxY&jsha~r*D%y&t<=<_%mn&WIl7}4&>QA|(Vf+BhqjLIQY zD(~!;PHd2fO-u}dK#MV=P?GPVgeT%MWfl_`XM)q;^&<~v(irQu*Y7f>TIl9mFr0mO zJQ&h_#&Gm)i45v!^}zo5Vbdc@2*fe^3B7^;6n~^kaZPRSPP|vhg;gPobikbxQU!K! z^EAq)Z=fji^VhGpvC67Y%?9FvZJh^Bf0+E8eLV zBGK5je(>_=WDX>Mga3Z?^5tDTfC+GD5Vzz(_jetDdZgREE%oJvXPeO+?;RXmkAiS| zj~+yP6d<>p1BEJrGzajp7VeG|D1b(spj`O`!wYp58bD#=v2bUF(XuSUA4{cLG+!d`P>GZm_V-4(GWq)qf?0R?XR8G}zcFU=hU05BYhjT|bLc(DplBuf3|@Ds(28mu8v`xyB3i%V3L8ATpB1qDh? zEv;4?Q9m6hbiaiPh%}mdmiCV;%nF zb$@{t$E?xI77?Q2;!4=LOxw0?KuZAgN~jeT6^T*~PH)0bdxVHED@uTGq<(n06{7QS z@^9MPoxRx9U$fw;4*2SZuHx-23vmc%_r=Y+O`jv#QfTch$LYW~x=$SmE zxdLI}r>3SvAZZA>8xHvYKtMzw1^uRA95$W|DP34_hOYN^&}I1f`TtXq5*t>LNrt!k zwMbecot-<-yobKF63R!Y=i~tCL7rvkq2xVvRHJb6E}NQiA89Q>VGOs($ihN}IeU=8 zq34RE1(a|*+W%LT(+&f`hWJtrRr^%F7vk_72^P;V&k@&KYCf@#z2*r`4! zf5YWKglaQB4ULgU_&HtRXEDcs7H_@1?k09kN_KWQ`ivx_0G^ht1P%|=jvXNom&&nF z+{D132z@TSZS`P_eS|>vQI6z=SC4XX7_r-KL)HbSc>^K}2sE*ivOG)soudbmQh~dv#z{i*0Xb7|yj%eEj4dnz@Hr>2k3sDU3JFob;GtB$ zp!U{Qc`!X9A3O*HysG;9cMg;|e}745fibT+T8s-tpsInPLc|^8$N=T^4ls;(cNv7g z5F331K=dTE+!5|PfhTuxaykJZBJb`}>%O&(u^yg4R$xfL1cEN4SC|L42N6EeSqBa_ z-Z-0od~|lOX&dR`Zmk6dQwb3eY0bbXlj{ix(4m%Dg;))Ymg*T=925m0{Q#?~Zv4sH z4x0xxXclDUHIO-*z|;(wZ^D{FMA^-Lm3d_qt+UbN>IoNso+IXoAZCr;b-|-?ku6gCr}m^nl`+<^l~BRjYWS z=#2LFGYZt!b z7^>X@Kq~)wCSoy|fdT3pWL~ke;{gWt4)j1+9nKDcv~0m?Yqi%IBMe&D02URlLeC1{ zh6ZV1NL>JZ?z@PHMiAd90YVMBULde5{F&ebR+kB`2pFtL!F?MFJv9~X3b2AKEG`0^ z@-@VLFsE)QDJiWw?Mr39HX|1;bqIv&M+WB>o5Sz88inJA@@zqLX6*ZoGo{?C)p>Q! z7|{-TILjqHLyuY>{f&;2MA`V(4yb=?%}c?`TT}0ift8$-(<5i`NNKS2JE$a(A{z`9 z!Qa^#Htr}OxenjNAKZQAd$Q@~b;4_{eZZ?Ab^*4a-QKMq*MgHunL zAUIDgD~sK8`)R|3b02xf!LZKW-XNG9Ma9J~5+DD0Ap7ccC{EVjrJu?X#AjwW_W_K2 z9W;BFAT0*isqEpt>wjMo40)x=^_<9`j{+pXfdR^8q-zhdm%~?=1}pW}!9gp;UJy*R zP5L93fn3SZ(;j%zDH)KOz2Q`f6kxMc+2y1m8US$CD@c=H0#_esH!}=sB_Z3~a{0xV z8m4Y7IE^3&lHTy>!r*_dF!-o9^`8q!&G3pYGNfeq=Yt`SLw=oHdz$y}rT+8gN2Yy- zl>h$lpI7Vr_Y?ekaqO!xxBb-q^L*qXgM5DfzS+MI$uPhnR{!Vq|NU<*5iR;Z&;R>& zo;24r|L1r4zvV)_FktG#(rz2_&sfRG{XcT|Xr%FGFDn1@jZwj&`xcC1Jw1kZ_k;C^ zr15+Xmm~hi(1wjo7V7DcG*15fIS_^#*k&dZ0#-tw4r=5g78%XnFV`#?bL*k@nZlgq zZP}P(mvzRsNCBsHB|kOc-5&X-CoOfEDU`aE6$PuO&mJ=IHfIfLOc-}v=<-cSVJM|W z+5Q?*a=zni8}cp7j;~8Fu@yZHppb;yVjuP%FkCgd-^tQ-b8lV$Q&j^KhF2XptUlcR z0M$;JkTD*9@XHS8<9dU0NJ;0DaMn*taQjfN2)t8s^cZz$YwyVK@C@u~kbmx8K&Jmq z|5fi>T-3_fwcE*Dbzd>QF!OQsPNt6q``@)K`&q}6Qv#JwJJ-5r*4xt?n}t zB2lYuJ&%KrhW@(*gzo=4V2|jkRfPWwCIZ!z@R4nv&cY`13B6O+)3?2f^7n|21qyzL zk$t2g>>P-WbvC)gE31Fc-BFx81JfHWRFuh+(T|s;;Z~T>q4HJ$*nOF9NO7!Ad;e!L zXBbEuKf2WQD6W1pjj43i;GuRO@uEa)%@xB3C*qa9jwza|U7RZKH84;wGsZF4y{6?K z#~N=pHn*{N85Tn_F|6k8R_`qOni{s+t+`^w+Q85TBBHA6q~M31;QU%O?Pk)JB*V;2 z`6BC7XqoNq3EqF#2v7XGsh7S|nVp%z-NJipj!TZJJ4^E_Hpr?-z4^;>Mew1*r?`o$ zgCckj2~D!6sXeit*$=$CCKf$KUl-itm%m@XmGNHMPHaA4J z=(7?Es;=dBXOoqBzIIouCFo^;yktYuHuHX$_2+su75PnhZ`eG$gc1qQ1Wvntvpa4O zA8V=%dSNT%{oN}Ey@sXU8&1weVoNJa8)|lvvXILl6aQ`E+cHKEhK`+%`$->rvT;!E zZAad0Nr}wDtQS{tqz z3B@K|Z-upldh7-J#Bn(|8_$6x0`WPb`tB6sy9%%3Qw9{U=&8N#4s9-c+)Elm8Km7& zjMPPAMflH_mU+y)zA=W)F$t`h?R9Vc8c;#qn*Quz2UW+{!`@#jIrP8O@*eB-QeeEs zke^&BNz1S8^)!VNu$!#4wzZkX$Z{1|pGH0?cyYg%$ z1?=ImD<9m2-XB)-ZIXsx@Ez^a#CsS3FYK2R&C<2{QB6$ict;;Bs?5q=hdR@TO!$2kb+{5|`Bj1ePH{5rNW0@SHwqyetCiNrrA;}HY zySSL(tH)e#3xlf&`jakdqEWphNemft|vRsmsy#+2{tFRu=N^Jlw%R(FW7rkB?&CE0+X?&2h+nS4Chd zPPkc20@sh9O@=M6PaI0bL{`ymJrUA9;H24}|fCa^+(q>7-zSwHjNP~ z&$k?vge^zY5-S)f7SeH#8LaF_1wMVcT=`+NwBcGPEO0={(QMwRAz0ZWI=F2Su^Ph!B$&2H{N9$H0^iS z%dpEg%e{KDGt>AsQH&ow#IIhi3E%C~R1)Fl!PEpNa-qb-bexkVoD+sa#skfx6nXgU zwWEJTcUkQ*x~ltPo)dD^XLj%wmGcG~G;vO=DM!e1b#j@wF8|Op%@1~9Ilc578~sQ} zU@hpF@g8h)j@awQ9TbZcWP&__`1%(^g7fEppQm?q!GmR6UQB>Nh=F^vf*#hY8FiMM zth9ogT}|`;trMKd?xWw4$@%s8vmBp=l$lqPjc4tw+#uzWw05|bhv4&{C1m&ZLcyLo zr@OL|dDC_rYK3D@OY6ZsU#3R1;imE-7dxv#xzW(EKlJPPh#S+`(6b)3x*^{|ML$Oe|&5`MN6ED3JsD z9P7Ny$VlVPLY~o`=Y-^C?-xeL$mlAq?l279oZv*=@_ZnPd|NUsLC!9%s9Uvxk|m?h zXS?e-)&&RA>VjPrB7__+9Ox1Sp^tMJCrZP=RTvBi)r-YP!}q?&e{;c^;GT4@cL1-o z&A{}vMvr2(q7S_dkvb|hzyAPCnqyc}pAgnU^ovN`ihD(jKE>*mpK#KxdPbS~IY?1` zTBU-H`x9Exht=YvgeXhy5yP5xca-;t7+=>xVlP3HT)*OA9cPGI?63=MDFHjlV0V>Z zgplrq#oJ$HJV<68jx4!7$|5;PXqo(BOc#s=ehM_&um0|w_$yxR?ar==N$DHv(Rc|J zw!Pkni|ACNyMM#<3@;9)uXr-2^q3&yYP*FaLATcw`ACJoeE!MH;dLTZ*#!q|ED4+f zvv}#>&A+@KV&!o?rIM3-*q7Q* zMu(BR_ztRTb@|1tOEkTRg?>;q^ELSNyDG#8*%}`elw<|NXc%rbvRog|d;awG+nWqp z>nP?K6;z-B&D*AlJIF<}4!`YM>*nle@TVhB*MC?0z|C*NyrS{ATI2~c79AE{*ZMW8 zw6RcM;0FLQh5xk0`KPe-c#U{gTszpR9)8=CK{~%-uU(6PRr|_tl3p zvUYkLv(yMZqIq?cv%C3K2>KQ!3YKhspG+8*qXtE-ajll=IGKu5Yvyn#Nuz=_7u(C* zR~&LQKEbnb1t0k*)Zz7#RoP!e!TM_G*-yXR*!z%JHRaErA_?;l!da>^wOX|K>)yU& zX&e1y0@RC#FAzE1#H*V6?938Y7TLaKcc!mNgpo`Kg*H76J4IKf(yM3H&nWy!Ln|fE zLk$0(7Gk+wo8HF#c%E?k-^=ROcDzTrD}EC7Zg6ENW=SzdR&m)Gx%Kl^Q3FA1gpqTF#t93f&u z#ewAhWGe@H5{b7{%Wm)?Fi;rvze|^mTsp#I&O*6hW9ZTELGI8mi+)0sE!Wb;_?(++ zv>DRBon}*ULu@anU&>%}6xrvc7pHfI+tX`(H`i87WNyOh*D zJ-UGEdbe`5LB3c2i9}C7Z8T4sct*Mr@A@t)K7PKQPYI}qpxi<}^|;(~C?pCQ7bw*l z&v7ood@LD7>@_y%L7o`q^)_3g#26Gjhhf{TiTZBLT&y8M+a%k^1JhdLr>DQ1AgqQF z6j~ZFJ@;yo3|*`p0>>lLn;aA%@)TUp>@>;4eLK!%KCBU&TL+O?-as^ys9f6v@5DgH zKk+9sYd=F+9c7W&L5a9Y*hqP(MOxVE{sX)KRzOm%yyS}Yqo1zaI@!0ph&O-d>SRIdns=m z>C}H))DEHdczR2ig=)D01H>9alVCn`rA?7lvzUwqYhK?e)MBa_3Z zS#*dgNIQQ)RO+WgbWd-nLf+-UGw=k)HHd3~65{IZ>V@rhx4+x6pU@ulsSVtT)8-MBer)2;Uwe|E zOkd8c4zd2A{ERge>~NdzE)(<9qWZWg!NeDCz`q7jEp^{>)Mux}w~uZn#J<4v{qAHg zSkLqfGXj$ZZh#R_Q2kIB<^0$ilReQc?vAGXJ`=Q+=isG?yHzP=a7Go~T_S3krVeX4 zrfr1KdE(Cm>F*oiLyvyy^gKR0=ham%5=8kcJ53wcFOEbS0?!XL{7RB!O?gs50*(9W zua7PSkZ6H6#HwgK8MJSt(F6j(RbHc~n=t0r?be;OSPI^E7%wal+uA`{N)+;w^Oovr zO1L`=zT~goeTgho>#IdF`5DwA#+)RhW)xN)XCKvv&W2LMqocRCQxKeWFj4!}qpfla+@2Gl&~cH`w8$E4Dah&UOR>hqdx?#HGAtG0Cgt?9 zKfCM}wl_$E4Q(`|*8=F^Vm!%|3{p|3p!M@A?>qb^d9k~aNT%2-N)y`v+<2L;+dQi)y|3&O`zmLCL(d3X7`${ za zF74EH7IQ&_PR|Rz`xl-!*V+rG8j)QOo6GLhnR+**g7rwCSIzxTw3K!a!KKirLYTnx zs)u)+6&S^0A(z(lX$kwzlz+vLu<%rnB9g+evoP3$vy*E+WkBX<-lWe^bk=s?4;CCD zrl!H^*VTS~gNkMnH(BGNo>oP_;1Q?aBSrL$#ZA!;?aT#T4M5m7TmXN>CgqctD7tiu?uq>CR zPbSQc+3p1qL=MSIT;Z=lZjhpv;3)4Q{is2s_8@X0($;0mbb+_4IqP-qmh6F)_YUJj z2emb6g%mW^D0e+~JRB?jm4Au9bj6c!kT8?ltf?}QC>^kQ#9EzvNpV=aQYbOh#aBW2 zV_uIdgL{I<>}bW@Nz~HQHYIhN-fvd2^HXhZ5Ni@tx~;cBl}-NL<2!fIyYG*LzWtk( z9IREdZ@N>>r2jAx5_x0ammo#Y7`=WF=b%t< zc&eHeHU6v6F{41$9alSjl8MUfO!dLubuv_Dei33%7DLlofhx9WBe~`of=v9)+gW4T z{NqoBv)(|S>|PPA4@bghL$}`b(Q!AMC>ac=u?-}eM0Bj)W>~Q--Wx_6Xh)FMt^k56 z>-m$l_p!rYf5vlO`D9CyJ$moj_k-Q^Wojo6`W#sU*++Kg6;G!;;(wEg1Wwm6347&X z<~1m@^i<`v4Z+xqU-b$e;!>cujg-%0jHB&XnD`y_jPsc>Fy+)gyzwC}QsdmwUyNSZ z30&}0cxu6}|5^21Iqk^v&=ZgSLf$Ykt8`rs1ll|7fbYP@KIQ(&;RJBRDqr z74Kbpdq+LUW3_PW2tr+}ca5q=bsE{D|}d3Rk;2UNrj|$J-FT0L|W$P zU~2W{a_%`qqE`VbODSi$3IyCR*_n)MdgH?W^?mM84}Dd&|fa5K&+)NhqDv{CJS zgk{lLSRK2sG~)|yEt@3F9`#WIvgnLQ>h$BVMF)@Z zD?T#_j5VqB=4NF;5nMIGQT~c=G~iPMQ_m#pcS||(#;7NKB#TtJQkO(;#1>B#-_{te z7*#q>8yz#@y6O~9l;(O**_=h@cix?C{ztslIXrfTVVzJi*)4sNLvQI}xnvWG%Stc7 zkW%`Pyq;OfkzWM8uHpkM8;mGr`$4ombz?aB9@b}t2hUy)(%TK@&YwwYMuGp8=ZFK!cDB%K2$6i$*P9w7 zf=R5351=HZckZga^a7?LRQPKZZkIfdv)cISrp7@Lt(V-?i#)S7@7}YDvdTCdtYe%JBpz-$r1#1NPC=xGB z)>qEje#ba++Y^B7G@tBnF9HlK&5-+)9@*YJmo(GsmJr@~#75cp)bqN{;}};xO${}zU%&e({IM8#a>uD4r5Q=YvrbBruA#hUv^WxyrkMST-NsF z{a^?LMDHR=e-eygSB5w~bxLRGsWm0h3+*+-HTd{U$RzvWwZTkhchq5IXHx!-hKd$1 zce}XQw9Jk~qX?tOhWtk<-;ZeblZd^i_GQF29Hi>!Dz8lMCV3=|D02|*JXC(ib!>f+ z3tQ^xk>FR(jMO9}DP%9BBG+fOkfU(?zA@KrO|^YvE=y4Ah28YQQt@GuSiV{D=<*%4 z&B`Zvvb59A2J&T+7{rbu-tGA0WfL#zziG%q{u)w|tKY7CCs$XvO}rZ1@0OsppRij# zBgoa35S`Q_Rysy+-AIRd!tzm~EBvTfl?Lfr)e7~s_ep1aynRrJ2E~(MaWpiOiO2Q& z1U6h~`h~@%o>w_|ngLZ+qlLEjNQ*B}&jo?c8PP5QaiTtwLq*dHRNx^X$I0*bTbVoB zyg+i&#+7qQEVONl|Ey5@!;pv!tUrj=>NM~~3lhuewe@f;?E9^0KAd2=y~QYmEu<-2 zgdR3lZ1n!F4_zYZDy-@{U-Kb4;+uo(b%T_6gfo=u0Vx`R#y}OVqM7x?X%C5CWhaZ` zmwAQwJ>0CKc>3QSlq!a6_{xR|;f67Z@ z%EP7A3KOQZ{0cwDY1)a4M6GmqZFUUZ!R{rlWBaLt%o-;3-#NaMcf}AVSyyT>-DMuj z(k4h?xsdbQN_{b&Smym&aK_gBX?lckLpI1&#Vfm`R~uze<6aMD(k$`v=HTF9XazcJ z!Q-WoN3dwH_2Nap6yCHYNQ(e0)dYBsnfZA?MA-y46%?pLH`V{Ck2wtuWZPyI~S>GJB3vT?c0pU1QHLAawAHNV|P zjC%B|Zg_SB^Q6}$@gN`zOvE`pi&?nA_gy7NQ#JJQjea*7xksbSuf_ZeA%?2jeK6La zrbIIAIGB5PwKUavR2u*x&=iXZH0L0eVdmw1J01x}5+5*w=0}6rPg+Okqef2F@ovpw zW`BX{Lx8m5A#Bjn)gU0prh(dRWi+4L=L?j;p$V%kcrfTi>kUD6 zn*REbzJ6i#na&rUEZ$0XIyegEy{Lq3su5j7118~9@6U*A(gFhEP3E0B(fAD0;Ff%$oH5JIH&c;xbh#p!ViV) z&G8rH+8)(G4o4d|AX3;%v)hayM=|;=EFxr>_0Z$Ts?1EMn8f=4)qV( z{IUDUaCvb~to(PqB<}2B%j*xJSf~PmLQSj727b=QMEO#zXHT-RZfROj>wl`5gH5@< z%XQUM#23YUMG6~iu~qi+;3LT{))8C_A6Kkp)X(D-6eI_=%sucGZ9{80X%M=A93Ro^ zO?i}i^J)wyr+b{PYg1fLp2OY%0+HZ;*!U077V+lFmkk=!tPX5<{M={D0K(l>9^Cet2+4gpn-hJ_m{`8 zTh)C}rDvP3GXoQdp9%OE*K{~hLRBQM!#Bb=|Mzz@v&nJ=t%5xOVP7AeM7`M;lJ2#a z5Ln;8K3txglkwIlJ8;|g!rX)qR7cRewZQ1)DE+*3;mC$yv?=Z+=d0O(Tttt?UHa#g zY)CdqB@7SRhY{J*XZq?1%ywUJFJR#^3x_;@G7N|0BS$7x=CT)AgCOkzPm z*%+*{t0J(n!#ri##@F6D7Zfsk@LqxgC6aeiygLBrr!2Mwr~!^{J;BOSc%O%-V)NMa z#idknvdRVd_qtIYQnpyF6Gqu~AMDV*S2}D0Up?sQ$3?CE8Oh&a4E!8uyfE}0Ev)PD zQMF4x&LBL@gKs~7)gCHpYwmp4$42mQ+=vamzSWFXfBfo&!>9S_>(|%db2A3Q&Z}3i zZh^21)K+=WYZaKbapQl!fVH6s^m29!ZDjB_w4e`W=UEJkQUDQ{q9SR;^%KxIi#n`Q z^dw4f3B7g!4LNwe-o1NQmyL-^Pfwo#cm^V<78e&MC96L*?*#q%>*Qo+5K@9RiWQVq z$Sbn5qgc+tA6~s#WDCoZ2MH(QsRuFWJcKFi+zY)MWEU?6mfCchaR3c0=*t&2MDPvG z!DTLopR#U%9|l}ME#R%+f?09t>eaw;q=g_jQ>9&9Zvqbx+O8q3J|}8C=d&@7y^cHpB(Q81T{HayRrz1sPYLxgu2qEODH?oj&{RkxE4JqLQ|#g6T-n}2iTq(N9u*Q46p9w~Mm2Cn zM0(q@So8bbSRi?*xmbG>LJw|Xy)I6j<=XQSJ^OVx&m53v!;6$rIfZ>4Q66sC$?4P@ z|HBUDve4%$WY6!nKlEwlAdJV8z<`MOr+W=~tpqO}G3%vE{$HS1ATG_2ptRG;MwhFj zoiO)fE#s*Z7tPID#uMKC#wjYw8$AoAivpj>#bUOk9>^$R5h{!_NJ0If?}sK^Y{kda z&48K}&(C7C>z4jd9V;B$dpd~4@RD-}GnIDvOL*0V=vW@3;_rtqSu2u$yoE|xUcb|o z(6@B?)}n*TIRTVQ(=lu1`DP}=M}LlY$)M8x>(5Kww`D|dps3PS4aX>fEK>eevo@~w zM#$d&#q)}fk?B2lY(7RG$X8zJ6sqK7U6K81yXIr`PX;HFAb=Q%~=tI-HQrv^AB^gJcDrkn@GvFOVc zQUXH4l+4VI%l0DIuQ!439&AX>p_f4_+YEMye4A-W;E7Ryw)b63Opu~xw5`obUkak4 zjS%4k!6hiz5$`0-m=7ml@djop9Tl&xw<5bggdgPW70~o~btFcTs}tUBd*_PSB_b5U zM}fY8AVBW}yV>(mMY7@z=z0JKnRZ%6fHMVyj&>GEYv6)4)t3PSP(C;;u3M@Lur~gq zTzrd9ezmT=b;R`gCc$@P~(2?0a(vSBQG@P1T}mEIDNG?WkG2SSPY!c zty*BN1$Ln?EK#6GMJ&b8=AK&AmRUVVw|$K5uO^TIBemV z|9gcQmuDB-6SicSRcIFHBcWeLiiO;-T_9M1Kv>X0yFh`>3KfbV{A4pwvocvG^2GGXHs>DY zqgu%~V3}EXvM?hs>NmvtQ~D5FzDj_My|#{K((!uSGa(t+PxzGek%|}SFP>^uUV%bQ zW|a!x*T_g|n;1qYu_1*TpBxkf-G}z~zrQ2hjaYJyIwAlkXaFR-HfQxk@=O! zz41xyx}sKq!~kH${URJFAhp8Y`j=F(;#_1*-StayGF7N+fs(;~fwGu6HY$B@+X5`U@tg1{Bp@*{sNBV=0 z5iPEpSmannUf&Xh=5K-XRsD{3`&tPu~EU{2Z`jc{PT-FYZ+8?e58|5 z(h#yh)#cj%^D0uNdaCKPp9vqF{p6zZdwH_R6S8Izdmtr zYMI0md9Z{o&%T5=2uWkiR_uZ?)d061bfI=oc?;!8a;h>}eC~}#uCWk~<2V44&qA4P z%8BeCzv*)CV`;q4lOI|pwlac&{Lv#8FYDwN?9GfCjnBVrsN5`Y2!aO-j$IQ>2;K5T zpDCF>)`rZ#y7VqxqfMUcY2c@Tl#z1%Dt%*PM41BG3->uLGgV?*rlvRvJA*ArZqK&! zJ#s3Ks~G_s&_t*I;KUxR8cMplT}KjE_oC&%M+usHf7sd^o13wrr*RYDmO0nkcdH*I zNg_tjdT167?3%5;y#Q#|rHS{2U_Kd+&1}1?z;0=9)b6&iZSK<&>Hdqh9|JMW$%L6VoV!Qx^F*S6YhQ>B<@;Cat z4$dqx3W{?gA|l8Y`S|!C2B5Ak&Qm27M0f0U+mDub3#pS_r>l!>Hg9bNp&|$`^D)&X z_bMCV@J0po=SkOGBmJiuUl>p`_qvD?=*-vBFUF9bYcg+51CbYfp;QaBGxGLS@BsFP zkJd@SStA4;MjI#Pu^u+UZ)DS;M z6idTcbKe@Su7B0svBf9PxRzxT==S!&nJP$1TAMF37aOYvF=K#S&ZK7BU0t6o2f9hj zbo6mmvD} zKb%4kCK7eaM%|^2X3pW9M`BR#diOi&@>Qtd&hiA!55Lku-{MIp3X12AeG3$l`x3&& zdaDlg60L6675DgdC1O)Jii2T#iOg_!4e)^het_JQ_K*av* zK+SW-#i)bW8u32@vVAQ0;g#+~JXg(`22D@B&!E9k`YkLbO&?KeZe zdqXR$H;5;8+zZfFgkUg4`j2yf3I3~kZzeRYMo6HQN)6T&MHeT!rm;uOv7c2$f_%G1KnoCq;xcRaUa6}(U zz#Qc0=y(WJc0f6Lzh~vDSd)ar3H)Cj#2Nx-UDT*LNQ)u!xU9T91^T|o>qz6>3uAoK z)N}`+K}_IMg6Rp!^b24nXe&xX!hWxQsi8tSWsr+)v`pSzSiZjywQ&2+9mQ}JY5VM@ zmG2o}2Ai66Kc!PhZcA>xIWWCoKBAh54<(5_ON-WpldoNn64{!^<_>qt(UgEqBn-TSZHPImD zke%Ss)fx&hp)v?~s~4NW@4)5OUl z$oyc}XK&|7iLhq-^{jt6>vtKV=e$14F=eW{@bj5w8lv<}sl4sIqbF;b_5=@H6ZUD5NB+KYA+^6? zv+Dd!hQ8^%+QAv3k=>@{t<#w|WnBgMb%PXxi0tf$X5Yk2EJ`(@mz3q4`IIWrmtoc6 zJ5r6oYaes*<%ynjtB*YRqVj2a8v6=%8J!bV?}emU`+D;yRHkX5wH;Ld`Udh?h=@|H zChV|fS4ESv$?t$<3$!o0HESb%us3h0ogb+GNL-L3;=kj7S}tQ#Zo59r$$o-Fp=t0X4Zq;)iBB|rw+{Q$XUAR8S6>syrt)5%|+;> zgV=LnbCw0C+Xu&Yc;a|x%Uj-5!hO!6cqjd z6ElRy8L@z~W+p>}$By>uBkr{pK4FJd)pOX`vv8Kl&?%iu3OICrOD%v2Q9ULK?5xZ{ ztD2gcs`8!(P?#+MU;Y528=R)C!IWIKK&C(f3UD!lTgy}AEs`@m<*k+e$L(|4nR8Ds zU|Lq{I{F(avE}tU^Koxn3d4K_xz+X68GqOhxKw9lc(DN=GIzS*FyvK4A|0*zW#x!; zp!NKv4(zsGez=q$4lD*ORUsgx>wrEk#1FP9?UIFQts}8l1_$6iGy=Z4c2jj!K_S;? z9~=||!w;oB@PY0G64ija3~bA{z)tDaQZOR}*`3GX$9Spnn1bpHBIdB$DB>*KF zS;>L)Qs0=C8p2EE#AG~I*=nGotxbSnDlOmX{`%EXVYRxtItPe)&0-5m#MXzzMd0#w z-cFr+81!Fr)Y0Y&WZ1a2?%e9zd!q5{<_Mt&->aXvzGZSaightj)R zpE4>{UES}ZCOME5ePU*o3P$q@PWMw?0c#!QmoKja2u4e0qzqE$aF`=wGKh|t-Ms2) z4dYq{@~fYC0W^H&!HK$gPdv0_BHQ1X3_*^ggM$>n2mpUOPU(-wDq!&gb7oyn&)b8W zO(6gS9nc388Z>u6WKv0S!SP+i@f7w)M?FaO9L{`BxW`s&mDmd6Tt9TxVSnAwWrR!Vjsya`>S8 zYd~&QB24G{(NSt>DACs4y{L{vjsN^Q!vJY&BKom7x@0l)}`nDkKEK+*~D z?z2D!x9aInlO-v#961lHjV1`JW8LMFq`X=H0dU%{f1kbg+fcTS$l=kEF?2oYnui+6 zEQGs=Dcvc;!V+Biat|LONl8c~!abe?EMA#Ihy>3{?{)V>+l;I%6NpC2oHiK+DRu$- zgzz(fDPLct2OV4VtDNf>s)E6J3dwT-Tw!H={VK5jw}Od`vy8K7Yn(}2hZQyV4+q$Y zFiEeq5&_ETKXQJZ{`~=Hia;6G+J9@vt4Zo2TH0mmGXzqIFBx(qc_k%*KpzJB5Fr>W zp|P8Sh4oi3g+up8a=0R3dE7t%6ktgIb9%gq5GqPvNEF&+!__pgIf7*No_673CGW5l;@ z)EHR1SoS}LL#;5_6sQNU-x|TuGx}r`V5Z%joRU#*b?+o8f<^7kz|n0aUwZ$tG(r|s zLkRB9r+;opLY5V<{An;2l+E#>dc_X3`7l`VQ{eUCaMuji`K`>(1cq=b5F*k0P>Oaw zIT8Y3gp16);^`lNy@C%JPft$|J~hAKl-eSgtNZ%;3?*cx@!;f@^668+RfRbIMZgFs zs;NcM-f@Gc!?WHcBoM_%;DB8 z6eNPYcl7nag>S^r3!In3<6~A14rrf5@N_hf1u%}Ea4sW8$JI^5>JDz(IL_aege?9v zOT4E#FQ5sHqOx)W%w~WFkpS8X#$gH!rFdB+)eOJ>JvE<7>}%j;c?!21LbHYJvY~&b z=(PWT<-c0}zG`PH{I~u-=|AH*{J+}Ae;)t;VMA>JUbv8P6P|9Rqk_eb!~gvB)#*(G zO0=?uMiAJeVTmjIUoEX?K3;17FJtW4z5i$}|F`e=|HJmWM+mB;TVM$)jXesW#1DA~ zN(P=&7X0t{>=!QD{dJG7O5F`4l`aeTcg4bnV+<+WQ4I}T6gW)X9a#Kt{n>r+r*z>G zD=Bq^t$I=$i4Ip^vz#9o94K1aTYRX&Uajyq30>+VdeG4Z(4mTePDoy`72f{(Ce9V zCsTA#8fyT3efVzphZk0qR+?)%CZHM06DcycYIJ}Ol)AxXP3UpDF_X`RSF;pMA>k9a zD`aj~4cR=XZhssK{2PtP0R@4bm)Go!@z{$*T>?({ur>Js9<($#GZ32f_`}SF-3ZDx z6BfudlZk=fP=~jqXDzlB1G!$E-8FgkRN-m);D@Z$Hex6A5mE8_2Qxi{c5Suql@_YJe zGFS&2rMXy10NQ_nH3*HG#@lUJSXmn_*t+vITKSLl@7h{OALEY>SyE*Y|4o-h)!fkB z1Ajk~GS(@1?gK2f(zq*pd?Zk|S-$wN7|>g_SDb$>w38zwS4i^$;ABBvWhf5-E(jTF zwjltJGz;opF%S|Uj0+Hl>tsE+ZoYY=B0DR{a>+#iUk~@YH|1 zZ`Ff=la!2Xtz6ag-ZIT$;}VJWwp542AOqOFKm{QSp&gmzRp<_Fcyn)yt0Z8=@Zyzg&X^neCSCEjR)FHN3=+ ziPl3+9Zvf1mEQS)xl?p!6;IO4>s*JQVGNFeFE}fErVi^lQO+yBNcDbIqar3C^Dn1h98$>=(#DBN*I8=qmz1gV`u(rLeK&^%|gisrJh~D^t~C zFdVMJ@%ZIR9|nV%2StA`mDlisS&a9RlM3=vQYv8!UrJVhY-w;vhX`A^Zk2 zwE23--{EGZewbs3of-F3xE@rz2$!^nSUd=9Hs5ZgVOV~IG9n9T5!Ln|e{^uV*iYCG z-7K9D$;%vW2nNb^)pd(z(GT>sbzk3*12EALZ612seKdb72@B}X_uvGJ^1e%Qan@nX zvS-R0oUWl|*L?9+c?9%)-@RthG^)XbUYFkBW*Ma!GxBN2gr1R&a=TF|?}>0-QP-Q7 zK&??ID-6RqO$^E0Ayy{UE7;Lj_IeB={Q+P4R{XRtUU#Dc|&iXo=fGgd@B0mY7_Vd&hP0h_BRY*k2=BKzne z;Cu>tC=Cn@=%qaALH2YT&}V=;@`LoBoyb3_fdG&yL#3wyU79&b;4_aY@THTU=&3O3 zcJNLCk%nQAZIF{G(ckRH=K zcIGL?kCxO8KK$v7s{6e0F|XhF3b@G1yHO|*^J*HGoYQf8j*WUkX=((utqC)3KW!pR zI7F!tC8JP(XnwPS`4Dv8N?F=3q*+z812&?%BM57g47zf;Pp2%$7P0Y9-@`p?swP z`kGyDCd9Cyqx{eexy7u6^q;BE)yFkBa?2Fny-Pr>HzrVdG`m6ng1Y`e{lsUKH%PS) zTaJB`FOe!Ua~m>(YLuI_aqs53kR$H88Dpbh2l@BAQOiGr+h4suqMg4sp9jVWC?&RT zBu~ETd1YqB#z{HrIpKlW-=Wj=JS@ix7ndRV9Ro=NK_VL%I@d=mdaN1-pa@GnB#4Qs zl6QIS8;<#zmqiQ%lu0NQ7>xz=_!GWn1wWLfGCNEOosks0VlM30xacTYE<)R@|zOXASY)6)!D8}xd5!WZMa4VRXx*e_DDei6mR zHDGKCWTUfXJ;JG>a5q|Qt{&msg&xKOC6QZRI$&6U{<(fG)^2_WmsTHAl+wuT>;~>E z>{a?Xnn1#JBCPUkXodxDxLQhoyc$S0kkm7j(-D*yWVAi)eb*s!Vv&+M%eu`A-K3G6 zFv979l>))F0kvMA1RcX?0MuwwnLr{RIBz1e0Tg`*od=TYP&W$%(#U|Mm>3;M_W%{c zU}#~{F&1ee`RGQucWi9%O7U>RF#V#gxS}h_MxCBNnX*yvhus@P#%OM z#T@i)QB>uw42g-0BM=i4BckRq0_W<49y2nO-YqJ_LSdq;kBpZEE@?f80^zUNHlRAxGTCgEa(7Am_D!QmQ7*EFjJ)+wi9$QRbJhd6K&-6^CZeHPwd5S~hmzi?aEWP@ z*Bieetc}`Q64a|iTD^6xQy@2_fZ-OfvIQNbxYn(5(*;HzR1CZgJ$-N03@AZl2~Y}B z_Qw@`8&=qldNO5LqQ%rOlJE2f@9;vTKdmDVK76%YN8Bt;!W3@W-Bx zFO*Z|Y}k?Q%!h8@`iv!@05a0Z)l=Smj!{=L(<#pic8mwXz(Sf_ixF*IT;t_7a)bU=qQwuN^0M(?&Hr?3@F5p1&)>1JV*rXZrPIw zaR`z_g1+AVP+dw*`|gzO83>pkpb_Ij%glN>ctPM1%4bkh2gPV)!sXiBEs#YyZ_i;v zVm!32?iMsryMR=R6xr{vPY84Mu0OTbosmISOP5V)`+o#c}s86L_c#R!?TMhJ?K z7lmmEO~tT&{7_rgM*z$q`m}>ivq&F!$gbaosRU?1XiuVECxAu= zcxI+iF3!#~a40@JIhfA39N`5u7}CyS6k6IK?Y|Ia7397UR2R^G0Fo&1tpDjC^v*UWkYIUm3Ho>kSbtY=QRq(b0nb0GXcdmzUSgk1^B6}#U%rceXIg$Z&Oz-xIhFWmoV4u8@^XMkIP zkx|s^R2-&Nz_iy{f*Ris7}Ll&2kxrf{!guVQM3RdOJ#)*y$Ft?^&5}eNf1oYU6H4GLTlPFH`@-_PXLRP^ zOD(Ga+xu|})XZQDe!(?Lsrhv5E6O{{ni9z%zmn!!S4Vk|=a*^;))7No$>=9;Yk#Pq zYg^`ReKZ+c0acf>-{k^pU_j~1tv_Yr0s#l&KLsP{IaLS+TU_6m5;t3b{C8M8I{>-@ zaN#*!StWQ|WqcO>{_>?u;-Ox62#P>}r*n2tDQNPe$63fp8)t_!n6>hzTqQ1kL;KEI(!fbiw~mxI60Bam9N1(DW7V?B^|az*{s;&kX$XJ9O*9C~x2?QG^7S zD^Sa5M`CAPcyVD%{Kt(_T9hrv+=VSa8I&NQpdEku&wGoY?y|F4kU)dT1Nzk4S=4dB zfh!H9n$`8D5(`Z^cl7JwT;{WrsAv??u;m8J84%Ck?ui9{F-b(4x4n0i~?JxPSJ75H-rZVK4-VrMRP^s?H$ zI09o9nK(Q`hdxeW?1vxDC30dG1OlAFv!DS8Me2DIQ8ueQCLu6e>8>u=Z~qZ`KN~D|vp2 z5hL0$S5e_Q{-&jPBLXmp)M|!Ol*UFoaQNA-YO#vz|+rnJ%D$y80P4QkM%^~pvi4s zM?rQ+CjvMZ5c_95H5)z~z%c^(g0L8(cLazZbswZrH`@H_e_5InA7AgCx1p~^9=yG*}` zewp)(&_68dbeFgS^jBfmA|4| zeh4;Fa;CDCuw*FIfhHq)zW!KO8e|sVEt!Cd0}~fF)hKgg_%p=hp4;fIbjH3l&2?@+ z_;1!nl%;(AtEt3h8fljwl?Fr7!jIcLeiy?@PmeHQRKusIJ}-V6^XK+ruSR@V9<8IJ zBMcGn_>6qsIyXbXTtaUt5JoA9gamy{2!m!KHj^&^S0PM($ExjehxY%0o^BN8Yh|CI zD5*`ldO~%U@N>*wxBrKMt_4f-ONSvuAGSVp%?ik8|2_VyC-aP#KY`6N(Og$uX*(IT zW-r`PU;SRbN$+0v2=w@UGpRwc%EEIWSFF;Ol@mHkX(tKSnK4;ZSni*-obMU<-IiRO zNy9T$_i+!C5Db|js~4R5_GSl3Mn2}UCR;?o?vrq+-rh#9SCXpTj3D?hfgTg-Q|-N@ z?V`0%tO{52hbcd(q+d&+fO~?fT^IeQ=MC;RpCTbFu+a3MH1ofP(nkkeO>!@lSXlmA z)rq(@UOY~E95h%ctz7-JcUw7ozz_rPj$e2S7`%XH6I@`H4jFikj~+cu_xY|T{j;q% zq;{E16Kv_cBgMv@RaJX)Mke@=h4>NLu5O^7?%f%urOmkz7PPV|9-1?XxZ(M`&Y~XQ z7T5O;Kkv1Y;%@=+f{qUNaF5sH8sdQJAaMS*5^Mc&3D!yToLs=f)ekCvz=#x?>3ylL zzP`JF2{b{m-e2$P9M9u`0|}7uYZPav5C8I)2g5QspGlwlXj^XA-HdzWJsPH|TX*O* zEum{T6R&?*AQ!3J0{VoQL%_pgF5Zl$7M2CpS=gRIkaZlEsVl-qi5;?SY2H)OGq674KVsW8G*fuW{tC?Pj?6X8A3Tr#Fqydp#6S_j8jTO;@Gzc=#Y7T(E}4V|b@B zP5xjsvc_&5AI6Hvc}I{s?kxzU%UNwFa(7>h? zP6U1C3O(6P_*U2Dg94f39}H1h7<=><+C#`GSNSj64U>Wd9$;7%taBwGN#;F^q}sL> zHjE6y%v#0FqPdH$ZK*FE<{?=YDHo?{$ekNkkm2Fy=8GKgB@HcdMn&q6hPiw`mA;6{ zjh_MiwqY#4C*EBnXT(R0FFP2Au`n^Eyg&LD{BC|-e!6#aw35)xn$wwNJ3`0-Ev@&g zxs{;yB#UQEQjM?0JzS`sZacpI^;GNz?Pea2q|V{UTlMuD=X}EW>+~CDrC}^j3?C|3 z1uMWkVr3Amn~F3KA>(y~W3+6(`_rHPCWRY!Bns7IITdv9TqShNEy{rs2*y-*}x#lnFa0&fdXXmqo|} z(Qd5r(M(ni?%W;J5(MM-_Hdf}U=q%(!r$4qd`UyZZq^36_VHrDgx3X|rtWU!hFy-% z&MZ*9TQ7DXM0aTwU(hZY1MSwb8dx7<-ou1-`{i!jS1j=H$&ubbl_-6EMf7b_f(1X3 zl0W*RRlBXPyhRjTAUpG>>6L>DYQV}ormzB2FCpT?4hK&`5Wx3Z~a)#lJ+k+6O!& zISrm}#ssgb_81mp%h+zcxsiY8-fB9Vf2?WWxf(NVZOc}K5{h>XnzP^64&N&L0@BTt9{_N?&(E*s@ z2loaj(HuBwgD^Sltsg!ViUq7SbZ!hVQWfS_y#kB~tf^;VWCY^3Awy>Yz;dGUx`dGm zxGzfOf_ETVLKsk61Goxv2bzEeddOv+=CUij2Qz6S88kZhuP>V50;@2-1;Ot_ZLW|d z^BGF!wV~TJHp@5-7kjsXKwE_3{av-KFX%c^WNPfiuu%jMyZMPikF4tQ@pzO0akmPl zA5Iu%qN!1Ji1A=gffM0jD1Yxoc39m&)fWqbR{^8_gqiM&Ba!83gPt{q1@@|}_| zH?Q#;EZh`&6*UY`&n>stFAAny#cDcJghYj>h~!D;`9nEuG!sNq6z)dcecR*D)gH&S zZ5R}KoL@#g@S3)a?|9&yW2peiU;d)A5fhOfliVbJ{j$2Xs@yO}8$P6~s-ru-{4b*> zz(+?80+=Neo17{7*MWd+>iKW zqm297LYOc##O!sXrnrLRi_>m(MSc*wRiKGgMSW@3*8em0#Onl?=mD*z7{P6p+mn9T z7#L&wAMY^vG7XqU7*agT^@|)a{d29yAEl)kSyG0E*h1^Dg^-8x)uRwI81(g<0XqnQ zN(*MEEr56q=F~<5bl0hjtPOCUimED;?TQQx%57bI|4*~Hb6OSxA_kpb!tL1(f z0TUTsfPe*IS`9UssDwoLw>0Ri}HF<(k=7sfw2sq0(!@7YMCQ^a*QXOU!KZjzI z45k6YmK_Auj5p5X4w&)--NC7_GeVhkg`j&y6g>3D>Row2oRkb30J>y?0TSsXxF!d0 zb3K?Ik*8Mv4R$obihXUguou8XRp3`uOV`|d?LK^%1%d9x;iwk)wkLqV=>xPD3Hd+N zc|j))`{wSI_}}}7=J4Q9R`BIfX5UZf?fn-ZRBAeM6V&5W#e2(HI zaLY^X^SYceCOyrorsvqZW9umdcyx;j--K@13Y(2EECuGp$t%1L*X+wTCY|cEZiyCzBKYCQlA%+m4uT5oz6A41TQdN9yy701{AOpIh$U7cJuG|$NaIp z`^27C&f&iK^2AoIUdr?8>aS|Vru~l6h6zs6L=&xvlq<^I>c;QPhEs1c)YMB*73FNs z{qZTA8jd`RTW6WuKy$RIHujKH*3!@)&R2XxB^1{93^m`cB9c+;aB?{P^00Tb5Cngjd@$lLkZ*;g>6;RV}pP-_0WDp2!87Qxgq zkS+>=?LEx7ctjcmDe zfrO77kLF?;orG-GdQvQ_>i5Qxew_bU*RMqK&u5S99~SB~WLX+|h=0Nu?AEIjg>8T_dXMc842&5oD5Z;9G&#@M`n+*X5~IZ-hmtT zP|$1mf$g;TaJ=HGYBg0%9&<574jhapkrUtapSLty5TtXzA(IZ&+bwUFJKw6Pu`3Bj zGBMBda?ffwaBll~msvgCAL(JlU9V1$@X>eE=`RgmVg<<=N_>>yR2)@WR4l7*bBg|Fz`$v;5*0 z;)FXw*>cvLvoCa|g67(t?ea^|Pl=0CyKxfo*gx$Wwy-RhaQm%p&Q@|?FPDBb41br> z^RUAxCZz3)2*ZW-=YerC@lGVpZkuOHxZ=G7ysCYmtQ6@^*x^x7Rlo5m(o4N0W1J}A z_{D4+(#W)?UsX1jgVPMDGNqly@LOd9rViz)#Zqx!26~es5yQG;t8L?w@>`WnmbxCd zma7v}{Y$w8=}&ZD6m-5rRvEU9kQx=!b(`K{8P(Ki>iHFz^_!YIYNe~BrE|gW^Ty;! z>HvvE4wLBeKF-xc3D4))H_sk^iHLc?;XD;SJ-Qebm0c>T5%~8*Ym-86ep~`IWQ-4w zAeMlL*R}z=kQ;Ljf-!PoTftxTzuj^3FoSMo_D2f6bUBt;E>Fv_@$Eqz@b}5aUtlCY zN=^-OTRPaBu57m~ymBvZCU5EcATC(oqY=eH$Xa(~i>}c3n73%NpyJW3m)}`}7B-3( zB_jo`^KR{;KrAz zcV_q&dg8(bJil?{>AU+}>Q#0!bPs08WuNSKC3V#>OUFjFGvC)w=nUnNx6l--U$8$h zPr!Zf2hY3-9t#$Jtn_mguMHbo_{3b^!nLyfm`2)9SHfrF<1VKx%bEHikqaHsejLS? zJA3;c3(38(GoI(CD$uMJ)p+9N4dq2q$v;7v#wa?SHlUH=&X{mKTpj~m&^Up zwcy#MOsn8fTLN=QSq10YM*$V=p?rn+0x68-if%zU0Z%Si(t!gv;UV_VU+A}2WvhM4 z3T`Sv0papQu#xuifa2f7Mw^SX>X`jvNuYHWz8SW(Vuv$=)0N8+M1dXk5R58W>HC7s z2uoJGawAJ)8(%$WZ%h$)nVO119OY+&qo+5N;$+C zlo^w*Hc>HA2Fx1^FA%kf?R!>uRC#9Aa#S)Du$^5ro|TFrw(pl~)$6wg5fu)_+noD< zu{fG6!~~vTm|~Pn=%t$!^~xnMGBSmM?F8tS(lqp42-3TwfWD zj)@I{d`65rGEJ(UI~!f(*Y~C|dv{{+AtozTG}zPY5KQ$5pw=!_w|@oI-RdGmPaUVQ zkuA0CEm=9<{G|O0vlrUR<0Ns> zJmXE(7wV`A4|BVIwEcc&?tC)p&s=4?1f8L}p%_=hces3#BKcM09}Gz97k6t~5ratf^R4+BL*-1H^m-}2ct`f!9D^7Y=?B}sGA_U04*wBNWaDn}VI#lYkB7_&2O z5buEWYtv^R$GxjtkigBFt#@r(G|Wen9x@Z_^y@sre%aCFaOYOgEvj5eCB(HwQz*Gr zt%-KOePpPsMf+r`q+Bw-hHe~Cb+yJFaw~-M54Sw4sVt;}0wf-sX9v{C+o&H2j&U-v zq{1C&q~}orii?Xv7<*bzf+la)AipA9W=7X)czV+#xmU(u_|Aj82^dHQ)si7(%6PPC zTG|ST#Y3BuzZeCP6$M1Tbmd4&QX1q?Q;8c_L?@zNKcFgrAGx~i?V)%UR9vqMT}9e3 zN$%Od^}p#6yrDQm=k#cW^hOSn8lD9yiXt4{9#1cd+_JPI5dQ|(-g;)p-AY5`(LSSMFvDD8SZF#+{C|r}e2y!Gsz9sQ9(HE< z-wj+#^SQa?au8|fH0FTT7Lg!>milY9@tUYgad9#5h8l*`kWWJ<1#^j|4X>aBv@Mjv zucy|M6g+vLRa7opjskQqRF+rtm|h-`py^szNI}MKJAoLU2TAuT49EgJX21nhDF~?< zXjJSX3I1Ec6HC{^M%r|_x34`yf4_MkDk{{FgTQ!T{dex&o6dZkCzq{&n1+|+cIJDJ zLaYylOoC9LBSp{$G4u~4J0qGe6(Rek0$&R#E861RR3L{N%2D)#Y10S|7rY?m6J?FR zet7^9wbu3juWQ)|Dcf6@+R&4a6fGoF2rK}udaXmPk{-oy2qUITU}`87f~&*11TaU- zc4I8$HUR_hQqQ&C{kLu>n4zHxZ-i*S`rZHh--f)ZT)mMC&4Gk`E}YPzlC0h60TQ19 zP|;tVE|UPMyXfa$42mOYzIz4oqO5mS%xtD3X#n$rg6>^CHHa$Gpy%$T`&B%hasgs4 zCG_74z)U)X+z2{@237f9zKlo6iF8|W5>Anz1Ljv}rysld#O%_NkS99!$$Sw1SAYL- zMp{A+i}-NWrR8N|*ljDLg(Tp8g*v{Ds#5R51*6x<=;{5zr_T5kWKOGQqro7TL=YM| z%7s!;8LvQr3|;@Bj6lD(*g%0)q-iNE> zl^eONOT9_bdV1st(GbwStC&SDIdCa3IY9_4V6r2O1`h@x6^3vT0~O*`Sy|b$2RSy7 z=MnI2nDpB2?k#qL(vUYxDW3?a=Z%oxh!OyaM zn0*D1`EP(^PfvDJdrBstXWAP&Z;)UTnqF^W0`S_p#>ThQ3K=OW(LX_-W-za_J@9=@ z92`-RqiGd{rH=as=y#rU0kysgE)1ZWMQBgpK_grujH{qy2qCqCfp(yTL`9$tFk%Z} z3VB24f7`~T0kIQ=seH};7nt;%*m99TYmfMG7`@!m-5mf>A?P}q0P})rpHYk!3TkY* zh+-AOf+}==JfKwwUTSS_X43wNWHDXaes;J{12r%b>;pj0C=gOh>qRll2ejn*rC>(^ z%KkTXPKP^tdniviIir>G)u0uIRR2wLOUnQtEs$3t7W&3*{P2p9;9#VuH@F z4viZO_=*jNfkOgQo7)kzitph7fDQsAL}?4qobc7fsVdA@M1mgk$!a@4=mA(m`}uc% zzPO|$)QteK&W%Oa)dmq_>04*V<;*!yAi?Zt{S(Aov4t6=o!Dq0Q_h$e(mUVCu@ zb%N>jI#V((L*~M=;WFcX)-x`V2({$3nIaf3A1+1#s~v@+NN#91oGtGIEM9 zuVcf*VHjE72>#vwUdj`J->q~FoHBO%OKceugh4*S#A@X^(lhl>4mQ_GwKi(-@89p< zUzT<}WBrsxJx@XC50c`!X1`?s0AOJJuf^`wqpM3En6fDT;lo`ktLmA;f%zt%niJ9FSwbV>%$#KO@gajgrXgq&Px?P(Y+%bM%5q_~6xtAIdn zmGdz>2$e!OuKS)no9;ApEh#Jx=*1-_7MJO>fzNf{b=;$XKiP+mgBkI6@ZA)|(nEoQ zfTen?GDf$m)6wvpk1ug{mHPD+y9W9&Qb-Az8nAJ154O9QPS48n&3{O@`efd#`ffDV7>^TlXaFQ!p{%B7qc~Rw+-cP_rTQd0eT> zgZBB>JDjd(Xl`!Hup!H()FbI}Sk1=5E6jP)*9Fp&X1LfbH9KK{de^)0*uk29F}eqWve3jYKOKoPuPV$`dn4!wWT}UeZoTrx zs(>3rzZ3Lip*uGz{h0UWZD+5-ZJ5FMvUM;MdB6o;1BmpJnNm}2vBR>42}5t*)GqJo z^CNzsJ8pD$FIIT&*V{$ERY)eDKuDY&NZ)rtrp55dV>KCyXE*0wdx>|23up$cViSxj z+}Y=W7x~6RmL)=)=BAcA&ywLf)+>T&9II-n}{Ta#UL zP3NaOq_1PQSE2)!y4452zg3rz#9qp9QQY0#HJd2&hNJ4<YM{_v3GT z^}lF~W$T0_C~fFZJM?LARMH-7tco6Oa4qDz+?P&5hv}HiFwvd1yR^9dRh<(y1gqr+ z>%xTa@Za^WHDfgnnLTXuHU`ds`3w2rX!vV3{Qdi$%cdpjHbD>cuVN>VKarQ07mJ`3 z&y;GA$x{(cI4pC$IQcA}8ECWnmkSir8=j>_cMUf(``JRp}&bm3li&9*gEx+H$~ zY=}w$d~OybgD-R@#>ZD5?GUwiND#6Zpoy@Ru0gf|@$%tRi~A;oAZk2JXxu8~fMEO$ zjv4VzcGD4mZos9i8dkLc8$Rq$5m_iMKC5_TnpmL#+D5i8*M0`MK-mcPrSJR9f+ z7cuD=o>4yti)nO!U>H0Z%#TIlZz!e4^BwzRn4;bIORpn5COX;(F#ezW%hjluuF??D zTb8;_A+RFBT43T)e@RcLfZ>Ucc-QE76S6s25twdJJ{~%$taUy2CKYsBYzsjp zC;vUa5FRjDHGJMYbN#Hz`w)m;OD%`dRzsfqRDmFehB5DY$*(@YhBFw3#kP%?)?*P3 zMI}Ey)K;A-U0I=S2_or%qyf@=6sk-!uz0!yVFnb|-D|_*G3@5Q4E5(-zQNByvhyXV z*B)9z+e4c_!!1Fk+_U+I;~|^LT?jx6xvMwt+<|24C70X93m9pu*SYk%;GLsPwgLp1 z&xo(v=vlKjT+i)(Ee`XSgNZo`-WwPQCB8iU@S#o2%nS<}3=K|pX6hX&wLzf>Tix(* zEgf;I^s0~Aq6(3qbJFGHZX*GkCho5tc}l@*mSsl1>5-1qY}9vA7q&gy1vL| zFTle26S90E6Fvy@WrcI6y(2>W2b^295twk3K(^u$$6>+h15fffMeuxn+g-GNP5C(K zMlQ^AC*|VQ{VJDD4(=|X2kwkZqq4M)WmIfI(I)2~hr@BmdGD~UsJy(nvGFrB#1bZm zMN0U787b6Cf&`PvVe8%Aa&Iprc8ARM{}RiSD{{(=$F(BeegwVg8(#`EoMo$RRa2$a z1FURvB@(!?v7~_NjbOYQCMVBo2ySpbj_iurgs9m&kiHI7?QmC81D4_P1`J(iwp;s{ zsv!W$U$$x~Ll{->`~4+e!23Pk`Y9D#FB*tNF<`vXp1luw8nu?9^^!m1pNec$XY)Vy z@29F0x)Ro5XYxP{Bmva77M{m&Ts=Iefr@;d+XMyLP2L(^iI;bBmCSWo{BLk_8=%gv z^m{^buL5r$oianohdDF6Z*Q!Zd;FqCUyc+^fxCyeN`o7fcw}DVR2^LmvwmpdnFftU z^&>K&i}s~%=V+eMIJ|5vbC>x4m0Uq{TwVM1|{V(q$V)Ed44unv0f#o ztNVGDd?vDdMwiZD1~0uzQGBzXa`F3SA+d1k8$Y3?Sfy%@1qE99hYeYQORIM;WEhuP~rN)Eh&}T);lA(^~wnLelD{PNux{p}W(>-hu(|&^` zMcmi>_ut_){A=j&Tp|dPD41s}1}2JLm=7BNI6p>Q_;4*B*6Jyq4rc|( zp3X8+Nj=ipp4NE8W&H`nw!0AaQr)Ft>~LViH3jS-LT+0u(-AY>s|$TdZ-GK0LfV;a z)KJQM;dW_l)h^YWmiU-@4Z4_zC7rh?;Ps(y|xSyNlhBq58l{ zHV6v~1Syi*)CPo@x4?+oMoLRaq(SYX*A*QC1%_t`%DQ+Yy$&4z2#!>(++@{^jF)u^ zDGnxBYq_sxOlOQ>_jPso!`Ze@Z<$3r3o3L@w+l|-!YG6TrNtc-sPPaZkfA=ZIXhT& zr;wCI)WB|f*NPl~!9laKx8>O2I^;d**lV|chSS(ktCp0x;CjNdUmeP(Kw>eVPc!Nd z-=;SnuP`Tr$Q9X({aetvID>8|28d`>3L9HyML8VCcV&|5i z&yjGp0+clv)eg!H(&ixOQBfzpDu5nx&&*{;2x*^veQ&`+G)-$B>twu6N!Ds80COv; zbTLIjo+HZy`_R$?*2cU>Phq(ld)L!v+4X@wcea_{|K1Lsr1;Q?Vn-SO4lJtRxLk(6 zpcg8=Fot5}V1a?aQQOn|FTL{^pvbo!{mOK)$#mPj~3 zDfOrsBJke0&~x>QCx*-6(|5F*+QWnqrvQ8&janIJvtQJ2cv$&r*+GpR5xME(*pTB$ z0uAm5R4J8Z=0g&GH@ImnB%}WC<~dVHh<9rs-P^McOhXpBV&eWbi^IU>CWRWb1Wv0j zH*OoCyf7P6F&XN6j(nep=$B=~p-_rQn%iZ|#nB&`grhYc%h=WA8J&;f7dn+ciAChdr3yU|$f zMc00VlbqKd8YLLWgmcz;uCLBNtc{pwmFB%p(H<*8e(6f|DI$WcGctd)=E@a&v_L~= zAgv$iVC|6Zxmwn?Asb9AP6oRV2;6^{lw$a=hHxV%h=dh(Z^krx`Jfkz>Vc3_a)>P zCPQy>l=2G(3!YO_#=_>a-kE)p8lwWK{>8yyFV>Uzdl^HgB z^HSxqqhIKdb69FN4Go2R-Bw<+OOTY1fPP~vIQSDzi6-2giCK+)eL@yo@Jn;Tz5#v& zxEMGmNDo~S$T7q+B~In}{$xcy|1&q&zk9xlt^#E#CILeiyvkMfl9xW>WPq$eIih21 zEDDlSy9p$45b1`#0=p&HA^w0LO_V_gPg^;(c!75mIJ{&=O<%zz?^GH)B3N*X4hs>Jv@(P-Y6YOnlY@k;yjd9>VAR{TfgYlXt z|59H~vvjoqY&6Tz9F}XYc7_4kA&n9wHDbx>^!Z77=@{2NlBv5p;_NC|= zO_V(VXoKCUDI#`A(=#FAF`y?N3-d3^Ei$glAq>B;TYKbon$7{r4l>;q>E0~UnR=G{ zR8IZbgN)&H%R=5*Yl+Xb1i|M7P^O=d=%Hd989;}IkaNMtM0&xW^^N$1wc*3C8zqLl z?b7_&>+|s5EX3)VLLu~(fN^M?S2DJ2=(a-0yG-f(wJ)vyey!zF1WOsHu=KAk2oE;@ zC}MWG-L9{1B|SwJ=#I5pgh?TBgBbxlbi;HhT0}@~_J_OZF z3Y4UXhFoY*ggW8)XqFrztEcOY;n#<++|V5gOthPb>kR!w)VCX z&QelS;_e5CMGSFJ!*d2`^X+sz<)%NOpoY^EzFMlwcUdyH3GCSF>O7eE3YAlJ&T%U% zLzdxK{WvcPogM=+UA@|tz{9BDxfU3DnGJq#JBPgJ?Qc^M$qVEDuw=Z5^9%fuz-Nh*~pw9c2RIA!LUP|Q)y>5Jkux~zW zs;!+1)MP{!H;5V-82qSG^j_$l=_|&?JMahVocm9%i0+J2Oq4*|AixpL(1Epk zbhHGF3E2BEXn2hRZ6gjaEF#+y4$64L3Y$v`a?=Bpx1e@Q27U*Ox#K_#F2chGcE+Gr zL#CplN?4?ljQtH(G=L=oK!eD3qX9ARFVNuOc90S+H3iud37?BLd^lvL-q7~U3}~F^ z6zx9_@5Id|A8Q4|H}c(kd#|St3Oj;HQN3>03}nl505!o7pyaSQ@!)7%Im)o_hmEkS zCu-V6x_HfIPeORt-oXIF>xAcVep1A0o|nNbVGDVx!)#&UV(IJ`jxYD$cWPcLzPl%V?K!wnDu`YgOUINGfCx8^f|$iZW^3ua}s9#J90oDnf>A64Z5CK3U@+>~uF|!tJ?C za?t_z!szb76JjsS^y@KBCxyq+*NahnP-sx}@{p^GMIEsR++Yr=6Ov4p64ZF;>JhHN z`C;}294b+bu6oACa4HO^saNuG@3Wn=mCNygMUY%AsKS<=8t2MZt~4%c*NcumktNjx z9Gqn|=0IcX-^E3Wq$Bv|iR zFoi2GFYmFIl9GbhrchY_pnY5lK_mjg@b1Tl&!Dqp2C^VkR>z#nW=XIA`&;Ng{f1~R zTwB9@1?>bX)wVQ_`)l~*@G<&-fBQli8jlcN7Nt~cSpl1d_;dd2JRbTous#Ba9>6+Z z=s7{iCo9axAu9yXU1A;LI2e=6K^+gx;U!=@qE=~fS%@V|i@^GSEuV`O(^@YnjOGSM z35yhhjSS&t>`@iOOzo9Erh#oZ$Oc!vaq+^LiQbtsqHI=3KSpL`V2Csw9U51Wk{VA- zPGsN2h@WVx?=)^WlE%iIuCkG*y=zHt^QwkU4IoU?)9YHhb#$o28b^;+a#C?S9`oiD zJWwyxBwHJncW6ZBw5LBLuCSC0s{_#Eb@R71tZ;XATifs*`kZ*vPK84eK06?M6DeD>^P%7{@!}z3DzLxG} zbN(Cz;IeCTef6$}sTu=cq~|v_p6TBZ5*D_)cI!Az(~xE?-=6|cf}C3i&rNppdlLr+ zg>2}FzPr|E+SL;d{;(3OOX*$BiNNokebAeD13aV1EWH=*R<+8Wm?AfWw*Yr(mPNfe=cg4tS zre4??d4xjy;Ex)IVPo;ac&_1dwwD*>(?@K;AgmAB`uR&-yIr2_dMYpu0BBooG91Pj zngImNfFVSwe#WheMEuK!$$yyx=mZ#Gur^poEyrX z$0E5Ro}RuvKra&aq}eZ1uicbDXPDuanST0KhK_#*v9MX*95J(?#Y{cvgP(Rbxv!hN zB^Ui(Sx50m-Zce2)2X~1384Aq;oNWmJO2m4?0SDH0_5)InT{sPjf!w>690u&VKyEx zf{PoC)=6mpg3OPNW~=D!h0(_DUcuFs6GQBumr7?$rjK1ecL zRje>`G(HCqlKtTi*Mk*g>BNWiO0M7FoDtnVRL4sm(JKYJ2&mpP9a+eO7P2;NX8f3} ztY}6_yO&M;?Q4#9cW7F@mn^-Ck8w#zT2}|Dkh0X3UAyUIzq2whteuU*3CB8i$;ZGT z6`M3NL$*1ZbvZH9;7+A)xY(<;Q))V9Y&f$uUMiR=Ip3G!%H2RrEsY%DVNtyW zVW_%K=Y#sQ?KxP<`S=2>Y%(GDc(1G56ik|m&3E%GwtjQuKaIj-G?19;O z;VIw%A-v8~u^gi$yyM`cL>$RD(+0HD_zx=%I%SItt%lD7H${AKHX}T4YrVD!`;=Gn z&0auBUVc6mKV?|4S4PKL5Qse%^9eLO%o|YEgF+y$e}j;U$}l@)5U4mXGpUezx&mk( zU|L@J<{dXpRxjVX0iexpu7>)`58vE)IH%497r@i9gZ-9(-0XL!RKQV)C-I?z7MjFn z*=evOy*lkJK$n1{W|!Loc}g0f4V9zV(+r^iZn+r0GLuRdb9g;w3maN?AT5I+4gZ?4 zj(2id3E}7yJn$3+S{l_7EKiJ}P{#McP@`{*r3g`V-`(-pI=$M}72}}X+~+Nq?dV&} z$yA`lMh~lhlOYjfJS^t=r0(Nx{CH{RO1v{Na!?G@d|@y5%p#08NK@kjEL*5FiBGxC zDd2;ZEXEsli+A1G@@xIbqBvsEfgV66jN=k<40Dg&*pwDD1ZyT^+6~qYE1iO>3$Z3e?bLADOzJ%1vF~$uF2pO0`~0N|P9KJ-07* z*k(vT`ctgy1G?_i9yhk5W63zN^k09R`5-wBM^U5@dss+kA@ctHv%$>k<}j+DqO!90 zlRw(!ytUL^Tq;&Ic*-+(cEag-s|uZm+;qKe6J$U#rq`4AL|^ECik)`;>n{Dh1*?zF zj86eA1Y*pX+jLD<+>8Wv~jW3+*-lIRia z?2M0QYSL4p49{Nb{1O3T00H*Qw@S0AOe(1#Z(XKseS?EY@8Xl z#g4ZS%)+=zc`Ymy(@wz%8WJbePsAJ-cGcTP`^OD$IwKDU*svc4@5Q7o_451dU!2M# zHpzB_VJNS&*l4GFC-9{)oK^_BJDge;JhCY>V+2xCbvgx2tNUNh=~7wK8!QSW$RTfySQsG-+0*FP_g zDrehp?FfEW+Yzs!eOMbZetKh#bqcNA*m7Hb+UMwebco^&`^0o6JV$+~D6DL|(0_JB zT=&6sS^^)7^(Jo7tFgv`B11k`$<_Gr=FbSG>FIqgIM?AE0ga1)l6%2(EpkOnFBHZ? zQK*^-#l`7b0x$hSDLUH-SZK+~RkkOxdDE3R_I)swE-&_bCE__l9&yP%JO1w&xu%0W z_;q`z{s(J0_n5YOVV{X|+pmUMW)jK;bS3XnjO zYlo6t(7S&;qQ5KLY9q~hB8VA~6yJj_-X1@m2<#+CF9b!}ZUb)EHd!TZi!!iE zNHHCqM!wlQzwfEpve2s)40x?^bO%c1zEzKC8u_)> zl^n(CM|`y;Kz@Q+PZ($_fCFi1XneVBGX8G6gWiMq>df?vYBW1Xy)tFGT;91OwE1Ix z5ecmdLQ#9uW2eFF=O=!EU)kxD%n&R1^9#g2tHq8{n!oB95{|1h2T}Oyqg!WDY`I|v zHb)yYcOK8wvG9GH^SOg7w@JTgw}2o_zuY1NZqfrl;JxLfu)(gZ0Ruo5qZoKqYV3Ic zdNphhWiy-naa+1~raib(Dbr85-le7HBj}p~;G4pcU_4%uFkQ6JVnl#1l|Ld1ym5Nc zVzUEu-Tbhcr!~5fQ3eI95|R1($!-(6X(;?hq<$xRn(5hkA>rPz9dL^oQjdc?1(iTH z6|r`8uJo%(OB}gNF1-VAb*WwFCw!_@0CHmL_HiEKG+mJ;&&ES(veni{ea-_)KctJ)a1nOs>|J*{zh;Oi%jBNUYQ8<;(iVzI%2Zg9F6 zz-pGYHJ#_k$Ys4S#B&4|`FY1xgmDJlYI&s$C9dHUZf|pW)!7Xb{HqQu$S5g=Fi{Ar zBaN6dI>NI*rRsLf5Mg(-$)?E6t~*Oi)0?xDkABM2I4?Kl{|zWtsN2;$)e_E~R+3a; z{|NjD3K3U?Qau1(J$OSXH%GAu%^(}}hOq!%fJ`Ht$N>3F>&NA9F44cu<$i?)pdPfL zDtvn&p8YmPv!H}f7rYcp_tzxwYj1!=&KjS#&fPVfpR_yLBmn;?s&b&Q6B)OjUgv?`Nsch|D-rg^CTV_C(Ae$~`=X9__rS+Rya#S2CU5@{2T1o;g zd2c+o+eMMW)2r=<)`3iEf`n{KtvfW)J0OuN(5U%d%GXYa-qXXd8q0dv?XOzz!UO=2 zHXOz1mJAK$Cnub+dwM~f3Y-^#Zi~b~jq3GCe0=;NEPj~1K}(QW4V~`XuY!TziDe6u zWoIL!j#ud3J;(6Iufjo-aiE8b&g^mbyDw+GZyNRGm`fTQI1W5Y7vr3Y(kbU!&rpVXb%d_2ij8#itmxiUzs6A(s zKYf?#$;7W9&kjbB33@U$SaWo^I_UL)?kXgbL%~R+v>O7LvED1eGOg4j)806a2E1UG zo!Laqqmkv3;$l+ef=O=V?BBo9fDHV!(2(20?7*mX6t+eTYAe6B;o+GFe9fOx`4C~` zlYpm?i*-V7p}_x%klkc(aMqGPzZ_h$0U?BF^QVS1Iw_ECC>NX{2eTMjBy@%BEy}ND zz5Mt=8nM2T&X3JuFw8OlXwlKpFW&#=G`4Ljq}Ae1cV#irm4xA1L9!CsuYkcA-Au9IVEp-AoEKi>6%8 zBT-F0!(>Vi=%Yiik1W-ytZ#k(ES*O5Ld%-|wlT=xpzn_*I9_paEtZ+vxXRjM;B+T_ z`MeS|cw`Ue>}_%nL^XuU6S(H-F7vVpjxB3!S3U5;vo-57YES(h&?(8~{5jZ3fmPU< zb6qt&bsH|ojyPlYCm{y?M7p+$t!>$~-S*)+!qSuMImx{}j~WNN8d+0I7T&_9$w?20 zIAZ%iQKiv$LRkQ|($wXy<{TF9BC6@G4#MUxiQw>n0v8A#NFn|j+9~7Q{766SW;&F0 zYN)U8iv8^W0<-6Ut#}{9(HR9oqck<^A}aI~^h{p^m4eEKOZ3$fW+h>-rQ?P%yyMg@ z5+`auOcJR-eXjZL+IK5oeRRCil7pO}pDmnsCmq(AR-c~DsPD}*)=yAo+{AK0`Q#(q zD~;n1qlLvg3aYKO`Fpq;+%UHwe+HmJ1uI~ji!^r}Jj6@0IB1zBHM?^=zLnK>Avn$oJ zO4buSe2N~$pz*>9oZTG2N4q16W4dln9f;;kydm?kqU>5OjbBYoY1&?OuJ~?ORe>%c zmQpD)MUX~_Y&m5<#yeBX%gf7B$R;A!@(a+vZ+w(nRaK=q%K-858@?h2`{hLs;o}eU z8>)xw%=#S?s{@O+6M>KAF{Xil&UUC9OoW(|TNx+>;B;}Bg5jv~6=M}BW@yODL7(L` z>bO~u33cVt#pxjTrk1Bz`uo9=gscO@>a&WFuL@h7u|P#!B-)Pc13orGs+OYhm%UTY+03%02|(}(HHp}t6E$!hC4FEwGSq#_0R>Qr+4!^7V@k>TD=X5p zo40T418p^cZ3}0z5uDO4Osg(Ifr0Ord!FwZAoiv{Yq`Y~(=d_rOvhABC2;Te$qg^U z8MQ>~MRI^uKq%%w>Mo`loS5hd#+U0h*$T9PR*M*ARTsz}Z@C@{DP5>dRBn3!Jp^|Q zX@c5x7f2Stne1LDYO6Pr3IHTI)s;rxXAW$RqRpi%5MUD6MMGa(?OU6|U z)l3^p1Bv}>Sn=^f!-qL6S=o>QdpP{x3}!q>{sEPv6nk_FkX7lga+f}iC;>U5RxU=! zW;K#W0}kyWzuz=9s)iP>w>%kn2-0qD8q{L>Os%5Q!NNn^s|(}RceEgw0VzQwU@}nq z;XcYMs8g(S%4Z}pKM{|~T1a63U+;=A815mOHW^)^l>FDU*}*q(k;hAehY1@P;mZ!H zF#zs#K^}K?LBqyy?_T)t-)Yz4Iiw)KgB}2Xh#R2VmiEJ6`y{Le+{!KpJ`j>pI8BQy zD(3oA&*2pJr;;AB%K%occeasiF}KA0kI-sHnt&%IBr+iE^#BP#BLAI*X20;iB>)D* z0BbXS-zb!y15qe|HU=`rmoJ^jL!~ks|IX(PcldlbZ*T;ZBH0#yK>BVdj1-H6ymwNSFfdpeaOMM9p?Fk|=Pzizpm08V)Xw(x*)2?`7KF<8aBrEhP0PLe z#mB_p_)V*e6CF6&LBxL>n~1f!qvIPw!sT)bh0b>xndG~gn)?l^uEl^6S%J7bN8!{L zSRjO$5L8AziHG{jJ^7%J0~MGqzyj#&C3dR=+*LJ}>}$iOA}~P-0S3ZL2@>vC9h7WL zOgcY5kqV(+{S!}2EC#>Ro|0KIQiBo!3)<(?Uwet+QOn#6^%Uf>H;Y79H|k5KK}EkH zRo`EqDAEDj!CX%lc-6jxGy_szU-e3h*-hT0uV0T5d0af#^}~D$cIP7n;HnT*@77j> z3_$3>?f$S`MWIuorv%Nxv$yYJxa|U^cpG8<6W9ylztiwzaXmvxFekDG?IcJAQD4o} zH}r!RE&Dk)_qVwwcQSJFXh^i?R!@2KJF8(d01#ZxJGa(6079d5{;f;Eo^7<|GXDq|7 zZv3eX+g~2mFo$M{mbQ@l2T%SYNyO|?MKR{q%o?_7o4!a+mo3u9h0XFbse8NOIHU)t zR+e<45BY$SIUR2?CUq}%x*>jr+_1nnuzv`=vpgWvo!Zv@-;w_7I_H{JB^}Yva#o_P zsG>scdY+TC6G*}zf%#w{>K1q^N`X(nv!v(Q8a0R+CL>ieeSJ7egu0eVUZ4u;&yw9& zxGmh;(!vZF-zrVfJNWvi`@QYlsf)%hT|NfklKBUPQgAr#(I*g*5rKFp!r}^>=G_l! zG9iBsq5}Y_?h~`8>7}N(Kr%=|av74v3P}tYW z6oMh3h{b1=npp<{T`^u>H0$c152>_duF_$;4H+BM&)9)uBc++=R1VT+eaW{_(X&t$ z*1m5wE%-fT(``ZV6p)ZCqOAjIVDnHm&6Iz=H*Dm&&HOF7QyNevG9<77L1_r;+`YGQ z`o_l1N1JOF;S-Itx`?=)tF&o6T`QR*kO5!UpeMcyF*-#O38*Qs2FaXV&^vi|P6T6N znmZzBnkyE8|L^^ZJ0D<>YUH7qO`}}!Orz$A^u2~i{M<|hwQ&{L$r`HhZBq!kA0 zQ&8tv1NP~7pB%&g`oe}5q3+}mh2Dh!N7Q#fbG`rnYpJA3iIRqt5!oxWkQLc8$|jVV zT}ca(nHAY1Br7{Ad(UhM*<@t%f4uL#zwiItd(XM&;PZKp*X#Luj>iZVb|#b~19`7l zo}8~2i63bl8}Dci$1*3NOVN+7n6a}r673|U-NctZ*)irE`Da%DqU$=ha+RcCGC-eh zq+U1XIEAc@*npgFP2@DH0nXCqiITCFBXXO4#p^sRBe^{Gv!AWK_f3qcKN)RaNMi>= zgyH;1uv7LGgbn=)pT^k^0kF0^fkxk@ydDIZS5fE?L8RuKX`BBkt$*jN7HcX5yN!Uy zja$V8*?t*Tc(M=eQGTa~BKzrje*ydpWRov<@)?{05MHO&uksH{J5BIIa?D3}2H{Mq z3~7A>1PBJ~SEQSQQ~c2LdPyP9XFGASq=Ze5$&Vi$2EB#{ zwzhBT2`0kLcc7L&U);Uh{t5y#=AlGsfOgmA$<76ZLU#7Q_D2n_0wrHzICkU44IO}; z2$=0NcBWCf?9`Nh2!61| zxKG`mRjaqZLjD;?a#K{e+TkOAU-_L=cvTx8>$1*3`aDm>X6$q0G39F;wKYkZF#&1; zM<#2MfGX@K@WZ<>u>oK1jiBA_*&$}1G5*tFIzHG(+gXl*1Ulc}zMmDuqQWn}CTSy%J}fGf_le-FlH1X#~Wl`v898$r^WN2HXye``h;jzc;?! zN#1I9@RspO_-}RIHBAn+rv&Q=YljaB*vF4@A5zRJLU~273)W&z{{p}f3S%J}IjM64 z->n!cMn^`jw|%(je?jB%Cw=A-Emu^{o)LZaCq!H>LzohfdOm*rXu0=M(DUZ29bX9M zJcqY^D#FYsT9?P|N)Zn6qbXMyfCAW3sIEs(^{L%@i%gnq-G^5%Ui1S`V$om$4;wTn(fl3LH|5Fz)`hcEV5xQXmAuaeMy!1QQ zD)<3moSfR%H!3U;SgwNy4qSF}x`f^t(1(8Vv68X5vQIM$ot8mjk^{C|R!1kYK+W6T zeFql&n|iTCMN8DBfE!-HUje~}3wm~(zez-M4uf)}1N(4`5Y_lOICvehPsp=|vC#YG2{gr;8CsKFlsI zmNz&1fkPPE*>|uXL=MQ*s0eqR1W6Sg`?C>dE#46d3?$vZCCK~EQ~Dx-_4Xwy{!IY6YP z0Pz|E!G!!tJ3$%a2S{t_e`I21efgQs#yO%swnsk_L=B=kbdc``jHBaUJm0Rq29l-H@+1V@KdAybz-IS2;oW$7w z-j7I;Jdabz{MVqBJ<(SjfuY#Xsi~X)sc*qF7?eJbVIUR03;o#i!g36rbq!gjDolzAU{g^ee;7s_1Q%5Y^E+f+=hfszXcwWb zd#Y^2?@s8f4~k;W(p-$J~DxLhYAUc`Y^DgRlr41gM5wZ z6g|La`qhEPZ10kAcNkjDeW$)G;_#0E8VompDK@AKC0B=NGQJ$)a0PouBF%fs^$x}s z;OV%7zr2=Q!X%^I300(GC{BZd`kGb{8NX}u=X4kCo{EYas3~MX-woz53n`#}gx$&k zwgkXLf;8O4^2)eW0`6=k6Lzx_pjWGCZuDR{$?HvzH4RJy2x@8ri zIH;c1&uEh-FG+SNk$}kwCG`t9%@}Jbg8w7%?;_ukEIqUba^-+b?*dwsP^gAbHSq%R z7#a&5?Uo0$MS-9OD;CIybKlCxsZuxxp>|FH_9`k`#Pu#Rz?%lH3~pKzP2&&(h8ffx z@TZhyzeMGgm=4FqInZTY0ltcGCc`TBEZ$fd_uHm~q6?7A?f65qABJj4QJq4shrna8 zvqvbm$cJ8i-w!wqp%|8saNa)S1ZE(xp5is{KFPzQ+#AM9q^4QRF1 zp-pE&Oo3aLu7yQC@)6gHsDY57ZCV3J7BpsWaEL)4l;o5XwNzHY4?2on zMUb`!@Dedc3dcMvA%z7jav3!0?dlh+!O(?H7Zl!-}iuekwFLRY4yBP*W0#dR3thga;MPyTraWcm~={3^HYiM9o z5*5VE&#z5jLH#8NwqU`7Br!4qOq0D^BdZToNsbT2SrLeavxzrJF#JV3}! zox1j{0XV@xHtjm>Jx1-KOL$fK(2|_}zCZ+HSisF}tUEH?468^|NJS2-+2GrYgM=s=daeYf7Gw{`+XZ~^{}9kx2M2@D&L$yb(kK|D2?x+bQeHw|FDr{1 z30oj9HENloTt)}5?jr&EWl_(30S5X-=s`do8~py_k~cKhu3iQAj1p{jT`)rklLds` zf`S4K^1Xlu}YsI7hA`<4w}) z5f;Y^RK>9Xz7fzkgf*!a+0=27RBg(61Xp4%iu)Vb0uJY4{U6P0C|VOYNbje zJFHgGCLjp+#C`0a2c*p}J&mOL>4;SPmZu0Wutt1fi z@CJE6>PiSQ!%uJtz+NLX{h{FzkC%n@@NTR%nUHzJ>W-e<6n0wjK{|q-Dpi#~<25`o z!ool@R({15N2wJ4i@h}ubv#-8U!r;z6TM;57DBrNi(CGao&@fz4hMANf(W(k?>br% zv;xjrNakSFvJHAHQjiOPlmLzupS9eM&d!0sL3(X2nOMny0VEK!9oUkk`)j(pDFp@R z(wff7{R_bmH=JR917Aj5i?8`N*NtUE(4`h6w)oFipnK|c1ZfJv(FkHwAbVu3v_GDrZIqX1~WA-u=ejg0+5PwgKS(F2Ok*ZO=N)DTcZLO?mL(8xxh9`3k7J(i?WgJ~xOkd2$bE6(*QS>t5sW(o*qRfXkf@V9Awz+)R`1Wicf{06s^^0P)6a~^-c)ls zW*T$cK~jTKH@~+9LZpeTe(WJ{W(U=jXhL*uq19Kw*aPzNWt8{ulY+!rjC>+ISvYAD zPTN!RlNYesXL~=xlXnWd6(XRGLa<>~8Zz$2Z6AVflZL zap2;}IU;^j8oMJ{og$@u&)<~kP~kh~!l&P8pxGH?8di!)Qc8R-jA2xOTk<$ZceLKGFKNaur1 z6qo`C&y}4p2<$m8;=VS=ruK>c3zc(fVxwMl<)*e7N?IIm2a$mx8h(NP(4fc2eM`&J zjEoXwtS;!Fz9K?6B33!HREBDy3(4!^3gKoZp<>na8FqjEoYQJpIwjV6$IhL=Hn4<$`3`3xz6S%_G1m9N zjebL>kGJ*!vN&i@zLZb&??hGt7|)v)rG~eJY7#E#Bh+n>K7D9LWaEZZj3~;i`K|XO zh%y1{9MN*;iFJYk4SEpcEOY%O+i)zLTi>W=D+aW;j1X)hYi6bd8c7w;=_D?GEoREu zGUUSt4130FEFca9rWpWCA`b2?+qP~6q@l2`Kz3+kWLM?1S{J@z!NlK~tits51>LH^ z3wtV8C!`41ZV(wDll2XGn~j(d7^Vb%9ghyj$1&n?0|-6F7Uwh+^k0EZ5iRCb+SR3z zrVO8r17H$0^0VSd!|@T+>qdZO*1<)R$h!XcAH9$#I&WVxr3g!FM5uUkwFUsP;UZ#7_-7>b!#nHfzNR8%t6lvn2pN73&&8sKYjMh_w8Gv zp2cAl5D3_-h~GI`G>e}?#`q1i!Y~oK4p|D|_~j4U??vz>9FUPu#n{t`tj|+`ivl&O z9Zdxg+Qtm!5fB|1a(=0-e2K5RX4$xcZ1n&Y)$?R%lfHhvedo@(i4IPb;9uZccZ&ZJ zXhVmQ3_K4C3d%I|LQbTRqRu^B7tUM@>vd|-6}~}X3j$sJaIcP$@H;AK%L19_!TJa~ zsHr2*eu&>fyfefJE6~MFP?HrC<=v6$RfLj2u!<0uK~fX};f%`Avna&wLWBfG#j!_7 zXdvAr0r6)PPlS#*q_4)Tx3s|Q`vQa)WD%9=(=6`XDS?(9*h4rCo+3fKVbcWEm@N3D ze`aT+P|kizA#(f(l++{yF7`n3?u)TJs3sHld>%HOlz1?TPjjcGO-Dq_HXLkb< zT6hzvru^}=sJowOV!ax*CLP8~gVfC&_@0pZAQ*1c?027XNrq`+HgI0`W295|Eh6cF zlEPqZXpnR;#~l-sSK#|0?~Dek4ymAYe7_Se%%~;dAl&~@GrgBP55U855Qzv9oP(?_ zN^)~^b1`iN@ar(7_&D!4ToatAn0N@NVln{$F~}cbl@cr{BC?_K$AL_FL7ftD5z#1C zWmh*8uK@fWscAm1T~u(>P80_R(T}Fjtj$)l%^IKr`N{dB=0AC`&A|6HNt+)G0#2?45pr>t9$v)q z{f&mn?C`WNWMfb#z&1~-m;N6d;6ICS)8d6rz>G*TZjLywp?Q2mwxU=CVnA@T^npZQ zoSKTvKUwiV)sBl^)Un8a|1je^@8y3hpv}M$QbK$7fB!nQ{|_uCI43+M1WCr(j;jLF z0)o5q)ocgV{Kb3cWeQ)~e}#nYP=>ojjd>t#_s<_mBqW>j64$RN+Gb3=b=5DbTT6A! zzspT>b@Lzm%PgsbJ-re;#;1W?p#o5w?DifDZH8=FQ3SF{JyGiXa-xI zWV;75TUteEv8hBA{c9m1hKSm_or1B8^J`zN?C18&{vSB1=uGI8c~p0mB}8yfTO2A< zV75q&=}xi?+bwX$;?PrTh4Y7{^Dpkr;WqDfwbJfg+w9CG&$$bP(@)14Kuc z^!wPj`g+5z>qiwV=TinBsDvSI`KD_H6Qws{NE-bVL zJKRYs7~K^5ALQh<=Pd2_&>y_B9i?{nmMVW1cssI1Tv&UqnUN=d#%^zw0W-73ih1EH zhwuJ-6kI-&hs{@6L`2Z!n#%Eu>)TWOy6OGPrp9!6g08pZk=umBXDK`o+q3gz)fOz` ziSkvUMUKqoANrfBr63{wL!(0hpJ_6fdPOYR6N{;>GgFI73SS@k2L z%rfEEsUuvfCoK+boPk39Pw461GtWXwxT{Yy@m?%n%bx?!1x}Q5Cnp!EE$w^xedBz=20s-#1V*@ux^&KQFJu{7(w|ASLB>L34#sxWxY1uJ{dC>O)5lRt)Edrt{<&7!AEY?qun+V`I;Yo1Sq{Wu0g1i*Wk895eLm z@Sl6RIqugUKY#e=&kl(sdP~D983?0}%17-{9#$6UYL8Q7AmyL;U!NsJh%a3)*n~_Fi?V`+66f*>2*!5lY=j z!yjHjqW5bOd9xaiMDRD5?vRD42Q1{B~Y z3=->m7`fvwCJdZ34%gb>x_VK(?D+ioo@*hlQ{VY-?hKE6=Zr6Q}QF!=lx?3T=2+@5&e0j$+ApySJ9WY zRSo-@zgtS)lu%Y^J|gR2Zb+793$NGj9kMTYV={mrcxW10@! zW4Slz(eGRviZuY8=<9u!&O@~V<*AMj?8polD_$C&`+U^$prDkXv9?)$u~+%@iHwo4 z)2As;C;As2vYBh$p`+Id|M(Ej*})q}v^6|EQufHYIG4f#Kou*h{cGwR`^Fi5j^Rj& z5{8HVGhf=8lz-b8IUZXLT*zs+;#p#WxbH`foYS&#m$+CP-oE}Wc-Po~QQLh_3Du1A zln0diqm#V?dAA*a;lro#YLXGT58EI&JjXP47~yWPZ2Z`9GQRC!8mg|Pb7jS-r<%0X zX=r2zv>+`Eb;Cv1Yr~rFzGm#N|KTJXzTSpM4$mL42jv5qterHEsHqHn-ul15CiPX6kiI1N zM%;q#7QN{~2mh(}bG>*d9T0Igd{Q^Vv~rkDxaefQmaXPJtpvZcec>KS`!NA|$!!vr$IRaF*lO0Qrr&jq1DM?zM|Nzve2Q_gCoLyKs+jN;T|6 ztYd#*kBozvC0Xnft^IcCzZ*}ybAI^DJ$Q%yr-1j`xh|A;EOl6*PM(`LGOpI1|D`Eb zly{;w{Wm@a-W^07z+TuE2?_bZjQVn%L8IB)Leu6E`9IWue3~fZfJ@Ff$S4zU*CBOG zV7mQ4tmMo3GjxANdS&~cUyeEyRT02Wl{MQEr7>zQ(EiP02y+n-T-cWIt zElGlE`~BJ671CR*CaV7PRx{-~c~j$60dilXsny=9U(D`QE!2@vhr7U)YT65xdciN1 zWKuC#VYCd|pjw@x_xrKI$-G*=aWQ1lb29m?IBe=19o;7pV^IbK$DZgo(`_t_4b zPescP9IARGk#%JPn)_PmwlqK-U&T#ctdY!fSIl^CYPXZKf+7E2DNd=lmax*aA=lPm zI-0|hcPtiUhTqvbj(m#us9T-V$Y!$|t9?9pdOF%k{9y8nfX*RFL+09|zpE7{eoBTe zu&lUJPMSWPE%5eKdtDYSH4DebslNj1N6ahB0*~2ro}oBBY7 zW2!jzp;F3;l!@I-+$URgK54(8Ti|Wq`6WJO|H5p0v$6LJkCXKSm(D9m*2vWE-nej7 zP-=l&@$2t5`%gFuUF2l{)$zzsFTJkxt%9yH-(=9!EFV<$b zK9A4iU~r|IFKM)nZEFfs80gc24ijUr+u~ALr(2@nIvYypk-z%}{B0jC-@n ziQ!$iQRZdGt|+rV=7T8|^Zcs=EHc?VSKME{>R`5vn%m9z@!IS{Dm*ykLKfe#i%?+zB7+2utR5SSd4c0zd4iG*)y@Z|cw zMX9WJ+EdcG9epk$J2EK!dD9m*lu2o6^=8y%XP0wgTaUo|Le<%ndz<$@f3~e(@`lHa z6f*Z3YKO)CX)7aHvi%!-ci)1rhlJ;;E~f>4r^v5c%EC{SFMJ#q=xR8sVfLXUQeV~j zXo_tnhpI+ZcS{%)#X08&q@SE|Q|s1Y?~zR2CY>1UY|KMZchjeyRL6C7y`@S+>YVCO zPeo{Byx6g|g2|MLj!p+=k)aid-s?B?c1;OSiS=2*W$VMePrjr(XevUBm|#E9xc9#X zwjgmx796wJHGN-4ZloA_u-B_Vt*0FReGalx#N${&d_O^RL&SVCZqg}6w3P} z$Q=c{CI&Uzt%xKM;gFP$uBKDNbSOD)wEb(b$(jk$8`BE z%D#Q@fV6G6t))WCP5x%=`Jbv+$rL9Y3%t!&^Zu~^JOf`0!z=4Mh)48z-%i3*L^W9L z!KuNmwK=@!cy94tKAQF-exa^SKC-Ittsrq7)|8BpjA>=6PXV2+@DD~1=OgnN+~S^ zISbs{K^D8U_<+dr>Ert@kze-e=9aIm8qqEi!JA3X`Lr|AyeRJ>?`#p} z!7#!%K{_VPieH&Wt1>tB_l)uQwH*1LizQFP_uDnuXse8#BCCv8r3=`2H27rHBaOAK zlWEO)!@~S&4~dR>VJ>Br{4R|>8dwSA+nvkTx%N$q^~&2uWFwJF+BT*}Cbggl0g&7-8 zt`5ty`q6F4`ITwE-w8SC+>7qX?^SHtUaEX+)-$Crf8JMC^UYJcdb6tcuOt7Mi~k!X zG30=ik-BaV4~Nf^oDrfqVw5nqGG|!FR(S3jcg_mks4ScYU4~ZD-+w11&UDB2za-bc zi8tuF?my&bz3m+eDg{?7XZXdGm$p3V>v1uZ%@+zAcX;hevvKXp>J#F|S9>P;7YD-X z@;0B*v1R}nV~N%=6!AlbDI`x3z^@;jG_nEfhx#nLh<3tEmXmC-5{>VAwXEUsxqEqd`>$5)Kz>?g?A`3pQ~fOb=(9x|o3hGy z1LeaS%ARrk}YW z)Di?gnLAH*cd1)6JJ!Q%B(uBGSBj18j=|lsh1>0nI@%<9!Ac}^|&d=L@j$)jygUB`G ze+E7yA^&jE$2iNzElu{!J9$F|+EU%ppPU@YB$hvh`mulqYs08Ag_}|Iy<%goTm8J~ zZ^K$$vTtXlUVua=X=TsuP;*mBU#6E>W3zD5h|P9Q-T1nz@1W1|r@n?YJ6y?!;}=B! z@cg}i(ncSPrpc*Ye=M{itF~>-CWp&kZHJtVnG&&NFXSJK&kJi(+u47&LUhbbdFRed zPD%M+_CNgg+VRM-n6jtNH`ERsx4w4(Wy-hh6tFFXFO7mp+;&JzpLGwU96-w>e9_{3 zhGg^$yMwpI3b{U~apUQV9)EQoF+9vHJk~Z=QlfhD0(^14V;NHw7y57%qR3#(Eugp1 z?UO$*b?WtJx<)msev=U;8Vgft>AU0sR*J*dfBTd4{5DWFHZoj$x^W`O&OB}y)%52S z+cOdY*OBR~_Bjb1G059efD&wO{NTdx{HRK@ZjXE^v)vNATY6PPi33U3{A=t~(0Lv0 zN6lB_jk8mznG~&A8-w+|T3r>mZVHP?cubD5rn(d_jp|pJ;02JX9It`Fkr#w2(_f~) z4S9Q4-`u_Y_I{@m%l$f&kFXQ4AQCh7W`24pBO|?gRYxbE-z zKQHoV)TU*V_fxUjcxYNso|K8Eqm37-2F;C#;5C8ZK<&TlrATuV-WHxN(sHut%;Zc) zM&Ey<{EWX9V|+%9_U{efJpL174`0yaDsXI&9;g1&*=3r3F-r$4U@c6XcB1)(^otlQ zzitO-4|oSX$Y__Tk#5~@SdpB;ud+iLA-KCkGoC_e+U6R&0tH39(uf#M8CuXuteJt zM79>TYFHTQ^~|e&NnOnND;i=!9TSkW zga%yIkA%>))ZV>sgA=JU#_P(k%vD8M#x0V^zsEd}%l1?tJy#fc;j+u>nnPB%aI25x zwV2C?)gwmZ@s`o0R& zd~}M^bZ>8K_#np_p3TM`J4{*l#Xa$5qV>dCCJMsct|fb@_egJ9k^5i`!*U+U;ZG_$ z*Y$1g|3R-()86>A$3n5$=t3-gqVGrcoIAJNM2VM`8kU!qOOX*XK{b4pwi>DWTlr?S+z9wE7tUxm%EpLmZ6z}%K6 zI+0{4y4Mor$E+U<9dl9^7>;WTF}WYHH<4>QQh?)T$8$IT78NXK1Xwb~65@$Cd3H>; zY8{TaKJrdC**s-yr2YG0;*wA!QfvO1%edS;-acDA274oiz$wP{59^CdGBw9WI~#KD zX=B-37OVDr*eWklfLo`2zO{9sedEH4t5+8A8LtVjp-ITtT>$_(2%OM#-}qtxWf5J7 z$E)CuAW<Gf6Zbq`6>fJX3%%X> zn8~b@JBy1q=^0l=gzw&1=QDy0W+&r?Zd!ee{z=14-}l+bsF&>vVXzh9bvQelBZs3i zFi`&H*u-Pk)b+1VGbmvBrV?KmCdKcPJabHjjGO&ovr$C{m0|2+bMAFR`-~X0=+K`e zdt~AB(^(nK%4L=tE+Iv*=S%%tAi3DoGgRwyT(Rkf{Mpg9)X~(|gv)25zbE#5%6}u0 z;bPDaFRR$lDjw0!iqI_;!R+VIJ|el#bVFpk{OvDU?`yN^dLO#fyP}@$DU1(l{B?={ zsKS?`%SrA&+~vzCeB_7KU@)knotVEnwynqXVZhG$u2=YQH~` zx>ZF~Z>Naz%I%bNSt93k6CK^6%%xR= z)8VMLR`>(G7q9%sed@A=<(yM;cyi)yJr-+nGRqFkh8e8C;kI{;@%QNL=L|V*o!)3_ z!+qJn3l+Ci$t`<^7#Fym=AhXyVwVt6 zGCDoys{3T69kLLvGCg_<;?!W14*)A4iZPT>rE%L*tfQ z;i=l|*!Yf1ZMTs=%XU}tz~RGIEDY-`@rjS;xcLn3`;R4=6&5R#0?S`X zZl6`|`cr$U1gVx;UNSrkjgj;nHg4Bv3CT*B&(QqI;_gNIx9G?Kd<$*_(-7+G2z7EF&2a6iO#G&AVPriB>_anQJ#rrv4Dd` z7J-4MmcyWgXAGyn#*3ClRUjW zM%JCyc7E1#@72VA!73I8sD7rmSjWthq#~|4zjb*akWV)`jLD2V$k8&q2d`;;%8XU6 z;peuQZM&nr>MU?2wjn`|r@P~F&U#NpJ|A20iH(4dBNxLL3ppZhw`1OUidlb`$<{Mjvu&lNHCJi0 zr2QWJ;g~&}b355|hx4RPfLHF%^#Gb$_Mq=flfSN8X$2UbTc^sbPbr_K8^_vcCPKic zXLamAD~l;pGp?KKn$Ib5I5!Ctd2c`QzHEhtQdRy@prASjxDmtJ!S(MST`PF$eC?g| zGw~BGVVlP5;j2eJ)Q}rKpo#8rZmcVP7#Q;Mr9{%C_Sg7#be-i@Q{wpxubC$$tYli& zRxKL$D0g&q!8zj=l&8J}@ATr;tJ6TwV^p1S=PT**z$m<3yx`;W{{7gU3s8uy2Jlo3 z_#gl8`Zqx40leA(z=L~zMOx}2+`s|f0Yv-*JbMAs0LbBxkf)c|_rAV9o%SpM_#ugD z|Cc4!JA)mJ6F@Knu;$WT)*V1vb-Q}!vu#NzuLa-3nUlc7!V9dt|F3qT!}tHlI0OTO zk8kLuXEqQn@X8|yI$+sc{CvR--~<9%1mYePQ%PAhKc93yLFQgMvg*7zMGMfp9)J(f zS@C;B(i6W2Am%Sn-~`vgSa4%wWBZQ8;ul83zX6dQ`w;&Jpcq?d;SH}s(tJyfdE({| zVAejmZn_Zm;=s_!uNUlxz1i6Be>Q>0X;aPx1ufrgG>MIrmS=NKyW=?mA4l5fjolk( z@sjj!i=obaIcUzr&D)~4>9>B~pNyENL~r#vs`=oeX=uuj?R1yGcdsntCybpvqU4QJ zVoQl8!-+3ZE~Hu)mwp?gNDPjTvz|K?L0OM+PGWJcOWw9eAvS)B62@)0ucRb93`sL~ zlTRNa5nFwY7#r`OtJsuCKlQzvaE^EEoIGW8*{7tjfGc<_eS49l%!jLX-vl!eIEk8f z(s7w9=k^N6N>=_E8nSNV)$a5t@>YiChJrLE{-lw@ow|MolpIzW{^SvvuUpd+Z*Mrr z8@R{a>mV>G7I1HBK{TWx&(CFJEK{cMy3EzBCol#TNOhU>#N zGct}BLsgFVLWos^9I3QPdGOVMmE3jy%=!zp=c7l1$@LfUT*M;e+Yiz&YqpVF|2gZq z9!{ca>r8ECmoB%58Lo9WiMAdva#(FSb2tc_ofGaNf`t@4c&31?%7y%XzkS<}GCH?MFaH>|Ttk8|3k=ihRFcLK&`bZDK zh;m@CmL_xhtg|U-X={NiGir|83%nS?!g^?LPv`_=pNea0Rs|h{{NC$^0(&cHRF&Z( zgLy4Z6mM<_I{r-%KL-9y321VF4UK-taay(n(5dRh!80@9a}gwf{QO^&;qo6Xu=gH1 zILrceZY+q$b+0FB>I~iSeK?JmkxI!R~JR#2w93Ta4isKc06`{LFFb7r&^6hvv^Z$jnaCO{MAbW1gq2$?U z9h{N%k^Akzxm>Ouy(o&PQN;p^6K92*!nlH|NQ&uJ!(rBpidF}UWBcFzdg7t9(y9Ex z*{Nog77=|$%5EMhd5&cOXe5#<3)?)rf9)0j5na`QJI6=vKkDy$($Qve>~Kc%9)+D^ z+adLeJ8(;T7 z;1)jHe4&u5JU2Etw%73@kMWc3ozb*Ko*ZlafrC~f(hbzNot#cttgsBn4a;B17xG?= zRAh{eyl;?PBe0DsCdeavk9kMW$z0}sOg5ZeY+lYL?>PT6Vd_ZIZsi_V#|WH|jH(O# zn|(Qv{9@c%)t)aEz8$2Az3JIdce#1Ho?^lc`8ey%CWDEPg|iqN1lB$Nz@xVC8fr`L zCvt~wsDP7mxnVKjM`_VQdUQ*D}n^}zbV?;*`B0s zZ#qgV^^D<~+fyeg(#=C+*RNl6TDp%VcMXQKmEbTyQQ;J0<;?Do+hA4{yBChYS@qx=f zbpfhFN7?Ug2fPzXHoe4wg){R0#1D4d_E-E_u&|K+i1Z`u5kkuwA6^EQ0iWx}B^MW$ znh24IOZMdP8YaN1UNmYr3E_e|AWiw4mM(%lL(qFJ*+*^oHi2~jR=yPY(CHZ&x;U>1 z3(X?u1@W5=a!dg*_43E(51=VC+8hru6FG4;fFu%6m*6j|oWa=-tQi#LuY))3otDP7 zFxL7DIQtLU5woI=aGeD>5Xurl;q_h3&Hwph&O|q){=8!O#?-5YES_0OlCk=V!p>3C z#_jhovWa=KOupNTEVl2xi!{H8=-44jn!{CIACHk(v$cjZxVLcI4rY!U8TB1Ed2(Aa zKt8_9Bg`PPRQ4bcKp#9ZM$(I)_Zr#r9N{5WTH)lPB(HZ!h?sF>uVJTX($FElL&PXD zCi+Bhn5{}??!qul%Fh@rZAk^I@2HVzwv7E~))liTa}(Y^dN}NyeWu{v$*oJ4zv?{= zkyYO-F4pSR^Fa{IELLEy+CbYj+?-F_!=PBp!M;)_hsg^#jH3^&PiC;z4d}-RTvS45 zGcmC4yN|~wZh1{7`!@_-A#(TB*w?PD57kC|kB(V6ahgSdnCbByxKH9MzQ47OWSKJL z))v`If+fL`P{w+kuzSGYnuW1v{=_~$7OhY&tz9AkYk7;YT#vhTTYtNJSuS}nOKZ<5?@Qcaif+nfKNqiCnfsJ22%@*$_j;`?Cd1E~ zRBf5}D7mtlh6Z$-bywzZskA|jo=*hK;B#JNMz99cEAyoO{5c`QGXPX?ZI@+t=<2ZE zmd<@^(f#=i$d?S#Z=s~b4c~_n$gU79r8J2yEKTU6zXwrg4bp-@lR+s@490te%c|W} z_s?FTg`ihpE;VA66Wbj7Gp5}i5Pa($JOtMY>J$%blp?HQC;*9wy?~#Ce8_OYZnJ1* z(6ljX2mE+85`nq39`l#~AvYI-jpvq?wXz>r*2YEC| z!+=MNpEHuMB>j_tvaSe|%7B9#o#`MPi^#=(b+sVm-3*XC^PWcw&C5y$7! z?HgJrDf6^WzT%^NV;*%xOG|H_!QpH8Uil-k)u%5E)oRBWzmIE@nI4?;^CIOn&hv8>6Clm6D=f zMi1z*iHD!B^^!lzeVJ>0CcKp)*<52**w2oeXv{Ni5w)$tZ-#66jxzNeV|Qw`#R~Q6^w;l9U_fxjS)7LaG*Od_MXEbGrrb=w zy~F0^TS%f=OPxAGOd(csk~)h8RkVyUAyB& zuYXAQruQ8{;iTt68EBhvo^r9p)G>9sxaQxUQPAx%vzaEvxN^h0F#om3Y1eIh8*1v8 zZ?PXZI6-nu`peW*YKC0B0{-FqbxEjjrY>XKF~Rz&(l1}iO0UOWAAP;Po<8weFyG_t z@1E&Zm%`!L8asnKx}?LwzwL_x_9$bQ{9g6H9FTQ^S?iH`ZiXn?@j}_%ks)~xRuMtu zXQaYqL=EIbwGJ(L^s&*$o%QYG5aFIQmF&`c{$6+Fnhk3gHODcj&EdsRr=uKwQZ|>% zOTRsd`yMK(8`AM+<%#zw_2`G9T=gRLC^eIX)L`!L>O_~n@r|--&et{+j)dX>qTth*>uMAqz4`LnsbIO5sPP7 z7i#V6nkTmNMn~)%TXFEws|x+&mq+8=hgTO8g~gw}r4E%?AK)Rq z_f6zFH$_6+%+h^>@QAb8;bshEtyT{0_4QqfIccm5dslxA(2;U(SJBii84FEbo-DPv z^s2?If0J?4OIQtdMj%;8ZE+_Iz`=%Q8JEw1_UJY#sY&gqy1F_N@HwQ$VOc2y`uohh zqNp=>Yue`UV1n&z%-CzG=lk*$hLscLcW`aJMglfSEYRS{1%e={0MzOiB%~L4T^(h2 z)|$0&(!T@y2i=X7-*N??llVuFvD&Yzb8ma43CawKYOdwk^z_bK_qi9W#+yW4DGETU zg6?ZBrWz#JqeE!(g8Io=-T&rPNIe@9(<_j@CC>WIUT(_gvyrrUo@1(_G?vKVe)UQy zk6A@UMgM^4q{v-QPfw$U%Z@a4NC*@@-@kLa$jQnM(!IVu%MR7m>;&rkXW#Xn8>{`% zZru*{9*${K5@!#IIBe_+R+BW#&T3>7RCTnv5dHe~lbRyYZOnUHXg1}RFU)Z^$+V6S zPRwP@clJmzYn(bOEqJHyy>yj0P4dL zvkV7x@9EXlI3zLts4wIzk6d@l{IqN9ZPEr~@pCC2?01tbg=A7TTYwA!rmbAxuqihGIbemr-FBchHkQu0`QL^V^*l6C487 zLe-@r!Y4-5isD-)iZ+Wjjytazh~;H^a=8dEW>C&7{}>Z&4SI5aZv8iBtzAf)`@s0O zcJgi!xvCc{oeQS3!*T%%TRjumNv(9P?#kaC`55ii_8`RfU8$_0%iYz&NfIZGb&b)j z8sYD^d>ooOa^kvh!!eSYS1YCV-xm(k$DX~#B+Ho8W$2tCz|6X=b>2k5A79P7Jvo)P zrG$~&W=4{h-r{x?f0a@%J z`Yq-IOH6+b7cS11v8f(@5i-Co%6xS4Xa6aE8fUu+LG!|bvtB~49InTQhkrik@>Pe& z*MMR+pj~B_YbCLSBuCTFx=ojbq4l@)*$ zjI*)=lrzk0&0Y<$GC04c(o*{tLABZ9(3^9+H>$i(s6x&_?#m|;yz@E{kS-n?cKplI^yp#eM1UKhYB5N?hP%f$^Lf2my(02WZ#h0$V{9rgK?( zj0*fB$o>wH{`mf?Ln`;CjEp`qXhOgM)`^X|R)%8UC(vA|&wA&E5|>uMx*wcy!d(jd zrBNpj0{^@bm2`x#7Lx`gK`C^luo)HC(L2fA-tx^RfSK*CQlTIXm1#{) zUecr5fCgqo^;<6mgl&w9a`|I}{0)A*zY`M^FL&B*w^Qd*fr`~aPOz$Dl>d6h?~)Ue zY>YB)3ww>S6RFQ03DQ{!9wqUw(0X$Cg3686V46^l_t|6Ky)#emYpUcm*=lGM?0eX# zr%O@Aa^Y*y^Hn45yh4Ak7_~z;42lEZD?Q)(aka>FXbOy}n0?F)N0$mX|lacg4Z~wtPsfonj$>dD~HD{n7-b3kggbxeK#L zT9s9z$EuQ=zF*I8ntZFM(ds*ZAfY&udRZ$XkE^dcOkPToedUKyQ@|+SZz}_vCTBBQq|!^fh#hiTD+}~1yR+KbqVQk^woEQ&eH^`-L?ypt z!X>3&;xr6D>2RT|!k?{51K|`$40)?-Gcdow!s72LiAqk|&5VKClNp{lPwaN&O^%hRI2K0@hlD&_ zc{qD<_EcZ%(#=ls4Eh88?JLFd`S;C87$V+DSDsC>a;|OVexN;G7p`JgamUwoL4CvW@E^k;&oZ2S#*WtXr*8K{9#Rc<7TO4z-;-Yj zWv=JH`_<}7f!)<$?kI@A{J2@-vTQIN8*0T{)^c>)mslSuY{uR7Ht&+=CYqYag)hFv zaWShtsDCYVFKI@UNI*T!hbAf~-!x?QXM}`kDJa%0qKee|IXD!J`=iCZ4FH&Mpn_99 z*nX&SVq#-Q_dcTLfaV7%Z!i)#8!Y6=0~6VA?d?>&IlMxvOQ&$hEGmViDieqh*mblf!cyWG3e+Z*RP&M74 z%-8^d8PHk3pmRs)fjBkWf&Lnp!XdwG72uk}pq(anehC4N5Dx-fkLW1iH#6>aaHLEU z_>P}aywOwSmyTb`Z0m7eFktxgrd8}y{M?Dev^qqoCE>ZVe5^;ij%Rz`KUNYfY5|mKKqc zk``$xX{AHp{?<9~`+eX2^WHHWXB=^}_u6Yc&wS>bznH2cJQ1$G?gtZT67Q1dR|k(8 zzLI$JrMcCo%zvjABchVyomW_%pe!AbH;+P!KinElSRbgj_xfY|x~F^cDXiWOT9^Y;#3bbrHp z?a5QGkNX@WS1kF5IR7O6@ylVY9al<@m0*-C+UUju8A3pg_ow{%o20Y%lu{;p(&i6(HUJ27kq1X zGtaW;V&9Tri(tGcmCg8-x2jTEVYK59UkM-GxJt2hbSS4H8I9DUpeWw?f)cg3=dp-=QiD3~ zoh^2rN}VlLeke9>70_$nt$#3-Q7v-Un6{+RG5?U|>*uZ8$dr$06^vTv=JdtcE`Dqn z7O?u*rHv;i6a7WFHPVW`;SY$vx%{TVDz@iL)Y98PU$-c^OV;kgf3UBR+dGdV@0}T= z;z~L)!)Z1PRj(rU`X#9d#qBa@?(7#EQc`qN4pD86N_ePv{h`D{keJi0si=FN+jBK)|DKz(N#m#{50iKp$#PuS zGn($t#Z`{&EPF1*570WNEoC`Uy~a|RJKEUtRmo@PK$cu(E_q3@)0k$4a6nwZbB5=G zYjuGp+8wv+Z^u5G{)qtly!2=(W8~hql!Fr@nj!{S%bMd80hvb`-IQCcy$^k-{b2E! z`@stoO3A9J%}h^P{~q@{Zlap{&ZS}_=xFdP=fGJ9`bqtXp49HwA4L#`F7`}tBYi)= z-EesH41^bp*1hF1KYXioysh zo(ue6#bTfOL&Fz|Eh5*R%W~x05n=%lPp?nEw7veRZSm{Y^4Oh-$YRXZ3v7|^@`6YB z-Rq}##miQbweR2)#Bbl-g>%T7rNx`8xKSptziR49@Nu$X*O=O0955{4HSewlj=-oS z(RO^ZA^Z|r523IF;naG(n4J&Twisw#VO8|_ort3Ck)yn(x2L=FJ4@94>5|8=tBFhr zm|I-sp zZVj|3v9rq4#vpIP*>12Z=UD3Y9Xpy~a<+rw=<~oprZ@0zdgMWO`Rm5|8l%jWrG|2} zhGEEd6qEd-RJat+l)xbjC8<^aWAmBUXpPSO9uV<3-XdH~B!D!0=CqiSXNb0`g;^Lo zpz^;i_V8OWGBT1Y6?t*(Px}oBkvl8LH%-{^GmMQr2>m3Csvt;)GTmt1yxs$)noqOO z1wP)Y2GzD?QMNN|&p&lMi7|-LG1R|RBY3uNg>r!M@UnmxLX%vxJl56Dz`tx3#cM?A zk{Xyt1jp8Dzn}SUOXb@sf@8IoH2WC1g${`y6i@o0*mjKj5xuOaY`2|_>$2aYI=A}! znGZhK-1Ofb;s5QUj8BVi#)XV;1>aic5u!Zb)A@#Yi=CXf=J!=zEcs58>m&c=H;)5J ziL22!z7e~{pM25H?#@}Nz%$%Je*4W&XBJ&_311FTW492!N>V@jk@62}nkVU7MQ@8o zeUyCgW`vEYZ^#$(mhbKY`%GJj>_V_w05zLFt_T@a8nk{$zl!(%c-Yb*UbmzB%Uv>i!_kkeRdwIpP*udtHOG@Hcn3Sh zZUp!7e2NLE6{N~JZrp;~Ao%uCNyi{Hqg%GKrk;(nVy#ht{Ay>GRgu%H^hM{2gwyXc z!x*J|X53A~L@2-&_l{^O40GwdF%b45cFq=GURW*as~0<`a$A<6G_3UCBi9emndD1F z#lX~5DvwE&Dhko_u&ujfJB@DC*)J7|N3(C-yqO7K=yOsEJgH~0nhNsr_{@G}zk`_< zrl-91K7H!|dTKB^;-*u)(-fVg>4snSvuEzfw{pdtXpQ&>e{rmI=9o~)$|n6XG&N1} zdlC~NdLQP9v;x+*jng(@wc+UG#KFrOXKkd&Rg9o31KT2uX=sG;SnTML!-p%-^v-|u z=M;gMTWGY=Zzb$5q$7po0s;hH1zyBfer8(MsIzIXXIOe zLaeOKl*UG$gwy9i1_iDtKgKy{hJVP(`<`zW#AKi0?dz-y($$@p(oI)j3LZ~pa^jYw zZoY=!SCgM+v&Dw^%j|nD&2awQu9=Bm2_YU8lT&+gaQw#xi!%?U zdks^ZzuHAblaeGCOV;NCJAwWCiD|=xNn~4c6@F4b*_mW?g9nofoHy5PzXq~<;!)sK zL1*+CuzljWwBYmw+pz%`DbWUCkqz_Y^-PNe&(sc&P$CMqT$ zA>1Ybun3TPqoGM0;756kahUA{#5#)m4qQPjgp}jVndf+sY^k%8pr9bpvLN6WS9)hJ zu?<+?U{n~th z1H9!O=oxUUaXlv)^1-4{2;*MGN}W3`x*3+n+n5RawXp?rIG@3$Y_xEu#P{j5{}^H9 zHt1i{H88zdz!@GF8k#xu^}t_^zx!NB*~;{Nmse}IO%*!seP-O=?! zr(f*1I%?clbY5@j{Za}lEgD!0VH5}5o;`|3AAu`{d-x8^QXs4BENo(6q5SUJi}NsF zX;;2?@4R7S1mRkWJ`={xv0{`Z#$AxXDp{bI9-S``mAZ=^0+*K`!O1K^H79BQ^84s$ zf};dFg>Pm|E1ZfR!K)1}Y62K12bZD|tPuozc=O%F*3Ng?B&IYfr2RE`7=$$IH*zdY z#so(E9?m??ldgIVj~}hf>I2`thRFqZ8BpAJ4k78vcU~8Osn|t+{s9;np$R_} zDtb*sgxI5)TJgQBOFrLHA5-VI1UnT1af_Q%jfso1M57#*NFVa@V8nb-7m~f6g4m^; z-Fx;70t~|oFpbTO_W1GGrPkhF4U0(Dg$bD6Nn*?~%op3%1mO}YE++P-cS8f7o~JoD zWG5CDmzG9hHiZDDZD@E4U|6<>1p#+?t@$`8?fyKPIoP}RB^|ApV-nMxI*~ljz903R z5%l%{J!Y3O*RT4WXUwGWRK(;|(UNbV@b0HkA%jryEa*z%97YK4gLSu(FIzpP0{~)p!_E^vA_IZ>yLk4sY(9d z_xg`vObPXWM;ra;og6v-YYao&KmsztibR{YRz#@26}Vczg1{*Y)ql`b;JA z|Kmbbb|hmZynqP~I2*GkpJ5@vAaf9g-)9&Y1~C-7w6v6adTPoYuYg&t>Y7o3{Q{GQ zh6WfDVnXv3gqN_+Z-K$}|a#pq|2viWAiU+;Y#* zZ$!h>=`Dd}gHUxJayf!A3IFE%*4BO&{}@Pr7M=u;1ND!#nHdG_QXWkJJd)j9iPYl-=7z76Eos00XYm7a2mi_Ue@Lm)2OkoZuq3}pcKXc_ zQ*=&a{E^TDwOBMH7e_3wzmuuv}+RrDzHJ;i-{4(@SJr4W}AKgTVku=)d?l6Hfn!R;pm_(Kw6 z&XbU-P<^gbUf|nwQNhQ1i+ca2i=^c4wP2QKo>dv~rQA&Z68i?eObzULuh5G3WoL*nDuh+TPXYgjlA!R>Q zyS`B>k2rXh<0{Eey?0=k0snBQqf*FdA^RV}=nXf$h5P`A{cBIrPfP9FzB_Suk;Eg$ zKJG5dkl`~H9z`V2zr67Bi8$rnsnV%!u9KFLqb+JA`n>!p0ZQC2!p7qbCs3AeJrGgIjKC zFcilC2zwwIN@J=w?hEJ9L@SQ*pu;^OxHZ|_B{yPIT7jB*#!zen0hj*xysN4uf) zBD?##>gJu7`FmTw|M)Q65imE^WYOo?aQVsIk^G@@ zsJyF}7)k<5rsdyJz71j9a-y%>QMIhw*1P=7PWD@gPbrzx)Ahc1@1K?IHAZ{inkm_- zehrnSaQMn=$vnROfk|s2Bz{?}Re5ctv998jE8o9c2q-7$uH`~-%M+`@5Q zOHx(!C|q^><0G9v*Vev;3Esfq;QPGvcHng?Aa{?AjbT=nHy}5{mLBGeaO&N8f|Jt+ zSwG?WO4Pe7YkKM>j=^a3(7**B<45c8%Q=;UKYxO=^B(66QlK|f>{2KIa&kHJz^R?= zO)Xd(869P~{7-wxq@(w`1kYucjWDp_IFObGdH>_ZwwB8=LhYru#_AQwJ6a> zZc^mD9)h6~8Q9)FKGrkm?v^@-1OFQw9;d0#cX+|Q-Yp8enR43oE4?XW_2v0^;1RWT>| zjp2T2u~9}=`c-NEjiHZ@he_g}l51Mj)C&oRu2U}6-tjFz$!Ly@ze|nTuJ50=Y;K=zQ{hyi9#r{q5SR0PG&_*e<$#HK+Q7pvW-H^H z%+q_P1xAe*hMzhuH2?U%GS&9``rLn(1fG&>lH*6K;<|f_9vsX?l;~Yg+%1VUVZb?qA#mXgy5D|uoELwE26c=O}O zB&b)ufDpZz!{G8yvQ;AJ+s*JGYJzmbIBY?(X_F7=QmlvW@#41yRQ}$dZyQP!|6=YU zRu9rhzw@0oE`g59Rf`T?veADhFPCpj1mr0}bn;0N?SjuM+5O$e9q+`GPeZTmahX3ZhmE;VV7hrX+2mN! ztr8j++f_BgLiKQR`dbUM6Jw_77K!pP9@&i>u50;o;~w)l;r_>&)zXHBs{^-DP@XcE zpj|7R#Mz#eP4Q{Qxzsl#A_?z^1L8iu)?Vw&SCV~Fhsr-QfYMajkgr+{h+*sF#Eis- zAbUpd_~(C5GDemPqB(*jp>yuak`;5_`t-xcE){m_79W^cSTI_9BN$p?7~4~*X5TA= z75;5;abJto-Zah92HfcdHuR|dEIdFo?Ed&b&~ElQAz0C`J+kq4PMQ#hz~&suBTQ(e zW*R@DSi~&QhNs*25DjIb(nWDZRNI)MK>P#9!~|y-eA-GF&`vyfINe=?B}~u`37>x0 zSP~By#=05sN{3eE{la>02YS#Kkvn3DiZ<{yNL~(Lw9Mq>WDu9(UUrRp@!3*A7oK3{ zWtaOQV53a0kpm0-ipP15PrD27>xn8{lt1FC7ob3j75!_qF>BA zVvyfe>=bb8cY!kKJ@cP1?>Jx?G!k{=^%0WEk9i_ODY_HtZS~C_`n{#L0lzn69}kC) zv@krA8t)zwTKmhANMrGo33MS7cM~!+-Ad@P? zV|4t}Kvfdm)y@IgFCq-*`@uZvBd6TiGu3^(dpJ}SsL;1gjlSs44{CJPp^6qq)W6y^ zjlWf@%GewF!|e0zKO=G*Hq9pB!p5e**rewj;pJva8Yj&goOYQgO5;;jgdHvf6e3_T zkWllQQe)%RExJAK{L^FG$DvofuejFdY=Qd@7>wV-h>y$m^Tb>ORb9AvMq!Hyx@_FF zpov6LU^km^${&Jl^zx}5x3(%EV!!bA9@mFA>Iq`34QN>(E-2bM#>%}$$7Ju`y~HZ8 zr$7Nf3_~EnkyHIwik_H~+Ij@?Xpk&a7 zfbeH&DPA&^m)rbrocB9u{Ba`0%Dm%aaNvQ)0|Sp5vA<(gXx-i12#Po6xYAFpkf9v; zyqU!yD;;EMPbSI7Q(+g(1)t6Mt~7Jg!a~W>Ez%flcF7GL2UQc}fug!#v0ndQCCQgS zbMXpz=g{I&cdlAvXA!~u(hJx#-`V2I#GEA4RCr3=_Tg~#ARpg*^tP3UN^h@rf|0>F zUVZ*)v|`pRqk^?@HvAs7{r&SKd8f^Z(;NRTr){_WhpAaPxIq-W7c}f`81b4Q8>zOs z1@&zud-ZuLZD=VGLR06joiQh<(NR1)s5I)Is*&oRm$Nj!5V_Y-%MxZrt{TaGGU0lG>xBanZ z!{*ZtQg+0j%G&3F5njpKMfe%m-XiDRgL z-(QhlI+91!D_%{vZprJ~P=p2Y%Xh@H$ved#b##hfm8zI{Ol4x8@}zFi4D6Oi$A9az znDvlRN>)YCmgArBHM6(y8(*54ikXQhQBYSoj8A=(GN*-aEcnXN!N0DmUv@~+YZPS| zI99PdX~Aat{{k&Jl{__(n)e(NdV3{MkAaE6epZ!L+Hl9DP*SQR^p$m4T(NWSSHA~iK~SEy zIVhfKIXfl_9?gT1U?$O1XV|W<_J&Y==6O-!%F$-agqs~ZH}~uP`~0=>G)H+>6kDbR z#jojHmZFgGrw%sBQ08nt-K(!Sy3o=nWys&vKlQ4s+vB68`CK7SgG@Sy#XWt;Gfk6kmVcL+z?J{;&oKk4CAh|-Slh=JAq%z?cUAC`!Y45l#*Cnw6j z-|<+=jy{-_4P`engi6pJL0unMnBbF-1NV{U3K}Fhvc+DI{orDS?={f9gP2lS2F*lv z#0+*DApn8*d-IQ5L?-pzc5W^|GBG>)fXm&#&$1dD4;(u9#rGG(q|=8$XNR>W1CwJv z<+6`Wz)&G>RVsFMe4ORC=BN5VzTIzj|I}_3Srq(U-oN!(VsS37XSB78v?f{pm(|A$ zVJ;6MQ0y4x$DX}3J#_*l=Pg;!?@RaTr}FX)Yy8g^NjXZscXy|@)d`!=>Tz(QL>m{Y z=3D+R3imzwPM_>~x0z~5_tOb>*kzv7+Pb9CH~3&)*F*SnL*A{@*!B=rd-fyX4P**w zUEWE5+>cU!%(k@ef!c6oQSBT7NJRym*m8Pn=L3tKmu;6~h64gr<=adI5U>4}6m%*( zX^88?YtmdbN2y9R6Efm-rg2_id8(jHKh5kRl(+}ka==9 z^+%Tzq0^>5LUX8;@8XN%!xC}}jtb>D4i#GdYC74zGiB6ZS@MUON!7@uP~r}CzqR`7 zJYdVne3tiYfYc=cg8PK8)-U$!@Kc?qALqvR;+GQ&OW0Z(i;UJz=7H6fl$utVX;QoE z)vgn0Z*R)DjNAnkRhJWCa2Q%quqo?PI1Y8w(rVDSp13< z7q#i#Z`Pzc3+S|5I@VdtN)F{+GoO_t7puQbJV4@JY?w?b2^dC3#(sUngbGbuKsd=W zT$pX+YMZ~JinCdMyO2sgZtcX@_PGmUHubc=2TnU#IF%l35WFOUmjqjB@9ij07atwf z?+6$`8P)S-)lkK0|JoL5dg&e0^wlUf1>NiuYy_1wWL0MJf0jn+zYaj-CP9pJD+NO5 zvE)36_PKNw<-P{iX@Sw049pzuE&IR&XRS>*+R9GXr<|7DPL|NjaQd{(=J^_bafeko zn_L;-@j2~V<$jB)??~7v!Om>0Avp&9Aq>u8LT-GyaxF7UUXq^4&?I?WJj$F*+Q4c7 z%_(`b^j}iaHy}y9#{&Bro<*wX3EZ7$vS(-Maofi7_-XGP1$yINlHg ze9oLadDVpepWHRmV!9&#uj8~Kn05r+g(tQBzDYl;$HK*%hKITdIg)Q3JLM#NLA z=@J|cz4KhlV7wu)SY;`-U;}-ma}JN@y)h;ew>5UwFS^jm79|D7nnbuP`E7|kUTdwV z8R)c)oJ`APEmh8_Gu^o~bEDn9^K>$~upq68yve!ti0X(2hwtAXp6&@NB;6N$sHT7G z%VVcZ#??#s^muobQb(7@%iq5H$}c#kH=?d1X`#J6%;CXaAQhT-)wV~ zs>%n{2CSVAS%XsGB~^APmR8=@zHVvHDMGpT>^c6MCXsk*A!f#v?!S*gmcUW4daq%L zUm8yuJlB4uYWJaey_dAKKB>-5o4oA??cB`0WI zpxnXVdlm_%DvNn;P;P8jbAs||r5x3>>fCfrj;;NDEQw=@latv8)0s3tb&P$iNLuo6 zJ%qxH_liN(y?2|}@b!ltwCcu%2k!{JY`WK0SYkph6%c>4W!cxi3Zo3X*@{l3(9BtL zlAH?>ol<02Lba6rq($HOLwUSz9q1siN4knrCFqef|M5Unr%!X*9 zga7jOwLhnn3K^J!W8+BolM>9d_c{fgE0N`uUB~Q>rrN73<*C*Oh3Fa?nINrbOOJHPG1Ic8|qNB}M;=UKgiG z5MO3{tg~4<-nihZeKkS$t(1?xt|JL8~=zZkU;LK zC9#qWO1m|-yJ^#Z&Z-VQ(V7p=z33hF_;50T7e0LH16}YC8{rNUDWP2%N`5Wo@pI-= zDUF@pnc?Ev!Q8LzD}kdfvie18)8=KXwi7H=b{BdYet2k3Y$oMMv0mWZhup+^v+&a1 zx#Pb+6mMOln`~Ljchszkqzg1S)!nOoDZJLE5}o+rS^xK7qb@$|e4FUaNb{BaS)_bE zXRiJ)#gagUStGb=qN_{%rT1JP0v7G`!yuIf!={hQx*`7eD%mNVy)^={&B904g;zJK z2Y*!sQ3ro`U%of4BUtLimc!r?MXQfJB!11_BS|b}zw0e8uT|$7DqKhhzsoVzYl9-g zg)VaA7>#aNVlPgb{!(KY85%0fD0A-u^cR~;&nYWr-;*UV?`ckRP%3n|bGVaLrTKo( z+}e4$>oz1WUcAt@ut>LMB<5h`EuFH6N+ZU`Vb+*j?28@Sw(SF#YNof?sHY&O)$?r~ zr;y~hDXU2Ao7n{%a5vw{=&d+X=s*4kEAq;5qFnM0iYt(vzf~?gFIBwZlsW?n(EAiK zm9d5eglEtlaXM7gADNKsvrsK!EM`u~WX)1oLQw8p2@awT;=hb?M%(Fcd1ez zJbroO*foRQu0?@vKkghZjaC{^oo(Z0YQH`1F#k@Ux;CAaf%P;6moC?a@!!B+A=Y|v z?s%gIiW9H&@AP#mxJkUx>nnF6A-6rAmZ#})=P*0d;e<1q>kVLn#molhvCi&kmrm7g zdO5^2GLJZ>uZE7A&>Qtx~>L+tK zv`*{oFtSoh=q&}T5}+>cRN3Wkek)YYEPL@}R(wl3g>!|nwuFxA&zMW_uxEl7NN>GfW(;vZH^^?lpC2 zPRSc9711cgDWUhY5FmyO%=UZ>sqSgTQ{MuoH4mm3cYox#dGlt9a>g}=LMB#L3bb`F zB4lCFV09l5oOp~NB(&R@XLMfN6ZrIxkfJTL-cAKKPZTRtc zgpM)v+XAHNKq=uCi`TCh%|@+g&x2 zBdqx^rIPwpkutq|kQ8di5EnZSQ0RZECR$>o%X-(>`Hpw-O zVF#mB7yo6lEB4Y0jA2<9z~?5tKi(NnG18iyp4gTr=2U0QJKG?ow9h>eBhdxV|DgB{Ks%OPF4*wRG_(L&mleZpmEJs@(OfWN2 z-0@Bb_-1VI847)!63IltSnGzqmq%>u)<<=Wj2U|l`9ya3i^VF?1+~qLvDXvfE#~%q zxO73GXiE%Jg8+XRJ>@VVrx2v)R)CcOB8v1DS!{T%DxA5Li&Fn1JBTh zyn!BCOoEc(iE&3uLj*?dXcddFB1e?;RO=Yg90Bwo5o@}4#*OMikFtZK-VO2h!6{N^ZP1JRyo<81^f?W>OwoovkJa( z9=h#FRbfe`>$4VP${OAfot-u_fm))?^^=&r)nc_XaEfLNSRhhdQApaZ9XnasNe0$-Vg-1Pm zPuJ%7@>6nH9AS3XK03Mvq_l*2251qO@a%^!drQf>Yv1;ks43n_(`PW=X9B7@-8Zrvu0vEDTSyb01)Z5sRO%&+)XGp@~VYwD9`#Ywxrm zY?+_wL!_k#s&~tXS40xak(l#@?*22d)QI_N7`j~riXq$fPp!pC)nS((pf68Mz=G?5 zFFun41|l$NA~f>WTXgx48yaS} zth$B^hd!*aCypvmcF`t@I&zDXq7{RB?QfO%4fB#B(JnJH#)5?N=p+%94M(4g5K3I| zqZKTy4ERMNMe9o>U*^_$(4Jd;RyrdduAZ}0rok8#5aHbra7m5i*I2VW^Zk_I9Gkge z$?(A|RO2Ykr&qoSnLyRStBc4gHq{DBeqN3qQdk zBw^Ass#F&j1Ty`%Q!^&_ZadfhwPxyiy&^ec4CC>J#zFkq-4|&)ryX_+v%8b#vQ- zX*yEKRJkklySXygg4Yf>E^4)5OxH)pmCWAY`)+(AO?gX5V-}=`+2&VPX zKP1N7;^~gDZiZrNF1)uYTjwQ@G6i$>6L9WWi;ZE{SbOR*;vecI9mX5M@+atp;Hp&s zyu*m#xBho-FLAAy#??PKSWfsX zVlsQ{FZF*Llez{m`nJYM9?eW5nTNCN1%D5XM}KOY|jxo3a2k6Y)KosD&B@Y2}X-Q?E?q@$WO?n?E#(! zO>)Ls$+*tkmzINaSq2Mk?~FqliGoic(#ff|@?jE7s&q|xnaHXO$dLJgBVwADhODEM zr*)b;UbWvpDhK%g4LegB9|>hYu%W}OO85LVW}nc6Z9Wej;2SH9XNOp`N8aF3iDk$YXZdhWXY%>rwWO$PD8zA8gXB_|e; zq{{2-DL`aj`NlBZ-~SloP!LPocRzJv0np;dsulpR90QtNT+on$#!L+DW9Itm6~=ER zN6-?Fu)e`iI?x6%%W`mX()73I9lRHT?qIH*fx)K4Gs%DWZ|O2i%FP`KD!x!0v2D}D zHX?`a(ug-DPqHb^E<>(bjIV1|zINQsD1an!?PU?OyskXsvGb=-KNIk<$;=tbQYdzQ zsAO^ObeujXrre}ICV9W7br>obDUKyHwtBUYJWvx!>a)HTSAOpXJ=|o=P}%;#55t708?^EFSb#^_v{#RKM;@Ss`EXrc5q z2;c;T?kXM#+9##bm8o!E>!ZS^_?r5D8`GYmkYc9$_c?#*1<+g#kqlm_kDE_i5t{Q) z_elt4CW@S9JMmiAEJ-Kt2d92r51@F#*V|kDX?<(3vq3@YW7RBf(Vlq~dZ+ra&9~sz zi^U4L?A&10SF~a2YU+2dYaBpFI_;(Ui@KXFA(unAd+b*X0)E>T%j9upeMap}GO7{g zODPTyfT*>;o(GzvY?5BT6BETrrMHKlg4VD2i391c;n}#1f)E3lKVV>~>V|-^R=$@) zx7AxVr7$sse@gzVc1XFFMc5?o9Sa4CLQ8|y&aoZhYm36))43+11wSmsGDj3%tgxaA zERhlu*XjQAV8_;sIrhemRe@w7$IhIw#d9}l>B>MZ8WtJKs;hb|wl!#kpMujNqj+k^ z*U>1NM*_>gqS}MvP_V7eOf>>J>T}@zBZd`;?HiRXmwqBtw_@+-%vwmoAaTTYJCP->nl(nF7M zR=axg7H7Tf(NJ>>ot{)1xlZkj?uwW_p`~o=XL-8X<^@OiLoH1B@;1^rc{$_IQXrY! z+g;!H#HE}{hRMfoF|NA}(AT`1wR7q3!g(8G`^AtT6FGWM!-((!x!-4TfnbYm`vkj` z9a0oS<&oFRqbV5m)L*r_DO4V(zXh=)c3w97`>x2mD8;Memy({^Fkl;%Jq#%*4RY9>jw0TL4pU}v(R^lg=_r`>^t=T4N1P4L)Y9F$6R%}U}}b^Yxy zQ1$f~GXXV}eTo|47fPm48E&m_;;C&D-ZARf(EMfFo^>j*tkSQkB^e>Cws{{We{f#= zc@11GnvksGX}onYr9#=X%WBbv(De`Fdx$CHv%~VS2`;9{+2XFfAnPu)^#qCA3Wn=< z@7^Wm*#`4U9;TrpXuSh1R?I`^7JQe-CZ$|dnlAiro{4m zpRyo$f7?yg19uW7HP!t`=wEKxZgs42J?indHL_Q`h#iq5=A8Ci<6TegL&6vXeh|7Q z9&JBH)pOWeH0)X9B7++mN1fZr%mv*XZ^s`GkMa3JZ@d}RcK$CK_EA^L&`h%a-gGtO zop&A0jxI9`JfyJf=~AiVANYZZvFm8cG~{-x8HRHcU6SSQ*&53lDVfCk4WH$VJR4c* zG3=t_DCL{I(Ssfym>+i{^{u2L&uJH`XH1lzdwo+Pt%evuL1P3-p1N+wyvRc&%JSV`1w1hJQ&PxhD z?jg^&F89K>S_TbiB~>Y;u5YjcQckjZKQN!w0%GA?vfjhzXVfFo3Jb>d_9+55VH+;E zm+C+dVj7jtDf}6FHrfl5nk_hbRB=gFW)6U6?*C=3cc)522ZOva9l_ z<&4Xc6W~~K{)=a7&t6hF3?4w7Lz0-5uAI(q<&^`i-% zCMWM4;Zt+N>TA@EY;m-*B1}03-Q5{W5-uX+I(d?Z6vz*-F!qJ}^6+#bP*b>cdHx7Y zMm3r`(orN*%9Qgbr*h7HB2=ZR?_9i!RC~6nZ))(V((A|&C&#lV!ksr}S8B6T%XuZ- zg^MCBp*E)0G!Y~T6k!`I`077fTib#ML40s6E9+~CH)l%qonaMqzVEU)4_V^50-0zg zQ5((ChJZqP!yV;ld(Nso>$@OFy`P%qd^p2V^Lw{nSDdA`zjq!=eBcQB@`aMh!NpDn z-7Z-L9yYNWfsXxlPH$!o{j zy&DkXefZ0`9j>%y>k5YETCVF|u4CX*v@>gEJGD4z?G_Y#_Zf!{5ID4Yu!oh9p;GqU zGJ5w7uNkt(XvRLY`SC*SBp*;u$W|*M-#+w#{Z*!a@Tk2cy3lvg(c(K@9)04*Uwz9rXNY|Cd(h_ z>IzI7F3{1|DVzH~dUtQWgta9%A+Vnm3JyPRi=RJgelPt_p;u1s^t=vl#eLiRffmt( zu>_&;hvFO?`G>y!9bjXfNyf5BBTj#2c!&Hf4=hU6pIGOW7 ziY`ZhiW6A$j=r5$cRk3{1cOYrrZq*!Bss43CE-w%n!i{U_R=arA<75tV}|)DN(o2d zc;F5-`8^(*O&L%a2YNoMjgKv22NJixYCE{2l6_=Oe_{ zLt-MwyZ)7)Yz)!~Io<|cxV=3|IN~r_g&I|?93xMW;-;pRsJM7}cXt>(p&>Yj`%XFR z1a&IrrQ4igvUF|mT8*~PR%lM)IPjIPNxWDS3ykP?u+80_l@xl5=1DVHM%jO?(_3J! zAm%70h%~wEOZ9Vzr(I?vr(|1C8{NzUMAAFJ z2()p3p*9w}c&X6~^h@wMUW>gs1^MvTQT9zwzZT~N2(3ZTKf}aGhGhHhY`#}Hx2t28 zODqz#>FeFz2Jf;sbE47aowRc9rTHlwA2dX5eyck`taMIoBpyFcOqrH{bNf|)L-Hjw z*~nB6$Dn9a%@Qn0kNR~2Wa1B5&RilBRfixIdDcPsO7itt?EA1eeqHnE@L>i=mH()V zHykAXBiUJYSvb2bd1GpRJCsdCHJd4}`9aK&lwhs>&!7KKI-*AwH_YB}zH8rht~KNe z1mm;X|Ge*W+jB=#{uz4l+eMsP`Jc4o>ayYb#L<+hiV6;w4M)PHk$&}F$=dWKLh86O z&i=!n`Ofdz+0TuQ(n9l61lt%I%|v*uva027>xX=dsN%D;xmQLyAI=Vm2C!>N+1nR5 z-cE-bESE*EV03i!(7)%=zu)C=WDTeC@aU*3YDdhrnmu_O{rZpj`Gk?=ikBW#mG}!` zM82|*_zOWugvSIJnlC{&ujO06M=(zzo*YUpz31)iy}Y(I2PNx@Ozw;4&o4ml z2pJRM5)Fya*8ZhFmn!H?(d($Ot;q#Z+8+h0<P+qW>SJf^IsX0iM|)G+JaL=dG)XQD&~_XpP+R#2bOiJ87VQ!0t%ZNP|X}~ z|3j|-cV%sI36v%M`gPCL%&fD->C)C6s!9?Qvcx|^Scg=Hwziybojr-k zEZ`8ohhFu}*|THw@8sY>0C@q1*vn+&Dx%M6F!?>> zk%NPL^!44inYU0WDQDmFZWaH!&(P2i1h!}3%W#W(ga~|ZOO$8$CQr89U$#}F)L9bk z$QT>Ka~={0WZ~iykX`=4(ncHp+cz0VU!~zNObB!F6bW%-b8g69I>Fne&g=JWZR7D= zB*HFwqYw6#&$q~a;SCU@Z}DbFclS&l_;pFsIa7L zo+^$vU#-_t#H=`CP{7We;uCW6@}L5b0!|@B%y7^oJmk=SB!Cgn#RZU*; zr2#~bHND>n$se%?!BoalrW1CSK-x^u&0(ah2NziDU*DeKR{VyWd*;I_RU!+Z|&T0$!Up0pM=G+Ln5 zd^@#3Nq0MbDF8-KC9C7iKk_UZK~tgOzUOu5LuO`XG$i-<=&dBsYLFdfI#0HiaI;^NCtGwH#H+=c&HiQ5{Bv4; z9*yTyK78azC4wdFD_FMgIid$A7+|Yu^Zn+-px!0U8lWNIkKj2u%v4Coxl?+&u%M9PB*os3#{yUJ|GT zUW*x2vDsVb^md3s>2X~`g1i@W;b6`e2sMOqiBOP$8LRR^ixl%Qp44qfRC89~j{aU) zsK8hP*xdMdd!KYy|9GENUS8g~J%ur~#SqvAY-obOQ0FjdXCcJ&kS?fT?#6sEPfwAZ zFAgPnxNx_psS`&d4Tk*qt;~05x{%7Gs`3!>8+ZVm$f8-zHfp)|E$YeSejD|C%NLM7 zaNz(b*;qBfMtGf=$OxZOAB&{nE{jrqY%UVw08G!Xg$QlCY@$;&*Wsq=eg;Qo2TXYFrltyO=I_omtri=;ycU z5V_6dhBz@vNvv^Z1*|+ZF3K%_=VhOQYiyiqg3l#^0Z(B2)c1_7v2rztKiR8XG{=q+ znz1pH9H8@-n;T9A)??9Jrz7CHh`bSr@e6VpIyY2vO%r)W`undS24=UDn)Vja;8XFma(Wqd?%atp z8WE#ocU>_v6ly7{sj=x(lamP=#R8Ddf2piAHd}j_Yufn~mTnlg<3kDk8YMLT-wSQi zl}>oo8BDRNW`9$S-?)o5j!?01@;=`M|UPWW#G`;#J z1?RAQqTE@eEo}Za0Gs#1ks5D&g6os6p5B@5kKimLs-qLFw7b6xE%T!9QN$C$E+Y}vY1R7xriHrTT#Nua`G)2yfur0w#iW*-(%wP6OoPNq(%6^@`Hntd zC4sBV|D*%|rY##ZJDw@hBi$7lXFZHZhfhS}n9Cgjg<@EEIIMi1a_>3uxUjIW^1Ys< zrh!jM@D$R;YF`FV$DHdCtVa$W+SV=Vmlk z1$>(ZM@G(VPi_s?vl(yoUTkAPRz#wvrna(A&)`MPja#>%2CIW}luZDl4uWh<%dU0x z#I?IdoLpSK>8o1fODB?-Sns6WB~hK(I`f+gJ1v5S%Roy{?@OcbrUdZ*KZ}bEN{Pw; zCm)Y&VA!MN-I@0lKKyQOWT;}E30HYO`*W9 zxV=Huu`w}TVPP!W#lQVhvw_7q+BTIKF_L&EosI;$xe=)3aoRo@_`F>#fJGFp6fsT< zvODjP>oenP)ZWoHGJ1{B4Xqo;$6vKT8bGu6@(K62JgTli@2*WgvrU3-I-3JSVu|^#h7Pf2e z-g7K05<*|F>uflUu*r93z8nil(>cjCBm8p%2DF*fFbpLxF#0&$^YMtHt4%8xwU zJMuqARs6?=OjULQgROK_H^%ae)peSbzi-D^{7*4 zQ?k~YbB#Ghj~?Cq{q*RlVy&|ykni&dIjaE=0vWAg%?n6x7uZf95EneaFZ~;~)1OuL z(vSjZd`G<~4QVY5}*GEgVw^YdpaS5n6QT4V~ku4pio1{x0LltxZS5#CeT~N*H zTdWPJ`WZSyTfrsHxVrfTXepDl1R=^>zwUh&KiJ@wbaaE_dQtrJMut=DMi^ZF;`{c= z-N=n@NlE!oSL)lDxkpZyto9|nRDh`ll9H9nPvD6>1#=F{V?_ocY>GIyY$$C}0_G*+ zT)`%#0RSyHQDs1RFMv%AMKKo9l8PDJ(a%{OS)(;Cf^ zG~^1c0hF*+CaUbqo4}jsgv}7K9$k1|KA<$i2f8?-A%XTP;d*_Vdn?nW-=jbAN2nt z0R8~D5tm>uMFg|R$rK7I5SAYlPl&+ep073<2O=@jgb3Cc(mx1pCm0w#{qX47Xp><% zZb%f$PuApI$A1&=GjX#eERmNghsLe#aVFR@kA)CHaKD8ti^pVV>V_QAB zXA`^1GBx$ufdceMIZHaBf^UyDpu8m3-u3!-0)i}{;YR3aMnQ=x1)k=Fn~Sa!m2?qv zB*7|i;uYrK+sEEhTIiKqy0Td7 zxL@u$gchCAWEiKjgYXOLwHvCmR_DI!-heGNj=~&|>Qciond_Se%G}tc6CXWdR$wdOoPdBI-Bn@ijFyWnBXUL~3ekfVD|2zaNWn6@JeN4DLuC zf%Cj*lAw#9pC7m@SdeD+fwBZPqc$Qas7mj@+deuP3w~CAs^}%=XJ1?3NP$#dF*7qG zPwZ&d9{uIs(@Z?51xL&Q-<=QuNv8u{%Wk<3i#BboW)6V&$U(El$sWA^4zPZ(NgDiW z@aD7_xdQi4K(~SG?Flh>4zmFU#4m?Q2G05n6ptZNY1pSs1!}{?2@4Ag`8vlyKJ1Z~ zmp8-*#u>ivE_boRt5@F!2UYUkJ3<+T{WDB=#;2KZ9&7?9kJo7@JHka3JSuo;d0bk2 zObjbbFQgs~VsCk>1Ob3-x1jE4+0-SFzdO8KT#P|HrMrp8?qqeS^E5$8k97c zdJshPJ|RZH@fEzv;hpcAeA$1^od@Njh|H&7iBU=Z*Y1FnFQRB@RdRrk*;hNN=uG}% z@a4?TA?}^Y{^M|LUMx$9;%3$RU^}}Utjfn-WW+(MKoU*K-bh96e8L9;mtttpk_~b& zP!IyeU_V{KpCjS#W`)lBZ=iALgX8w1Wq?vn1T)bfdRQ9(W8iYpGcfppE85Y~0mrCR zkd2}c6$@z6lv=8;c!+#r4tTm+kw*bI&_+l;`YBe$-di_c9?SqGFF&e5?47=m@tvtT zugNY?lA{Uq1;*v(eji#d|}VV-aTGtuDKUTWvKW8Bl9_<)q&&RJ{cF#a^+Xez-wm`mGkjqP8>^5)HG%Y7xc8;+018NRA57;I2CcF1hQo2jAvpeHu&}bguJ)NnY&qc`u%EYL@rIE_G#($Upuz165#(cO)W6XKEj!xmuNi}f2 z^-Q-jKtQH^K6ldNzp$mGCs4xyDI_G;%D5zA%-iq3dKZOET{rF{j`j{(TSD6?ZY}@V zlHA|llA_NdthQP??@tl|QAdSw`ZQk}W4)%T8GxNFMo|IK*rUzYn`I!XS_?-WCkxcw zTepx99QA**BWMf&>a%UH$vhl#L^5hnr4xLt>0q3gki#)PG5)UE7ucAWiZGu&xg%=5 zJ}3bCGrw(ilN%%tW=gues9oIVpu*v>P!rLvfp7+j$IK${6?~~UcPCe=P4Z9pCp_gG z-mwRL?HMGOKa%&P$XtNh^SOBEYaj(sx-x6&l2kyXGZe+e zFp2@jjbOkJQfCmIGQ}?*6zS_1q#(WhWI^XoP}uYf-UWM$u(57Q z5rK>B;rzUH%=)7{>r!|E4svXg}25;G1rQ5?;w}iRR-tp55W$X44eH`KZXW)viL2Pd*zH1aj(nh@1R8ab!u7 zNeGZ@ny9GrKBrV?dJz!xImqjRl-NM1n+gQMJLBUa2J*qJJXkl`8N=XB-JW!p7^3B? zcb*EI!L_pMY6Tlfh?}iFXd~5>jeE|7v8g%up&CRFsx$_)bqIYA@guag!^rc@S@#aq z6NXQP=P;4mhQ1M|2}h?>`+7-36)5Qbz<$#6>ZfX@;u}}}Hs<@%{j##L4vvZSR0dk> z7KoG?5eo3$kA-1Xv`}QrEzEB_Ae?oKJdhgWzE2wzgh8=fnngeyrS=WJEP`nVwpx5Rj|4;q>L%LBJ_iwcAL zAJa?SXB7Q@`SRgvpDuRN)Hr~6{6M4ay4}xwd3;}w8WD+uA`=Bg;ps4}5gM940LWK# zb8#u~83VZxXl>nL65@8V$iM<$0-e`zL!s%zTq%&9?P$*`&3vJ>j>kC0mRQsP@Oj4r z{@H@0!~Bo9e2w2+Fd6H(l`rqJe2yi9_yzG{ z79pTnGbbiw3jojzG#tHGF z(7OP}Q0A=i5dIUm$S0rqF|i?FghX@v*!KV-(ZW1>yl}62rFqX~;Zm%T`-(jV3uf7# z+FOvTZ_+nCwY8Upytbl^wdBgtfYDH;2DWZH=navX8(7M5b9;mug}uT@m;vF>_G2tGldWzt+ljw6-i_XH({k;|{5A^(kWk`x~n-3U~%eSM=vZ zm(i5S+-t2 zx3A-*N(qE@P--C5JX`WE{T>ft&Dr)imNY;wZJmVrLZuB|wfw@d=9IZ*+K`Dn_3NMG z!cbqZ@w=ev#kmn1lS`-jyII+?imtiagqZsTw|RArJuiP#*YEJDpm?G2>5d_H2+Mkb zoAK%y@i9ly`<277j*?qCv2s6S9+-ZuKf*>h@PT|B54PrTvOMKX*9su{+pzFDo>5Q3 z9iN|X>9WuDZk>-HaSR`S{MIHD@^44$tKGG}RrM6*FXyXDvPWqcMda@b-g#zKR{E3%BhY7^?x8J8A-HUsW@YXe$E2UAb! zwB@)fc}2dg#3Jx}QrcX;5GX6v}D@4g=|axukdL@0?$vYhZqbL zt5FV{0Ucta^OqG~?Q2Ldj|}Nk%x|xvKa%$unUFxDxu`$><=){atTV5sMsnzC;X_39 zfkM@uG+cnL|D_gx!K2_f(8j#wU(cuzu{50k0EM!a&Slj4^+^zwYFk|q)D3oCTl*5u z^jf8C$YijT3AzgX^7SpfrRO!|B-`oFV*vCm_4piDbdF=;_8fRDFlQPkFTCCDdS+r~ z*j9l*j_hV~{QRa^9D`ExjEy~mR(QBsNm?4Jw<2#zwt{7?(bK*5Umf(uOxz%TRI%NRERN(IzA%*WS$2Cys{X#ZiSMx@6e zY2+Q*y$K>;ax7e^SO)~$$^TCFrcL^8Kf?BdzI;nu~&j=HIdo1CR zTT6UoQ#EXQ4jb!L#l8l%suGqI&&22t9$$MmITsHmcL0eIl2c28u0mt-IWLCSIUG`= za~$T2-u4ovrHP zx^`C|WilFpE=2x3Wh5k^<0Q3;)R;kIq9^aepvtzS;FKF~Wf~nR)c-J3A5i75v|0Zu z!prU8C|L1x!V{QA(3`5~TMh#)E*+mDp_6KYN2fXRj07c;$NIR`9G{#GhlYIi86x=;&Gcl%&?I@%t5Hb))?yD!g z8w5z*5Ww$1Co}^`tiwMa9BK6re*GGW8D}m1BZF_x4>k73>9)GyCqo5qf9r$ezW4v~ zQ5%Gi+Hi0gM>X*xDHtQAd??AqpsFyq@&@nVHc?I6e(H-qsemQ#&9R`D+j-~#0!E-s zI=|h~Iu!Y;BISfDXz5IQ8Mq{J>S z2`x${^FyGBCv4#;#Aq_Zk*_GJHe>Q=?LtI{Y)8ggDpKcPC77$*9U6WHyCE>LDH)qR=v`21SbQ= z(grxQ!XL`o=0UC`2f+4-w!Ai_xAEC?4A?4EKQdp(r&~mpa5b~1j^VVN{Dj-J$sJ~F z8n_{1={v^BJQQO|Sz)TONyQ`vi*2V#ePv3k@oE{wNpJ zt5J>%j|3lNgJAc9o?^eKox`7C7$`Yzxi>_cdRo4gMBO?!rW44|s9l|7Vj@VPbjxDB zI04x2k|E=TcKk>|7R+WlBfjx<%M0I{ej;Bfef9H$onBy#Rl4! zfPmQtKHtcqoi%fT6b9TEwm|@X1`6g1UAY2w3ATYs!D&A5VGJA=CoEoOIl1~$QHHfC zpv`tjpnp&>E*6u-l!4y7NB)bP6;a>BeNzAkL9Hv&v!s_wd|9i61@0cHQiLJ;1jThk zxZXp8W&k5qN-hC1=f@>$Pf!#7g0TP>>mYYV?Z&$GM{VQEHxSaKmOH)a=0|WX@`ksx zAPLMGVV=d82s(b)Mn_}R<_=0K0`YjhHf^f|(FBnW10}$CC_xe}b&BzY$fi|q&m3kJ z#rR9ZSCRE|teqavZ02`+nTb_&4QN3LBX1b7=1Kp7LQkdSm1^>-lFVIlvyou{)?b9` zs1xmVlk1!ssBiV+7cOH@r-h{*RILo>TU9^fQ*9n5?=H^$jzaqT0hHDG?J;{*(+h}F zWW*Je&%Opm?KvkwObSeH8}JQLu2viT+i@Lf{yM}kb&&>lAUfh`G{7~)w%#$yNnw6l z#2?=Io2MThAzVKhiY0^Xggnc0m^j2so0FwoNdQ<-|MQ7Tq7L|;NQVFb<1w!8b_ckH z70S?mc64DmT%(aM?r=ImH*tV&Q7op!wSX^jZvB>uwY!WE$WB{#c zbX`?Piy5u8!>cSHQ$Q_hI}XoamrzT6^eMOH>ymQ2 zd8nHCnt`8GaG&Gp&i$=gTC0ArA}H7kdPdbCRp#Lhz-aRz7e8jB>KBn5E`c{=e!|l! z?lxu7E!ces-N|~%kFUVq0N!_0(NNs|Pv(_{5heH2xL!Utq=}q3-)!35_GKs6Y(Y5M znb~4F4|JZEUW?w!e5a@@766bF>A3s)($)7*l+YxH#lkCFpJBBD z7kEn_9<4f<7K9qu#@-sNGOQMw(t$Yd4Rn|6+ph~#T|xzQwq|RaViPp>8Na!tzk_sO1g$WrYiYOJtLed04ppMdzxqUK$=SQv zR+{7cUjZb=( z;B2QSm(z77mBJB5YJo9_>m@Mb@4r=PjXzOWF%eZ|Qh0w$Wy%oOj9kT%Xm2RjHtZpX zbZ1wa+|fPrg3lGZ9XC`$A4MIA4^{$Jv8t5Iux-LTD z{2*iOd4{O!7`v{opo*vW+Sz}1Tru`p$v7=j-kuqK<3DijU(^r}?R=+6_^BKWi)Jmq zA*lb`&FDBf1&K#nnR*8xNOQ;}S$eJWCWlBfi+Z(5TQ9x1@bz~$OP@UMRJig-WWYW@ zZ~JIjYrrACG!KBmum@m_QoeN$xJ3eBSUlg4_ybJ&RT9UfKLftBtGU?43D|KGe`3CU ziZ-Z~2d#A|kMGM5N;-)m(5W`*=R&TaN}NaUmxu=tdG+Zq_@-ctRGU(XK19KxT~jbW z%`h#FTa?25KR=_}bAHoPsqcj8D2vyztGD9uQQ(6KL6Q^}y$lo8l7Y|JcBu=mZK zi}Q$_l@AF|=|Cmh=M42ZRld#`YgO}Tsw{+dleyz+(FD>1^RYm;!7jC#j7~AoatZ%7 z*rl?*C|_EqDdprp6r(AA@+?@&4vgyNZ zEFu?zbc zmD{Z&x$JW+x6A<=&2fHaL!W=lKdQ%!Bo^m1~?+-G3bSz>XKNRYK1r=+k(!^t}Ap(F^94 z*xTWKVLQgo%k6y_tbI7QvN2n1jyz)_DkBwy{`_+^b$c6mm2gtC;4p;*$Idg9I%%Gh zf=i3zDuC6vCnkRY<&Uh`3I*9RM$Wn`vvOZ!zl!McPF5>LH`e|B(rFMXz7lesXnR4u z&v1!LFZf zJ++x7SwqU+f!qs)%~GqaCu#f;gYLnpFj9kgJsBG;NMgVD-Fy0y(ko^GTAdYxT{g&w zFWVnQbOi30Jac9`YWqA#WGFP9MaJqxx~s5gTU7bt*<9o8Jm#fR_TsHa6%|ubk)Bq@ z`T@Wt8K1C3niaxPo%N(=!$C0fI*(4r`eoPXqoWUw7)T>VzTaz4pyofuRzEo6{SG%2 zgdUMi?!~gPv4;jrx^QgOSfW8#(FXwtDP{m>)Kzmp01_b6w(Lu{p%oR79Ny=IzPy-P zW!Uy}MBA!IQP#CqAwbICvqLZP#AQ&M+2^b2qtn85X;qmZnajqEIY#shMt&)eNInhE zSz`2M8xF2MSul}89w0&5WQ2!U)>5tN%A~x8WAtMFVJRX)LmpeV!PL)_o_#?x?0%ul zP6zH;$aQL(o3p(_KZ3s1jX=b!q;jR?pylw2HC&fIt?XJkReNf3C(kR?CTWH1klqO0 zf9Ic?C1=F}2N_CRUa3-o8q33qqiQY<9_5P1*H5zsPIGs5^&sc0WI7Fug7pD4W9acm zl&Bl?dVI{9@gU6kAUtnXJ=&R9S%ZE>=^ICPHv~Y$;Eanzj4VP3!V~V@x6kwx)TnVl zM>t%3V&v;Y$Ku}lC){3e9mo=ri{qRuy*H*NYk!iy0U67Q-1fE3jDUlP9U|2!ZCSuS zPcgPPjI_kuQt^FdvOy`g`>>JVj}St0#d1syON&|Ik7UeJ3Cf%TNXduq%7Z-1mPUeb zivOXkqLH;=9!&`Xqcn)HDZRIXn_BwS=LIyjO^2+yi{w;4z|qa1l8YMVN{2aHw41MkRir%M)3OIUXhMa!n za;u;ga2q%z!@ECvan2bJ_5lM(7Cj7d^@ptlrZiq2Um%>RXW&?w{7YD-Wet5$l8qTU z%2=*SO|jBZg1+#dW)>SPMkX0?rb{X_cg^?*qKt30nXxG=z3@v3!(=y+dD?H$S5O-h z$)l!buBbGqdsie@{}mmR3#`#6&Snq6Ik}VNI7D_c$rG+?Dg7DigX^E)4k|%|gO^8y zNbJSDYOj%TxsY8%bFCPlf<|#mOJ77a8HxkchD^yGM{C?_esseGiIv$@m)(%iR)$3r9O})voVulM-Br;g@3bIup%N7cJNI#gZfKMX z)&f`{gkz_5Y^hE8D$=MkdJ~*72vdE4P_IO{L^OK^C&zbA>CsPZ*%ABeN>A&$;q1b< zo{=*Dw1fL7$53T5>oBqQw*Vpo#>JtaAY1)P=X2e0_CQ{ETfI|1Ok~l7wQMQ=-n2o0 zgr8pAIwz`a@ox8T;m?TLrjGj{vX=N*sj<+XGdxpMl?V5ew98MkGv+}!eoMxUi0I%S zpdbCG*T-4Lz-5iur?cg81?^b1`00>%#S`NEXxlyYJ9SKf(3m}*F5J=KOQwq~3Yt7a zr)o^-_Uh&GKr`CnzR~kj=Rb=UMrsMpPD*Vfxd7HTvTSeTIlKo91+P@E5y~$V?p^bO zFQFrwIJGiD9H#}b3KyuT z^fo-|k-i5eTA_{G(;{Tg+a4XBD;31=da`5?DYF)Hy;oFQJvwidP&CAd;);GBF3h06LdCrq@<&Vd&NW zx)8d#;2 zXYEc4qRwXuTf;i11h-?}_NUe}yJTya9@j8TirW4A`4qW8^5Nq@RIK1Li)cT#B zT%%@0=nQoy`<%(-Q^*13f33adUXd|we3w??R09E}0#iSfK*X4?+oEptgz|s~^mKLQ z)Wglm;6o<;e$sOhUx4rS)Oq*zThSWRb?y+lxk76Cfb~#tp!vhsH8~D-lWdk5kw+a#QRzOxFT2U z0=X+_)qmmwz2rQGdKn%J3Rj}Z#X(Q}rrkvrIQL{|0hZS`)38|2`@o>PXYAfH}=FAI|0y)O)C3m(~6 zeA+vYwbCpH_%@!pDdZf-G{KP$2RXd_{I~)K#QTGwJisbVA8y#+wESEi*+qzK8QKfE zVykF^|1mNa@Jzqvz7bv!^&4m6K@!W5+GniDCe3@9@7dAxV>`Yh`uFK;;w`ml=%)#4 zTS_^U+_cL8= zOZ(JLUvb4MyBiel;H-bj9E`It$po<>6IM)-j}AhLCel%lfEOAFO(oX8Jr0YBk^pvE zhb5<)xh?>Ul~6XdXlG3e)B61F()7*w&S>fRFCbwLNDWX9(Ryxu5!BGPZqlGYE&Z1) z*h(;I?3A#K@ zp|mV8LS-1>ZkbNbwWy9}gVzC0@-!4E{F(1#7uClKSJg#c=*Yau)p1S5D|OY;>-Kp|8`3fVm% z2CF{PAcKj9B>rat{QF;PX*JA#M^L1FY}p#ua1@{|%Q9Lh@h}wLSqzwq0?VCP9V_kv zsS3}IZPV5}cc5C~p;1&+3RuUFj;`2PxJ|?4@=3TZbJggq|0V}alzVb-LMmV?N74+E zM$ohC2U~QSGmiITL{2+0=6bgrcenvaebAs;J~inBJR*rg8kzl%T`4bp?Tl60kPL>l zh>;>lpcg}Y-1H#Fryz5s-nyRjZs0PokF(w;4KeLklRHJKy)VjE%^uS-DLBW-9I; zw{Pk{M$`yjuS>KrGAD9JfK&Qt4zC8gvctBdWJ0VU(Xigys_nt9fEB+v{|#GS@_U`^ zT$^~u2 z1F01lxu#0_7h#nnyFI+>>ies}vh1Iz|PmTs)C;?7WwK#{A4R-x_zJ9abxhWJYS zHEEEe2Ig~zmAZ7Te6@nOFOswc@^Xef#1;C`+Y2r2&~-c(dRhRxfgbW+^u6-XIqf^> zlOfLf3bL9gLx~->$e+N?8uKT7HpDKjZt zWTyxh3UbAL1k43q$Q=dP^vUj0I`F1pEW>!3PpFNJLg#~h;w$i9l3T_Ubks1Dx!X-@)bTx z8W<|b*h0Pn@+bw;6;1Go2r6XVAJ7svc0ZPK8SQE$LQx%(nq8E^!eu-*RXx=}%ro>| zhCJpk@I=7tLag2TR!t=!p+)lWGh}nPVad#$1Z<-X)@#3~ei`F-pR&86psetNN^(G* zHhY9^Pc5h^@x_|ry^`BQBZRVnDX?o!+KQ@&j&}s>W>|{`r5AwhePtS9t z5aRd4puX&`eXBWb zO`IW&I7N6KTa!aF%r@Mb<&?@SX7HP@ieQ9lUD%J0Pabx@^}i;15&p4<9EZlkn`?UMChy3NxhBReVvi=s4Uqn?x<1gza+kY0Cz~>QyPCJ1_Klr^~%w8aak-pJ#MrWaVKO zmo1GW_xOhHOUoCRXqEOb!jc}~EIJhH%2Nw{`VrGsV8Z=Pzk;<5k7)Z)+9} z8eK=>O5y4yn`|^tW449GCHZGL$~WFzjOW8{tB!~uA|fHlbE7sW_J_*uNwxLo#VfKs z*Yjy;j`Ftrw>Oqkbd=JRnAkmOpsYSMtFTnb<9)c$@*Q( zdZyo%&!7DBWAzBj3s<63-n-d_Ab(RgZP(QGO#Z~0bA7QlB4%`c6)8+)j{j(~0B-MX7&16MQQtD>ije z7>u2%zU%o;LJdRzj?9xCRlUC>4TJ6H*LE2@@9!`0f7w6(kAIl%N4@v+TdLVDe0W(Q z<%(3+B06h7zOWGA&OQ>oB9RAwY$LXm$29!s8ERSC7E7gEQP9qRB>5gy`B8UKf?q&@ zl9Y7mTaQAt$6Xp4rsy)PyphWv;Id2iX>iWrUYc)d4NWOlfZljDAGDd1ixm`|zP2P@{h!C^bg9Jfu4RW~25 zAMLAgtonn&!FB zCNwqE>3Dc9I66A^Jr7Mxq`G&%Aia?#Bkxj7{Hln!FJ=+p)m}I8an$PHsRMJs5=WKz zdYhv90ST=N3M6QOpc%qIk#imZ^v5caJEhKad%=EVZ|@vxZED@epZM;3dy{S_z43}E zWleKF>zNxnJ3Hx(sRD0bf15asDN{Ez)ws;>Koxeq?wWyt4k<k5G$$;J*O<3q zLL3n!R5{@06&5^p60R!4#r1YiO|7HKPDLlam&5|`wT=NhCubP<{qWe>%BB-giTQ%S zy=>Y1E|b!u6o%u^s|h>~&lAvmEkx|5@Hl#feEu0$w8T#7i@;;s8;`?86dKe0%g7rW zomZyDyLwCbKPC{E$$&OJiu->5hg-TYI@Z^muYhVVoZH3HbK~T}-GG$BTT#dNo2`Ud zy6|aX)`tJ{IFASz&SPad$$HD&`ku?2mp+Jc4-2cK&RLm4+d{`Ld{8rgAIK@q7-ZQw z*rfegOBp==`TMQt_Kd-u;5WV2+@F>uILpoaAwT-d^~eR5JKV45zxVsCqQ??P2KPs_ zZ0!?+_NG2F2BHQEN6q*k+54R4L)SXv%HI|I7Vldj;d{My^EykSS7X3p@|Q2_nzHLS zmD&uYcasZ)nN{sHJ!l-SW+ueb1rLkCGLwJ)ckVCgM(Kuy4DzUAq87>$XbZ5Vyi}f` zqev*NY6O?Oja55eownM)5qKl`;URKQ@Bg_cx6w1dQwbIs@n}9BJ*`ny&C4i-2!TL_ zSQ=WZ*_lRLBRLReMs#h3R6DSc7Z&;!oA#4i^Syb+!>s)P#P!DvjE>e#z`y7JC+uv%MDcX>ot_L@xjVk^ckr%ytuf}t_gnt;sKYl^Vf{VR5pX! zrexvo@EhFT^V6fGj7FBZr4h022FN$w@uv`@pg z(pWKf(b)vCkFlo|YhM^mNR7P%E5#xyDJg7iT{5=MX8hOsp9U}sRK4@nAV|Ta+{vC2 z(Y$|jSBT#A#G1qT$W*?3**=kPpRV9p&0{=eF4MjnvrV#~=doq8o>2xU!L_|TOT`q= z96N4BNl7-v+vGF8Rd`9|%bF%1g(!kvMsC>@^9f}e;x^VsOL`vXNyi?z+Fjgg_SZx?NXk0~_)aHM! zxK`d_e#^T>_>d+Mx& zr6&Bp=2~Zgh7!p=oNFY_55yP(hR#<<3-K2Z&W^2q&CkDITf1kv?e;{bLtqnKQE_>2 zWm3GHY3Ld{>0^ApsyG-Lx_|d|7Rh#bLbPt{()=uWP3Jw0~{ha_;bkx8Gn!4&Y`s)rygOC zj;fBb^%O8rA5=Hc&Fo;K;{V-!>u#s9ik#Ht=#R=byd?qoKgRaLeLzt2rn#Yoi_6Nc zt-hS9eLt8N4VpO(33<0n?xb80<~<+G)!l4oiSJ1hr?#H9sniZmzUhWcj6Bu*qOPvB zc0)X=$lu zFQbpAOu&3$qn?OQ)mzmSgmmLeUD){@wp5(zw*^0o8(NSY;|JD^czsXf+++<>mdgHd;Ev z4up_&#kv>0H2=9Xby6)qw418JYcWN~6g(UZ_nQx?%~#i7jBFUlBtFE9=c)eI_lX>J z^WHt2!$ZfuOig%XDURDwF#>Nfh6*PozbZjm@%HAVN$_d6crWiOLb6k zl@!D^@^+t7r-MQ0FT>6Ql0;@GG4YKXc$WeesigpLL~ajb2$tpJmp~8+z8HA>=1ulj zT*R?D&Zrf2*+g4?j{zc3cQgGt_n8?Uk`Fo0Cdl#eDSy=2+9aB+ehtRHEchgxt`ls1 zCGUs!`93g++d zPK~4{Y=($Wx}d_I`;L!z6@~hfJ`t*#$4DS@doceHE$>$ScE52okBO5LCpH!>Bp9vy z`t@~BFH96FGt)R*a~IuQs)UR4Wv?MHZ*J}hNFvXnK!lqWg_S8QEG!6ikVWq0OYwAB zPP?@whO;T~jGCU}xVW(B@2?-mJU9mBDCkw8v4CI07-avE?pJne>Z zzYt5X!MUDOrkSpVUz;&HGSC3KFa`<>3k$vwY?IC*SeK0TH)nVc4i}9cIN8ygUJ|SYXq1J#Bg^W`_LqU1sLT3Lk`^ zg{!|&`+`Berv|7rLC{J-OHWS${hea??633LuP`N?1|2TM^S_{LJyX+E>C@l_Hz36B2Kz@>foUt(KN+PuFANh`~bnOExe{5}85Q{eyzM zW$3(OW62cabhbW8UO8`FY(0-wp^ufprlq9?h6^ctH&#|wcYv*|47&+FQ%T9cQlVuT zsuA(Npr&Fb&saC7AUy2xt(*MEhv6~k;DLdxzy5Zag=q-fiA4O@0dS|jxK5CSP&Xr< z39k3KNG6SM9UV8og>7sJMGL)Tl=>_U`_7XmKYxHwJT&fz2v`ANVm!S?jo?YrKHz&T z4!ySr7oGx_%QGgX`isjkUE)K>KyXqFjf}nx3_zpi$li2GTf09$fuj?dQEC>Mloawb zD>%T7f|T@m%Lf)H)Doo&|Mins{yf$pEe8jtN}gtl%dyvrq@*`*PV-Sc{6Y|6 z?9Z4)b3g-R9kIucAENYr`1KY=jNYDyO(ihUBwL}L2smA#s&!HR#JeeZT6=sC@4oRN z`0V2M+>z}kc4f-&g_?nt3rVDb*<}n%D@!ypt2pI+;0coa>-ik*v;AEyOD?;*=krk0 z7wV{so7^tnu(&aOn(p^8pH(&?;lNM3?fFxkHn1+xpJ>i=G)UhG2^e9!)(Goe2l*br-KV* zTwH@D4v(DD?Ccbrv}+E&Z3Ss-1+wk_INUELP!)iF*obDfR!eN&t^>ajREptc5&gh*FXV-OfzIDhXdBDdo4IePV zcKT!|3jAMqID&yehY^pQ1o-&eOG=nKI(JjDn!S8sjq&_r5hrQ*`1n}4hX}n?@gDXB zEG;kl2{RcO)I!pA66z53UstdTWPt?_$&D?+XtEx*pAqeHp0!h|+@1+knq9!mq& zf1H)|0*5>QL?bF78u6S5xzoQtOg#UI!oaQDc>O&M{eSg`qYFz*OOHU0uPFlq@r0%R zZ&U$!Fjpff{u9xGa6{$)uYX8E=vw!Y1G^J7fNvhth1Y}DAC;Vzw%rFtj-gJF5naUB zYRC?}LI4?IfRTee#utp7;K_zaYaYZIRuveC;D3G3X`I@DK!coJe;<=_{NDt6{*Mu$ z|L1>rv*?L1LB71*X9h4Cgotk!xZZ{4J0!q?in{)HDZ{a8Niv zCK|7>R8&`Iuw;r8bm0R&1pS!+w8FW;YxATaC>OXIX+XaD&}xWs2fP7T$Xk8Jz%Xk0 z2K1glz=owk(`r&^i6VHs#(}^cpkc)aZgltBL^a9Y-d>E5TWy(CC-l^L1zbo|HstZc zPcP{5>T~%W{(wm)0!9QD>WP@xj2D3*ERT{hM%1G#=K&~jK{k#P12wm>fKVR}4rW6# zWJLiH^I{ms-7WQ>jJ;Gl=e!@~mzFl^g}j(X^lz-qsu%xO7B#K_3lr*X!S zC7T%Ke6E5zH|HbO@4kYXbLGRDhzur zwaZRuSq=awl^TnfPa&X?J9CD@OW7PeTMXOfkV14AnJgLawlP4=qeRe z@Ru(Sc2)*2vB%<>bbSnk7~?-bPU|(C>US>7)!h3)L`HUzgM$OkCE_R5z(8c__~GyG ze=RyTGSV9WcO=+9l;J)wP)_@Q?iZXx#l*%+2AmNhUk74d03q`LkAE88-A9KkG2~}m zfD**?roRBo@`EiG;FNmC#y&u0Lcy6nOd&&x80K*b06AV+Ti3^Om=xQuswS6>>k5Ou zFF)VCZ#w*O$|K;7VW5ED`3TrdfBB&EHaMQ{b9093nwkyYzM<~ixdUe^5g@#z>E4P8sJwJX`-HU5CK!*X(RdR`584ab8E9v&Wk zAtB<>V*@sS!aynka+s0V$B}7pg@WQztPI`RmyG|nYd&TYkeSia6hqmHm;fU4DJZy) zOgZrOkjC!WN*TDoB6|4gQ5Va zO7FCu{)Pd>FasbTJ~Ayf-&yL#!Nq+HQ{dOqk{^K1e!=5B*lK5K)Ek5WV%2Xr53YF% zTyzOqF9BodexWV6Z#~(Hw5@sYXlm*J`~pQqdM{q!e1$xP5wwkkg&&%ba2ecA9UUFW zDB-sgI?5f;N2$l-hK&?NlicoW3yXQDABRDX2Zk7gZ&CKR>lWR$Sr>UzYTsaP&?nO zXz%Fw0gbIfBO=Zd5D>7f20`q^r5SvQ)Xx`SgPN2bW6yi`z*xo3jx&zSobK%OQ`Syn zW8*C$A>EG%=MByg2vxBxX9)~Fc~Q#!o*f#nem?-B)0-l40pP#}@Ql^JzG1Vmu^AWx z;1Fz}`p};3c`_~v4pqGX#02~#wS1Bw7V3tO>kXUA8(>rjF;yV0Z{!X1v0F?`xUg+K zchsN~aC*0~@yc#}QU^~N;}JC43XP8sfbW`HJ}h?Vt$yT+clmOo?wiw-lMgX5e$Xr{ z8!H#}t)bx@VEDu&B`?A)W+5S)zdy=}FAP<6zP`B%{y7%vJT`X2&!0EI)MKNxYn{n} zTOp@YOF0r)N`WTQOVUG;^3nt=v#D3q0z z6{pz%4op)|ZRTd+6ZIDA@GBQ+5?57KA*kH37#SAA>(_k%w*&_N90USJDs8i3BzFeY zbZ@~7fW0)b%cr=Q_56hk-+`x=d=gzm;$;X?-)aIhh_&k_<6f&e(??{?RV z0alj}ydU6?;7|A=R=TSTAK0@n#9{#M(l;^jg+^6%sxUbO59bKi#>y|jaEL;%6Jdju zFvHY^Lm#YJ@_u-x2&9tjDdXL{mmrLlmH^abWD5g>7`+!A)oQr0vvVE=bVZ`m<9(7W z$nS|j+!I_h2?>c0UAav#F975x3}y*|S;9KhTj+>=b8=8JLU;GBv_+mQ>;)cun??Ug z$FR`$Mk3C3o8C-;#dSa%o9 zX+W&167(eh5lqSdYN3M+^$ljyRoK)4mTcNzH`mTm_X9>9!9xS<>?$1KzX7)Q2iuot zhG48)T3bD$qod1KB6Vti zvK3O!0WvFaWiZbGAZZVv+Zco*--QSsN$|zTXbb|!_66C~Bv|S-KmNC+UKF8`0sh8& zSm^$-$N>pr`lhiSxv8l%$P$J5iX~Nz$_>`d2(oj|1wvn4@#!i%B-x}`%upM@e5rw| zhY5L+u(AO|bMt_*va)DnftnWRv4}!}lQ_&*pizo#Y-|kA<()QjbXTDYP_GeeTSpw% zB{-%7NEriFl9yRmS7#W!2*4~9sxzJ^`rp(pawr(1mDj|63h>%D`pL849DvXHe1j1d z5zI?bz`XtA{XKsrO&5NPkMGF4D5VqD{9x60#)(=N3c!*+hBf`eT?^(oWLVCQ?n+5X z4UCx>8QpsLQ2XTA4Sh_lFs4cuo>S&5=o4Y4WeEr8UjR!7n(d3u+;b>krLz|0hUpZ>8svWzgONv=nXz!d!e+nS4u z3m8C3u)BSkMn|xX6vHY$I69gExBLsVyM%e>1D*@wg#oAR+LQ>4aVS_rFq1QYtd@YJ z3D|NV=t261oRos%JKO_G;qyx!BtQf7%pU;X+t^ut`b1nDX*O1OvULeKu)UeG6s=eK4xi3OqTa--G}7qY?d9$NxIFxMEgG^$<)zZEfw% zzy8_|;6&Jt*{3t-*|-5SY4%-S{d&L4h^2itto^5=0=Nt%gSPAK$V*1_)}+N|KtzP5 zSW;px-{9cR^sM!xd0;4w>s;P;ZrPM+Xv<$e>`#|n{ZP{~(hYq~sP2Ypr-Vj1{I#qu z{Sf;OAFk@HA@dzy7RB|&eOo-Yd#;Gx@Y!YTrWzI2-CKI&+T5X)=HC7LeQ+i>aMgHh zBWT<>yR^n3tLtOgC2<%xZ{PM!NYI1Z+!>Qx+mfc0R`V?9&+iUy=f^AukiAekK}*X} z{IuSm8bA-#$gV{KHuEN?i|jeGsnPSi#<+_4M(cZ5SM&x_`ANult6Z&~SJyr|(vQ2d{!y3$H&+ap@VKVlj_sEfIw{G3a zi`;tWXwee)R@)4{$brVL`=D?0x%A4~_dRK+9G>|;;p@|5np#@vME$Xw>(&tEPLptn z|1_)`)Y>vLJKF)Xar5rogOHaR-Ny&-qR zUr<#>1QD?$s?Pb^+Wq^dg&6pJ`1az&DG@q+&l-naArxg4$Ue*O+7b-W1isBB_a_G| zgEvmz)4hFQ3}N?_C?i}=CRQcXRMT|!Y{{nIJi0um_|5S@01Rj&40$jwPfOvc(Y)yT z#u1w~ZBi(@4PTl{N6xT2rSteaW4vUneP&DN{4srh{k19SNXAJc|K&9w7SZ3+xcHyr z)&JbuKV(8+sS&6Jy*%+bN8&{&w)185hjcp&rhXqgempd)E`5m$(R)+k9HpjBdk-5X z8I;RsnY+xJ4PN_hzC`JSFdh7oEEvGT`zljk7A&{&&xJix^(H`v|Pe1L1=91 zPmE&P0#9Sc^h@W?3XQ>oRZ@O5jG-Gv{4VpqnvNScj<+P%ZP3Tw(t5lxvphEa`2N*? z!OE3G2$}PXQ?wS7P;NEd@y1N4c zI8WX@n90!t&ddQ}^T)h-`!@3eF^~g}?dF|3nLt-7Dsnm>8^2lo#oZIxuO6Jy1yEz5 z7Nz^Pi1B#v@akIkpN^JB=$6-q@O4aQc*e@V&+Jmq2-eiX!Y;&P!Ir_@Xe}>^DMLLT z=Fmgik4-*>r*Ww;@z(e`2H~Imvj#ie({TQ*UBd8JrVpIgyZ8aLM0)$mgaV5nEeup> ze5wpi^YHwFd1zfEr4J6aI9&2}b78#m9Ks9xs`AXd$hF2!PMUCDO-7C!sZj8yjT9{Q zBt~?Ak!T-&_SS0d+~%`p%@R6n-wGk>?3a^27E%PcJ|t=ehU`a~TQ&CNSWn}6qg*ZZnrv$fnEx;0f& zDkB|WX2{O?mYQ!HDk>}e!795GROGp6S(M)OOVOS%p_i(vYF>Glo|W!bSe+%%1S%wp_VoX+7{7{+=IHbWY+!3`&)e87UAlYGjqOiQ1&;To{-ylcGqaQ}n{OW* z)sZPF8=MR7vo}xQzYk=FLgeF`w~sD&WFp2P#{NnR{^5a<4CQ@F)YH6qbN!fw*E70B zfe#Xigy8=r69^1!*P%lPQ-&Ro$KfFw6Dbkudl!Esj9o564GEwa>Ju?Ht`E42FDc|d z|NIjI{9#{0=XD~9vmTxO_Uw_a^mcA;0q4#Qpuesdq?>FSy` zfHFQ{M#f+Flj=SjI(6z4aoq~YAnf$%lXO4Nv-ZlHo&~&l z`@{s>%Hb0bSdj=xLcYtOocZ1z`7E_DYtF@wA~g{RP{0a27J3g~UOB!iM?s}iCz(Ft zyKS31uk@2on%cHS3j^elk>+Q;8UHM&4BBZTCQAhybO_b5b&&y~bwYjSSbV8_8EnCZ15C8Th+_iYb#I5=IC8 z=^&nnWJ0A&mu7qf$Z%r?t%H|?=ZaQ^Wt6cW+z7cN39gekB|5gryAcv<=;*ZVtYv;r zeXQZDx{p;=UNJE-hpK+Lz9*zQ0c_{ziMhJA-H^l6pIz^NDUSI$Bmibyi(mTnBk1hH z6-Z)o1KH?(AW=eAzwFn!lEHFGvsn5n(i=&(Nkv`UTDEGn;(M(JDT>C}vE31i#3m*d z6vgCJCWVIfX2;}S$t~e^BOrm3dUWj2A!AjS)M_ zU@~sp^&yvjJ`_HN;G{3mjvzO9C+^-3TvK{+vCZ2fA&<`I6q+#`A|Nd6mw>{STq35a zWPU1SCP4JU4GnmNzD%;g4wma4W-`mNYzz_%cL-g&Z{ED=X&9=KaxtQ93)6!CFDJuH z{Wm9ba@xtz8Kx0+R905Di7A{kDQsq_sRjuxN0qkGv+GJ{PI|xn+O@GaD^`Af@4%>{ zyzL5=&Yib$MI9bSn2q#!-KlN&k*3cNI#_T>GeBM$K7MM=gCWeD8N2aI>n=L;Rj&RS zMBDPt-197ed|hUnC{mH=h)Os zPqz5``YOGA{aTI>Zj<>o0tz1);l76nO$(MzuuE0Qp=IS%bF=pJ@P{<0XIBo5aPP^k zP~f0YNKV86sL(Itfk1WvT%3xHRl%xh4j7=MXx(*)QY+N~DkX5WGP~)}_{~=e?7SlR zRv8!pUXMn>(9Ep8!Vb&@O;C4*9VeoQF82j7wt+pytkEDx;m&|~4A#|6!_4G++cSqo z=J70N7)+Hi&|6n9nQX!nfdXm$zbjYa2`%OT+FIV_GpB0Nhq5%ap-WmrDR{b-B*I?J zTIvo`!^65hvU4vsqT1YYu;tw6bDX*0=rp_IVTZA}#Z?alh#}q$|U90`aDcz)_sbw@gNeTUTX|fltG8;28iISd;8tTkAs;|74|%cC_tr4+w-A zacvc4|NP@C!79rtqraG;HF)EfrHDuT>cX+$@Mi6O42uQ4y>+VvV8LWAK8{YKd1EC5 z&wzk{k=sk@W$#6S@vZTbUyb~I;*PeNr1rWnl5z6^$C-jA@z;DEt1&UbFYaP^7#Y&? zoJ~SYiSv8S4>@-?H}?h~A!AAu`XsFxOHYsATx-XO440DJ$B%mu(d(n+E7pDb_U%CB zOK>6_OfSZk=mTvHyvRTzdgTYG=^r1p>U2R`B9~|%XZb`_W@EOHUI-ATYxfbSQ2n-~3kWO> zvo16KPJP+Joe5wP&Cc9AIXUToIpSG~Rhf3ie>Z*k`}et5R`(yi?9ongFQI3g9wo(% zw8bTY|2E&aapTgG#2Et)=2pB!-YF?SY|EnBwCu)Bf|;pC}P_Zdor0W+v4njc=%N z2&uN(c$R4pof);5PGsGCYRftM4<6jX+G*f>0L0S4z$E0s4J|@VP=4o0)J;w?)B9pK zeOp=c?b}nrP-b>C!$F;?Qc6dOC%2gh!<*SQjE~q!25|#3k7Uxt%{HH;ZKninGGG!? zf$3?1gcANGQ}YL<)O+*1X&lKdTeb-E#6rZnHl=LH>xq?U)eZ;`a4zNizoG3GvL8@gy>oRFD%SA_`23 z#H?e-j?MT!h7lOdi%VtnlIxnlNH{C}TS8o(IX{&4;6X>Q0Uv&Q=AUC*FeZs4(B}4m zmk-Xgg7=gV)UK+-Qc{2#Kg1%g_CHWwQ%v;&f5#qESXQir)*3GqN1AmPj|yD^qrM$ zTwGpjd-xD>rOEPQzMr8S`0({>HggXpVIZ38)4%`JrFG27K_1tY4d^no1rYHx=Ipe> zM$Vq6V=_n|J}H$8`}EzrJs<#Q^9Na9P?EWPn>KG=!8}YMty{EcLG447&D9ItM=n>i zQ6H9yZzUcJcN?+H4$J^IFL@!??BRhn3Sbte$5#^8wdtm7uY{3^UH;T?>EkP%$+W1V zm>|mn2K|(r9&yk4)w=qxie_+j9yZ@H$R@rypg{HRi)h0TO%i3#4T+1*+lCrfv82O@%sOh@!CCU^0SgCAeL8%vBYHgV8ClC(4bR zG>O~#V@tgIlb(u3+giEHqqmpTgJHV2kBB`qRQsQpwIv|W{R^;PdIW?jKLz>OxA_YK3z|w8th4w^$ z`$!m03l4-{E7 zIX+%i44^}Pqw-`Te3p1uG&@h(l)UFtrcck{*Y5GCsAf{3w1+Oa?TH3~7$>t)-NlO+ z2^iZBb1&^qCf{-BXS|XO>>>MP4r?<4DiL~I>;`De3J<}Tzx<+QIT})*zxwCz95`@5)Gnr@3kv-oF(D9g_GRhyF;L$9mb5s6)+J+Sd-Vl1 z2vr2H3c=&TtM+HOmfUyrH@nqz8w2f@$IStz6!;OYXUCZ{XVj9wYPK7O>N7nx(>0WX zMEcXO=YAw>Ma)r>jvrlx6~^QrOc`+zETJ_>zz9R@ZAu zCRCnq0R=_UhR=~UrmEo+$|Ra*yrTZA(O9q^nmziyKe3W4A2O_!>E|P#P|8fP8UNz> zbGgn!8M#ytVd$NnbwX#&@uB#LCVItxhoG$xq<;P{M`U zrfjj#a>Jb7N1C9}Cyg*=4rG8`F#ht&nzy?UMv=1btjPIfb~*4as1hg{<4T*J*!-od zaEh!eB9ai?0F?DZHTSoW$&wdxX{yqi^-3)+RyQ*r24A@JS9ZEt0WoxEwwcy3EW8Kk0`E|8t5iOj*y%u>DX6LNOTJ34%is43#MOwWe z_vG6a8!Rm?IYg7^&p&3Yaz8E2p!L#-*~>Oo6b)gRC;4cGXQL*=yl3XDF6BNXd@Kw; ze7FU<+{=Tyf0?mbncW8G4+&Duvb+GtGJ4FaXjV(zvd(`^b-Z+);Bs12 z{OgiSF~*nv#9t`FA3G&{dvozFQ>)aLo1H&O>WG}bkMs9OM4Tk%gV8_*tZEUS>w94L zfe}yPpCcIGc{sbfN#Iq|`ID@m`m;fe^Z^4A9EE#)53(L*0$fo(eEsq7sI2|c(+vYE z4_~M}kvM%)g~ybxk4#;Pv7@?)~E9kpslo zsgJxE8+)(D`+WB&k?v2DCFhWN$@SF_X6e6L*L`ay;iRZTCFGQh6%(GJJ2@=OHZSzT z_wY)a14Mk&{1w4zzQKoAnm8s{wcQf2^auKgkobA0m?Bpkb}eo8n!vg!bYSsq_e6)e z=^IxlQeqzHRXgSs_XC#O!P+Fv5Rmkp7pL$BI=20o( zgOw{9{$?<2R>O+r%RNbzTbVz9@j|Ga)YwHg?!`Gw7OP51YOrL<>4MLNs`t#p-xgWC zJ8Cs*O+r(npuaWqZja!|mv#QKo-_)5Tt-M?u2VO~1QguR364EG=9HZs;`HJEdvX#>9duGh6$*|U5)nInNmq&S_34M+q(J0in+6w^qKk!)hhA` zn+YA`7ks^Q`!))^Q)X5LTRJHteH3oPX0;v(3$vmqq5+&)X7H z;Skgxuv6yGH+dW%?U9aiXJGhF6bBMN*`JOK;-F*LGvDP#!c15k#KH>4nTE2p4`tD|B^=rhS(# zJ2-9AqB1<@U0CdwRTX_q#BvGi7kZ3?B3Ko0E)vo@psH!`-&wPZa|GUD$AuImold{` zM_;|H6}ez5WWfYuXI8X^so)-xJ9k;15#nc~a-C zMu^T4GDYa!m^do0{^)a(cRV7Ajk2ga@foI9*SG~t4@;3gGD2IEO2#6!8N2@Dq{@z! zrQ%(t`g`V8g%ElT`}3WZRVbKDEQvszTxlT zh}ZVmTqX)6?r1A{Td(om2`&No%v}3cJb(Tr{oGl`VQX-mD%)Hgp7Z7uhu-;3mx{2l zzcp#xIODhNI&)(cST(ydq`5;I@=u!i_=8vO;vV$(Ll4qy=%z06V?ae*&1&%42`>;G7bF>UVf*){{!{8X0y*ffg%mJ zI0=n0B6*7mgV}-CJ2b1Y48PVEWu0^PCplA(1bpt-mGZQqL+9A+e)HzdkO>F5lH0Mo z&sZy`qS)RdIYN)H>vN7yVDVobWPb>Y1#LStYE?fVT3=bHh=_>WtsfUIva|C9a(xC? zF*jw)IAZSnp63=VS)vT=C6vRsaXmzD2ju3Nr+)xv4&Wm696>}>z=(*kKTuPgj|&Xi z5AS|qQ+-u-4NzE> z4s@DZzpdJ0)5lxCL9KUoe`kLA>eXrfrOh1=syb_=7ZzH*eV-zM`o!(64MhK!mhog5 zjGJ?NfH9<)ejG{H-M3ajtpp6vKqF1gf(U-@o0I2u=M^awKdPrrGB97_?%oclXWfPk zF4yk|ALxG~{>$hQ<|6Vn482zy6jvC2yQkS^o8Y|Mf`Pqz8#p}brYL{VDYs>YI;k0R zZyT8_`xl;u5}-E2SlHe3rn8Z1O3jL%@;sesTm~t`U|y~3>ZsYX-}QC;U|gK=mVn&G zJ>!XG&iCpI8g>4fLybsq`%&p3_!7~Z!?}Lp7;pb3e%gV4{FO+hm_q$P{g6dl-kl97aW_(;c`oLP0Xl9HHG%?_5eV7%93)34yj)-Ld1DWVMS-(loY;C^ugN*U4235P zF)d0lurPGQ9YS3a|H7hzLB)Sc?Q*%sm&ihpgAt&YHk+pSL|zzwkh#>6U%no_cX`$C z=mRu<{naRX+FGzs`~dh#%{Ls;D3pxk@ZKA2@R#;Kf;gj!h%89=z<)$aU-2 zORDKIE4WrWxu(1osq?dgwp-GOa5VPc+KX4?p4@owU{2+X+fTyZH2hOu?u{#QdXk-c_NZQM0K@OAt83O>t$xOstqo%V(R(Y0NQDMrt%0~J!>~xmD`9Y| zs;X$yd7t_3C?WiD3;xfP^GQiJ*H#-WUp{zCebwX@Ate|rZs^WgM`zF8Gp-!f0VWPq zB_+P@G^%LR+KiZ#Y2RvdCSQ$GUbN7BN8UR-(ZXjtBmT@F_gFy+9Pd_QIsYzo2V_q( zZ=W~2t~+OZTrBNGFz=a&7zXG(DJhv(+4psDkk3HZ+;~lYvU15*g=!*~esltwm%-v$ zzAZXtc%2MxqS}ixu1)XJMbAy%bUCZ+jr(jgJlw+Vu$m@O4ehxyh6DyH=*}T{_O(W{ zrcJwn?_YR!-YTy6Jp>}%$F5T$T`DKJm8JmwBJJy=~Gr_fp+rDVo zvON$7X%sx%R^ITT%xmPHz1SDkGNf+?Ivdb8^~dk`^qQ~-N3*Mr z>gi?>$;#$?wt?cK_l&*m>h*DzGg&%Ynm>Lk3m1q~gHJN;yK@4>rl^R?k_a?+s7;z>V&YBFSVPUTb_rh` zSFByTgDJ*IJ&0Wij*avy8g&z0v3auGkRas_V#3+Ga&S;#`X~zvXw*bmsG)WBHM+^) zo_9NElVI{}T3zLZgaicc+F<^>-zV3#g&?W&X@=nJfb8Cj#G6c?+5(oM&gu?mEOIc!o1Dm4{Q3k{7_B;i#ciFEAvXM5wF`!3`j+OeaVJURC4Bw7TZwmrt%O`#O& zS<#N@LJ+|k;yJww?ZYTa<70eAd>r|W;5aQWuLB-zJJgWspoIepJV2?5U~Ulg*^zWr zjfWcB3FMbbOwVKKvjcH#72N65GbgrmxY$g|fbJ@je+ut}R4PdvxTWFS?||Lb-Fs<` z8r4-K1jGaxU*G>r9t5pF6@J_9-teN2{zBUTque0x)J1Q#`b|-LZqRlnP~#jktFqbp zZFtPSRB;iGO(x-#B19_9Y#auE8quFJ7m_^t?Zp#jfPo$z?&gh2m_L91J#^*rSt5>t z7l_|8@0akHm_RC3PGY2C*tQdVAt3UmJVq-04h?hOmlR{BUjJQcj6O+e=JK^`v$29_ zzYM!3Ta6z~W5GY9{P^B(!IjkpvIy*|)YS}3`Zh#lK5VP-=c1w&->VR91k8*5X;qWE zxlrOg&;$sz!nF24cF7(f&c*s7uhk`{(suLb&f;)@))o=9i!KIh@x{d9?De*n=eLD~ z2gWlxb@jqN6c$3BvHy!OFfSjT-JdjT#L}VTr2gSxk+^?gwyW!+t3Q3ZfkVjHJr$}0naQpNm0@zE_)>{7*#l#FL-dx>F<-A> zbab8beyJMSWBjI(nC9L9o)ngM9j7&^+Wo=kP8jku$7YR{v)`Ql1HVX~MsJ+TaEE1x%hI1b=>^7(V1FW+O6KkE;Y1I={PN4r z1((e!VAcThVOV>oCWg2@sVD$h%jl+x)KmBagc`m90mAl({9h0b0JQw1xJ>{W^iUE= zO+*gDU?R;UL6G8t=moQbBpjnC_T0GvaLb`Eg*GMHLv@2@t$mXh?yt7EUIIio7{bzo z^;mR2ej@G8of&UxPnv4d5@Z+qwA0!kk_>6lqD7(YcjrRd65aj*x&@}5P-Y6tEKh}4 zfYdL9Usrf?X(UOf0_!*V`VJi$8>oD!%I@XwX8voxej;$A*#fb&;e*pN^a^fpo zaXVE|%>aEa`ul<-D#jF>F+oe(RKI%A3??{3NbYD=7QY?7*2cY{=Y%c00eTUvOn(!3 zDtgQ!0OXS=Pi9PhSQu&1ih5-grAERYmEfd9kn*U%Zx#NxBOI*#S~Cj-D*8BNtVdIz z26$&8zYxCJe#uk>TB1P%d2t<^Ieq=(8l;{NFHBJ~(4R78XK|G&B~~DsWOfrPJ7yx~ zqPVX)S?LXeIgFpm-2{$XMrJ0^faNBaBg4TmMF0n!U`9PiQAvsG*rzl9);3+8zI+g!l!gjeK?;@rQUz#4#_h>m{DT0aBri4mZ@`iN!cK3~;tfBkXLvt3b}d)38wTm1MH!62bi4*(w# zqlD+bADC|!oOsl_KmWJ#SoqdC)@hOG%|v!XsYDhf^bcP*w24fM+?q~|Bb>{9#^{G#QPkr%dDJ_mF{e zKQF0EJ1dpTLeG%hIOnIFBxRzUJkOpixg2~C1hp-xqfYecOQ{4pq8?Z=Rwy%J<_`l z^l7juYea4Qu@ODbxsa&~E^@!~KTlLSdLk?$3>OBO3}=@}J!(EY6$&^juvbjg>R&co zg-^S7+Y^{`9QoP~NSCU@_iMdY)}NxH$HeAW8*qpT!~g7Rw%!79Btdi=tm=Nt>lfuU zDQutW|Fd|Ybc6e~Zg%U%K0)lXAU7+YQ>_TW;uFg4E{NMwy4HQ(h}4g-PrQ=`B<^jm zHtNtm*!GR`l3t%{XnH`jJT!z8eYXJlA^!c|c!1Ex6GO@9&-Nm+sFNy`|1A-ce>PwCfBqNOtkNO@ zbW-#4Eo|y7MK*#}mzs^}lRxySZl+mhTa^3G`4jr#TM4JLx#D3KlVa{*uK8DD@`IMw zJI|go2l4fwfu}F&QwfB`ukXMu{Ym!;Y@gw|rMC;UuG!ZH&jph5!pITnPqwk>2UGx` zYkdsA5@40`_xz~4 z$am8rEfW&&+g8=RPjSGmjO1_QcQrHt!6$}mn3fg^Fc8^eGC5H2@J0$b?N{F?cWiPF zv&au@Ipbr&H)Mi8(#=!{0N@c7jU*&lJbt)E^%0!~SCnwT_y_0wd5d_vpAy5nY8yOw z#&muS_04b5wUf!SclQ{hibb0UG#+2Ojk|E{_;ISD_DvP!f`|oESxqM+gjGn#vWa0^XN0K1mIT&Q&OC2C|M!7&Hsvf=Y)D-stquWcNfx_0X(wp$ck;@()~ zsYewGi4>71oL z5HPLN{}zphh0$QHzGellbP_L(;rBtqjw2V9I_jbT)>U>y3hNKx`4=H^qwzszOiIHp zk#37zlZ;E$nW8m8RbV!6=K6T@4XU`CD_P_6f+J#W0DYv7!Bcvc`X}Q6K$zu@b@pL`s z-%pa(nn+aYyvaoV814mFL6o6AP^S>8N0;^wQtbMly8HMR_g%Tpy#&I-dryrjwdV6B zpdJ6cdJY9XlKxOTpf=2DFC|G0-U7^G{>XR!__v7o`fZxh8i ztPk6rg@)uls^I+7Hc~H)0Y+*+046wdCD68LSAd2fR;?&df-+d~@?LKN^Q8m^K_d?= zG`m|%1))zCUPF3a%%{Ns(bGf$P~H^jBA#~Iq-&+wY2?~>-9^*Ked$9R1qmvN9rBA8 zpmriVP#eBfje_5YuQ6Jp`IcMaB;vwEW89ZZ!8t!MLMT!C_3Ia55p`gsEqI#rrr?jk zYg?`RP}WEqa#U%r<$zP|%ab($Gf23Cf?LoJh}vv~PQ;#Gl!c3u*5$1N6uT9eq|}S! zu8GClDuh^<>MRb(im@7w2mg}tiiZ!)FZ|+>2p&51lX%Ngx{B&IR@V{H~lF}=NL$r;BIE7LeQg|OReDX}N$$ali1pN|*$Ymr@ z@UOrKj|2gfhAP)Lc)Z~qWdRBAB*tzxq26@q#&?fK$!23aHFb21=`mtxXlS>1u`f^^ z3N=;!9CX@f>Quj^&0rbNoNI7xM-V{L#F@p6dhh33E1LMSl8qLv4{FJf*T5^E8 zQ5)BBXd|>JaU`vx!zVOw`P5iC21ptUH!Bvl1sB3)b}*PYXn8^MP> z969;Hg9ifXA(uZ%+Dv~5X-Pxw$%(<15~$f@zK}|Y6_QKBcTFb3CT}&BdXG;g z{i(3xCo@I(2F=bt3PmXeTM)8H^&(b83rq2WXu=# zK+`Zp%8C%}xLkWr0Jmau>#rD9-bziJ&P1$PRkr`!ADgA#$o}-y`Id)>g<9sbF$>Ykv0@ z9hiP9{;_W`C1wdO7FAa&o;_=V;gK&CkH!(m-_zr)#D=0d8oU02&1F0W_=_^RKj{#V zdsF=I>@hRVzn(#A1$rbsCve+MW&2rvtX3lhKt4@Slqh{~A(eia#Pjh>T0TLACdy5D zOZ?d*vR6un#M+~xh{XXF6&JfGC7|)AR&cvqX@ZKRtv|;9v@_NN_umqYV3i)nUesp< zA}i)WfnQs_q3bq7sqmu~4gI+RL<|J`;9h}hIYjMDA7wII!8&j51*|IvS9TIHM={;lfHh$nW4 z4#5AndwDgYE08COlazw}O@bf)2pUlp*(7ZX;HT7OuuGY5=aRaicya(Z2Hx=k(4v4& z_)-c!CY{Q4WSI%B^sbnT2@q*H7oF19y#ON^4||*;X`-nsjU{)2?UhrAGLc+~Gbw^* z_NB3cQ`wFPG^G0UZ8$-+WrKPsjo|7?qDGb7iua}C{L@yCq1WQZXHKLy);gG9A>4 z>uRg}3sug)hLDVrFxLQ(RN=&<1`?Z$Av!gN;y`xL0&EX_LAoP|)Igjod_cnbc#w)L zw&rJ_E^Y-rTFxD$e^pKsgJw!fXca*C7TPooQZ}Z@!4EFOfW#K?ojsTMNh=XKyEnD@ z>=AfQ|981K2MtOfSrGI#lj#FKw+mfWf=bnZdioNg5?!V7?$RMhOf4>tXS*IG1CZun zAoP=f3nfyh6W$UoRd`GMN}$a+#nRGiUH|&)FZHhbctY4>1Jq$6M5U-^;j`jZ*r1VP z#z>i@OGROf?bcWN&zV#}$Ua)shUjY5)YXw%w}5+aDJ%sXXx)9}&)Q{#-{K5mrX0ZZ zu>nH}TOS^%`{!0iQM|}Qaex%5ga(8b#t_*y^TMT}7zqoe6Y@+S1O-K^XRj?a2GPf{ z9~{u1A;!0ggGm4!N(L%-<6!Ec@crIWSd;PWHSN{1MCpKdo0Pgyc=qE%x(*WaJwonC zrJg?hd1zSWi~V=q-PPmUM@L@Hb!=}BEEaHd2S7KWi|1WhwusG_+|>)kk`*`h(R z%c69}uSLgxc7RPTZox19L8U$z*}mw;rI{{XO-}E>V&N7D%Z;%+5b53k!=id{Tr(qZ z*Dk}wi^H-4M@*>y(1d89DQF0Z5}Gyz8tZHtuSc(G9rf-ml7e#1vAAU{DbMQ1J2lcW zu+P6c3=T3}Mz=d$eE2-{k0uKUs%N!@P;v^%xz zJz&7}`Y{wH$b+)_za6-Kn`#ohFGd{y!7dLqLjj!(xvMNVEU+&@Kui9lGto&?UJ*y! zoIaFNu9mr;KM=yF_oz|U^&5BEM_W94 zhmtQHqt;tEaq#_4C0DOpX~}Ae3PR$9<}J4ws+e55OO&C6nG)>Sz7D)GV94e9Izj|F zJxRV^yk!GDsP54hEfgJ|`U_Kfd2J&ya*XD2@c%EpLr}>K*YsI_)e9WUYoF#-oDo9zk;qm=TP>xOe zxtHJ*Q3EQztqg()_2rJVM1bVt=9~BIB%hv+Aw_0_d1%Sa?Lr&9xdq@Ki|G03^7h*G z>)Y@Ltss!vkEIUgBS|BDk-ww^+i9}&;%1jGUv9e5op4&dtL)`VO)-cAx+oc_jo*|s z7|x&GlvV3YHxJ?r7-DZFWM71L)mqguojw%4B&<$vHd+WRE(aNmo$i^_2W(}@l4hMi z_(_T1)R%=ZCyL{A4(3Y7i&ktvd0j`7z{d~|&E;5Ojxs+|D*77p&*sZ(>HQcBuM9Nr8- zK+u94jRb8&_G!Wmr%k;c9I>__{}aVI7g0lD$H|kT4za^}`4KB}@9@;-d>3A^)^&wpz@ZIdeN{uM{$Vsk{KldhFOS zI=7ts<5#b|+XoOzL%Wrc(bw>uRoL0-hXxxw8+RH#fCTVfvyTG>eRlJR87MhH3t=!#oPvV~+Jn}Xi3f(6sLX>X2HSxJWm zbR?5NEvgXY_*Y8JruFSA;pt1_?p)V_#oWQAPvCe$0wgj$syU2gLtWjLNFy!wfqYMHwjv@S#j@WzthDPxA++n-^u)XesRdK zPnx)azBeZJCnaI6L;?Kp%5AB9lXQ$xQ*)n_?()nhsdJ-Fu1hXFfFG7+MeA4$)y~Jg zEM8D@I2wZP%<%WPSDG#K{i_6hl)}_iz&H$~NM32N+%d4Dfr<)g0BC#g`tQ4U?Mf%J zxlbDy&|1srC=2!!eR|WNHC^wpWf<%HJs$9Z(~k^m!JXblXiVnemFGb#o>Y8ke%AP* zsOmX5dgm>?H3UxKoTgt}|0&~heqmuYgt=$l^qFS?{~|oL=@GHt9pyIbzO%hvFnMwUX>f_~hRwQKhfgeQFJrVz}asv)>*K=JuO zu<`13pFC)_zX+=&+Dmpxx*YHHAP~<>N{ndPym_j;+?qFY6Ld1*Go(W`)+O^z(uMOD zKjN)k4VNbGlU_5rLy<}i#Wmgd*w|ER!Uwp0%n8cd^$`}DZAMEe zFGs%ojx{_ReQ5QvR2qB2wma>1>quV)&N)Y+@5qsJ-Da<8asP`_ME^Ob%P!s>e*+aI zgMJL9F`ZOON~NOPF2EJ%-J9vxrVMsUly){)JHf3)708eF7N_G)X3)`2pg@#e0iQ1+ zTjfL+b^ZW?2Ii5kmi^*Am9NMX^*KAk3Jm`Kb?T_nRwkFSBg{@M2bGZuLh!%2sJ;qT zSP-~^WS3P`G-XSwjP=HiTTpE7@TMbNqTmNGE`@3br;J)=3L0cH%Di#=$kiSmQdUeP z>eMEvfB&mT(O$SLZRPm2YrdP=0Vt+`6_(}+ghDpHShvQG*SLeMV`adZkJ~?B`H@p! zq)D|T4rF=GZf6=U{`ues^}(FD+6`B+jqc|r7B+Mq}ik6Tl}YJ zMQ{_vRo#Hf!1Vj@g>F5AR{UjtetuV2aB8#9*;wfZE!+4?%{s?zeu19Z`WaSh20nNW zoPc+lL`~50%7TFjpHpbZj&R|ZKeyuTq-PEx`NDPQuj@z>*sa?$dQzT0u6jC~vuo6WvrGHM>`)OWnp7QdLe_)^>y#h+; zE5D^Pq%It~`I+ zF8`=Gr5`KChFg7x5!dXrYe+M*W*Tivqw5=gr*2+0{(72n$QRdv=35*egRJ7j9-c;H z)Hpn)#)S1~Eu~wk18sZ}M@gsRf!!tt4>N5V>}hE2Gq4gM5o126yLKe_0v>oB(OlM* zF{4KLbsbB11Vn<{Jgs(b-Tt5v)dUfFb9bO`X%t==BB|+i+Bjl0C5&}_j`lgCJ+wvGi2IrjTSKdjo7?a7qdbQ(~zl#Tr(+mb}dl*RLFa{zzJ};T}Q=jp?S4K@97a*R7bu#lNl;O#$aM z4Rx1ip6g8vRL1(?Pntgx5))O2cJScFA(%zCbBe)-Sakpr5pY3uJ#1_Z#)$bHxT;<^ zXh~k^u#g4-g#LrB_0$>~8&o*aG0WPzuK%EgJOMmE$_ z+M^y5eJr`|-I#>+pfCVrZ8=M@u=AcRaUn;e1f`j@G7*6>@+pF3o1ujb19PU2c{S&Q zdH=7U!HI??dacxoiaHvJ$#8iTcHp<-L?g z-@l)j8s(YSY#ec()8l2-rjbPH<6x*1A(gq0{`Nn5DM(u{n&+y;&t5X8KO=Ek;ETWy zwqrJF`6AYVn|c!MkV~WA+&*btZEtL3)SKnS+S%KgjEbR_oX*andQOqmkuT09CpS!s z>AH7*JF_DzP6rJ85H|K8*xcC_kF?Gp7LB;$GsHVvAuVYi=bb4$TdQ4|aiR36R>ew6 zuR`NWbDY5jQ(c#SN-1~D-4uK`(Q19lRtq{;Q^Fjf7o~*?l7={*sEVXF35Ly+u2iY4PmlFJdh$i!k5OxCgpqLPi5uFfD<>dXuNv_pcd0S}qD4ayk zRysl)v~+ePR>F13_SpQoi&{Lw?F`$;t`8%;NFSmfXHbqiEGPK!4gTNG!Qqt0z9p-! zwaBr($N>wZ8NvuUqIUxEHi?>4TU(3AR2Ikx;k?tiODpjkJ`j~)%G&`Cg4RFNvM6X1 zVGbJNm3Q7XudpDo4LxWeJ-r1Kgi+!lO}nja9saBw^rs0?=>+qQ3tgaoD3{Fjp{5XG0ZS~o#6;a3H z9ecWr`CXcnp`W9@h|`@z`#1cpXI5JpZ?^0Q>07|(1LsqQoQgbGSQjOU1$p4L5B1R& zQL4mKwzYpRadZ1_Qs`eu?TzxZY15(~SKK{5rdd!!jR+KUT`Nx{e`z@WJ#_3c+trVQ zmxLXr{+cz%3Ta=g(4LWVQiDDothc)Jh8n##P{_g( zM=$6XUUH9+9S@J3y0@rlWd;Gz&YW(ow2-Sgv<@PQff%xhese+|B4GCps13nmxy+7h zbd6p$C_I5^qQ;dkn0jSk&dJ+`oAN!M`qLCxYL#qS2Nke_2fC(STm5QZaao0Co5hfV zKg;1quE~2F4#85|d;)^S0SA}N5MC3s&}QgZg$9`d=&a4f$RN-R1?eE~+n0iux60SZ zEeTBfi3^09by2bzU;DBz8X*z)iI}NjqH}70L;+BJjF9jv_WY*#cnvPj7^^@@*y%4< za;h4HY$h!V(C_j~i4^BjK70dEN$<*SgNph$41xGpuYwW>VI5M?c&Gb@*VbFD83$M! zl2x@1zAHduKOq4!H)$s4)FWyT3szZ+E@ZBaFKX!Czx{URwr)fiL8&sdRCI|xGu7Bw z!N$?bJbZ0#LBPwc^}%im%aku=MHgLz|6U7J-zB@tobV0r=zP%Fv*6Q|4b#8A`MV?O zH9)Y1_Kut(i0ovP1$Wc`S@78_@QMHtwi~|x&=wId&^SoGX=RaV&Rqj%&-=(%-@dmB zy&dr&@o|_)JZX{$;9&TsL&R&NLc@x02@tK(g+nUVwsg8|N%fY~;u#${#Ae?Q0CfLzUIu#V4ripQcbtZ$_8 zZZ$7JcYil9nVm%YcEk+QFjp8c^s8{mbEBh9AvZtF)4J3bwLm-nbu&!wvd_xa#(s|VDm3ev&prVqcm^bcZ1=F?$@ zHAp8(55MT-i1>(PD7vd|OeGBpCJ`he)X;1@ELxi6BYvRvtrtvp!Odz!2pw3pKt3Ed z)R?X}!k)m2NIx3gDc3j)1E?mX4I>W46Qc~lOV5g((4C6#Sti82eFgs3c>)?F?dW7! z&VjS^7xW>ppoqV3bO&lUTMV>`PbD@Nw1n0ew&yCT!QfWWeR2MhHFI#=NX436o_~J$ zd2@tc($7)kN+RN}Rd{k2`=YXgL$+$Q+Jd$>(kKlI)QpnygcV-YPf%&#CtX#%u5qBB z3U`DZ(xo`-*qF6#$)bd7moN$>r*U}UB}#9eBF&UeT4FiKT+nsxT(CIU;caO3I00M8 z%WB?TeZQP;Ibz_rX+jA`eh%%*NBoM4U#>T?%j8TF{Z5E6ee7liW1c= zPoaL8RFpvu6UT@c@gQ)cXN%S})PIv1Axu;%D=+WUHYb_3|0~Y*4O$Za>h)_;WpO?j z7=eU0N2(sb{PKWOl~7OvY4HW^(2QJ99v<{g#(@?sld=hVY)Gdtmi;N4D#C1bTNGDB zCDKI3zHUSXdM6bngSWS$BZGY62hmNMrIOMs)VUeA6AMFcdyhfOL!F)NAxCEzII4Gh z0^O-i*fLfGKJcG>vk14|y?d8uJqb#%w+!hLb`ga>jJ5%~CSZLj(~_be`x4$=Dlg=( zxDfo+3Tkx|D#Wq=Ym-bjOuRr1k!TD7Pm3rQN8`1dG)#nLSPt`zOV@+;h@wr}9bn-z zq1OVi2lk{1FCSeVN(s~11Eucv_TEHzO$611-_WH}def&nBgFQwkMVncNMjM{1q@Dk z10Gc_x)kCuQoyX+i}D#nls%y8*Gj!1y!KGQlx-yLLb*z}7U?#3yy@PtjZ4V5AZnco z&UIb$zBGV?r4AaL!8tO!xMYS5R9Wguq5&u(4Y!Hvg`|}hkeHAe&z#p&uqicPQ0X7g z4n#O+JAGn~i%hryt~M*#&ULy$O9JYSS4giYY!vwB#AAhM@FgcEoypjpB#0O^1yPD1 zTv9r<39Inq=AEMtNnYha#o{9N8d1dT+&*3PTsjfi#j#^@z*!uZPi@r(D{ujs zL>#`dEyy7#{}+nGMk4|44P&b;1TueDUgDn8Q~|PU_NEk{+Y}nB=QPSza2+r-pe}Qjq~iw~Pl(E{IHgX~ zD_zw0MCuP;_PYd^%r%qNaB$elFpQp3dd7mNzZhrY^Rw;_V_9&1fxpzL0BK5T2vzZs zdUN9`^pP*-c8bcf%IeEe!*&oAH4?fu=2w%PrQPyf?diBw z#e#*}XYK+T?I8^iX^2w z>5?lQaFizi?NR3tvS#x`0wlsML20GrQ67#}k+)9hHBFi$;rQU0q>&lWwhWOFJ%~Wy z9D6dx_9ZDTkc(phqyWqKKxiJ_VWbTqtz|`NN=1_v$-s}m>venl%U}LbG>jTK+QcgM zlBQO{n9iBryG)vOZZt-#kS-(7A|NQ%gx7sU~EW2EC^zqeirE8bO5yvchpe#wNblc)J+1HY?@iO}g zfMnvFIUUjcq_cJOvSw-JS-0axqZ`f`4ikcw7P$mxC(GQ-TnJ zl$#4aoDc%Ixp&Qrs)*W;l_{yvP#og6^Z*)`RGNiCO-hAe_~bbD`*b#u;wZ=^Y0FAD zwBI`ZAkkSXT0PUPYQgooaKB7@BxoU|qMW>y@Ap+(K}Dn?grn1k4~W#Q>0UmoYagKm zCEwB`|+DW2M-or6;&LA z2W|URzLp|rSg_^rDHFyyb@rPyWyXxAC+;3xKTC6$G+XT5!S7!3=8Z6ueJJi?3%p8k2K%@iGXn4c1MPd^!Vr3I?v~Eq$P`!Jt&nLm zu%^bQrhBI=oO+v_4Yg+{MF}700&_dy2IS1sg^tE$!i0%QoXrY-gwX(C!*M*hATm zK{mU|9LoqyR=&?LneYP%NC^4Kkh>|vYirM*Inzv@-yjjL22@4X?)GERHHOj;{HwZ& zZIg9ld!qZT9NUlD6AZZ*Z^%P_J#+W#m7gFzwTRsR2W6vYKvcs__;`649N!!p_pd(5 z55+*vxS1a})z|!C9e5wE_1*6$$0o#F1&QBR_Xu&|hpK0jpLc&)SU4G>>ZCsHKh>`r zyU?ebk=gXrpoSmCN2mPay=zxXzzI`pYdMlmPEPt0CpJOr4!PY6nx@|#BO{5brPU)2dsS2;=d4pljvRTE@O-CxlM!=2uU$p8>7+hVY@cM| z+g)N@PP@qdE~j1p;rPp3Bgp%=ebThNYo2Hfn)~_Sj3xxx+u(#BHC^m?cR$K0N~Q^z z4=P1Aw30eQB5(ZO%0fkBPo6`1cA~zjJ^9%_*^%f$qF-Fr?dZl~hqtnO(t{|;LaC8L zdR=qRl(qV$CM&}UT=+^TerpZJf{vpi!p3McSeZ|D0nLy-dp`CvFO~y zrCkA?8etdAEiH#9rH-h2FIDXFW3&vS-S{A65tnBu6v!-#l2-Ix)$HOARRS^e$vYnD z?KiE=YUVNU+RS?QE65+EKQqQA4RjL~wWI-;y7q2%;_eOxRQNpj@$VxwFP~SH?_W&5n;lCfzy!@zvx5a-R=jR7yjPOy4`rp4VKe*F9 zYl7;zoWK4uHZ*LEItQbal)p6!{vb6wd&j&-nsOOu&C14J0lue4H}vDuOA1T(vB7wX z#(tB$@o}QOg86&&{K){nNsZb6?jx6bT5O?t0=nN|i!bh9Yd^b+hK$;qN0II(K&i-8 zLkJw3huMckXe^_af#|F4o=)`V=?n(QjsOGz|j$&!+kv{1t! zSt6xmr%;rwl!?(UNtPC*k?hnkA)-`cNr=|Z<22r%-jXNav7PPV8=XZV8bI2b{id}M@fIjOYnwOqP=QZ7yi+Grkb?omp4@H?N8EA z7Esg2hcm_-4^mHh+Hizb*o<9VTv8Y2dW+aH@y45_h&TUx9R1hl4NDEur z+smr$7SlaS*_;w02Q^6^Mf9lLy9o?Vk!XVD73q1D<KEjZ(Sh4-)s$Xrs+QhqL^Z%rO|jR7UW9jeSI*sHOw_vki-xN4@NY*gKE z9X*K%j=@Dqf%ik5EHX#lOH(ErlvjWi*S-4fRQjyBb2|##3uO#%(THshiAG1uxCLS) zmr0qtsT6~+4L|o>iHitBf(U`68l>cC*&`r(+1Gd{nk8a*Bz<}2oH?&88{BTQInZui z1qzm%MoPCh4J5SY!ra}EMUr|Up8*As8M{1)^FqSs(-}9D(!wFJv&iEis8Z)PkQx8H zkT!|}{FSBBgM9bO;%T&^M$@M4v9Ucx8lc0oiyj3I5lX?q!N3AHcpMTGNv#rz52nER zdZ#fs5$4R9gRCbzwtAlS(4pB-3vJcZuE+X?jo$y|8xjUu zgibMMe-~|S1zL6yQ_IviI!F$9KT6LA;Gx?XBsph zd6`!6TD>8fV^Bh7bP!>{zGmbeQw(w6Q!X{+4=3jTcbjrT=*Y< zWX0CcNcvn57gIrIqsbNC)iu@Yqal=uD-$zvigN>eVtFiVVR;Xq_6qjj{av zXcS+IpEP_v%&VXs$Y$#9e*S}sNRSPPMURCwqWIoyA0N}O6Rm-wNbIfJtai(po{@ffhOTmDHJUh6@Mih~z z>(`HF!y{ojGiR1(WwEMd{K7r(($@&iVy^)qoO-O~DHwYB9CUf3@aVrJ^q!4k<&i}A zeu=}DC^7b7rP7Or3dBaWo=w>?<^#MbGkRx5&DUjSeSb_HMm1M5qOpSXSlN~lWI5+h z?nodDf?33HZKQprv_hzT%ky7KR4!{Xm`o9l6#2An-Ng^3#4e7+y=mZ(v;Xq@h~E=? z-0jzXhv=A4#>$hxJMIr^jcsG*+__ojB43>1uuSM-H+ODh5YbfYb@XY`m7O0=vQQIQ zKgtW4EKZJvyu)R!YQ03)Pk?ZA3?wxB!*zBi9p*kjnK_Un6Ry4UaU9z&^fP+A4&wUc zooLS;g2Pq$;l|`-i19eP1Oo`}W+Pgd=vt5q{@Vw%GB-C@_GzXphCD6?^O3zm(p6;c zC@L~W%{Y{S;K&qSExo;5BwphjbC=Q=>EjXF$R-$?^{MjHC%HX5h+YN;-KQQLB%*$? zKR}1`E5{zE8KUd=p?D+{BxR?Jm=gGsL3kq4M=sL0ee>Dr2u%d@QHTJcxM2E>8KSEI zYigrdSMjRx>?#_l@VpxE_1&ByQWQ~o`J+seEM4|bJ@0J?0|OPnq(VEAu`1 }d; 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̿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�H%b9j$j&13vZ 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 |vY^Q=nfA{B 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 Ux*DBxN5CZ|_DVGWrOxO72a>j elemStyleClass = new LinkedList(); + List elemStyleClass = new LinkedList<>(); - List>> elemFunctions = new LinkedList>>(); + List>> elemFunctions = new LinkedList<>(); Boolean nodePerWord = false; - List styles = new LinkedList(); + List styles = new LinkedList<>(); VBox root = new VBox(); diff --git a/javafx-markdown/src/main/java/example/MarkdownView.java b/javafx-markdown/src/main/java/example/MarkdownView.java index f179b7800..7c2607c5d 100644 --- a/javafx-markdown/src/main/java/example/MarkdownView.java +++ b/javafx-markdown/src/main/java/example/MarkdownView.java @@ -1,16 +1,28 @@ package example; +import java.net.URL; + import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.image.WritableImage; +import javafx.scene.image.PixelWriter; import javafx.scene.layout.VBox; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + @SuppressWarnings("restriction") public class MarkdownView extends VBox { + private final Logger logger = LoggerFactory + .getLogger(MarkdownView.class); + + private SimpleStringProperty mdString = new SimpleStringProperty(""); public MarkdownView(String mdString) { @@ -55,8 +67,58 @@ public Node generateImage(String url) { if (url.isEmpty()) { return new Group(); } else { - return new ImageView(new Image(url, true)); + return new ImageView(generateImageWithPlaceholder(url)); } + } + + // wrap the image generation in a try/catch, + // when an exception occurs, substitute a placeholder Image instead of + // letting the exception flow out and crash the JavaFX renderer + + public Image generateImageWithPlaceholder(String url) { + if (url == null || url.isEmpty()) { + return getPlaceholder(); + } + try { + // sanitize input + url = url.trim().replace("`", ""); + if (url.startsWith("<") && url.endsWith(">")) { + url = url.substring(1, url.length() - 1).trim(); + } + + // attempt to create the Image + Image image = new Image(url, true); // background loading + if (image.isError()) { + logger.warn("Image reported error for url: " + url); + return getPlaceholder(); + } + return image; + + } catch (IllegalArgumentException | NullPointerException e) { + logger.warn("Failed to load image: " + url + " -> " + e.getMessage()); + return getPlaceholder(); + } + } + + private Image getPlaceholder() { + try { + URL res = getClass().getResource("/images/placeholder.png"); + if (res != null) return new Image(res.toExternalForm(), true); + + // NOTE: can generate 1x1 transparent image on the fly + WritableImage writableImage = new WritableImage(50, 50); + PixelWriter pixelWriter = writableImage.getPixelWriter(); + for (int y = 0; y < 50; y++) { + for (int x = 0; x < 50; x++) { + pixelWriter.setArgb(x, y, 0xFFCCCCCC); + } + } + return writableImage; + } catch (Exception e) { + logger.error("Failed to create placeholder image: ", e); + return null; + } } + } diff --git a/javafx-markdown/src/main/resources/images/placeholder.png b/javafx-markdown/src/main/resources/images/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..29464dcfbecf65abfd9cdc3f317a9f1750ef6304 GIT binary patch literal 1491 zcmchX{XY{30LFLnxojb)^g`$T?ZZ(gNeOMN2s4FG-iA9TFX7sGe+!w?8M%3jvhudP z56#PLWSTK-vXg9FO%`I7tuZ#7{)xUne4pp}2cBFw?5Yw-9RvUXl$@O$ukR-X0Qlj6 z!h!t;mzmb>4`sNkCsZPl2!%qaRLWwp+S=NRii-C3_PjgnhW=g0)i>7E)?h0uIlP^? zxVW;iGVz9(LLC-w@6p*`=a;q^oG;V!JJd-bDieh)3D3^XZfxm&#}#`KYzp%8Cf;x6 zqYD=n7WiLxdl;Od$&Kbo`qri_EiFwX-Rmc%YJT{w+t8d{hN$GU@_?r)y z;);RJEIrnRCU^?@p4$Zf5~9|%MtedKFn=m5SH53&YXzv`75Z~ z%e__aJRZoG@GPs;8m7u8Khr56$c+E^g(DRxS}bR62GIzw9B(4bjCFIn%Ib>qXedav zPJTK1?$fN6(OM)XDm)?_VKy-a0LW)JJAyqEpYUgcZ?K&JL+dIdSypb@VZU5el~*?_ zrX*c?nFwi|_AWw1rHDy_J!te1u)`=h!on^^BpW*Z&mBYA%-rqESKah<_sOa;b@%hA z3{_LR6`o_JnPMoD*SYO*7F0l1zYEI*0?INnfC}G7+9G*r|50IbZ97b*B-o5M9gmC{ zz7)(KLFNQ@#Mus>og38&Ztm}U-5^Nlox7xtbh@clEZ}>`2TJ<>Xnv^Zey)^eyy|T- zu4RI-%CiQC*efUHL1GsR3b=UIX* zp4o{WJtiG*1&5OiJhfCCMDn)jB;jl0kY4)* z4Bn^t?axNek2)eM@n-yHzbgqTHiKtBodbb;bl0M04Nefs1RCgaEH7&~Qn&Uk zkuNIoyMFeg6*VN)+51L(;_^YS4ul8SDn=(b)3ntkIA@WCbS>-udeCh7RTNXXn~bjt zkI%U^W;%c-aD=ALVFZqc&4o`FO-KoqXh_c~=o>CqQW3%@L zBuf%Ww?0`@+1BvZ7Th@+KO!B6;^tTLiDw}Sl3-Ku>k(ga`Q zF8KiC_4McG5=HUWM2&mB3W7l@s(GgKttS^IF78RP)-2F8^zi@F4v5*(ikG{QnVlS9 zsCXPi+Qck$LZ)phK>AGx1mbDwF;JbZ&j_1le;?}#RVBq{ExN_oAcna#?h;0>8s8b8 zmR97eU=g$pj;23P|8*Fg&C&H@g5~zMxIz_(pa()= zx_*bD!m!vlv675+X>cjxw`5#^ZC(sa zJkMarZYs$z{HM4>yN`F0;Z1b~YuZL(D8X0($E6??d1co?5n!ktBq#TMB*E&xg9H#& uI-mPMsXpw7!uh+)FS=<6wBt8McMdJZ);MrnUli`2HNY7Pb8LYGW&ID{uiIDv literal 0 HcmV?d00001 diff --git a/javafx-markdown/test-jdk11.sh b/javafx-markdown/test-jdk11.sh index 4ebe49ebb..3eb29717f 100755 --- a/javafx-markdown/test-jdk11.sh +++ b/javafx-markdown/test-jdk11.sh @@ -1,4 +1,51 @@ -#!/bin/sh +#!/bin/bash +# Launch JavaFX Markdown Viewer app, fallback to JDK 8 if JavaFX SDK is missing + +APP_CLASS=com.markdown.MarkdownViewerApp +JAR_NAME=markdown-viewer.jar +JAR_PATH="./target/${JAR_NAME}" +JFX_DIR="$HOME/javafx-sdk-11/lib" + +# Detect Java 11 first, fallback to Java 8 +JAVA_BIN=$(update-alternatives --list java | grep -E 'java-11' | head -n1) +if [[ -z "$JAVA_BIN" ]]; then + echo "Java 11 not found — trying Java 8" + JAVA_BIN=$(update-alternatives --list java | grep -E 'java-1\.8' | head -n1) +fi + +if [[ -z "$JAVA_BIN" ]]; then + echo "No compatible Java (11+ or 8) found via update-alternatives." + exit 1 +fi + +JAVA_VERSION=$("$JAVA_BIN" -version 2>&1 | head -n1) +echo "Using Java: $JAVA_VERSION" + +# Check for JavaFX SDK if Java 11 is in use +if [[ "$JAVA_VERSION" =~ \"11 ]] || [[ "$JAVA_VERSION" =~ \"17 ]]; then + if [[ -f "$JFX_DIR/javafx.controls.jar" ]]; then + echo "JavaFX SDK found in: $JFX_DIR" + exec "$JAVA_BIN" \ + --module-path "$JFX_DIR" \ + --add-modules javafx.controls,javafx.fxml \ + -cp "$JAR_PATH" \ + "$APP_CLASS" + else + echo "JavaFX SDK not found in: $JFX_DIR" + echo "Please download JavaFX 11 SDK from: https://gluonhq.com/products/javafx/" + echo "Or install Java 8 which includes JavaFX by default." + exit 1 + fi +fi + +# If Java 8, just run (JavaFX is included) +if [[ "$JAVA_VERSION" =~ \"1\.8 ]]; then + echo "Running on Java 8 with built-in JavaFX support." + exec "$JAVA_BIN" -cp "$JAR_PATH" "$APP_CLASS" +fi + +echo "Unsupported Java version. Only 11+ with JavaFX SDK or 1.8 are supported." +exit 1 mvn -f ./pom-java11.xml clean package echo 'Launching with classpath + modulepath semantics' From a60491c8f4196e199659f9ef3d2379c604489002 Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Tue, 18 Nov 2025 21:55:49 -0500 Subject: [PATCH 116/171] bumoed to configuration2, error in runtime --- javafx-markdown/pom-java11.xml | 8 +- javafx-markdown/pom.xml | 9 +- .../src/main/java/example/Example.java | 194 +++++++++--------- .../src/main/resources/application.properties | 1 + 4 files changed, 102 insertions(+), 110 deletions(-) create mode 100644 javafx-markdown/src/main/resources/application.properties diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml index 94e46b11e..fb0dbace1 100644 --- a/javafx-markdown/pom-java11.xml +++ b/javafx-markdown/pom-java11.xml @@ -9,7 +9,7 @@ UTF-8 11.1.0 0.64.2 - 1.10 + 2.4 4.2 1.3 2.7 @@ -33,9 +33,9 @@ ${flexmark-java.version} - commons-configuration - commons-configuration - ${commons-configuration.version} + org.apache.commons + commons-configuration2 + ${commons-configuration2.version} org.apache.commons diff --git a/javafx-markdown/pom.xml b/javafx-markdown/pom.xml index b5ee95487..e7a09d3ea 100644 --- a/javafx-markdown/pom.xml +++ b/javafx-markdown/pom.xml @@ -9,8 +9,7 @@ UTF-8 0.62.2 1.1.1 - - 1.10 + 2.4 4.2 1.3 2.7 @@ -32,9 +31,9 @@ ${flexmark-java.version} - commons-configuration - commons-configuration - ${commons-configuration.version} + org.apache.commons + commons-configuration2 + ${commons-configuration2.version} org.apache.commons diff --git a/javafx-markdown/src/main/java/example/Example.java b/javafx-markdown/src/main/java/example/Example.java index c423bdc82..175b0f205 100644 --- a/javafx-markdown/src/main/java/example/Example.java +++ b/javafx-markdown/src/main/java/example/Example.java @@ -7,114 +7,106 @@ import javafx.scene.control.ColorPicker; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; +import javafx.scene.control.Label; import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.layout.Priority; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.paint.Color; +import javafx.scene.text.Font; import javafx.stage.Stage; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; +import java.io.InputStream; +import java.io.InputStreamReader; import org.apache.commons.io.IOUtils; +import org.apache.commons.configuration2.Configuration; +import org.apache.commons.configuration2.builder.fluent.Configurations; +import org.apache.commons.configuration2.PropertiesConfiguration; import org.fxmisc.cssfx.CSSFX; @SuppressWarnings("restriction") public class Example extends Application { - private String mdfxTxt = null; - - @Override - public void start(Stage primaryStage) throws Exception { - - CSSFX.start(); - - mdfxTxt = IOUtils.toString(getClass().getResourceAsStream("/syntax.md"), - "UTF-8"); - mdfxTxt = mdfxTxt.replaceAll("local_image.jpg", - getResourcePath("local_image.jpg")); - System.err.println("Sample: " + mdfxTxt); - MarkdownView markdownView = new MarkdownView(mdfxTxt) { - // @Override - // public boolean showChapter(int[] currentChapter) { - // return currentChapter[1] == 1; - // } - - @Override - public void setLink(Node node, String link, String description) { - System.out.println("setLink: " + link); - node.setCursor(Cursor.HAND); - node.setOnMouseClicked(e -> { - System.out.println("link: " + link); - }); - } - - @Override - public Node generateImage(String url) { - if (url.equals("node://colorpicker")) { - return new ColorPicker(); - } else { - return super.generateImage(url); - } - } - }; - - TextArea textArea = new TextArea(mdfxTxt); - - markdownView.mdStringProperty().bind(textArea.textProperty()); - markdownView.getStylesheets().add("/css/mdfx-sample.css"); - - ScrollPane content = new ScrollPane(markdownView); - - content.setFitToWidth(true); - - textArea.setMinWidth(350); - HBox root = new HBox(textArea, content); - - Scene scene = new Scene(root, 700, 700); - - primaryStage.setScene(scene); - - primaryStage.show(); - } - - private static boolean debug = true; - - // NOTE: getResourceURI may not work with standalone or web hosted - // application - public String getResourceURI(String resourceFileName) { - - if (debug) { - System.err.println("Getting resource URI for: " + resourceFileName); - } - Class thisClass = this.getClass(); - System.err.println("Class: " + thisClass.getSimpleName()); - ClassLoader classLoader = thisClass.getClassLoader(); - URL resourceURL = classLoader.getResource(resourceFileName); - if (resourceURL != null) { - try { - System.err.println("Resource URL: " + resourceURL.toString()); - URI uri = resourceURL.toURI(); - if (debug) { - System.err.println("Resource URI: " + uri.toString()); - } - return uri.toString(); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } else { - return null; - } - } - - public static String getResourcePath(String resourceFileName) { - String prefix = "file://"; - final String resourcePath = String - .format("%s/%s/src/main/resources/%s", prefix, - System.getProperty("user.dir"), resourceFileName) - .replaceAll("\\\\", "/"); - if (debug) - System.err.println("Project based resource path: " + resourcePath); - - return resourcePath; - } - -} \ No newline at end of file + private static boolean debug = true; + private String mdfxTxt = null; + + @Override + public void start(Stage primaryStage) throws Exception { + + CSSFX.start(); + + // Load markdown text and replace local image paths + mdfxTxt = IOUtils.toString(getClass().getResourceAsStream("/syntax.md"), "UTF-8"); + mdfxTxt = mdfxTxt.replaceAll("local_image.jpg", getResourcePath("local_image.jpg")); + if (debug) System.err.println("Sample: " + mdfxTxt); + + MarkdownView markdownView = new MarkdownView(mdfxTxt) { + + @Override + public void setLink(Node node, String link, String description) { + if (debug) System.out.println("setLink: " + link); + node.setCursor(Cursor.HAND); + node.setOnMouseClicked(e -> System.out.println("link: " + link)); + } + + @Override + public Node generateImage(String url) { + if (url.equals("node://colorpicker")) { + return new ColorPicker(); + } else { + return super.generateImage(url); + } + } + }; + + TextArea textArea = new TextArea(mdfxTxt); + markdownView.mdStringProperty().bind(textArea.textProperty()); + markdownView.getStylesheets().add("/css/mdfx-sample.css"); + + ScrollPane content = new ScrollPane(markdownView); + content.setFitToWidth(true); + textArea.setMinWidth(350); + + // --- Top content: TextArea + MarkdownView --- + HBox mainContent = new HBox(textArea, content); + mainContent.setSpacing(5); + VBox.setVgrow(mainContent, Priority.ALWAYS); + + // --- Bottom version label --- + InputStream propStream = getClass().getResourceAsStream("/application.properties"); + + + Configurations configs = new Configurations(); + PropertiesConfiguration config = configs.properties(getClass().getResource("/application.properties")); + String version = config.getString("version", "0.1.0");Label versionLabel = new Label(String.format("Version: %s", version)); + versionLabel.setFont(Font.font("Arial", 12)); + versionLabel.setTextFill(Color.DARKGRAY); + versionLabel.setStyle("-fx-background-color: rgba(255,255,255,0.6); -fx-padding: 2;"); + + HBox bottomBox = new HBox(versionLabel); + bottomBox.setAlignment(Pos.CENTER_RIGHT); + bottomBox.setPadding(new Insets(5)); + bottomBox.setStyle("-fx-background-color: #f0f0f0;"); + + // --- Root VBox --- + VBox root = new VBox(mainContent, bottomBox); + root.setSpacing(2); + + Scene scene = new Scene(root, 700, 700); + primaryStage.setScene(scene); + primaryStage.show(); + } + + // --- Resource path helper --- + public static String getResourcePath(String resourceFileName) { + String prefix = "file://"; + final String resourcePath = String + .format("%s/%s/src/main/resources/%s", prefix, System.getProperty("user.dir"), resourceFileName) + .replaceAll("\\\\", "/"); + if (debug) System.err.println("Project based resource path: " + resourcePath); + return resourcePath; + } + +} diff --git a/javafx-markdown/src/main/resources/application.properties b/javafx-markdown/src/main/resources/application.properties new file mode 100644 index 000000000..caeaf1204 --- /dev/null +++ b/javafx-markdown/src/main/resources/application.properties @@ -0,0 +1 @@ +version=0.2.0 From 0ce2512cded8e4e891a9effe03b3bd881c5e00e0 Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Tue, 18 Nov 2025 22:01:38 -0500 Subject: [PATCH 117/171] intermediate revision - aded beanutils to address runtime error (it did not) --- javafx-markdown/pom-java11.xml | 8 +++++++- javafx-markdown/pom.xml | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml index fb0dbace1..8a1f8df16 100644 --- a/javafx-markdown/pom-java11.xml +++ b/javafx-markdown/pom-java11.xml @@ -9,6 +9,7 @@ UTF-8 11.1.0 0.64.2 + 1.10.0 2.4 4.2 1.3 @@ -37,6 +38,11 @@ commons-configuration2 ${commons-configuration2.version} + + org.apache.commons + commons-beanutils + ${commons-binutils.version} + org.apache.commons commons-collections4 @@ -95,7 +101,7 @@ 1.8 -#~bg129rWt&&=FqQB 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

;YCz=pALQml+ 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 literal 396351 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 }d; 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̿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�H%b9j$j&13vZ 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 |vY^Q=nfA{B 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 Ux*DBxN5CZ|_DVGWrOxO72a>j Date: Wed, 19 Nov 2025 11:05:54 -0500 Subject: [PATCH 119/171] intermediate revision - updated README and added translating http://github.com" links to "https://raw.githubusercontent.com/" for rendering - size is not patched yet --- javafx-markdown/README.md | 411 +----------------- .../src/main/java/example/MarkdownView.java | 49 ++- javafx-markdown/src/main/resources/syntax.md | 8 + 3 files changed, 78 insertions(+), 390 deletions(-) diff --git a/javafx-markdown/README.md b/javafx-markdown/README.md index 2b0fcaf4c..56551d258 100644 --- a/javafx-markdown/README.md +++ b/javafx-markdown/README.md @@ -1,409 +1,44 @@ ### Info -This directory contains the replica of -[markdown-javafx-renderer](https://github.com/JPro-one/markdown-javafx-renderer) `MarkdownView` class which uses -[vsch/flexmark-java](https://github.com/vsch/flexmark-java) Java implementation of markdown [spec](https://spec.commonmark.org/0.28/) and [real time CSS reloading](https://github.com/mcfoggy/cssfx) -converted temporarily to maven and Java 1.8. Also switched to classic `pom.xml` rom using [JPro custom build process](https://github.com/JPro-one/JPro-from-Jars) +This directory contains a minimal desktop application showcasing a standalone replica of the +[`MarkdownView`](https://github.com/JPro-one/markdown-javafx-renderer) Markdown-to-HTML renderer running inside a simple [JavaFX](https://en.wikipedia.org/wiki/JavaFX) UI. -### Usage +![application](https://github.com/sergueik/selenium_java/blob/master/javafx-markdown/screenshots/app.png) + +The project uses: -```cmd -mvn clean package -java -jar target\example.javafx_markdown.jar -``` -or if you need to explicitly load assemblies -```cmd -java -cp target\example.javafx_markdown.jar;target\lib\* example.Example -``` -and -```sh -mvn clean package -java -jar target/example.javafx_markdown.jar -``` -or if you need to explicitly load assemblies -```sh -java -cp target/example.javafx_markdown.jar:target/lib/* example.Example -``` +* [`flexmark-java`](https://github.com/vsch/flexmark-java) — a Java implementation of the [CommonMark 0.28](https://spec.commonmark.org/0.28/) specification +* [`cssfx`](https://github.com/mcfoggy/cssfx) — real-time CSS reloading +* A classic Maven `pom.xml` (replacing the original custom JPro build system) +* Java **1.8** and an **Azul Java 11** launcher for Windows and Linux -NOTE: on Windows, uses `;` as class path argument separator. For unix do `:` +This setup provides a clean, dependency-controlled JavaFX Markdown renderer suitable as a scaffold for future desktop tools. +--- -### TODO +### Usage -* The project does not run with Azul JDK 11. +#### Launcher scripts -To reproduce, call: +Windows (Java 8): ```cmd -call test-jdk11.cmd -``` - -Will get error (after significant delay) : - -```text - -Exception in Application start method -Exception in thread "main" java.lang.reflect.InvocationTargetException - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.base/java.lang.reflect.Method.invoke(Method.java:566) - at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1093) -Caused by: java.lang.RuntimeException: Exception in Application start method - at javafx.graphics@19/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901) - at javafx.graphics@19/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196) - at java.base/java.lang.Thread.run(Thread.java:829) -Caused by: java.lang.NoClassDefFoundError: org/fxmisc/cssfx/CSSFX - at example.Example.start(Example.java:28) - at javafx.graphics@19/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847) - at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) - at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) - at java.base/java.security.AccessController.doPrivileged(Native Method) - at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) - at javafx.graphics@19/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) - at javafx.graphics@19/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) - at javafx.graphics@19/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) - ... 1 more -Caused by: java.lang.ClassNotFoundException: org.fxmisc.cssfx.CSSFX -`org.fxmisc.cssfx` to `--add-modules` argument - -leads to build error: -```java.lang.module.FindException: Module org.fxmisc.cssfx not found -``` - at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) - at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) - at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527) - ... 10 more - -``` -adding `org.fxmisc.cssfx` to `--add-modules` argument - -leads to build error: - -```text -java.lang.module.FindException: Module org.fxmisc.cssfx not found +test.cmd ``` -#### Note - - * to check if cssfx is a JPMS module +Windows (Java 11): ```cmd -jar tf target/lib/cssfx-11.2.0.jar | findstr.exe module-info.class -``` - - -### Testing - -#### Linux with JDK 8 - - - -```sh -java -version -``` -```text -openjdk version "11.0.27" 2025-04-15 -OpenJDK Runtime Environment (build 11.0.27+6-post-Ubuntu-0ubuntu122.04) -OpenJDK 64-Bit Server VM (build 11.0.27+6-post-Ubuntu-0ubuntu122.04, mixed mode, sharing) -``` -```sh -sudo apt-get install openjdk-8-jdk -``` -```text - The following additional packages will be installed: - fonts-dejavu-extra libatk-wrapper-java libatk-wrapper-java-jni libgif7 - libice-dev libpthread-stubs0-dev libsm-dev libx11-dev libxau-dev libxcb1-dev - libxdmcp-dev libxt-dev openjdk-8-jdk-headless openjdk-8-jre - openjdk-8-jre-headless x11proto-dev xorg-sgml-doctools xtrans-dev -Suggested packages: - libice-doc libsm-doc libx11-doc libxcb-doc libxt-doc openjdk-8-demo - openjdk-8-source visualvm fonts-nanum fonts-ipafont-gothic - fonts-ipafont-mincho fonts-wqy-microhei fonts-wqy-zenhei fonts-indic -The following NEW packages will be installed: - fonts-dejavu-extra libatk-wrapper-java libatk-wrapper-java-jni libgif7 - libice-dev libpthread-stubs0-dev libsm-dev libx11-dev libxau-dev libxcb1-dev - libxdmcp-dev libxt-dev openjdk-8-jdk openjdk-8-jdk-headless openjdk-8-jre - openjdk-8-jre-headless x11proto-dev xorg-sgml-doctools xtrans-dev -0 upgraded, 19 newly installed, 0 to remove and 52 not upgraded. -Need to get 48.0 MB of archives. -After this operation, 163 MB of additional disk space will be used. -Do you want to continue? [Y/n] -``` -```sh -Y +test-jdk11.cmd ``` -```text -Get:1 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 fonts-dejavu-extra all 2.37-2build1 [2,041 kB] -Get:2 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libatk-wrapper-java all 0.38.0-5build1 [53.1 kB] -Get:3 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libatk-wrapper-java-jni amd64 0.38.0-5build1 [49.0 kB] -Get:4 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgif7 amd64 5.1.9-2ubuntu0.1 [33.9 kB] -Get:5 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 xorg-sgml-doctools all 1:1.11-1.1 [10.9 kB] -Get:6 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 x11proto-dev all 2021.5-1 [604 kB] -Get:7 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libice-dev amd64 2:1.0.10-1build2 [51.4 kB] -Get:8 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libpthread-stubs0-dev amd64 0.4-1build2 [5,516 B] -Get:9 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libsm-dev amd64 2:1.2.3-1build2 [18.1 kB] -Get:10 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxau-dev amd64 1:1.0.9-1build5 [9,724 B] -Get:11 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxdmcp-dev amd64 1:1.1.3-0ubuntu5 [26.5 kB] -Get:12 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 xtrans-dev all 1.4.0-1 [68.9 kB] -Get:13 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxcb1-dev amd64 1.14-3ubuntu3 [86.5 kB] -Get:14 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libx11-dev amd64 2:1.7.5-1ubuntu0.3 [744 kB] -Get:15 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 libxt-dev amd64 1:1.2.1-1 [396 kB] -Get:16 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jre-headless amd64 8u452-ga~us1-0ubuntu1~22.04 [30.8 MB] -Get:17 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jre amd64 8u452-ga~us1-0ubuntu1~22.04 [75.3 kB] -Get:18 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jdk-headless amd64 8u452-ga~us1-0ubuntu1~22.04 [8,878 kB] -Get:19 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-8-jdk amd64 8u452-ga~us1-0ubuntu1~22.04 [4,039 kB] -Fetched 48.0 MB in 6s (8,625 kB/s) -Selecting previously unselected package fonts-dejavu-extra. -(Reading database ... 244117 files and directories currently installed.) -Preparing to unpack .../00-fonts-dejavu-extra_2.37-2build1_all.deb ... -Unpacking fonts-dejavu-extra (2.37-2build1) ... -Selecting previously unselected package libatk-wrapper-java. -Preparing to unpack .../01-libatk-wrapper-java_0.38.0-5build1_all.deb ... -Unpacking libatk-wrapper-java (0.38.0-5build1) ... -Selecting previously unselected package libatk-wrapper-java-jni:amd64. -Preparing to unpack .../02-libatk-wrapper-java-jni_0.38.0-5build1_amd64.deb ... -Unpacking libatk-wrapper-java-jni:amd64 (0.38.0-5build1) ... -Selecting previously unselected package libgif7:amd64. -Preparing to unpack .../03-libgif7_5.1.9-2ubuntu0.1_amd64.deb ... -Unpacking libgif7:amd64 (5.1.9-2ubuntu0.1) ... -Selecting previously unselected package xorg-sgml-doctools. -Preparing to unpack .../04-xorg-sgml-doctools_1%3a1.11-1.1_all.deb ... -Unpacking xorg-sgml-doctools (1:1.11-1.1) ... -Selecting previously unselected package x11proto-dev. -Preparing to unpack .../05-x11proto-dev_2021.5-1_all.deb ... -Unpacking x11proto-dev (2021.5-1) ... -Selecting previously unselected package libice-dev:amd64. -Preparing to unpack .../06-libice-dev_2%3a1.0.10-1build2_amd64.deb ... -Unpacking libice-dev:amd64 (2:1.0.10-1build2) ... -Selecting previously unselected package libpthread-stubs0-dev:amd64. -Preparing to unpack .../07-libpthread-stubs0-dev_0.4-1build2_amd64.deb ... -Unpacking libpthread-stubs0-dev:amd64 (0.4-1build2) ... -Selecting previously unselected package libsm-dev:amd64. -Preparing to unpack .../08-libsm-dev_2%3a1.2.3-1build2_amd64.deb ... -Unpacking libsm-dev:amd64 (2:1.2.3-1build2) ... -Selecting previously unselected package libxau-dev:amd64. -Preparing to unpack .../09-libxau-dev_1%3a1.0.9-1build5_amd64.deb ... -Unpacking libxau-dev:amd64 (1:1.0.9-1build5) ... -Selecting previously unselected package libxdmcp-dev:amd64. -Preparing to unpack .../10-libxdmcp-dev_1%3a1.1.3-0ubuntu5_amd64.deb ... -Unpacking libxdmcp-dev:amd64 (1:1.1.3-0ubuntu5) ... -Selecting previously unselected package xtrans-dev. -Preparing to unpack .../11-xtrans-dev_1.4.0-1_all.deb ... -Unpacking xtrans-dev (1.4.0-1) ... -Selecting previously unselected package libxcb1-dev:amd64. -Preparing to unpack .../12-libxcb1-dev_1.14-3ubuntu3_amd64.deb ... -Unpacking libxcb1-dev:amd64 (1.14-3ubuntu3) ... -Selecting previously unselected package libx11-dev:amd64. -Preparing to unpack .../13-libx11-dev_2%3a1.7.5-1ubuntu0.3_amd64.deb ... -Unpacking libx11-dev:amd64 (2:1.7.5-1ubuntu0.3) ... -Selecting previously unselected package libxt-dev:amd64. -Preparing to unpack .../14-libxt-dev_1%3a1.2.1-1_amd64.deb ... -Unpacking libxt-dev:amd64 (1:1.2.1-1) ... -Selecting previously unselected package openjdk-8-jre-headless:amd64. -Preparing to unpack .../15-openjdk-8-jre-headless_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... -Unpacking openjdk-8-jre-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -Selecting previously unselected package openjdk-8-jre:amd64. -Preparing to unpack .../16-openjdk-8-jre_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... -Unpacking openjdk-8-jre:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -Selecting previously unselected package openjdk-8-jdk-headless:amd64. -Preparing to unpack .../17-openjdk-8-jdk-headless_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... -Unpacking openjdk-8-jdk-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -Selecting previously unselected package openjdk-8-jdk:amd64. -Preparing to unpack .../18-openjdk-8-jdk_8u452-ga~us1-0ubuntu1~22.04_amd64.deb ... -Unpacking openjdk-8-jdk:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -Setting up libpthread-stubs0-dev:amd64 (0.4-1build2) ... -Setting up xtrans-dev (1.4.0-1) ... -Setting up openjdk-8-jre-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode -Setting up libgif7:amd64 (5.1.9-2ubuntu0.1) ... -Setting up fonts-dejavu-extra (2.37-2build1) ... -Setting up xorg-sgml-doctools (1:1.11-1.1) ... -Setting up libatk-wrapper-java (0.38.0-5build1) ... -Setting up libatk-wrapper-java-jni:amd64 (0.38.0-5build1) ... -Setting up openjdk-8-jdk-headless:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/clhsdb to provide /usr/bin/clhsdb (clhsdb) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/extcheck to provide /usr/bin/extcheck (extcheck) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/hsdb to provide /usr/bin/hsdb (hsdb) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/idlj to provide /usr/bin/idlj (idlj) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jar to provide /usr/bin/jar (jar) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jarsigner to provide /usr/bin/jarsigner (jarsigner) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javadoc to provide /usr/bin/javadoc (javadoc) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javah to provide /usr/bin/javah (javah) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javap to provide /usr/bin/javap (javap) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jcmd to provide /usr/bin/jcmd (jcmd) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jdb to provide /usr/bin/jdb (jdb) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jdeps to provide /usr/bin/jdeps (jdeps) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jfr to provide /usr/bin/jfr (jfr) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jhat to provide /usr/bin/jhat (jhat) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jinfo to provide /usr/bin/jinfo (jinfo) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jmap to provide /usr/bin/jmap (jmap) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jps to provide /usr/bin/jps (jps) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jrunscript to provide /usr/bin/jrunscript (jrunscript) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jsadebugd to provide /usr/bin/jsadebugd (jsadebugd) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstack to provide /usr/bin/jstack (jstack) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstat to provide /usr/bin/jstat (jstat) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstatd to provide /usr/bin/jstatd (jstatd) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/native2ascii to provide /usr/bin/native2ascii (native2ascii) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/rmic to provide /usr/bin/rmic (rmic) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/schemagen to provide /usr/bin/schemagen (schemagen) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/serialver to provide /usr/bin/serialver (serialver) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/wsgen to provide /usr/bin/wsgen (wsgen) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/wsimport to provide /usr/bin/wsimport (wsimport) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/xjc to provide /usr/bin/xjc (xjc) in auto mode -Setting up openjdk-8-jre:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode -Setting up openjdk-8-jdk:amd64 (8u452-ga~us1-0ubuntu1~22.04) ... -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer to provide /usr/bin/appletviewer (appletviewer) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole to provide /usr/bin/jconsole (jconsole) in auto mode -Processing triggers for hicolor-icon-theme (0.17-2) ... -Processing triggers for gnome-menus (3.36.0-1ubuntu3) ... -Processing triggers for libc-bin (2.35-0ubuntu3.10) ... -Processing triggers for man-db (2.10.2-1) ... -Processing triggers for sgml-base (1.30) ... -Processing triggers for mailcap (3.70+nmu1ubuntu1) ... -Setting up x11proto-dev (2021.5-1) ... -Processing triggers for fontconfig (2.13.1-4.2ubuntu5) ... -Processing triggers for desktop-file-utils (0.26-1ubuntu3) ... -Setting up libxau-dev:amd64 (1:1.0.9-1build5) ... -Setting up libice-dev:amd64 (2:1.0.10-1build2) ... -Setting up libsm-dev:amd64 (2:1.2.3-1build2) ... -Setting up libxdmcp-dev:amd64 (1:1.1.3-0ubuntu5) ... -Setting up libxcb1-dev:amd64 (1.14-3ubuntu3) ... -Setting up libx11-dev:amd64 (2:1.7.5-1ubuntu0.3) ... -Setting up libxt-dev:amd64 (1:1.2.1-1) ... -sergueik@sergueik47:~$ java -version -openjdk version "11.0.27" 2025-04-15 -OpenJDK Runtime Environment (build 11.0.27+6-post-Ubuntu-0ubuntu122.04) -OpenJDK 64-Bit Server VM (build 11.0.27+6-post-Ubuntu-0ubuntu122.04, mixed mode, sharing) -``` -```sh -dpkg -l | grep openj -``` -```text -ii libopenjp2-7:amd64 2.4.0-6ubuntu0.3 amd64 JPEG 2000 image compression/decompression library -ii openjdk-11-jre-headless:amd64 11.0.27+6~us1-0ubuntu1~22.04 amd64 OpenJDK Java runtime, using Hotspot JIT (headless) -ii openjdk-8-jdk:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Development Kit (JDK) -ii openjdk-8-jdk-headless:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Development Kit (JDK) (headless) -ii openjdk-8-jre:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Java runtime, using Hotspot JIT -ii openjdk-8-jre-headless:amd64 8u452-ga~us1-0ubuntu1~22.04 amd64 OpenJDK Java runtime, using Hotspot JIT (headless) -``` - -```sh -sudo apt-get remove openjdk-11-jre -``` -```text -Reading package lists... Done -Building dependency tree... Done -Reading state information... Done -Package 'openjdk-11-jre' is not installed, so not removed -The following packages were automatically installed and are no longer required: - libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib python2-minimal - python2.7 python2.7-minimal -Use 'sudo apt autoremove' to remove them. -0 upgraded, 0 newly installed, 0 to remove and 52 not upgraded. -sergueik@sergueik47:~$ sudo apt-get remove openjdk-11-jre-headless -Reading package lists... Done -Building dependency tree... Done -Reading state information... Done -The following packages were automatically installed and are no longer required: - libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib python2-minimal - python2.7 python2.7-minimal -Use 'sudo apt autoremove' to remove them. -The following packages will be REMOVED: - default-jre-headless openjdk-11-jre-headless -0 upgraded, 0 newly installed, 2 to remove and 52 not upgraded. -After this operation, 176 MB disk space will be freed. -Do you want to continue? [Y/n] -``` -```text -(Reading database ... 245165 files and directories currently installed.) -Removing default-jre-headless (2:1.11-72build2) ... -Removing openjdk-11-jre-headless:amd64 (11.0.27+6~us1-0ubuntu1~22.04) ... -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/jjs to provide /usr/bin/jjs (jjs) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode -update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode -``` - -### .Net Framework Alternatives - -

    -
  1. -Use a Markdown-to-HTML converter like [Markdig](https://github.com/xoofx/markdig) that can be added as nuget dependency -[Markdig](https://www.nuget.org/packages/Markdig) -(modern, pure .NET) or [CommonMark.NET](https://www.nuget.org/packages/CommonMark.NET) to perform Markdown to HTML conversion then render in - WebBrowser control embedded in an Windows Forms or in WPF through `System.Windows.Forms.WebBrowser`: - -```c# -using Markdig; - -string markdown = File.ReadAllText("README.md"); -string html = Markdown.ToHtml(markdown); - -string fullHtml = $"{html}"; - -webBrowser1.DocumentText = fullHtml; - -``` -this would work even on .NET 4.0+ (Windows has .Net Framework 4.8 ). -The WebBrowser uses IE rendering mode, which one can tweak via registry -(FEAT URE_BROWSER_EMULATION) to look like specific version of the browswer, up to __IE11__. - -
  2. -
  3. Use Markdig with WPF + WebView2 (optional) - -Add [WebView2](https://www.nuget.org/packages/Microsoft.Web.WebView2/1.0.3296.44#supportedframeworks-body-tab) -dependency, this will work with .NET Framework __4.6.2__ and later and offer slightly -more *modern* Chromium-based rendering engine, but the latter is ultra heavy: +#### Manual run -```c# - -string html = Markdown.ToHtml(markdownText); -await webView2Control.EnsureCoreWebView2Async(); -webView2Control.NavigateToString(html); - -``` -
  4. -
  5. Use `RichTextBox` or `FlowDocument` (NOTE: lower fidelity) -There’s no built-in markdown parser, but if you only need bold/italic/lists and want native .NET controls -(e.g., RichTextBox, FlowDocumentViewer), you can parse Markdown manually or via a -Add nuget dependency [Markdown.Xaml](https://www.nuget.org/packages/Markdown.Xaml): - -``` -var md = new Markdown.Xaml.Markdown(); -var flowDoc = md.Transform("**bold** _italic_"); -myFlowDocumentViewer.Document = flowDoc; +```cmd +mvn clean package +java -cp target/javafx_markdown.jar;target/lib/* com.sandec.mdfx.example.ExampleMDFX ``` -NOTE: This provides basic styling but not a full GitHub-style rendering. - -
  6. -
- -### Installing Azul JDK - -Unlike OpenJDK 11 and Oracle JDK 11, the [Azul JDK](https://www.azul.com/core-post-download/?endpoint=zulu&uuid=e0449078-aad8-4719-aba8-78ae22fea199) has JavaFX included. - - -* Make sure to uncheck both - -+ add to PATH -+ set JAVA_HOME variable - -when installing the MSI -Also, make sure to install under `C:\java\zulu-jdk11`, not the default location `C:\Program Files\Zulu\zulu-11\` -NOTE: install 32 or 64 bit Azul JDK (`zulu11.82.19-ca-jdk11.0.28-win_i686.msi`/`zulu11.82.19-ca-jdk11.0.28-win_x64.msi`) in the same location - -### See Also - * javascript and JavaFX powered [Markdown Editor](https://github.com/arildyk/simple-markdown-editor) (need to convert from visual studio code project) +--- ### Author -[Serguei Kouzmine](kouzmine_serguei@yahoo.com) - +[Serguei Kouzmine](mailto:kouzmine_serguei@yahoo.com) diff --git a/javafx-markdown/src/main/java/example/MarkdownView.java b/javafx-markdown/src/main/java/example/MarkdownView.java index 7c2607c5d..ed3922b50 100644 --- a/javafx-markdown/src/main/java/example/MarkdownView.java +++ b/javafx-markdown/src/main/java/example/MarkdownView.java @@ -12,6 +12,9 @@ import javafx.scene.image.PixelWriter; import javafx.scene.layout.VBox; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +25,11 @@ public class MarkdownView extends VBox { private final Logger logger = LoggerFactory .getLogger(MarkdownView.class); - + private static final Pattern GITHUB_BLOB_PATTERN = Pattern.compile( + "https?://github\\.com/(?[^/]+)/(?[^/]+)/(?:blob|tree)/(?[^/]+)/(?.+)", + Pattern.CASE_INSENSITIVE + ); + private SimpleStringProperty mdString = new SimpleStringProperty(""); public MarkdownView(String mdString) { @@ -67,10 +74,48 @@ public Node generateImage(String url) { if (url.isEmpty()) { return new Group(); } else { - return new ImageView(generateImageWithPlaceholder(url)); + return new ImageView(generateImageWithPlaceholder(translateImageUrl(url))); } } + private String translateImageUrl(String url) { + if (url == null || url.isEmpty()) return url; + + Matcher m = GITHUB_BLOB_PATTERN.matcher(url); + if (m.matches()) { + String user = m.group("user"); + String repo = m.group("repo"); + String branch = m.group("branch"); + String path = m.group("path"); + + // Normalize path (remove possible leading slashes) + if (path.startsWith("/")) path = path.substring(1); + + String translated = String.format("https://raw.githubusercontent.com/%s/%s/%s/%s", + user, repo, branch, path); + logger.warn(String.format("translateImageUrl: %s -> %s", url, translated)); + System.err.println(String.format("translateImageUrl: %s -> %s", url, translated)); + return translated; + } + + // No match: return original URL unchanged + logger.warn(String.format("translateImageUrl: %s (unchanged)", url)); + return url; + } + + private String translateImageUrlShort(String url) { + final String regex = "\\(https://github\\.com/([^/]+)/([^/]+)/blob/([^/]+)/(.*?)\\)"; + String translatedUrl = url.replaceAll( + regex, + "(https://raw.githubusercontent.com/$1/$2/$3/$4)" + ); + System.err.println(String.format("translated %s to %s ", url, translatedUrl)); + // if (debug) System.err.println(String.format("translated %s to %s ", url, translatedUrl)); + logger.info(String.format("translated %s to %s ", url, translatedUrl)); + return translatedUrl; + } + + // wrap the image generation in a try/catch, // when an exception occurs, substitute a placeholder Image instead of // letting the exception flow out and crash the JavaFX renderer diff --git a/javafx-markdown/src/main/resources/syntax.md b/javafx-markdown/src/main/resources/syntax.md index 7e7e4c266..0ff9a6a54 100644 --- a/javafx-markdown/src/main/resources/syntax.md +++ b/javafx-markdown/src/main/resources/syntax.md @@ -42,6 +42,14 @@ asdf | asdfsdf | asdf ![Image](https://www.jpro.one/app/default/resourcesencoded/jar:file:/home/ubuntu/jpro/jpro.one-jpro/libs/jpro.one.jar!/one/jpro/img/landing/Java-Logo.png) * image from earlier deployed `README.md` + + +``` +![application](https://github.com/sergueik/selenium_java/blob/master/javafx-markdown/screenshots/app.png) + +``` +![application](https://github.com/sergueik/selenium_java/blob/master/javafx-markdown/screenshots/app.png) + ``` ![APM Example](https://github.com/sergueik/springboot_study/blob/master/basic-elk-cluster/screenshots/capture-apm-example.png) From 7b49208715102177c38bdf5443054f30fac8dd85 Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Wed, 19 Nov 2025 11:33:24 -0500 Subject: [PATCH 120/171] intermediate revision - added downloadBytes fix and fixed logging --- .../src/main/java/example/Example.java | 5 +-- .../src/main/java/example/MarkdownView.java | 39 ++++++++++++++++++- .../src/main/resources/application.properties | 2 +- javafx-markdown/src/main/resources/log4j2.xml | 13 +++++++ 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 javafx-markdown/src/main/resources/log4j2.xml diff --git a/javafx-markdown/src/main/java/example/Example.java b/javafx-markdown/src/main/java/example/Example.java index b12f2750a..7f1991c1a 100644 --- a/javafx-markdown/src/main/java/example/Example.java +++ b/javafx-markdown/src/main/java/example/Example.java @@ -73,8 +73,7 @@ public Node generateImage(String url) { mainContent.setSpacing(5); VBox.setVgrow(mainContent, Priority.ALWAYS); - // --- Bottom version label --- - InputStream propStream = getClass().getResourceAsStream("/application.properties"); + // InputStream propStream = getClass().getResourceAsStream("/application.properties"); Properties properties = new Properties(); @@ -91,7 +90,7 @@ public Node generateImage(String url) { Label versionLabel = new Label(String.format("Version: %s", version)); versionLabel.setFont(Font.font("Arial", 12)); - versionLabel.setTextFill(Color.DARKGRAY); + versionLabel.setTextFill(Color.BLACK); versionLabel.setStyle("-fx-background-color: rgba(255,255,255,0.6); -fx-padding: 2;"); HBox bottomBox = new HBox(versionLabel); diff --git a/javafx-markdown/src/main/java/example/MarkdownView.java b/javafx-markdown/src/main/java/example/MarkdownView.java index ed3922b50..d79ac56b8 100644 --- a/javafx-markdown/src/main/java/example/MarkdownView.java +++ b/javafx-markdown/src/main/java/example/MarkdownView.java @@ -1,6 +1,11 @@ package example; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; +import java.net.URLConnection; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; @@ -120,7 +125,7 @@ private String translateImageUrlShort(String url) { // when an exception occurs, substitute a placeholder Image instead of // letting the exception flow out and crash the JavaFX renderer - public Image generateImageWithPlaceholder(String url) { + public Image generateImageWithPlaceholderOld(String url) { if (url == null || url.isEmpty()) { return getPlaceholder(); } @@ -146,6 +151,38 @@ public Image generateImageWithPlaceholder(String url) { } } + private Image generateImageWithPlaceholder(String url) { + try { + byte[] data = downloadBytes(url); + if (data == null || data.length == 0) { + return getPlaceholder(); + } + return new Image(new ByteArrayInputStream(data)); + } catch (Exception e) { + logger.error("Image load failed for: " + url, e); + return getPlaceholder(); + } + } + + private byte[] downloadBytes(String urlStr) throws IOException { + URL url = new URL(urlStr); + URLConnection conn = url.openConnection(); + conn.setRequestProperty("User-Agent", "Mozilla/5.0"); // required! + conn.setUseCaches(false); + + try (InputStream in = conn.getInputStream(); + ByteArrayOutputStream out = new ByteArrayOutputStream()) { + + byte[] buf = new byte[8192]; + int len; + while ((len = in.read(buf)) != -1) { + out.write(buf, 0, len); + } + return out.toByteArray(); + } + } + + private Image getPlaceholder() { try { URL res = getClass().getResource("/images/placeholder.png"); diff --git a/javafx-markdown/src/main/resources/application.properties b/javafx-markdown/src/main/resources/application.properties index caeaf1204..62044170e 100644 --- a/javafx-markdown/src/main/resources/application.properties +++ b/javafx-markdown/src/main/resources/application.properties @@ -1 +1 @@ -version=0.2.0 +version=0.3.0 diff --git a/javafx-markdown/src/main/resources/log4j2.xml b/javafx-markdown/src/main/resources/log4j2.xml new file mode 100644 index 000000000..f714117e9 --- /dev/null +++ b/javafx-markdown/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From cabdc6b6af934e203af66f6575271b905c07535d Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Wed, 19 Nov 2025 18:41:53 -0500 Subject: [PATCH 121/171] intermediate revision - used logger evywhere misc. cosmetic changes --- javafx-markdown/README.md | 13 +- .../src/main/java/example/Example.java | 181 +++++++++--------- .../src/main/java/example/MarkdownView.java | 27 ++- .../src/main/resources/application.properties | 2 +- javafx-markdown/test-jdk11.cmd | 9 +- javafx-markdown/test.cmd | 11 +- 6 files changed, 119 insertions(+), 124 deletions(-) diff --git a/javafx-markdown/README.md b/javafx-markdown/README.md index 56551d258..b7f64005e 100644 --- a/javafx-markdown/README.md +++ b/javafx-markdown/README.md @@ -1,18 +1,17 @@ ### Info This directory contains a minimal desktop application showcasing a standalone replica of the -[`MarkdownView`](https://github.com/JPro-one/markdown-javafx-renderer) Markdown-to-HTML renderer running inside a simple [JavaFX](https://en.wikipedia.org/wiki/JavaFX) UI. +[`MarkdownView`](https://github.com/JPro-one/markdown-javafx-renderer) __Markdown for JavaFX__ advanced HTML WebView renderer hosted inside a basic [JavaFX](https://en.wikipedia.org/wiki/JavaFX) UI to run on Linux or Windows laptop. -![application](https://github.com/sergueik/selenium_java/blob/master/javafx-markdown/screenshots/app.png) - +![application](screenshots/app.png) The project uses: * [`flexmark-java`](https://github.com/vsch/flexmark-java) — a Java implementation of the [CommonMark 0.28](https://spec.commonmark.org/0.28/) specification * [`cssfx`](https://github.com/mcfoggy/cssfx) — real-time CSS reloading -* A classic Maven `pom.xml` (replacing the original custom JPro build system) -* Java **1.8** and an **Azul Java 11** launcher for Windows and Linux +* A classic Maven `pom.xml` (replacing the original gradle ) +* Java **1.8** and an Java __11+__ SDK with __JavaFx__ present e.g on **Azul Java 11** launcher for Windows and Linux -This setup provides a clean, dependency-controlled JavaFX Markdown renderer suitable as a scaffold for future desktop tools. +This setup provides a clean, dependency-controlled JavaFX Markdown renderer suitable for pre-commit checks against broken markdown syntax. --- @@ -34,7 +33,7 @@ test-jdk11.cmd ```cmd mvn clean package -java -cp target/javafx_markdown.jar;target/lib/* com.sandec.mdfx.example.ExampleMDFX +java -cp target/example.javafx_markdown.jar;target/lib/* example.Example ``` --- diff --git a/javafx-markdown/src/main/java/example/Example.java b/javafx-markdown/src/main/java/example/Example.java index 7f1991c1a..85c337f15 100644 --- a/javafx-markdown/src/main/java/example/Example.java +++ b/javafx-markdown/src/main/java/example/Example.java @@ -25,96 +25,99 @@ import org.fxmisc.cssfx.CSSFX; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + @SuppressWarnings("restriction") public class Example extends Application { - - private static boolean debug = true; - private String mdfxTxt = null; - - @Override - public void start(Stage primaryStage) throws Exception { - - CSSFX.start(); - - // Load markdown text and replace local image paths - mdfxTxt = IOUtils.toString(getClass().getResourceAsStream("/syntax.md"), "UTF-8"); - mdfxTxt = mdfxTxt.replaceAll("local_image.jpg", getResourcePath("local_image.jpg")); - if (debug) System.err.println("Sample: " + mdfxTxt); - - MarkdownView markdownView = new MarkdownView(mdfxTxt) { - - @Override - public void setLink(Node node, String link, String description) { - if (debug) System.out.println("setLink: " + link); - node.setCursor(Cursor.HAND); - node.setOnMouseClicked(e -> System.out.println("link: " + link)); - } - - @Override - public Node generateImage(String url) { - if (url.equals("node://colorpicker")) { - return new ColorPicker(); - } else { - return super.generateImage(url); - } - } - }; - - TextArea textArea = new TextArea(mdfxTxt); - markdownView.mdStringProperty().bind(textArea.textProperty()); - markdownView.getStylesheets().add("/css/mdfx-sample.css"); - - ScrollPane content = new ScrollPane(markdownView); - content.setFitToWidth(true); - textArea.setMinWidth(350); - - // --- Top content: TextArea + MarkdownView --- - HBox mainContent = new HBox(textArea, content); - mainContent.setSpacing(5); - VBox.setVgrow(mainContent, Priority.ALWAYS); - - // InputStream propStream = getClass().getResourceAsStream("/application.properties"); - - Properties properties = new Properties(); - - try (InputStream input = Thread.currentThread() - .getContextClassLoader() - .getResourceAsStream("application.properties")) { - if (input != null) { - properties.load(input); - } - } catch (IOException e) { - e.printStackTrace(); - } - String version = properties.getProperty("version", "0.1.0"); - - Label versionLabel = new Label(String.format("Version: %s", version)); - versionLabel.setFont(Font.font("Arial", 12)); - versionLabel.setTextFill(Color.BLACK); - versionLabel.setStyle("-fx-background-color: rgba(255,255,255,0.6); -fx-padding: 2;"); - - HBox bottomBox = new HBox(versionLabel); - bottomBox.setAlignment(Pos.CENTER_RIGHT); - bottomBox.setPadding(new Insets(5)); - bottomBox.setStyle("-fx-background-color: #f0f0f0;"); - - // --- Root VBox --- - VBox root = new VBox(mainContent, bottomBox); - root.setSpacing(2); - - Scene scene = new Scene(root, 700, 700); - primaryStage.setScene(scene); - primaryStage.show(); - } - - // --- Resource path helper --- - public static String getResourcePath(String resourceFileName) { - String prefix = "file://"; - final String resourcePath = String - .format("%s/%s/src/main/resources/%s", prefix, System.getProperty("user.dir"), resourceFileName) - .replaceAll("\\\\", "/"); - if (debug) System.err.println("Project based resource path: " + resourcePath); - return resourcePath; - } + private final Logger logger = LoggerFactory.getLogger(Example.class); + + private static boolean debug = true; + private String mdfxTxt = null; + + @Override + public void start(Stage primaryStage) throws Exception { + + CSSFX.start(); + + // Load markdown text and replace local image paths + mdfxTxt = IOUtils.toString(getClass().getResourceAsStream("/syntax.md"), "UTF-8"); + mdfxTxt = mdfxTxt.replaceAll("local_image.jpg", getResourcePath("local_image.jpg")); + + MarkdownView markdownView = new MarkdownView(mdfxTxt) { + + @Override + public void setLink(Node node, String link, String description) { + logger.info("setLink: " + link); + node.setCursor(Cursor.HAND); + node.setOnMouseClicked(e -> System.out.println("link: " + link)); + } + + @Override + public Node generateImage(String url) { + if (url.equals("node://colorpicker")) { + return new ColorPicker(); + } else { + return super.generateImage(url); + } + } + }; + + TextArea textArea = new TextArea(mdfxTxt); + markdownView.mdStringProperty().bind(textArea.textProperty()); + markdownView.getStylesheets().add("/css/mdfx-sample.css"); + + ScrollPane content = new ScrollPane(markdownView); + content.setFitToWidth(true); + textArea.setMinWidth(350); + + // --- Top content: TextArea + MarkdownView --- + HBox mainContent = new HBox(textArea, content); + mainContent.setSpacing(5); + VBox.setVgrow(mainContent, Priority.ALWAYS); + + // InputStream propStream = + // getClass().getResourceAsStream("/application.properties"); + + Properties properties = new Properties(); + + try (InputStream input = Thread.currentThread().getContextClassLoader() + .getResourceAsStream("application.properties")) { + if (input != null) { + properties.load(input); + } + } catch (IOException e) { + e.printStackTrace(); + } + String version = properties.getProperty("version", "0.1.0"); + + Label versionLabel = new Label(String.format("Version: %s", version)); + versionLabel.setFont(Font.font("Arial", 12)); + versionLabel.setTextFill(Color.BLACK); + versionLabel.setStyle("-fx-background-color: rgba(255,255,255,0.6); -fx-padding: 2;"); + + HBox bottomBox = new HBox(versionLabel); + bottomBox.setAlignment(Pos.CENTER_RIGHT); + bottomBox.setPadding(new Insets(5)); + bottomBox.setStyle("-fx-background-color: #f0f0f0;"); + + // --- Root VBox --- + VBox root = new VBox(mainContent, bottomBox); + root.setSpacing(2); + + Scene scene = new Scene(root, 700, 700); + primaryStage.setScene(scene); + primaryStage.show(); + } + + // --- Resource path helper --- + public String getResourcePath(String resourceFileName) { + String prefix = "file://"; + final String resourcePath = String + .format("%s/%s/src/main/resources/%s", prefix, System.getProperty("user.dir"), resourceFileName) + .replaceAll("\\\\", "/"); + logger.info("Project based resource path: " + resourcePath); + return resourcePath; + } } diff --git a/javafx-markdown/src/main/java/example/MarkdownView.java b/javafx-markdown/src/main/java/example/MarkdownView.java index d79ac56b8..e646269dc 100644 --- a/javafx-markdown/src/main/java/example/MarkdownView.java +++ b/javafx-markdown/src/main/java/example/MarkdownView.java @@ -27,13 +27,7 @@ @SuppressWarnings("restriction") public class MarkdownView extends VBox { - private final Logger logger = LoggerFactory - .getLogger(MarkdownView.class); - - private static final Pattern GITHUB_BLOB_PATTERN = Pattern.compile( - "https?://github\\.com/(?[^/]+)/(?[^/]+)/(?:blob|tree)/(?[^/]+)/(?.+)", - Pattern.CASE_INSENSITIVE - ); + private final Logger logger = LoggerFactory.getLogger(MarkdownView.class); private SimpleStringProperty mdString = new SimpleStringProperty(""); @@ -86,7 +80,11 @@ public Node generateImage(String url) { private String translateImageUrl(String url) { if (url == null || url.isEmpty()) return url; - Matcher m = GITHUB_BLOB_PATTERN.matcher(url); + final Pattern pattern = Pattern.compile( + "https?://github\\.com/(?[^/]+)/(?[^/]+)/(?:blob|tree)/(?[^/]+)/(?.+)", + Pattern.CASE_INSENSITIVE + ); + Matcher m = pattern.matcher(url); if (m.matches()) { String user = m.group("user"); String repo = m.group("repo"); @@ -99,30 +97,28 @@ private String translateImageUrl(String url) { String translated = String.format("https://raw.githubusercontent.com/%s/%s/%s/%s", user, repo, branch, path); logger.warn(String.format("translateImageUrl: %s -> %s", url, translated)); - System.err.println(String.format("translateImageUrl: %s -> %s", url, translated)); return translated; } - // No match: return original URL unchanged + // return original URL unchanged when no match observed logger.warn(String.format("translateImageUrl: %s (unchanged)", url)); return url; } private String translateImageUrlShort(String url) { - final String regex = "\\(https://github\\.com/([^/]+)/([^/]+)/blob/([^/]+)/(.*?)\\)"; + + final String regex = "https?://github\\.com/([^/]+)/([^/]+)/(?:blob|tree)/([^/]+)/(?.+)"; + String translatedUrl = url.replaceAll( regex, "(https://raw.githubusercontent.com/$1/$2/$3/$4)" ); - System.err.println(String.format("translated %s to %s ", url, translatedUrl)); - // if (debug) System.err.println(String.format("translated %s to %s ", url, translatedUrl)); logger.info(String.format("translated %s to %s ", url, translatedUrl)); return translatedUrl; } - // wrap the image generation in a try/catch, - // when an exception occurs, substitute a placeholder Image instead of + // if an exception occurs during image generation, substitute a placeholder Image instead of // letting the exception flow out and crash the JavaFX renderer public Image generateImageWithPlaceholderOld(String url) { @@ -182,7 +178,6 @@ private byte[] downloadBytes(String urlStr) throws IOException { } } - private Image getPlaceholder() { try { URL res = getClass().getResource("/images/placeholder.png"); diff --git a/javafx-markdown/src/main/resources/application.properties b/javafx-markdown/src/main/resources/application.properties index 62044170e..b31ef9ad3 100644 --- a/javafx-markdown/src/main/resources/application.properties +++ b/javafx-markdown/src/main/resources/application.properties @@ -1 +1 @@ -version=0.3.0 +version=0.4.0 diff --git a/javafx-markdown/test-jdk11.cmd b/javafx-markdown/test-jdk11.cmd index 1c7f25ef2..4805b42e9 100644 --- a/javafx-markdown/test-jdk11.cmd +++ b/javafx-markdown/test-jdk11.cmd @@ -9,10 +9,11 @@ if NOT EXIST "c:\java\zulu-jdk11" ( REM the original launcher does not work with OpenJDK 11 due to REM its module boundaries REM if JDK 11 is not the default on the host, set it to custom vendor JDK -REM which has JAVAFX now +REM which has JAVAFX now set JAVA_VERSION= +REM NOTE non-standard directory naming with Azul set JAVA_HOME=c:\java\zulu-jdk11 REM if JAVA_HOME points to an empty / non existend directory @@ -27,14 +28,14 @@ set JAVA_HOME=c:\java\jdk1.8.0_202 :INIT set JAVA_VERSION=1.8.0_202 call c:\java\init.cmd -java.exe -version +java.exe -version 2>&1 where.exe mvn.cmd 2>NUL 1>NUL call mvn -f %~dp0pom-java11.xml clean package -echo done +REM echo done :SKIP -echo Launching with classpath ^+ modulepath semantics +REM echo Launching with classpath ^+ modulepath semantics java -Dprism.order=sw ^ --module-path target/lib ^ --add-modules=javafx.base,javafx.graphics,javafx.controls ^ diff --git a/javafx-markdown/test.cmd b/javafx-markdown/test.cmd index 85c1c20b0..738935fba 100644 --- a/javafx-markdown/test.cmd +++ b/javafx-markdown/test.cmd @@ -1,18 +1,15 @@ @echo OFF REM WARNING: avoid naming this script "run.cmd" -REM if JDK 11 is not the default on the host, set it to JDK 1.8 now -set JAVA_HOME=c:\java\jdk1.8.0_202 set JAVA_VERSION=1.8.0_202 +set JAVA_HOME=c:\java\jdk%JAVA_VERSION% call c:\java\init.cmd -java.exe -version +java.exe -version 2>&1 | findstr -ic:"%JAVA_VERSION% > NUL where.exe mvn.cmd 2>NUL 1>NUL if errorlevel 1 goto :SKIP call mvn clean package -echo done +REM echo done :SKIP -REM the *.* mask should not be used here +REM the *.* mask used here, there are 80+ dependencies in target\lib java -cp target\example.javafx_markdown.jar;target\lib\* example.Example -REM java -jar target\example.javafx_markdown.jar - From 3d6ab56aa056e9413c32ae3f2a023c657cb93034 Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Fri, 28 Nov 2025 01:54:31 -0500 Subject: [PATCH 122/171] intermediare revision - added javafx.web dependency to scroll by utilzing webview, swiched to "runLater" --- javafx-markdown/pom-java11.xml | 20 ++++- .../src/main/java/example/Example.java | 81 +++++++++++++++++++ .../src/main/java/example/MDFXNodeHelper.java | 1 + .../src/main/java/example/MarkdownView.java | 17 +++- javafx-markdown/test-jdk11.cmd | 2 +- 5 files changed, 114 insertions(+), 7 deletions(-) diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml index 1fda9c664..d268eb780 100644 --- a/javafx-markdown/pom-java11.xml +++ b/javafx-markdown/pom-java11.xml @@ -19,8 +19,9 @@ 3.2.0 1.2.17 19 - 2.17.1 - 1.7.5 + 19 + 2.20.0 + 1.7.36 @@ -67,6 +68,13 @@ org.openjfx javafx-controls ${javafx-controls.version} + win + + + org.openjfx + javafx-web + ${javafx-web.version} + win org.apache.logging.log4j @@ -83,11 +91,19 @@ slf4j-api ${slf4j.version} + + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j-core.version} + ${finalName} diff --git a/javafx-markdown/src/main/java/example/Example.java b/javafx-markdown/src/main/java/example/Example.java index 85c337f15..10480d8cd 100644 --- a/javafx-markdown/src/main/java/example/Example.java +++ b/javafx-markdown/src/main/java/example/Example.java @@ -1,6 +1,8 @@ package example; import javafx.application.Application; +import javafx.application.Platform; +import javafx.concurrent.Worker; import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.Scene; @@ -8,6 +10,12 @@ import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; import javafx.scene.control.Label; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollBar; + +import javafx.scene.web.WebView; + +import javafx.geometry.Orientation; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.layout.Priority; @@ -20,6 +28,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Properties; +import java.util.Set; import org.apache.commons.io.IOUtils; @@ -91,12 +100,70 @@ public Node generateImage(String url) { } String version = properties.getProperty("version", "0.1.0"); + Button btnSync = new Button("Sync Scroll"); + + btnSync.setOnAction(e -> { + ScrollBar vbar = findVerticalScrollbar(textArea); + if (vbar == null) return; + final double pct = vbar.getValue(); + + final WebView webView = markdownView.getWebView(); + if (webView == null) return; + + Platform.runLater(new Runnable() { + @Override + public void run() { + final Worker loadWorker = webView.getEngine().getLoadWorker(); + + Runnable doScroll = new Runnable() { + @Override + public void run() { + String js = "var root = document.documentElement;" + + "var h = root.scrollHeight - root.clientHeight;" + + "root.scrollTop = h * " + pct + ";"; + webView.getEngine().executeScript(js); + } + }; + + if (loadWorker.getState() == Worker.State.SUCCEEDED) { + // Page already loaded → execute immediately + doScroll.run(); + } else { + // Page still loading → attach listener + loadWorker.stateProperty().addListener((obs, oldState, newState) -> { + if (newState == Worker.State.SUCCEEDED) { + doScroll.run(); + } + }); + } + } + }); + }); + + btnSync.setOnAction(e -> { + ScrollBar vbar = findVerticalScrollbar(textArea); + if (vbar == null) { + return; + } + + double pct = vbar.getValue(); // between 0.0 and 1.0 + + String script = + "var root = document.documentElement;" + + "var h = root.scrollHeight - root.clientHeight;" + + "root.scrollTop = h * " + pct + ";"; + logger.info(String.format("Scroll %.2f", pct)); + // System.err.println(String.format("Scroll %.2f", pct)); + markdownView.getWebView().getEngine().executeScript(script); + }); + Label versionLabel = new Label(String.format("Version: %s", version)); versionLabel.setFont(Font.font("Arial", 12)); versionLabel.setTextFill(Color.BLACK); versionLabel.setStyle("-fx-background-color: rgba(255,255,255,0.6); -fx-padding: 2;"); HBox bottomBox = new HBox(versionLabel); + bottomBox.getChildren().add(0, btnSync); bottomBox.setAlignment(Pos.CENTER_RIGHT); bottomBox.setPadding(new Insets(5)); bottomBox.setStyle("-fx-background-color: #f0f0f0;"); @@ -120,4 +187,18 @@ public String getResourcePath(String resourceFileName) { return resourcePath; } + private ScrollBar findVerticalScrollbar(TextArea textArea) { + Set nodes = textArea.lookupAll(".scroll-bar"); + for (Node node : nodes) { + if (node instanceof ScrollBar) { + ScrollBar sb = (ScrollBar) node; + if (sb.getOrientation() == Orientation.VERTICAL) { + return sb; + } + } + } + return null; + } + } + diff --git a/javafx-markdown/src/main/java/example/MDFXNodeHelper.java b/javafx-markdown/src/main/java/example/MDFXNodeHelper.java index 867779da0..25a3e628c 100644 --- a/javafx-markdown/src/main/java/example/MDFXNodeHelper.java +++ b/javafx-markdown/src/main/java/example/MDFXNodeHelper.java @@ -12,6 +12,7 @@ import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; + import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Label; diff --git a/javafx-markdown/src/main/java/example/MarkdownView.java b/javafx-markdown/src/main/java/example/MarkdownView.java index e646269dc..8a92a2ddf 100644 --- a/javafx-markdown/src/main/java/example/MarkdownView.java +++ b/javafx-markdown/src/main/java/example/MarkdownView.java @@ -9,8 +9,10 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; + import javafx.scene.Group; import javafx.scene.Node; +import javafx.scene.web.WebView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; @@ -27,21 +29,28 @@ @SuppressWarnings("restriction") public class MarkdownView extends VBox { + private final WebView webView; + + public MarkdownView() { + this(""); + } + + public WebView getWebView() { + return webView; + } private final Logger logger = LoggerFactory.getLogger(MarkdownView.class); private SimpleStringProperty mdString = new SimpleStringProperty(""); public MarkdownView(String mdString) { this.mdString.set(mdString); + webView = new WebView(); + this.getChildren().add(webView); this.mdString.addListener((p, o, n) -> updateContent()); getStylesheets().add("/css/mdfx.css"); updateContent(); } - public MarkdownView() { - this(""); - } - private void updateContent() { MDFXNodeHelper content = new MDFXNodeHelper(this, mdString.getValue()); getChildren().clear(); diff --git a/javafx-markdown/test-jdk11.cmd b/javafx-markdown/test-jdk11.cmd index 4805b42e9..27bb0275c 100644 --- a/javafx-markdown/test-jdk11.cmd +++ b/javafx-markdown/test-jdk11.cmd @@ -38,7 +38,7 @@ REM echo done REM echo Launching with classpath ^+ modulepath semantics java -Dprism.order=sw ^ --module-path target/lib ^ ---add-modules=javafx.base,javafx.graphics,javafx.controls ^ +--add-modules=javafx.base,javafx.graphics,javafx.controls,javafx.web ^ -cp target\example.javafx_markdown.jar;target\lib\*;. ^ example.Example REM java.lang.module.FindException: Module org.fxmisc.cssfx not found From 124ae8e8af92dc05db8096c0388916bae8e4f8ce Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Fri, 28 Nov 2025 13:50:34 -0500 Subject: [PATCH 123/171] added note about memo processing starus --- javafx-libreoffice-markdown/Memo_Posting.md | 218 +++++++++++++++++++ javafx-libreoffice-markdown/Memo_Posting.odt | Bin 0 -> 32284 bytes javafx-libreoffice-markdown/README.md | 31 +++ 3 files changed, 249 insertions(+) create mode 100644 javafx-libreoffice-markdown/Memo_Posting.md create mode 100644 javafx-libreoffice-markdown/Memo_Posting.odt create mode 100644 javafx-libreoffice-markdown/README.md diff --git a/javafx-libreoffice-markdown/Memo_Posting.md b/javafx-libreoffice-markdown/Memo_Posting.md new file mode 100644 index 000000000..2d2bd0c10 --- /dev/null +++ b/javafx-libreoffice-markdown/Memo_Posting.md @@ -0,0 +1,218 @@ +## **Why memo-posting will not disappear with Event** + + +for someone who is very strong in software/QA but new to +core banking. + +### 1. Why memo-posting existed in the first place + +Historically, banks had: + +### A. Batch-based core systems + +- Core ledgers were updated once per day, usually during an + overnight batch cycle (\"End-of-Day\" or EoD). + +- During the business day, transactions still had to be processed: + + - ATM withdrawals + - debit card authorizations + - checks deposited + - ACH files arriving + +- But the ledger was "closed" until evening. + +### Therefore: banks used** ****memo-entries** + +- A memo-debit reduces your available balance immediately. + +- But it does not hit your posted ledger until nighttime. + +- Then, overnight, batch processing resolved: + + - holds → postings + - reversals + - settlements (Visa/Mastercard, ACH, wires) + - interest + - fees + +### In short + +Memo-posting = a temporary real-time shadow that compensates for a +non-real-time ledger. + +### 2. Now the interesting part: Why doesn't memo-posting disappear with modern systems? + +Your intuition is correct:\ +****If the core ledger were truly real-time, you would not need memo +entries.**** + +But here's the reality: + +### 3. Modernizing a bank is not simply "make ledger RT and remove batch." + +Banks cannot just switch to: + +- Kafka +- Event sourcing +- Cloud +- Microservices + +and call it a day. The constraints are not purely technical: + +## A. Card networks are not fully real-time + +Visa/Mastercard generate: + +- Authorizations (real-time) +- Clearing files (late day or next day, large batches) + +The authorization and final settlement can differ in: + +- amount +- merchant adjustments +- currency +- tips (restaurants) +- hotel/car rental extended holds + +➡️ ****Core must handle temporary holds → final postings.\ +Memo logic is required.**** + +## B. ACH is fundamentally batch + +Even "same-day ACH" is not real-time.\ +NACHA settlement windows are batch-driven. + +➡️ Memo posting is required to give customers intraday visibility. + +## C. Regulations require availability vs. settlement separation + +Reg CC in the US, for example, requires distinguishing: + +- funds availability +- settlement date +- risk holds + +This is exactly the domain memo-entries serve. + +Even if your ledger can post instantly, regulation forces you to +sometimes: + +- reduce available balance +- but not finalize posting + +## D. Core ledger migration risk + +A bank cannot: + +- rewrite its ledger from scratch +- migrate 40 years of customer accounts +- risk losing audit trails + +So modern banks create ****real-time layers around their existing +cores****: + +Customer Channel → Event Layer → Real-Time Balance Service → Core +(Batch) + +The real-time balance service still uses something memo-like: + +- temporary holds +- pending entries +- expected settlements + +### 4. Even "next-gen" cores keep memo-posting --- but rename it + +New cloud-native cores (Thought Machine, Temenos, FIS Modern Banking +Platform, Mambu) use: + +- Projected balances +- Pending entries +- Hold events +- Reservation ledger +- Authorization ledger + +Architecturally, this is still memo-posting --- but implemented in a +modern, event-driven way. + +Because the real problem memo-posting solves does not disappear: + +- asynchronous external networks +- delayed settlement +- uncertain amounts +- reversals +- fraud checks +- compliance checks + +### 5. Where modern banks** ****are**** **removing batch + +Banks are decomposing the batch cycle into event-driven components: + +### Batch functions being eliminated + +- interest accrual → event-driven accrual engine +- fees → real-time fee service +- loan amortization → streaming engine +- daily extracts → streaming CDC +- GL integration → real-time accounting feed + +### Batch functions that are** ****not going away soon** + +- settlement with card networks +- ACH settlement +- regulatory reporting +- system-of-record end-of-day reconciliation + +### 6. So is memo-processing obsolete? + +### \*\*Short answer: No. + +Not until the entire global settlement infrastructure is real-time.\*\* + +Individual banks modernizing their cores does not change: + +- card scheme settlement model +- ACH batch windows +- fraud-risk delayed availability policies +- interbank liquidity processes +- regulatory deposit hold rules + +As long as money movement involves external actors with delayed +settlement, memo-entries remain. + +### 7. Why banks still like memo-entries even in cloud architecturally + +Memo entries offer: + +### A. Immediate customer experience + +Balances update instantly without ledger mutation. + +### B. Isolation from expensive ledger writes + +Ledger = SoR (system of record)\ +Memo layer = high-frequency, cheap operations + +### C. Reversibility + +Memo holds can be: + +- cancelled +- updated +- replaced by settlement posting + +### D. Regulatory traceability + +Clear audit trail of "received but not settled" events. + +### 8. Summary + +Even when a bank modernizes to cloud-native, microservices, and +real-time architectures, memo-posting does not disappear. It +exists not because old technology was slow, but because external payment +networks (card schemes, ACH), regulatory rules, delayed settlements, +fraud-risk windows, and reversals all require a temporary representation +of transactions that affect available**** but not ****posted +balance. Memo entries are simply implemented in a more modern, +event-driven form, but the core concept remains essential until global +payment rails themselves become fully real-time. diff --git a/javafx-libreoffice-markdown/Memo_Posting.odt b/javafx-libreoffice-markdown/Memo_Posting.odt new file mode 100644 index 0000000000000000000000000000000000000000..a4e2780842d1b0ad506188500e2480a6e7ef94a5 GIT binary patch literal 32284 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 j=j`!YQvSo}oc0~ Date: Fri, 28 Nov 2025 13:50:34 -0500 Subject: [PATCH 124/171] added note about memo processing status --- javafx-libreoffice-markdown/Memo_Posting.md | 335 ++++++++++++++++++ javafx-libreoffice-markdown/Memo_Posting.odt | Bin 0 -> 36788 bytes javafx-libreoffice-markdown/README.md | 31 ++ javafx-libreoffice-markdown/diagram1.dot | 56 +++ .../screenshots/diagram1.png | Bin 0 -> 30067 bytes 5 files changed, 422 insertions(+) create mode 100644 javafx-libreoffice-markdown/Memo_Posting.md create mode 100644 javafx-libreoffice-markdown/Memo_Posting.odt create mode 100644 javafx-libreoffice-markdown/README.md create mode 100644 javafx-libreoffice-markdown/diagram1.dot create mode 100644 javafx-libreoffice-markdown/screenshots/diagram1.png diff --git a/javafx-libreoffice-markdown/Memo_Posting.md b/javafx-libreoffice-markdown/Memo_Posting.md new file mode 100644 index 000000000..9b8158da4 --- /dev/null +++ b/javafx-libreoffice-markdown/Memo_Posting.md @@ -0,0 +1,335 @@ +**Why memo-posting will not disappear in Event Epoch** + +\ +for someone who is very strong in software/QA but new to +core banking. + +### 1. Why memo-posting existed in the first place + +Historically, banks had: + +### A. Batch-based core systems + +- Core ledgers were updated once per day, usually during an + overnight batch cycle (\"End-of-Day\" or EoD). + +- During the business day, transactions still had to be processed: + + - ATM withdrawals + - debit card authorizations + - checks deposited + - ACH files arriving + +- But the ledger was "closed" until evening. + +### Therefore: banks used** ****memo-entries** + +- A memo-debit reduces your available balance immediately. + +- But it does not hit your posted ledger until nighttime. + +- Then, overnight, batch processing resolved: + + - holds > postings + - reversals + - settlements (Visa/Mastercard, ACH, wires) + - interest + - fees + +### In short + +Memo-posting = a temporary real-time shadow that compensates for a +non-real-time ledger. + +### 2. Now the interesting part: Why doesn't memo-posting disappear with modern systems? + +Your intuition is correct:\ +****If the core ledger were truly real-time, you would not need memo +entries.**** + +But here's the reality: + +### 3. Modernizing a bank is not simply "make ledger RT and remove batch." + +Banks cannot just switch to: + +- Kafka +- Event sourcing +- Cloud +- Microservices + +and call it a day. The constraints are not purely technical: + +## A. Card networks are not fully real-time + +Visa/Mastercard generate: + +- Authorizations (real-time) +- Clearing files (late day or next day, large batches) + +The authorization and final settlement can differ in: + +- amount +- merchant adjustments +- currency +- tips (restaurants) +- hotel/car rental extended holds + +➡️ ****Core must handle temporary holds > final postings.\ +Memo logic is required.**** + +## B. ACH is fundamentally batch + +Even "same-day ACH" is not real-time.\ +NACHA settlement windows are batch-driven. + +➡️ Memo posting is required to give customers intraday visibility. + +## C. Regulations require availability vs. settlement separation + +Reg CC in the US, for example, requires distinguishing: + +- funds availability +- settlement date +- risk holds + +This is exactly the domain memo-entries serve. + +Even if your ledger can post instantly, regulation forces you to +sometimes: + +- reduce available balance +- but not finalize posting + +## D. Core ledger migration risk + +A bank cannot: + +- rewrite its ledger from scratch +- migrate 40 years of customer accounts +- risk losing audit trails + +So modern banks create ****real-time layers around their existing +cores****: + +Customer Channel > Event Layer > Real-Time Balance Service > +Core (Batch) + +The real-time balance service still uses something memo-like: + +- temporary holds +- pending entries +- expected settlements + +### 4. Even "next-gen" cores keep memo-posting --- but rename it + +New cloud-native cores (Thought Machine, Temenos, FIS Modern Banking +Platform, Mambu) use: + +- Projected balances +- Pending entries +- Hold events +- Reservation ledger +- Authorization ledger + +Architecturally, this is still memo-posting --- but implemented in a +modern, event-driven way. + +Because the real problem memo-posting solves does not disappear: + +- asynchronous external networks +- delayed settlement +- uncertain amounts +- reversals +- fraud checks +- compliance checks + +### 5. Where modern banks** ****are**** **removing batch + +Banks are decomposing the batch cycle into event-driven components: + +### Batch functions being eliminated + +- interest accrual > event-driven accrual engine +- fees > real-time fee service +- loan amortization > streaming engine +- daily extracts > streaming CDC +- GL integration > real-time accounting feed + +### Batch functions that are** ****not going away soon** + +- settlement with card networks +- ACH settlement +- regulatory reporting +- system-of-record end-of-day reconciliation + +### 6. So is memo-processing obsolete? + +### \*\*Short answer: No. + +Not until the entire global settlement infrastructure is real-time.\*\* + +Individual banks modernizing their cores does not change: + +- card scheme settlement model +- ACH batch windows +- fraud-risk delayed availability policies +- interbank liquidity processes +- regulatory deposit hold rules + +As long as money movement involves external actors with delayed +settlement, memo-entries remain. + +### 7. Why banks still like memo-entries even in cloud architecturally + +Memo entries offer: + +### A. Immediate customer experience + +Balances update instantly without ledger mutation. + +### B. Isolation from expensive ledger writes + +Ledger = SoR (system of record)\ +Memo layer = high-frequency, cheap operations + +### C. Reversibility + +Memo holds can be: + +- cancelled +- updated +- replaced by settlement posting + +### D. Regulatory traceability + +Clear audit trail of "received but not settled" events. + +### 8. Summary + +Even when a bank modernizes to cloud-native, microservices, and +real-time architectures, memo-posting does not disappear. It +exists not because old technology was slow, but because external payment +networks (card schemes, ACH), regulatory rules, delayed settlements, +fraud-risk windows, and reversals all require a temporary representation +of transactions that affect available**** but not ****posted +balance. Memo entries are simply implemented in a more modern, +event-driven form, but the core concept remains essential until global +payment rails themselves become fully real-time + +functional areas primarily ordered by: + +1. B --- Business Criticality (highest > lowest) +2. ****A --- Technical / Implementation Complexity (highest > + lowest)**** +3. C --- Logical / Conceptual Dependencies + +This gives you a realistic, bank-aligned prioritization:\ +what matters most to the business is studied first, then the +technically hardest items, and only then the items that depend on +earlier concepts. + +Below is the reordered master list in exactly that priority +sequence.\ +This is the ideal planning view for an engineer entering core banking. + +### TOP-TIER: Highest Business Criticality + Highest Risk Domain + +### (If these break, a bank loses money or violates regulations immediately.) + +These are the \"heart and lungs\" of a bank. + + \# Area Why Critical Complexity + -------------------------------------------------------------- -------------------------------------------------------- -------------- ------------ + 1. Double-Entry Ledger Implementation Defines money itself; absolute correctness required \*\*\*\*\* + 2. Settlement vs Clearing Determines legal finality of transactions \*\*\*\* + 3. End-of-Day (EOD) Cycle Regulatory reporting, overnight batch, reconciliations \*\*\*\* + 4. Reconciliation Prevents money loss between bank and external networks \*\*\*\*\* + 5. Real-Time Holds / Memo Equivalents Controls available balance > fraud exposure \*\*\*\* + 6. Card Authorization > Hold > Settlement Flow Constant high-volume, legally constrained \*\*\*\* + 7. Fraud Detection & AML Legal requirement; life-and-death for compliance \*\*\*\*\* + 8. Liquidity Management Ensures the bank can settle obligations daily \*\*\*\*\* + +> 💡 As a newcomer, if you understand these eight areas, you understand +> 90% of why core banking is complicated. + +### MID-TIER: Business-Critical but Narrower Scope + +### (Important, but failures cause operational delays, not existential loss.) + + \# Area Why Critical Complexity + ---------------------------------------- ---------------------------------------- -------------- ------------ + 9. Posted vs Available Balance Drives user experience + risk exposure \*\* + 10. Memo Posting (Legacy) Determines overdrafts, pending items \*\* + 11. ACH / SEPA (Batch Rails) High-volume interbank transfers \*\*\* + 12. Wires & Cutoff Times High-value, sensitive flows \*\* + 13. Check Deposits & Holds Risk window; regulatory constraints \*\*\* + 14. Chargebacks & Disputes Customer-facing + regulatory \*\*\*\* + +### EMERGING / MODERNIZATION LAYER: Important but primarily architectural + +### (Impacts engineering velocity more than daily banking operations.) + + \# Area Why Critical Complexity + -------------------------------------------- ------------------------------------------- -------------- ------------ + 15. Event Streaming (Kafka/Pulsar) Modern replacement of batch queues \*\*\* + 16. Real-Time Balance Engine Modern equivalent to memo-posting \*\*\* + 17. Wrapping Legacy Cores Enables modernization without replacement \*\*\*\* + +### BOTTOM-TIER: Architect-Level, Very High Technical Complexity but Lower Daily Business Exposure + +### (You study these last; they require all earlier areas.) + + \# Area Why Critical Complexity + --------------------------------------------------- --------------------------------------- -------------- ------------ + 18. Event-Sourced Ledger Design Next-generation core banking design \*\*\*\*\* + 19. Settlement Risk Models Predicts future exposure across rails \*\*\*\*\* + 20. Core Replacement / Migration Strategy Only after mastering entire domain \*\*\*\*\* + +it fits** ****perfectly**** **as an opening joke, and not just +as a joke: it lands with exactly the right ****paradoxical, profound, +bitter-truth undertone**** specific to memo-posting and batch-origin +banking cores. + +Let me break down why it works and how to phrase it so it sounds +intentional, not random. + +### Why it works for legacy batch > event-driven banking transitions + +### 1. Memo posting** ****literally embodies**** **"past obsolescence" + +Memo‐post logic is: + +- a temporary ledger overlay, +- invented to compensate for overnight batch constraints, +- still present in "modernized" event-driven cores. + +So it is a process that survived its own intended death. + +Nothing fits "to obsolescence and beyond" better than that. + +### 2. Banking cores don't die --- they accumulate sediment + +Even after modernization, you get: + +- "legacy shadow rules," +- virtualization layers, +- emulations of batch cutoffs, +- microservice façades that still depend on batch timings underneath. + +The memo workflow becomes the fossil that the whole new system is built +around. + +So the phrase feels like an honest admission, not sarcasm. + +### 3. The paradox has the exact tone insiders appreciate + +Bank technologists love: + +- self-aware irony, +- subtle acknowledgments of technical debt, +- jokes that hide real architecture history. + +This phrase gives you both humor**** and ****a knowing nod. + +It qualifies as one of those "we laugh because it hurts" jokes. diff --git a/javafx-libreoffice-markdown/Memo_Posting.odt b/javafx-libreoffice-markdown/Memo_Posting.odt new file mode 100644 index 0000000000000000000000000000000000000000..c7ab5929191d0ee7c1acb5a8ae5c6e0b16c4c91a GIT binary patch literal 36788 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
(YGGz~Nz&UGIX@vg)?b@vmd1zL<7 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 legacy2 -> legacy3 -> legacy4 -> legacy5; + } + + subgraph cluster_modern { + label="MODERN ARCHITECTURE (Real-Time Event Driven)"; + style=filled; + color="#bcd7ff"; + + mod1 [label="Customer Transaction Arrives\n(API, Mobile, POS, Real-Time Feed)"]; + mod2 [label="Authorization / Hold Event\n(real-time balance projection)\n== Memo equivalent"]; + mod3 [label="Event Stream (Kafka/Pulsar)\nproducing:\n- hold events\n- fraud checks\n- AML checks"]; + mod4 [label="Real-Time Balance Service\n(projected balance = ledger + holds)"]; + mod5 [label="Settlement Event (Card, ACH, Wire)\nMay occur hours/days later"]; + mod6 [label="Ledger Write\n(final posting)\n(event-sourced or cloud core)"]; + + mod1 -> mod2 -> mod3 -> mod4 -> mod5 -> mod6; + } + + subgraph cluster_equiv { + label="FUNCTIONAL EQUIVALENTS (Legacy vs Modern)"; + style=filled; + color="#e8ffe8"; + + eq1 [label="Legacy Memo-Post\n(Shadow entry)"]; + eq2 [label="Modern Hold / Authorization Ledger\n(real-time reservations)"]; + + eq3 [label="Legacy Daytime Queues"]; + eq4 [label="Modern Event Streams (Kafka, etc.)"]; + + eq5 [label="Legacy EOD Batch Posting"]; + eq6 [label="Modern Finalization Event → Ledger Write"]; + } + + // Cross-lane conceptual equivalence arrows (dotted) + eq1 -> eq2 [style=dotted, label="evolution"]; + eq3 -> eq4 [style=dotted, label="evolution"]; + eq5 -> eq6 [style=dotted, label="evolution"]; +} + diff --git a/javafx-libreoffice-markdown/screenshots/diagram1.png b/javafx-libreoffice-markdown/screenshots/diagram1.png new file mode 100644 index 0000000000000000000000000000000000000000..590525132f973dd9684b94d62079d3923b5c1a1f GIT binary patch literal 30067 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 DM&lg= literal 0 HcmV?d00001 From bb7726c1dbbe7df7a6003a37f2ad195357c85c9d Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Fri, 28 Nov 2025 18:17:08 -0500 Subject: [PATCH 125/171] intermediate revision - misc. fixes attempting to scroll the webview, unsuccessful --- javafx-markdown/pom-java11.xml | 8 --- javafx-markdown/pom.xml | 10 ++-- .../src/main/java/example/Example.java | 56 +++++++++++-------- .../src/main/java/example/MDFXNodeHelper.java | 7 ++- .../src/main/java/example/MarkdownView.java | 19 ++++++- .../src/main/resources/application.properties | 2 +- 6 files changed, 61 insertions(+), 41 deletions(-) diff --git a/javafx-markdown/pom-java11.xml b/javafx-markdown/pom-java11.xml index d268eb780..7e67cc57a 100644 --- a/javafx-markdown/pom-java11.xml +++ b/javafx-markdown/pom-java11.xml @@ -91,14 +91,6 @@ slf4j-api ${slf4j.version} - - org.apache.logging.log4j log4j-slf4j-impl diff --git a/javafx-markdown/pom.xml b/javafx-markdown/pom.xml index cfab1c907..0413d3fe3 100644 --- a/javafx-markdown/pom.xml +++ b/javafx-markdown/pom.xml @@ -16,8 +16,8 @@ 2.7 3.3.1 ${project.groupId}.${project.artifactId} - 2.17.1 - 1.7.5 + 2.20.0 + 1.7.36 3.2.0 @@ -77,9 +77,9 @@ ${slf4j.version} - org.slf4j - slf4j-log4j12 - ${slf4j.version} + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j-core.version} diff --git a/javafx-markdown/src/main/java/example/Example.java b/javafx-markdown/src/main/java/example/Example.java index 10480d8cd..485e4e5f2 100644 --- a/javafx-markdown/src/main/java/example/Example.java +++ b/javafx-markdown/src/main/java/example/Example.java @@ -3,6 +3,7 @@ import javafx.application.Application; import javafx.application.Platform; import javafx.concurrent.Worker; +import javafx.concurrent.Worker.State; import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.Scene; @@ -108,30 +109,58 @@ public Node generateImage(String url) { final double pct = vbar.getValue(); final WebView webView = markdownView.getWebView(); + logger.info(String.format("webWiew: %s", (webView != null ? webView.toString() : "null"))); + logger.info(String.format("Scroll %.2f", pct)); + if (webView == null) return; Platform.runLater(new Runnable() { @Override public void run() { + // https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Worker.html final Worker loadWorker = webView.getEngine().getLoadWorker(); + + logger.info(String.format("btnSync clicked, WebView = " + webView)); + logger.info(String.format("WebEngine = " + webView.getEngine())); + logger.info(String.format("LoadWorker state = " + webView.getEngine().getLoadWorker().getState())); + Runnable doScroll = new Runnable() { @Override public void run() { - String js = "var root = document.documentElement;" - + "var h = root.scrollHeight - root.clientHeight;" - + "root.scrollTop = h * " + pct + ";"; + String js = "var root = document.documentElement; var h = root.scrollHeight - root.clientHeight; root.scrollTop = h * " + pct + ";"; + + js = + "var pct = " + pct + ";" + + "var de = document.documentElement;" + + "var b = document.body;" + + "var h1 = de.scrollHeight - de.clientHeight;" + + "var h2 = b.scrollHeight - b.clientHeight;" + + + // pick the scrollable element + "if (h2 > h1) {" + + " b.scrollTop = h2 * pct;" + + "} else {" + + " de.scrollTop = h1 * pct;" + + "}"; + js += "alert('JS executed!');"; + logger.info(String.format("executing: \"%s\"", js )); webView.getEngine().executeScript(js); } }; - if (loadWorker.getState() == Worker.State.SUCCEEDED) { + Object html = webView.getEngine().executeScript("document.documentElement.outerHTML"); + logger.info(String.format("HTML content length: " + (html != null ? html.toString().length() : "null"))); + logger.info(String.format("HTML content :%s" , html)); + logger.info(String.format("Webvire Enging Loadworker state :%s" , loadWorker.getState())); + // https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Worker.State.html + if (loadWorker.getState() == State.SUCCEEDED) { // Page already loaded → execute immediately doScroll.run(); } else { // Page still loading → attach listener loadWorker.stateProperty().addListener((obs, oldState, newState) -> { - if (newState == Worker.State.SUCCEEDED) { + if (newState == State.SUCCEEDED) { doScroll.run(); } }); @@ -140,23 +169,6 @@ public void run() { }); }); - btnSync.setOnAction(e -> { - ScrollBar vbar = findVerticalScrollbar(textArea); - if (vbar == null) { - return; - } - - double pct = vbar.getValue(); // between 0.0 and 1.0 - - String script = - "var root = document.documentElement;" + - "var h = root.scrollHeight - root.clientHeight;" + - "root.scrollTop = h * " + pct + ";"; - logger.info(String.format("Scroll %.2f", pct)); - // System.err.println(String.format("Scroll %.2f", pct)); - markdownView.getWebView().getEngine().executeScript(script); - }); - Label versionLabel = new Label(String.format("Version: %s", version)); versionLabel.setFont(Font.font("Arial", 12)); versionLabel.setTextFill(Color.BLACK); diff --git a/javafx-markdown/src/main/java/example/MDFXNodeHelper.java b/javafx-markdown/src/main/java/example/MDFXNodeHelper.java index 25a3e628c..c077b014b 100644 --- a/javafx-markdown/src/main/java/example/MDFXNodeHelper.java +++ b/javafx-markdown/src/main/java/example/MDFXNodeHelper.java @@ -59,6 +59,7 @@ public class MDFXNodeHelper extends VBox { int[] currentChapter = new int[6]; + private Document node; public boolean shouldShowContent() { return parent.showChapter(currentChapter); } @@ -83,13 +84,15 @@ public MDFXNodeHelper(MarkdownView parent, String mdstring) { extensions.add(TaskListExtension.create()); Parser parser = Parser.builder().extensions(extensions).build(); - Document node = parser.parse(mdstring); - + /* Document */ node = parser.parse(mdstring); new MDParser(node).visitor.visitChildren(node); this.getChildren().add(root); } + public Document getNode() { + return node; + } class MDParser { Document document; diff --git a/javafx-markdown/src/main/java/example/MarkdownView.java b/javafx-markdown/src/main/java/example/MarkdownView.java index 8a92a2ddf..01f70471f 100644 --- a/javafx-markdown/src/main/java/example/MarkdownView.java +++ b/javafx-markdown/src/main/java/example/MarkdownView.java @@ -10,6 +10,7 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; +import javafx.application.Platform; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.web.WebView; @@ -25,6 +26,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.vladsch.flexmark.html.HtmlRenderer; + @SuppressWarnings("restriction") public class MarkdownView extends VBox { @@ -44,17 +47,27 @@ public WebView getWebView() { public MarkdownView(String mdString) { this.mdString.set(mdString); - webView = new WebView(); - this.getChildren().add(webView); - this.mdString.addListener((p, o, n) -> updateContent()); + // https://docs.oracle.com/javase/8/javafx/api/javafx/scene/web/WebView.html + this.webView = new WebView(); + logger.info(String.format("webWiew: %s", (webView != null ? webView.toString() : "null"))); + this.mdString.addListener((p, o, n) -> updateContent()); getStylesheets().add("/css/mdfx.css"); updateContent(); + webView.getEngine().setJavaScriptEnabled(true); + webView.getEngine().setOnAlert(e -> logger.info(String.format("JS: %s" , e.getData()))); + this.getChildren().add(webView); } private void updateContent() { + MDFXNodeHelper content = new MDFXNodeHelper(this, mdString.getValue()); getChildren().clear(); getChildren().add(content); + HtmlRenderer renderer = HtmlRenderer.builder().build(); + String html = renderer.render(content.getNode()); + logger.info(String.format("Html: %s",html)); + + Platform.runLater(() -> webView.getEngine().loadContent(html)); } public StringProperty mdStringProperty() { diff --git a/javafx-markdown/src/main/resources/application.properties b/javafx-markdown/src/main/resources/application.properties index b31ef9ad3..59a78457e 100644 --- a/javafx-markdown/src/main/resources/application.properties +++ b/javafx-markdown/src/main/resources/application.properties @@ -1 +1 @@ -version=0.4.0 +version=0.5.0 From 1693fe014e9075ddc9982c8ca51ea61a755c336a Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 30 Nov 2025 17:28:38 -0500 Subject: [PATCH 126/171] added links to .net markdown procesor --- javafx-libreoffice-markdown/README.md | 5 +++++ javafx-markdown/README.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/javafx-libreoffice-markdown/README.md b/javafx-libreoffice-markdown/README.md index 18a6d4dfb..932eb31c3 100644 --- a/javafx-libreoffice-markdown/README.md +++ b/javafx-libreoffice-markdown/README.md @@ -29,3 +29,8 @@ Improved workflow: Once fully implemented, this will allow for a more seamless w ### See Also * https://nibblestew.blogspot.com/2022/09/looking-at-libreoffices-windows.html + * __Markdig__- Markdown processor for .NET. - [repo](https://github.com/xoofx/markdig) and [artifact](https://www.nuget.org/packages/Markdig) + +### Author + +[Serguei Kouzmine](mailto:kouzmine_serguei@yahoo.com) diff --git a/javafx-markdown/README.md b/javafx-markdown/README.md index b7f64005e..e98650324 100644 --- a/javafx-markdown/README.md +++ b/javafx-markdown/README.md @@ -1,7 +1,7 @@ ### Info This directory contains a minimal desktop application showcasing a standalone replica of the -[`MarkdownView`](https://github.com/JPro-one/markdown-javafx-renderer) __Markdown for JavaFX__ advanced HTML WebView renderer hosted inside a basic [JavaFX](https://en.wikipedia.org/wiki/JavaFX) UI to run on Linux or Windows laptop. +[`MarkdownView`](https://github.com/JPro-one/markdown-javafx-renderer) __Markdown for JavaFX__ advanced HTML WebView renderer based on [WebKit](https://en.wikipedia.org/wiki/WebKit) layout engine hosted inside a basic [JavaFX](https://en.wikipedia.org/wiki/JavaFX) UI to run on Linux or Windows laptop. ![application](screenshots/app.png) The project uses: From f9e068ac1ebeececf8ab6c66ee1680be5463feea Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 3 Dec 2025 14:25:56 -0500 Subject: [PATCH 127/171] initial revision --- utils/npp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 utils/npp diff --git a/utils/npp b/utils/npp new file mode 100644 index 000000000..dffe3f5a2 --- /dev/null +++ b/utils/npp @@ -0,0 +1,42 @@ +#!/bin/bash +# robust wrapper for Notepad++ in Git Bash + +# Try common locations first +NPP="" +for path in \ + "/c/Program Files/Notepad++/notepad++.exe" \ + "/c/Program Files (x86)/Notepad++/notepad++.exe" \ + "$LOCALAPPDATA/Programs/Notepad++/notepad++.exe" +do + if [ -x "$path" ]; then + NPP="$path" + break + fi +done + +# Fallback: search PATH using where.exe +if [ -z "$NPP" ]; then + WINPATH=$(cmd.exe /C "where notepad++.exe" 2>/dev/null | tr -d '\r' | head -n1) + if [ -n "$WINPATH" ]; then + NPP=$(cygpath "$WINPATH") + fi +fi + +if [ -z "$NPP" ]; then + echo "Notepad++ not found!" + exit 1 +fi + +# Convert Git Bash paths to Windows paths +WINARGS=() +for arg in "$@"; do + if [[ "$arg" == /* ]]; then + WINARGS+=("$(cygpath -w "$arg")") + else + WINARGS+=("$arg") + fi +done + +# Launch Notepad++ +"$NPP" "${WINARGS[@]}" & + From f301a3c809a48f6e8ca7ba1ffabbcb5e66f68003 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 3 Dec 2025 14:30:00 -0500 Subject: [PATCH 128/171] intermeidate revision - added --install option --- utils/npp | 72 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/utils/npp b/utils/npp index dffe3f5a2..26855afa1 100644 --- a/utils/npp +++ b/utils/npp @@ -1,42 +1,76 @@ #!/bin/bash -# robust wrapper for Notepad++ in Git Bash +# npp: launch Notepad++ from Git Bash / MSYS +# also supports: npp --install -# Try common locations first -NPP="" -for path in \ - "/c/Program Files/Notepad++/notepad++.exe" \ - "/c/Program Files (x86)/Notepad++/notepad++.exe" \ +SELF="$0" + +install_self() { + local target="$HOME/bin/npp" + + mkdir -p "$HOME/bin" + + # If target already exists, replace it + if [ -e "$target" ]; then + echo "Removing existing $target" + rm -f "$target" + fi + + # Prefer symlink (best for repo use) + if ln -s "$(realpath "$SELF")" "$target" 2>/dev/null; then + echo "Installed symlink: $target" + else + # If symlinks not supported (rare), fall back to copy + cp "$SELF" "$target" + chmod +x "$target" + echo "Installed copy: $target" + fi + + echo "Done. Make sure ~/bin is in your PATH (Git Bash does this automatically)." + exit 0 +} + +if [[ "$1" == "--install" ]]; then + install_self +fi + +# --- Locate Notepad++ ------------------------------------------------------- + +CANDIDATES=( + "/c/Program Files/Notepad++/notepad++.exe" + "/c/Program Files (x86)/Notepad++/notepad++.exe" "$LOCALAPPDATA/Programs/Notepad++/notepad++.exe" -do +) + +for path in "${CANDIDATES[@]}"; do if [ -x "$path" ]; then NPP="$path" break fi done -# Fallback: search PATH using where.exe if [ -z "$NPP" ]; then - WINPATH=$(cmd.exe /C "where notepad++.exe" 2>/dev/null | tr -d '\r' | head -n1) - if [ -n "$WINPATH" ]; then - NPP=$(cygpath "$WINPATH") + FOUND=$(cmd.exe /C "where notepad++.exe" 2>/dev/null | tr -d '\r' | head -n1) + if [ -n "$FOUND" ]; then + NPP=$(cygpath "$FOUND") fi fi if [ -z "$NPP" ]; then - echo "Notepad++ not found!" + echo "Notepad++ not found." exit 1 fi -# Convert Git Bash paths to Windows paths +# --- Convert arguments ------------------------------------------------------ + WINARGS=() for arg in "$@"; do - if [[ "$arg" == /* ]]; then - WINARGS+=("$(cygpath -w "$arg")") - else - WINARGS+=("$arg") - fi + case "$arg" in + /*) WINARGS+=("$(cygpath -w "$arg")") ;; + *) WINARGS+=("$arg") ;; + esac done -# Launch Notepad++ +# --- Launch ---------------------------------------------------------------- + "$NPP" "${WINARGS[@]}" & From 02d267df679982fe795f41b100195fbdf1b4747f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 3 Dec 2025 14:34:29 -0500 Subject: [PATCH 129/171] intermeidate revision - added existing aware checks to --install option --- utils/npp | 94 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 25 deletions(-) diff --git a/utils/npp b/utils/npp index 26855afa1..a43fce838 100644 --- a/utils/npp +++ b/utils/npp @@ -1,39 +1,85 @@ #!/bin/bash -# npp: launch Notepad++ from Git Bash / MSYS -# also supports: npp --install +# npp: Notepad++ launcher for Git Bash / MSYS / MinGW +# Supports: npp --install (safe installer) -SELF="$0" +SELF="$(realpath "$0")" +TARGET="$HOME/bin/npp" + +# ------------------------------- UTILITIES ---------------------------------- + +sha1() { + # portable: works in Git Bash, MSYS, MinGW + if command -v sha1sum >/dev/null 2>&1; then + sha1sum "$1" | awk '{print $1}' + elif command -v shasum >/dev/null 2>&1; then + shasum -a 1 "$1" | awk '{print $1}' + else + echo "no-sha" + fi +} + +# ----------------------------- INSTALL LOGIC -------------------------------- install_self() { - local target="$HOME/bin/npp" mkdir -p "$HOME/bin" - # If target already exists, replace it - if [ -e "$target" ]; then - echo "Removing existing $target" - rm -f "$target" + # If no previous file → safe install + if [ ! -e "$TARGET" ]; then + if ln -s "$SELF" "$TARGET" 2>/dev/null; then + echo "Installed symlink: $TARGET" + else + cp "$SELF" "$TARGET" + chmod +x "$TARGET" + echo "Installed copy: $TARGET" + fi + exit 0 fi - # Prefer symlink (best for repo use) - if ln -s "$(realpath "$SELF")" "$target" 2>/dev/null; then - echo "Installed symlink: $target" - else - # If symlinks not supported (rare), fall back to copy - cp "$SELF" "$target" - chmod +x "$target" - echo "Installed copy: $target" + # Case 1: existing target is a symlink + if [ -L "$TARGET" ]; then + LINK_DEST="$(readlink "$TARGET")" + + if [ "$LINK_DEST" = "$SELF" ]; then + echo "Already installed: $TARGET → $SELF" + exit 0 + else + echo "Refusing to install: $TARGET already symlinks to:" + echo " $LINK_DEST" + echo "Different from:" + echo " $SELF" + exit 1 + fi + fi + + # Case 2: existing target is a regular file + if [ -f "$TARGET" ]; then + SELF_HASH=$(sha1 "$SELF") + TGT_HASH=$(sha1 "$TARGET") + + if [ "$SELF_HASH" = "$TGT_HASH" ]; then + echo "Existing file matches hash; already installed: $TARGET" + exit 0 + else + echo "Refusing to install: existing $TARGET differs." + echo "Self hash: $SELF_HASH" + echo "File hash: $TGT_HASH" + exit 1 + fi fi - echo "Done. Make sure ~/bin is in your PATH (Git Bash does this automatically)." - exit 0 + # Case 3: weird case (dir, device, etc.) + echo "Refusing to install: $TARGET exists and is not a file or symlink." + exit 1 } +# ------------------------- HANDLE --install OPTION --------------------------- + if [[ "$1" == "--install" ]]; then install_self fi -# --- Locate Notepad++ ------------------------------------------------------- +# ---------------------- LOCATE NOTEPAD++ ------------------------------------ CANDIDATES=( "/c/Program Files/Notepad++/notepad++.exe" @@ -49,10 +95,8 @@ for path in "${CANDIDATES[@]}"; do done if [ -z "$NPP" ]; then - FOUND=$(cmd.exe /C "where notepad++.exe" 2>/dev/null | tr -d '\r' | head -n1) - if [ -n "$FOUND" ]; then - NPP=$(cygpath "$FOUND") - fi + FOUND=$(cmd.exe /C "where notepad++.exe" 2>/dev/null | tr -d '\r' | head -n 1) + [ -n "$FOUND" ] && NPP=$(cygpath "$FOUND") fi if [ -z "$NPP" ]; then @@ -60,7 +104,7 @@ if [ -z "$NPP" ]; then exit 1 fi -# --- Convert arguments ------------------------------------------------------ +# ---------------------- ARG PATH CONVERSION ---------------------------------- WINARGS=() for arg in "$@"; do @@ -70,7 +114,7 @@ for arg in "$@"; do esac done -# --- Launch ---------------------------------------------------------------- +# -------------------------- LAUNCH NOTEPAD++ --------------------------------- "$NPP" "${WINARGS[@]}" & From a6f193f9a462134e7e9013aca42248f292c6b87c Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 3 Dec 2025 14:41:54 -0500 Subject: [PATCH 130/171] intermeidate revision - now relies on sha256sum instead of any handmade sha1 function --- utils/npp | 155 +++++++++++++++++++----------------------------------- 1 file changed, 54 insertions(+), 101 deletions(-) diff --git a/utils/npp b/utils/npp index a43fce838..fe945ba03 100644 --- a/utils/npp +++ b/utils/npp @@ -1,120 +1,73 @@ -#!/bin/bash -# npp: Notepad++ launcher for Git Bash / MSYS / MinGW -# Supports: npp --install (safe installer) - -SELF="$(realpath "$0")" -TARGET="$HOME/bin/npp" - -# ------------------------------- UTILITIES ---------------------------------- - -sha1() { - # portable: works in Git Bash, MSYS, MinGW - if command -v sha1sum >/dev/null 2>&1; then - sha1sum "$1" | awk '{print $1}' - elif command -v shasum >/dev/null 2>&1; then - shasum -a 1 "$1" | awk '{print $1}' - else - echo "no-sha" - fi +#!/usr/bin/env bash +set -euo pipefail + +script_self="$(readlink -f "$0")" +script_name="$(basename "$0")" +install_dir="$HOME/bin" +install_path="$install_dir/$script_name" + +die() { echo "ERROR: $*" >&2; exit 1; } + +find_npp() { + for p in \ + "$LOCALAPPDATA/Notepad++/notepad++.exe" \ + "/c/Program Files/Notepad++/notepad++.exe" \ + "/c/Program Files (x86)/Notepad++/notepad++.exe" + do + [ -x "$p" ] && { echo "$p"; return 0; } + done + return 1 } -# ----------------------------- INSTALL LOGIC -------------------------------- - install_self() { - - mkdir -p "$HOME/bin" - - # If no previous file → safe install - if [ ! -e "$TARGET" ]; then - if ln -s "$SELF" "$TARGET" 2>/dev/null; then - echo "Installed symlink: $TARGET" - else - cp "$SELF" "$TARGET" - chmod +x "$TARGET" - echo "Installed copy: $TARGET" + mkdir -p "$install_dir" + + # If exists, compare hashes + if [ -e "$install_path" ] || [ -L "$install_path" ]; then + echo "Installation target already exists: $install_path" + + # Compare symlink target + if [ -L "$install_path" ]; then + target="$(readlink -f "$install_path")" + if [ "$target" = "$script_self" ]; then + echo "Identical symlink already installed." + exit 0 + else + die "Different symlink target — refusing to overwrite (no --force available)" + fi fi - exit 0 - fi - # Case 1: existing target is a symlink - if [ -L "$TARGET" ]; then - LINK_DEST="$(readlink "$TARGET")" - - if [ "$LINK_DEST" = "$SELF" ]; then - echo "Already installed: $TARGET → $SELF" - exit 0 - else - echo "Refusing to install: $TARGET already symlinks to:" - echo " $LINK_DEST" - echo "Different from:" - echo " $SELF" - exit 1 + # Compare file contents with sha256sum + if ! command -v sha256sum >/dev/null 2>&1; then + die "sha256sum not found — cannot safely compare existing installation" fi - fi - # Case 2: existing target is a regular file - if [ -f "$TARGET" ]; then - SELF_HASH=$(sha1 "$SELF") - TGT_HASH=$(sha1 "$TARGET") + existing_hash="$(sha256sum "$install_path" | awk '{print $1}')" + my_hash="$(sha256sum "$script_self" | awk '{print $1}')" - if [ "$SELF_HASH" = "$TGT_HASH" ]; then - echo "Existing file matches hash; already installed: $TARGET" + if [ "$existing_hash" = "$my_hash" ]; then + echo "Existing file is identical — nothing to do." exit 0 else - echo "Refusing to install: existing $TARGET differs." - echo "Self hash: $SELF_HASH" - echo "File hash: $TGT_HASH" - exit 1 + die "Existing file differs — refusing to overwrite (no --force available)" fi fi - # Case 3: weird case (dir, device, etc.) - echo "Refusing to install: $TARGET exists and is not a file or symlink." - exit 1 + ln -s "$script_self" "$install_path" + echo "Installed $script_name → $install_path" } -# ------------------------- HANDLE --install OPTION --------------------------- - -if [[ "$1" == "--install" ]]; then - install_self -fi - -# ---------------------- LOCATE NOTEPAD++ ------------------------------------ - -CANDIDATES=( - "/c/Program Files/Notepad++/notepad++.exe" - "/c/Program Files (x86)/Notepad++/notepad++.exe" - "$LOCALAPPDATA/Programs/Notepad++/notepad++.exe" -) - -for path in "${CANDIDATES[@]}"; do - if [ -x "$path" ]; then - NPP="$path" - break - fi -done - -if [ -z "$NPP" ]; then - FOUND=$(cmd.exe /C "where notepad++.exe" 2>/dev/null | tr -d '\r' | head -n 1) - [ -n "$FOUND" ] && NPP=$(cygpath "$FOUND") -fi - -if [ -z "$NPP" ]; then - echo "Notepad++ not found." - exit 1 -fi - -# ---------------------- ARG PATH CONVERSION ---------------------------------- - -WINARGS=() -for arg in "$@"; do - case "$arg" in - /*) WINARGS+=("$(cygpath -w "$arg")") ;; - *) WINARGS+=("$arg") ;; +main() { + case "${1:-}" in + --install) + install_self + exit 0 + ;; esac -done -# -------------------------- LAUNCH NOTEPAD++ --------------------------------- + npp_path="$(find_npp)" || die "Notepad++ not found" + exec "$npp_path" "$@" +} -"$NPP" "${WINARGS[@]}" & +main "$@" From 26f81536958b40385191bd6cd7585c1f4ad11914 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 3 Dec 2025 14:46:51 -0500 Subject: [PATCH 131/171] intermeidate revision - made instakler honor "use the force luke" argument --- utils/npp | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/utils/npp b/utils/npp index fe945ba03..eeaef86ea 100644 --- a/utils/npp +++ b/utils/npp @@ -9,6 +9,7 @@ install_path="$install_dir/$script_name" die() { echo "ERROR: $*" >&2; exit 1; } find_npp() { + # Prefer Notepad++ installed per-user or system-wide for p in \ "$LOCALAPPDATA/Notepad++/notepad++.exe" \ "/c/Program Files/Notepad++/notepad++.exe" \ @@ -22,35 +23,33 @@ find_npp() { install_self() { mkdir -p "$install_dir" - # If exists, compare hashes + # If already exists, check content or symlink target if [ -e "$install_path" ] || [ -L "$install_path" ]; then - echo "Installation target already exists: $install_path" + echo "Existing installation detected: $install_path" - # Compare symlink target if [ -L "$install_path" ]; then target="$(readlink -f "$install_path")" if [ "$target" = "$script_self" ]; then - echo "Identical symlink already installed." + echo "Already installed and identical (symlink)." exit 0 else - die "Different symlink target — refusing to overwrite (no --force available)" + [ "${FORCE:-0}" = "1" ] || die "Different symlink target: $target (use --force)" fi - fi - - # Compare file contents with sha256sum - if ! command -v sha256sum >/dev/null 2>&1; then - die "sha256sum not found — cannot safely compare existing installation" - fi - - existing_hash="$(sha256sum "$install_path" | awk '{print $1}')" - my_hash="$(sha256sum "$script_self" | awk '{print $1}')" - - if [ "$existing_hash" = "$my_hash" ]; then - echo "Existing file is identical — nothing to do." - exit 0 else - die "Existing file differs — refusing to overwrite (no --force available)" + # Compare with hash if file + existing_hash="$(sha256sum "$install_path" | awk '{print $1}')" + my_hash="$(sha256sum "$script_self" | awk '{print $1}')" + if [ "$existing_hash" = "$my_hash" ]; then + echo "Already installed and identical (file)." + exit 0 + else + [ "${FORCE:-0}" = "1" ] || die \ + "Existing file differs from this version (use --force to replace)" + fi fi + + echo "Overwriting due to --force" + rm -f "$install_path" fi ln -s "$script_self" "$install_path" @@ -63,6 +62,13 @@ main() { install_self exit 0 ;; + --force) + FORCE=1 + shift + [ "${1:-}" = "--install" ] || die "--force only allowed with --install" + install_self + exit 0 + ;; esac npp_path="$(find_npp)" || die "Notepad++ not found" From 52bc324007df8e8183a382e5e5ae7b9131b899c4 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 3 Dec 2025 16:53:46 -0500 Subject: [PATCH 132/171] valuable note --- utils/choices.md | 151 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 utils/choices.md diff --git a/utils/choices.md b/utils/choices.md new file mode 100644 index 000000000..0675dcc01 --- /dev/null +++ b/utils/choices.md @@ -0,0 +1,151 @@ +# 2. ****Two Migration Philosophies**** + +## ****A. Big-Bang Migration (a.k.a. Full Cutover)**** + +****Definition:****\ +The entire bank switches from the old core to the new core ****on a +single go-live weekend****.\ +Everything --- accounts, products, transactions, channels, GL feeds --- +moves at once. + +****Mental model:****\ +Like switching an airplane's engines mid-flight, but all engines at +once. + +### Pros: + +- ****Fastest total transformation**** +- ****Lower long-term integration costs**** (old system can be shut down + quickly) +- Clean-cut product behavior: no drift between old and new logic + +### Cons: + +- ****Highest operational risk****\ + If something fails, everything fails. +- Requires ****massive multi-month "dress rehearsals"**** +- Requires ****100% feature readiness**** on Day 1\ + (including obscure corner flows like "reverse interest adjustment on + dormant accounts") + +### Typical Use Cases: + +- Very small banks / neobanks with simple product sets +- Banks with aggressive deadlines or regulatory pressure +- When legacy system is failing or support is ending + +## ****B. Stepwise / Progressive Migration**** + +****Definition:****\ +Move the bank to the new platform ****in several controlled phases**** +--- sometimes one ****product****, ****segment****, ****business +line****, or ****channel**** at a time. + +Examples of steps: + +- Phase 1: New checking/savings accounts for new customers only +- Phase 2: Migrate existing checking/savings +- Phase 3: Move loans +- Phase 4: Move treasury/cash management +- Phase 5: Retire old general ledger adapters +- Phase 6: Turn off legacy core + +****Mental model:****\ +Landing the airplane by installing one engine at a time while the others +keep flying. + +### Pros: + +- ****Lower risk****, because each migration is smaller +- ****Business continuity**** (legacy and new platforms can coexist) +- Can deliver ****value early**** (e.g., modern APIs for new products) +- Allows ****parallel treatment of technical debt**** +- Lets bank learn and adjust after each phase + +### Cons: + +- Requires ****temporary coexistence architecture**** +- More complex ****integration layers**** (old core + new core + simultaneously) +- Requires strict ****product mapping discipline**** to avoid + inconsistent rules + +### Typical Use Cases: + +- Medium/large banks with complex product catalogs +- Banks wanting minimal customer disruption +- When channels cannot all be modernized at the same time + +# ****What Is Being Migrated? (Core concepts)**** + +Even experienced IT folks outside banking may not realize how special a +core banking system is. In simplest terms: + + Term Meaning (simple) + ------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + ****Core Banking System (Core)**** The bank's transaction-processing engine: deposits, withdrawals, payments, interest, fees, posting, end-of-day ("EOD") runs, general ledger feeds. Think "ERP for money movement." + ****Products**** Checking, savings, loans, credit cards, mortgages. Each product family has its own data structures, business rules, and posting logic. + ****Customer Data**** Identity, addresses, KYC data, account relationships. Often deeply embedded in the old core. + ****Posting Cycle**** The daily/weekly/monthly batch jobs calculating fees, interest, balances. + ****Channels**** Mobile apps, online banking, ATMs, teller systems --- all depend on the core via APIs or message queues. + +Migrating a core means moving ****all product data, configs, rules, and +posting logic**** into a new system ****without breaking anything that +touches money**** + +# ****Term Definitions**** + + Term Simple Meaning + ------------------------------------------ ------------------------------------------------------------------------------------------------------------------ + ****Progressive Modernization**** Modernize piece-by-piece instead of all at once. + ****Decoupling**** Building APIs to isolate channels from the old core so they can later redirect to the new one. + ****Strangler Pattern**** Gradually replace old functionality by routing new flows to the modern system, "strangling" the old. + ****Dual Posting / Parallel Posting**** Temporarily write each transaction to both old and new systems to verify correctness. + ****Dual Run**** Operate both cores side-by-side for a period, checking that balances match. + ****Product Migration Wave**** A batch of accounts/products moved together during a controlled window. + ****Event Gateway / Middleware Layer**** A translation layer enabling old channels to talk to new core via adapters until channel modernization is ready. + +# ****How Banks Decide: Stepwise vs Big-Bang**** + +## ****Factor 1 --- Complexity of Existing Products**** + +- ****Simple product set**** → big-bang possible +- ****Customized/legacy products**** → stepwise preferred + +## ****Factor 2 --- Regression Risk**** + +- A bank with 40+ years of accreted business rules generally cannot + fully test every corner case for a one-weekend cutover. + +## ****Factor 3 --- Tolerance for Customer Disruption**** + +- Big-bang creates a ****single high-risk event**** +- Stepwise spreads smaller risks over time + +## ****Factor 4 --- Integration Architecture**** + +If channels are already API-based → stepwise is easier.\ +If channels are tightly coupled to the legacy core → big-bang may become +the only viable option. + +## ****Factor 5 --- Business Roadmap**** + +- Banks often want ****new products**** early +- Stepwise migration lets the bank release new features on the new + platform without waiting for complete cutover + +## ****Factor 6 --- Vendor / Core Platform Capability**** + +Some vendors (including FIS) ****explicitly design**** for progressive +migration --- with product-level onboarding, dual posting, and +coexistence middleware. + +## Public / Shareable References for Migration Strategies + + Source / Paper What it Covers Why Useful + -------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + **FIS --- "Targeted Core Banking Modernization" White Paper** Argues for a "component-based / incremental modernization" (versus full core rip-and-replace). Describes a "low-risk incremental approach" via modular components rather than monolithic replacement. [FIS Global+1](https://www.fisglobal.com/-/media/fisglobal/files/pdf/white-paper/core-modernization-white-paper.pdf?utm_source=chatgpt.com) Great for discussions with executives/architects: explains why incremental modernization is often more viable than big-bang for large, complex banks. + **10x Banking + AWS / Contino --- "Making sense of cloud-native core banking migration" (2023)** Explains a six-step framework for migrating to a modern, cloud-native core while reducing risk; emphasizes phased / "coexistence" strategies over full cutover. [10xbanking.com+1](https://www.10xbanking.com/downloads/core-banking-data-migration?utm_source=chatgpt.com) Useful to show a modern, real-world minded, cloud-native migration approach --- good selling material for converting legacy cores in conservative banking IT environments. + Analyst / Strategy Report --- McKinsey & Company "Core banking migration during M&A: Seven keys to success" (2023) Though oriented toward M&A, covers many of the same migration-risk factors; recommends careful planning, strong business sponsorship, and sometimes phased implementation when "single cutover" risk is too high. [McKinsey & Company](https://www.mckinsey.com/industries/financial-services/our-insights/banking-matters/core-banking-migration-during-ma-seven-keys-to-success?utm_source=chatgpt.com) Good for showing that even in high-pressure scenarios (M&A), a phased or hybrid migration strategy is often more predictable and safer than full cutover. + Industry Guide --- Virtusa "From Legacy to Digital Leadership" (2025) Provides a roadmap for moving from monolithic legacy cores to agile, cloud-native or modular platforms; discusses trade-offs between re-architect, re-platform, hybrid, or replace models. [Virtusa](https://www.virtusa.com/insights/whitepaper/from-legacy-to-digital-leadership?utm_source=chatgpt.com) Helps frame the decision criteria and strategic context --- useful when aligning business / technology leadership on what "modernization" really means. + Comparative Overview --- "Core Banking Modernisation: A Complete Guide" (third-party fintech consultancy / blog) Lays out modernization drivers (open banking, APIs, customer expectations), challenges (data, integration, legacy), and strategic choices including phased migration vs full core replacement. [Meniga+2Whatfix+2](https://www.meniga.com/resources/core-banking-modernisation/?utm_source=chatgpt.com) Good layman-friendly reference that non-technical stakeholders (product, compliance, risk) can digest, to build shared understanding of why modernization is needed and what the choices are. From 594f52ad9ee513a17d35f1c6b58755a1a2a0a778 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 10 Dec 2025 16:08:00 -0800 Subject: [PATCH 133/171] added memo --- rube-goldberg/8332.svg | 75 ++ rube-goldberg/Main.xaml | 129 +++ rube-goldberg/README.md | 107 +++ rube-goldberg/automation anywhere.xml | 25 + rube-goldberg/blue prism.xml | 38 + rube-goldberg/eac4.svg | 184 ++++ rube-goldberg/jenkins.xml | 55 ++ rube-goldberg/mule.xml | 12 + rube-goldberg/screenshots/blue_prism.jpg | Bin 0 -> 224367 bytes rube-goldberg/screenshots/flow.jpg | Bin 0 -> 254634 bytes rube-goldberg/screenshots/flow.svg | 882 ++++++++++++++++++ rube-goldberg/screenshots/jenkins_job.xml.jpg | Bin 0 -> 314774 bytes rube-goldberg/screenshots/mule.jpg | Bin 0 -> 131588 bytes rube-goldberg/screenshots/small.svg | 18 + rube-goldberg/screenshots/uipath_ide.jpg | Bin 0 -> 45505 bytes rube-goldberg/screenshots/uipath_main.jpg | Bin 0 -> 376385 bytes rube-goldberg/screenshots/wwf_ide.jpg | Bin 0 -> 211900 bytes rube-goldberg/uipath.xml | 41 + 18 files changed, 1566 insertions(+) create mode 100644 rube-goldberg/8332.svg create mode 100644 rube-goldberg/Main.xaml create mode 100644 rube-goldberg/README.md create mode 100644 rube-goldberg/automation anywhere.xml create mode 100644 rube-goldberg/blue prism.xml create mode 100644 rube-goldberg/eac4.svg create mode 100644 rube-goldberg/jenkins.xml create mode 100644 rube-goldberg/mule.xml create mode 100644 rube-goldberg/screenshots/blue_prism.jpg create mode 100644 rube-goldberg/screenshots/flow.jpg create mode 100644 rube-goldberg/screenshots/flow.svg create mode 100644 rube-goldberg/screenshots/jenkins_job.xml.jpg create mode 100644 rube-goldberg/screenshots/mule.jpg create mode 100644 rube-goldberg/screenshots/small.svg create mode 100644 rube-goldberg/screenshots/uipath_ide.jpg create mode 100644 rube-goldberg/screenshots/uipath_main.jpg create mode 100644 rube-goldberg/screenshots/wwf_ide.jpg create mode 100644 rube-goldberg/uipath.xml diff --git a/rube-goldberg/8332.svg b/rube-goldberg/8332.svg new file mode 100644 index 000000000..45eca0d85 --- /dev/null +++ b/rube-goldberg/8332.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + Alarm + + + + + + + + + + Domino chain + + + + + + Ball + + + + + + + Seesaw + + + + + + + Kettle + + + + + + + + Cup + + + + diff --git a/rube-goldberg/Main.xaml b/rube-goldberg/Main.xaml new file mode 100644 index 000000000..9129f174f --- /dev/null +++ b/rube-goldberg/Main.xaml @@ -0,0 +1,129 @@ + + + + System.Activities + System.Activities.Statements + System.Activities.Expressions + System.Activities.Validation + System.Activities.XamlIntegration + Microsoft.VisualBasic + Microsoft.VisualBasic.Activities + System + System.Collections + System.Collections.Generic + System.Collections.ObjectModel + System.Data + System.Diagnostics + System.Drawing + System.IO + System.Linq + System.Net.Mail + System.Xml + System.Xml.Linq + UiPath.Core + UiPath.Core.Activities + System.Windows.Markup + GlobalVariablesNamespace + GlobalConstantsNamespace + UiPath.Terminal + UiPath.Terminal.Service + System.Security + System.Reflection + UiPath.Terminal.Enums + UiPath.Terminal.Activities + + + + + Microsoft.VisualBasic + mscorlib + PresentationCore + PresentationFramework + System + System.Activities + System.ComponentModel.TypeConverter + System.Core + System.Data + System.Data.Common + System.Data.DataSetExtensions + System.Drawing + System.Drawing.Common + System.Drawing.Primitives + System.Linq + System.Net.Mail + System.ObjectModel + System.Private.CoreLib + System.Xaml + System.Xml + System.Xml.Linq + UiPath.System.Activities + UiPath.UiAutomation.Activities + WindowsBase + UiPath.Studio.Constants + UiPath.Terminal + UiPath.Terminal.Activities + UiPath.Terminal.Activities.Design + System.Security.Permissions + System.Runtime.InteropServices + System.Reflection.DispatchProxy + System.Reflection.TypeExtensions + System.Reflection.Metadata + + + + + + + + TerminalSession_1 + OutputConnection + + + + + + + True + + + + + + + + + + + + True + + + + + + + + + + True + False + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rube-goldberg/README.md b/rube-goldberg/README.md new file mode 100644 index 000000000..52f02fb1b --- /dev/null +++ b/rube-goldberg/README.md @@ -0,0 +1,107 @@ +### Info + +Classic [RGM](https://en.wikipedia.org/wiki/Rube_Goldberg_machine) [RPA](https://en.wikipedia.org/wiki/Robotic_process_automation): + +![Rube Goldberg chain reaction machine pinup pop art retro PNG illustration. Comic book style imitation](screenshots/flow.jpg) + +A mechanism that accomplishes a trivial end result by means of an extended chain of loosely related, finish-to-finish obscure interactions, each activating the next in a cascading "domino effect" + +Classic __Rude Golberg__ *teller screens*: + +* Candle burning a rope +* Rope releases a weight +* Weight tips a seesaw +* Seesaw knocks a domino +* Domino toppling occurs, with each piece in turn knocking over the next +* Needle hits a balloon +* Scissors cut a rope +* Balloon rises and pulls a string +* String lifts a lever → pours tea + +![Rube Goldberg chain reaction machine pinup pop art retro PNG illustration. Comic book style imitation](screenshots/flow.svg) +### Author + +[Serguei Kouzmine](mailto:kouzmine_serguei@yahoo.com) + + +### Related Info + +DVI (Device Independent File Format) and PostScript (PS) within the context of TeX and printing technology. That’s a fantastic analogy to highlight the complexity of a mainframe to API-first cloud migration! + +Let me unpack what you're saying and align it with the mainframe-to-cloud migration idea: + +DVI vs PostScript (PS) + +DVI (Device Independent Format): + +Purpose: DVI was designed to be a device-independent output format for TeX, meaning it was created to represent the output of TeX without making any assumptions about the final output device (e.g., printer, screen, etc.). The focus was on compactness, where the primary goal was to produce a minimalist, raw format that could be interpreted and rendered by various devices, but without making the format too verbose or device-specific. + +Characteristics: + +Very simple and efficient: It just holds the raw information about how text and figures should be placed on a page. + +Lacks higher-level constructs for things like fonts or color management, leaving much of that interpretation to the downstream rendering process (like a printer or display device). + +Compact, but cryptic: It doesn't aim to describe everything in a human-readable way or optimize for quality printing directly. + +PostScript (PS): + +Purpose: PostScript is a page description language that was designed with a very different goal in mind. It was meant for high-quality print output, particularly for low-capacity devices like printers, and it provided much more sophisticated ways to describe pages (fonts, graphics, color management, etc.). PS allows for fine-grained control over how the final output should look, and it's inherently device-dependent (i.e., it describes the output as commands to a device that understands PostScript). + +Characteristics: + +Pre-computed coordinates: PostScript programs typically contain highly detailed instructions about exactly where to place things on the page, often describing everything in terms of absolute coordinates, making the final output highly refined and device-specific. + +More verbose and complex: Unlike DVI, PostScript is rich and detailed, capturing a lot of context about fonts, page layout, and printing specifics. + +Higher quality: PS is designed to ensure high-quality printed output, which is why it’s cryptic in the sense that it’s a specialized language built for a specific purpose. + + +Connecting DVI and PS to Mainframe-to-Cloud API Migration + +In your analogy, I think you're pointing out the fundamental differences in design goals and usage between DVI and PS, and then comparing that to the shift from mainframe-based, monolithic systems to cloud-based, API-first architectures. + +Device Independence (DVI) vs Device-Specific (PostScript): + +Mainframe systems are like PostScript: They are device-specific, meaning they were built for a particular environment, with tight coupling to hardware, operating systems, and often proprietary software. Mainframe systems are optimized for high reliability but lack flexibility and scalability. + +API-first cloud solutions are more like DVI: They are device-independent in the sense that cloud architectures and APIs are designed to be flexible, working across many different environments (whether that’s microservices, containers, or different cloud providers). The key difference, of course, is that APIs are designed to enable dynamic, scalable interactions, whereas DVI was more about a minimal, "compact" output format. + +Complexity of PostScript vs Simplicity of DVI: + +Mainframe-to-cloud migration isn’t a simple, minimal change (like moving from DVI to another device-independent format). It’s more akin to the complexity of moving from PostScript to a flexible, modular cloud architecture where everything needs to be re-imagined, re-structured, and possibly rebuilt from the ground up. + +Mainframe systems often deal with complex legacy processes, and moving to API-first cloud solutions requires translating these legacy processes into modular components that can be easily exposed via APIs. This is very different from simply taking the old format and "moving" it as-is. + +Overlapping Goals and Technologies: + +With PostScript, the high-level goal was quality output (high-res printing) that was optimized for specific devices (printers). In the mainframe scenario, the goal is often to keep the same business logic or functional capabilities while transforming the underlying infrastructure to be more scalable and adaptable in the cloud. + +With DVI, you’re more concerned with just getting the data in a minimal, device-independent format. In a mainframe-to-API migration, you'd be rethinking the data handling, transforming monolithic business processes into cloud-native designs, which often involves much more than simply "migrating" data or functionality. + +The Full Analogous Shift (Reverse DVI to PS): + +So, just as moving from DVI to PostScript is a full transformation (not just a reformatting), migrating from mainframe to cloud (API-first) is a complete reconstruction of the system from the ground up. In both cases, you are moving away from legacy systems that were designed for different purposes and environments, toward a more flexible, scalable, and modernized solution. There is no direct overlap, and the new system is entirely different in how it operates, just like how DVI (compact and simple) is fundamentally different from PostScript (rich and detailed). + + + + +![jenkins job XML](screenshots/jenkins_job.xml.jpg) +Jenkins Job + +![blue prism](screenshots/blue_prism.jpg) +Blue Prism Process + +![uipath Main XAML](screenshots/uipath_main.jpg) +UIPath FlowChart + +![uipath IDE](screenshots/uipath_ui.jpg) +UIPath Designer + +![Visual Studio Workflow IDE](screenshots/wwf.jpg) +Visual Studio 2010 Workflow Designer + +![Mule Step Flow](screenshots/mule.jpg) +Mule Strp Flow + +Despite XAML’s infamous reputation as part of Microsoft’s largely failed ‘Internet reinvention’ during the Vista era and its practical dormancy for decades thereafter, UiPath adopted it as the foundation for workflow serialization diff --git a/rube-goldberg/automation anywhere.xml b/rube-goldberg/automation anywhere.xml new file mode 100644 index 000000000..a2fec304c --- /dev/null +++ b/rube-goldberg/automation anywhere.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rube-goldberg/blue prism.xml b/rube-goldberg/blue prism.xml new file mode 100644 index 000000000..adc3d1382 --- /dev/null +++ b/rube-goldberg/blue prism.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + "Hello World" + + + + + + + Log Message + + + + End + + + + + + + + + + + + diff --git a/rube-goldberg/eac4.svg b/rube-goldberg/eac4.svg new file mode 100644 index 000000000..ca08ab5af --- /dev/null +++ b/rube-goldberg/eac4.svg @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + Alarm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tea cup + + + + + domino chain → + ball → + seesaw → + kettle → + + + + + + Animated loop — alarm triggers pour + + + + + diff --git a/rube-goldberg/jenkins.xml b/rube-goldberg/jenkins.xml new file mode 100644 index 000000000..46b7c0c58 --- /dev/null +++ b/rube-goldberg/jenkins.xml @@ -0,0 +1,55 @@ + + + + test the naginator plugin functionality + + -1 + -1 + -1 + -1 + + false + + + false + + + + true + false + false + false + + false + + + echo Retry BAR: 3 +exit 1 + + + + + (FOO|foo) + true + false + true + TestParent + + 10 + + 1 + + + (BAR|bar): (\d) + true + false + true + TestParent + + 10 + + 2 + + + + diff --git a/rube-goldberg/mule.xml b/rube-goldberg/mule.xml new file mode 100644 index 000000000..9ce67b2f5 --- /dev/null +++ b/rube-goldberg/mule.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/rube-goldberg/screenshots/blue_prism.jpg b/rube-goldberg/screenshots/blue_prism.jpg new file mode 100644 index 0000000000000000000000000000000000000000..715b73dcf3947ab76d30dc6dec2e5e16b939dcf4 GIT binary patch literal 224367 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 M5SeDIp%_ExsUeNtMa2ki|6X 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

%k<&&pI-ajm0$79hCRID~SBzxsFNf_Qw+Tz2)w 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�DYrj<&*y7qOSydk@*$ai1! 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 literal 0 HcmV?d00001 diff --git a/rube-goldberg/screenshots/flow.jpg b/rube-goldberg/screenshots/flow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e02062ee26443846012702556e7beeee71a591ed GIT binary patch literal 254634 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

w6{C$80@4`2?RW3IJ*AocU%e*P+|+_eAp5 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
N55My>qm8H&1E^maC)=g|h4f07+9sHWnPXs# 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

`onrI!{;S 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

D|TImGpxM~1N*e6UK4t$LjtW1 zo_ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rube-goldberg/screenshots/jenkins_job.xml.jpg b/rube-goldberg/screenshots/jenkins_job.xml.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d160bc504d3190a73afdeff92849d5d2d8855c1 GIT binary patch literal 314774 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


n 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 diff --git a/jna_autoit/src/test/java/example/AU3Test.java b/jna_autoit/src/test/java/example/AU3Test.java deleted file mode 100644 index d65819e3e..000000000 --- a/jna_autoit/src/test/java/example/AU3Test.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * Licensed 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. - */ -package example; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; -// import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.greaterThan; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.fail; - -import java.lang.reflect.Method; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.sun.jna.Memory; -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.WTypes.LPWSTR; -import com.sun.jna.platform.win32.WinDef.RECT; - -/** - * @author midorlo - * @author sergueik - */ -public class AU3Test { - - private String title = null; - private String text = ""; - private final String commandline = "c:\\Windows\\System32\\notepad.exe"; - private String workdir = "c:\\Windows\\Temp"; - - private final int au3Success = Constants.AU3_SUCCESS; - private final int au3Failure = Constants.AU3_FAILURE; - AutoItX instance = null; - - @BeforeMethod - public void beforeMethod(Method method) { - instance = AutoItX.getInstance(); - } - - @AfterMethod - public void afterMethod() { - // cleanup of instance ? - } - - @Test(enabled = true) - public void testGetSingletonInstance() { - System.err.println("Get Singleton Instances"); - AutoItX instance2 = AutoItX.getInstance(); - assertEquals(instance, instance2); - } - - @Test(enabled = true) - public void testInit() { - System.err.println("Init"); - instance.AU3_Init(); - } - - @Test(enabled = false) - public void testCloseOpenFileDialog() { - System.err.println("Close File Dialog"); - title = "Open"; // will switch to "Save" - text = ""; - int result = instance.AU3_WinClose(new WString(title), new WString(text)); - assertEquals(result, au3Success); - } - - @Test(enabled = false) - public void testCloseChromeBrowser() { - System.err.println("Close Chrome Browser"); - title = "New Tab"; - assertEquals(instance.AU3_WinClose(new WString(title), new WString(text)), au3Success); - } - - @Test(enabled = false) - public void testCloseFirefoxBrowser() { - System.err.println("Close Mozilla Firefox Browser"); - title = "Mozilla Firefox Start Page"; - assertEquals(instance.AU3_WinClose(new WString(title), new WString(text)), au3Success); - } - - @Test(enabled = false) - public void testProvidePathToOpenFile() { - System.err.println("Provide Path to Open File"); - title = "Open"; - instance.AU3_WinWaitActive(new WString(title), new WString(text)); - instance.AU3_Send(new WString("D:\\AutoIT-commands\\TestingVideo.mp4")); - instance.AU3_Send(new WString("\n")); // "{ENTER}" - // close the file not found sub-dialog - instance.AU3_WinClose(new WString(title), new WString(text)); - // close the file open dialog - // TODO: confirm the status - assertEquals(instance.AU3_WinClose(new WString(title), new WString(text)), au3Failure); - } - - @Test(enabled = true) - public void testProcessState() { - System.err.println("Get, create, stop Process using AU3 API"); - - String regex = "^.*\\\\"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(commandline); - String processName = matcher.replaceAll(""); - title = "Untitled - Notepad"; - - // System.err.println( - // "Commandline: " + commandline + " processname : " + processName); - int result = instance.AU3_ProcessExists(new WString(processName)); - System.err.println("Existing process check: " - + (result == 0 ? "not running" : String.format("already running with pid %d", result))); - - if (result == 0) { - System.err.println(String.format("Launching process %s with commandline %s", processName, commandline)); - int pid = instance.AU3_Run(new WString(commandline), new WString(workdir), Constants.SW_SHOW); - System.err.println("Launched process pid: " + pid); - } - assertTrue(instance.AU3_ProcessExists(new WString(processName)) != Constants.AU3_FAILURE); - instance.AU3_Sleep(1000); - assertTrue(instance.AU3_WinExists(new WString(title), new WString("")) != Constants.AU3_FAILURE); - System.err.println("Window exists. "); - System.err.println("Closing window title: " + title); - instance.AU3_WinClose(new WString(title), new WString("")); - instance.AU3_Sleep(1000); - if (instance.AU3_WinExists(new WString(title), new WString("")) == Constants.AU3_SUCCESS) { - System.err.println("Killing window title: " + title); - instance.AU3_WinKill(new WString(title), new WString("")); - } - assertFalse(instance.AU3_WinExists(new WString(title), new WString("")) == Constants.AU3_SUCCESS); - } - - @Test(enabled = true) - public void testClipboard() { - System.err.println("Put and get data using AU3 Clipboard API"); - String dataPut = "example"; - int dataPutLength = dataPut.length(); - instance.AU3_ClipPut(new WString(dataPut)); - try { - StringBuilder sb = new StringBuilder(dataPutLength); - while (sb.length() < dataPutLength) { - sb.append("*"); - } - String dataGet = sb.toString(); - // TODO: explain - int bufSize = dataGet.length() + 1; - LPWSTR resultPtr = new LPWSTR(dataGet); - instance.AU3_ClipGet(resultPtr, bufSize); - dataGet = resultPtr.getValue().toString(); - dataGet.trim(); - assertThat(dataGet, notNullValue()); - System.err.println("Got data: " + dataGet); - Assert.assertTrue(dataGet.equals(dataPut)); - } catch (Exception e) { - // Corrupted stdin stream in forked JVM 1. Stream '#' - solved. - System.err.println("Exception " + e.toString()); - } - } - - @Test(enabled = true) - public void testWinGetPos() { - System.err.println("Get active window position information"); - title = "[ACTIVE]"; - assertTrue(instance.AU3_WinExists(new WString(title), new WString("")) != Constants.AU3_FAILURE); - - RECT rect = new RECT(); - instance.AU3_WinGetPos(new WString(title), new WString(""), rect); - assertThat(rect, notNullValue()); - assertThat(rect.bottom, greaterThan(0)); - assertThat(rect.right, greaterThan(0)); - System.err.println(String.format("top: %d\nleft: %d\nbottom: %d\nright: %d", rect.top, rect.left, rect.bottom, - rect.right)); - - } - - @Test(enabled = true) - public void testMouseGetPos() { - System.err.println("Get mouse position information"); - try { - - int[] pos = new int[2]; - Pointer arg = new Memory(32); - instance.AU3_MouseGetPos(arg); - System.err.println("Dump: " + arg.dump(0, 16)); - pos = arg.getIntArray(0, 2); - - assertThat(pos, notNullValue()); - - assertThat(pos[0], greaterThan(-1)); - assertThat(pos[1], greaterThan(-1)); - - System.err.println(String.format("X: %d\nY: %d", pos[0], pos[1])); - - } catch (Exception e) { - // Exception java.lang.IndexOutOfBoundsException: Bounds exceeds available space - // : size=4, offset = 8 - System.err.println("Exception " + e.toString()); - } - } - - @Test(enabled = true) - public void testDesktopWindowDimensions() { - System.err.println("Get desktop window position information"); - title = "Program Manager"; - - RECT rect = new RECT(); - instance.AU3_WinGetPos(new WString(title), new WString(""), rect); - assertThat(rect, notNullValue()); - assertEquals(rect.top, 0); - assertEquals(rect.left, 0); - assertThat(rect.bottom, greaterThan(0)); - assertThat(rect.right, greaterThan(0)); - System.err.println(String.format("top: %d\nleft: %d\nbottom: %d\nright: %d", rect.top, rect.left, rect.bottom, - rect.right)); - - } - - // @Test(enabled = false) - // public void testAU3_WinActive() { - // System.err.println("AU3_WinActive"); - // WString arg0 = null; - // WString arg1 = null; - // int result = instance.AU3_WinActive(arg0, arg1); - // assertEquals(result, au3Success); - // } - - // @Test(enabled = false) - // public void testAU3_WinExists() { - // System.err.println("AU3_WinExists"); - // WString arg0 = null; - // WString arg1 = null; - // int result = instance.AU3_WinExists(arg0, arg1); - // assertEquals(result, au3Success); - // } - - // @Test(enabled = false) - // public void testAU3_WinGetTitle() { - // System.err.println("AU3_WinGetTitle"); - // WString arg0 = null; - // WString arg1 = null; - // WTypes.LPWSTR arg2 = null; - // int arg3 = 0; - // instance.AU3_WinGetTitle(arg0, arg1, arg2, arg3); - // } - -} diff --git a/jna_autoit/src/test/java/example/AutoItTest.java b/jna_autoit/src/test/java/example/AutoItTest.java deleted file mode 100644 index ab6a3638c..000000000 --- a/jna_autoit/src/test/java/example/AutoItTest.java +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * Licensed 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. - */ -package example; - -import org.testng.Assert; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.fail; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import static org.hamcrest.core.AnyOf.anyOf; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.User32; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.User32; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import example.Constants; - -/** - * @author midorlo - * @author sergueik - */ -public class AutoItTest { - - private String title = null; - private String text = ""; - private String result = null; - private AutoItX instance = null; - private static final boolean debug = true; - private final String commandline = "c:\\Windows\\System32\\notepad.exe"; - private String workdir = "c:\\Windows\\Temp"; - - @BeforeMethod - public void beforeMethod() { - instance = AutoItX.getInstance(); - } - - @AfterMethod - public void afterMethod() { - // cleanup of instance ? - } - - @Test(enabled = false) - public void testCloseOpenFileDialog() { - System.err.println("Close File Dialog"); - title = "Open"; // title will become "Save" - assertFalse(instance.WinClose(title, text)); - } - - @Test(enabled = true) - public void testClipboard() { - System.err.println("Put and get data using Clipboard"); - String dataPut = "example"; - try { - instance.ClipPut(dataPut); - String dataGet = instance.ClipGet(); - Assert.assertTrue(dataGet.equals(dataPut)); - } catch (Exception e) { - // Corrupted stdin stream in forked JVM 1. Stream '#' - solved. - System.err.println("Exception " + e.toString()); - } - } - - @Test(enabled = true) - public void testWinGetPos() { - System.err.println("Get active window position information"); - title = "[ACTIVE]"; - try { - int[] pos = instance.WinGetPos(title, ""); - assertThat(pos, notNullValue()); - - assertThat(pos[0], greaterThan(0)); - assertThat(pos[1], greaterThan(0)); - assertThat(pos[2], greaterThan(0)); - assertThat(pos[3], greaterThan(0)); - - System.err.println(String.format("X: %d\nY: %d\nWidth: %d\nHeight: %d", pos[0], pos[1], pos[2], pos[3])); - - } catch (Exception e) { - System.err.println("Exception " + e.toString()); - } - } - - @Test(enabled = true) - public void testMouseGetPos() { - System.err.println("Get mouse position information"); - try { - int[] pos = instance.MouseGetPos(); - assertThat(pos, notNullValue()); - - assertThat(pos[0], greaterThan(-1)); - assertThat(pos[1], greaterThan(-1)); - - System.err.println(String.format("X: %d\nY: %d", pos[0], pos[1])); - - } catch (Exception e) { - // Exception java.lang.IndexOutOfBoundsException: Bounds exceeds available space - // : size=4, offset = 8 - System.err.println("Exception " + e.toString()); - } - } - - @Test(enabled = true) - public void testDesktopWindowDimensions() { - System.err.println("Get desktop window position information"); - title = "Program Manager"; - try { - int[] pos = instance.WinGetPos(title, ""); - assertThat(pos, notNullValue()); - System.err.println(String.format("X: %d\nY: %d\nWidth: %d\nHeight: %d", pos[0], pos[1], pos[2], pos[3])); - - assertThat(pos[0], equalTo(0)); - assertThat(pos[1], equalTo(0)); - assertThat(pos[2], greaterThan(0)); - assertThat(pos[3], greaterThan(0)); - - } catch (Exception e) { - System.err.println("Exception " + e.toString()); - } - } - - // see example usage - // http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=760#8 - @Test(enabled = true) - public void testActiveWindowClassList() { - System.err.println("Get active window class List information"); - title = "[ACTIVE]"; - try { - List classList = instance.WinGetClassList(title, text); - assertThat(classList, notNullValue()); - assertThat(classList.get(0), notNullValue()); - for (String className : classList) { - System.err.println(String.format("Class name: \"%s\"", className)); - } - // e.g.for Chrome browser: Chrome_RenderWidgetHostHWND, "Intermediate - // Software Window" - // for Internet Explorer: BrowserFrameGripperClass, "Client Caption", - // WorkerW, ReBarWindow32 etc. - // for Firefox: nothing - } catch (Exception e) { - // Corrupted stdin stream in forked JVM 1. Stream '#' - solved. - System.err.println("Exception " + e.toString()); - } - } - - @Test(enabled = true) - public void testActiveWindowState() { - System.err.println("Get active window state information"); - title = "[ACTIVE]"; - String state = instance.WinGetState(title, text); - assertThat(state, notNullValue()); - List stateList = new ArrayList<>(); - stateList = Arrays.asList(state.split("\\n")); - - assertThat(stateList.get(0), notNullValue()); - for (String stateName : stateList) { - System.err.println(String.format("Window state: \"%s\"", stateName)); - } - - } - - @Test(enabled = true) - public void testProcessState() { - System.err.println("Get, create, stop Process"); - String regex = "^.*\\\\"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(commandline); - String processName = matcher.replaceAll(""); - title = "Untitled - Notepad"; - text = ""; - // System.err.println( - // "Commandline: " + commandline + " processname : " + processName); - boolean status = instance.ProcessExists(processName); - System.err.println("Existing process check: " + (status ? "running" : "not running")); - - if (!status) { - System.err.println(String.format("Launching process %s with commandline %s", processName, commandline)); - status = instance.Run(commandline, workdir, Constants.SW_SHOW); - } - assertTrue(instance.ProcessExists(processName)); - System.err.println("Process is running"); - instance.Sleep(1000); - - assertTrue(instance.WinExists(title, text)); - System.err.println("Window exists. "); - - // NOTE: not really getting window on top - assertTrue(instance.WinSetOnTop(title, text, Constants.AU3_WINDOWS_ONTOP)); - instance.Sleep(1000); - // NOTE: without the timeout, this call will block the test - System.err.println("Window " + title + " is active: " + instance.WinWaitActive(title, text, 10)); - - System.err.println("Closing window title: " + title); - instance.WinClose(title, text); - instance.Sleep(1000); - // - if (instance.WinExists(title, text)) { - System.err.println("Killing window title: " + title); - instance.WinKill(title, text); - } - assertFalse(instance.WinExists(title, text)); - } - - // todo: order - @Test(enabled = false) - public void testActiveWindowTitle() { - System.err.println("Get active window title"); - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - System.err.println(String.format("The active window title is \"%s\"", windowTitle)); - } - - @Test(enabled = true) - public void testActiveWindowHandle() { - System.err.println("Get active window handle as string"); - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - String windowHandle = instance.WinGetHandleAsText(title, text); - assertThat(windowHandle, notNullValue()); - - // https://stackoverflow.com/questions/33705230/how-can-i-get-hwnd-from-string - - HWND hwnd = new HWND(); - hwnd.setPointer(new Pointer(Long.decode(windowHandle))); - assertTrue(User32.INSTANCE.IsWindow(hwnd)); - System.err.println( - String.format("Window \"%s\" handle is %s. It is a valid window handle.", windowTitle, windowHandle)); - } - - @Test(enabled = false) - public void testActiveWindowGetTextByHandle() { - System.err.println("Get active window text by handle (as string)"); - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - String windowHandle = instance.WinGetHandleAsText(title, text); - assertThat(windowHandle, notNullValue()); - String windowText = instance.WinGetTextByHandle(windowHandle); - assertThat(windowText, notNullValue()); - System.err.println(String.format("Window \"%s\" text is \"%s\".", windowTitle, windowText)); - } - - @Test(enabled = false) - public void testZoomFirefoxBrowser() { - System.err.println("Close Mozilla Firefox Browser"); - title = "Mozilla Firefox Start Page"; - instance.AutoItSetOption("SendKeyDownDelay", 30); - instance.AutoItSetOption("SendKeyDelay", 10); - // zoom out four times - for (int cnt = 0; cnt != 4; cnt++) { - instance.Send("^-", true); - sleep(1000); - } - // zoom 100 % - instance.Send("^0", true); - sleep(1000); - // CTLR + is a bit tricky since the '+' itself has a special meaning - // zoom in 2 times - instance.Send("^{+}^{+}", true); - sleep(1000); - instance.WinClose(title, text); - } - - @Test(enabled = false) - public void testProvidePathToOpenFile() { - System.err.println("Provide Path to Open File"); - title = "Open"; - // customized to exercise shift modifier - String filePath = "D:\\AutoIT-commands\\TestingV+i+d+e+o.mp4"; - instance.WinWaitActive(title, text); - // will successfully send a shift key - instance.Send(filePath, true); - sleep(100); - instance.Send("\n"); // "{ENTER}" - result = instance.WinGetText(title, text); - assertThat(result, notNullValue()); - // TODO: get actual dialog text - // currently receiving the text of the button having the focus ("OK") - System.err.println("Result is: " + result); - sleep(100); - // close the "file not found" sub-dialog - instance.WinClose(title, text); - sleep(100); - // close the file open dialog - assertTrue(instance.WinClose(title, text)); - } - - public void sleep(Integer milliSeconds) { - try { - Thread.sleep((long) milliSeconds); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/jna_autoit/src/test/java/example/EnvironmentTest.java b/jna_autoit/src/test/java/example/EnvironmentTest.java deleted file mode 100644 index 69b4a5e30..000000000 --- a/jna_autoit/src/test/java/example/EnvironmentTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2018-2019 midorlo, sergueik - * - * Licensed 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. - */ -package example; - -import java.util.Arrays; -import java.util.List; - -import org.testng.Assert; -import org.testng.annotations.Test; - -/** - * @author midorlo - * @author sergueik - */ -public class EnvironmentTest { - - /** - * Tests Plattform. This will fail on non-windows, - * and also on windows xp and older (chosen voluntarily). - */ - @Test(enabled = true) - public void testEnvironment() { - System.err.println("OS test is Running: " + System.getProperty("os.name")); - String result = System.getProperty("os.name"); - - List osNames = Arrays.asList("Windows 10", "Windows 8", - "Windows 8.1", "Windows 7", "Windows Server 2012 R2"); - Assert.assertTrue(osNames.contains(result)); - // see also: - // https://www.programcreek.com/java-api-examples/index.php?api=org.hamcrest.core.AnyOf - // NOTE: anyOf(containsString(expResult1),...) does not work with testng ? - } - -} diff --git a/jna_autoit/src/test/java/example/FirefoxTest.java b/jna_autoit/src/test/java/example/FirefoxTest.java deleted file mode 100644 index 365f47366..000000000 --- a/jna_autoit/src/test/java/example/FirefoxTest.java +++ /dev/null @@ -1,245 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.time.Duration; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; - -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebDriverException; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.chrome.ChromeOptions; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.FirefoxProfile; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.logging.LogType; -import org.openqa.selenium.logging.LoggingPreferences; -import org.openqa.selenium.remote.CapabilityType; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.ExpectedCondition; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; - -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.sun.jna.Pointer; -import com.sun.jna.WString; -import com.sun.jna.platform.win32.User32; -import com.sun.jna.platform.win32.WinDef.HWND; - -public class FirefoxTest { - - private String title = null; - private String text = ""; - private String result = null; - private AutoItX instance = null; - private static final boolean debug = true; - - // for Selenium part of the test - public int scriptTimeout = 5; - public int flexibleWait = 60; // too long - public int implicitWait = 1; - public int pollingInterval = 500; - @SuppressWarnings("unused") - private static long highlightInterval = 100; - public WebDriver driver; - public WebDriverWait wait; - public Actions actions; - public JavascriptExecutor js; - public TakesScreenshot screenshot; - - private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; - private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; - // see also: - // private final static String baseURL = - // "http://spreadsheetpage.com/index.php/file/C35/P10/" - // private final static String xpath = - // String.format"//*[@id='content']//a[contains(text(), '%s')]", "xls"); - private final static String locator = "table#table-files a.btn"; - private static final int timeout = 2000; - private static String fileType = "zip"; - private final static String xpath = String.format( - "//table[@id='table-files']//a[contains(@class,'btn')][contains(text(), '%s')]", - fileType.toUpperCase()); - private static List elements; - private static WebElement element; - private static String osName = getOSName(); - - @SuppressWarnings("deprecation") - @BeforeMethod - public void beforeMethod() throws IOException { - instance = AutoItX.getInstance(); - - System.setProperty("webdriver.gecko.driver", osName.equals("windows") - ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() - : /* String.format("%s/Downloads/geckodriver", System.getenv("HOME"))*/ - Paths.get(System.getProperty("user.home")).resolve("Downloads") - .resolve("geckodriver").toAbsolutePath().toString()); - System.setProperty("webdriver.firefox.bin", - osName.equals("windows") - // TODO: detect architecture - ? new File("c:/Program Files/Mozilla Firefox/firefox.exe") - .getAbsolutePath() - : "/usr/bin/firefox"); - // https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities - DesiredCapabilities capabilities = DesiredCapabilities.firefox(); - FirefoxProfile profile = new FirefoxProfile(); - capabilities.setCapability("marionette", false); - capabilities.setCapability(FirefoxDriver.PROFILE, profile); - try { - driver = new FirefoxDriver(capabilities); - } catch (WebDriverException e) { - e.printStackTrace(); - throw new RuntimeException( - "Cannot initialize Firefox driver: " + e.toString()); - } - - assertThat(driver, notNullValue()); - actions = new Actions(driver); - - driver.manage().timeouts().setScriptTimeout(scriptTimeout, - TimeUnit.SECONDS); - wait = new WebDriverWait(driver, flexibleWait); - - wait.pollingEvery(Duration.ofMillis(pollingInterval)); - - screenshot = ((TakesScreenshot) driver); - js = ((JavascriptExecutor) driver); - - } - - // using arrow and tab keys to select "Download" - // https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm - @Test(enabled = true) - public void testDirectURLDownoadManagerDialog() { - driver.navigate().to(directURL); - sleep(timeout); - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - System.err.println( - String.format("The active window title is \"%s\"", windowTitle)); - sleep(100); - instance.Send("{DOWN}", true); // arrow key down - sleep(100); - instance.Send("{TAB}", true); - sleep(100); - instance.Send("{TAB}", true); - sleep(100); - instance.Send("{TAB}", true); - sleep(100); - instance.Send("{ENTER}", true); - sleep(10000); - result = instance.WinGetText(title, text); - // NOTE: Mozilla Firefox Download Manager dialog button does not return any - // text of interest - assertThat(result, notNullValue()); - System.err.println(String.format("The result is \"%s\"", result)); - // Downloaded file will be found in the default location, that is - // configurable through Mozilla Firefox profile e.g. - // $env:USERPROFILE:/Downloads - sleep(1000); - - } - - @Test(enabled = false) - public void testButtonClickDownoadManagerDialog() { - driver.navigate().to(baseURL); - elements = driver.findElements(By.cssSelector(locator)); - // inventory - elements.stream().map(e -> e.getText()).forEach(System.err::println); - elements.stream().forEach(button -> { - actions.moveToElement(button).build().perform(); - highlight(button, 500); - }); - // click on a mime type in question - element = driver.findElement(By.xpath(xpath)); - assertThat(element, notNullValue()); - element.click(); - sleep(timeout); - } - - // Utilities - private static String getOSName() { - if (osName == null) { - osName = System.getProperty("os.name").toLowerCase(); - if (osName.startsWith("windows")) { - osName = "windows"; - } - } - return osName; - } - - public void sleep(Integer milliSeconds) { - try { - Thread.sleep((long) milliSeconds); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public Object executeScript(String script, Object... arguments) { - if (driver instanceof JavascriptExecutor) { - JavascriptExecutor javascriptExecutor = JavascriptExecutor.class - .cast(driver); - return javascriptExecutor.executeScript(script, arguments); - } else { - throw new RuntimeException("Script execution failed."); - } - } - - public void highlight(WebElement element) { - highlight(element, 100, "solid yellow"); - } - - public void highlight(WebElement element, long highlightInterval) { - highlight(element, highlightInterval, "solid yellow"); - - } - - public void highlight(WebElement element, long highlightInterval, - String color) { - System.err.println("Color: " + color); - if (wait == null) { - wait = new WebDriverWait(driver, flexibleWait); - } - wait.pollingEvery(Duration.ofMillis(pollingInterval)); - try { - // wait.until(ExpectedConditions.visibilityOf(element)); - executeScript(String.format("arguments[0].style.border='3px %s'", color), - element); - Thread.sleep(highlightInterval); - executeScript("arguments[0].style.border=''", element); - } catch (InterruptedException e) { - // System.err.println("Exception (ignored): " + e.toString()); - } - } - - @AfterMethod - public void afterMethod() { - - driver.get("about:blank"); - if (driver != null) { - try { - driver.close(); - driver.quit(); - } catch (Exception e) { - } - } - - } -} diff --git a/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java b/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java deleted file mode 100644 index ffb3be9c5..000000000 --- a/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java +++ /dev/null @@ -1,169 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.net.MalformedURLException; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.ie.InternetExplorerDriver; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -public class InternetExplorerMultiThreadTest { - - @SuppressWarnings("unused") - private String title = null; - @SuppressWarnings("unused") - private String text = ""; - @SuppressWarnings("unused") - private static final int timeout = 1000; - @SuppressWarnings("unused") - private String result = null; - @SuppressWarnings("unused") - private AutoItX instance = null; - @SuppressWarnings("unused") - private static final boolean debug = true; - - public WebDriver driver; - public WebDriverWait wait; - public Actions actions; - public JavascriptExecutor js; - public TakesScreenshot screenshot; - @SuppressWarnings("unused") - private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; - private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; - @SuppressWarnings("unused") - private String originalHandle; - @SuppressWarnings("unused") - private StringBuffer verificationErrors = new StringBuffer(); - - @BeforeMethod - public void beforeMethod() throws Exception { - } - - @Test(enabled = true) - public void multiThreadTest() { - try { - App.main(new String[] { "dummy" }); - } catch (InterruptedException | MalformedURLException e) { - System.err.println("Exception (ignored) " + e.toString()); - } - } - - private static class App implements Runnable { - private String title = null; - private String text = ""; - @SuppressWarnings("unused") - private static final int timeout = 1000; - private String result = null; - private AutoItX instance = null; - private static final boolean debug = true; - public static WebDriver driver; - @SuppressWarnings("unused") - private static Set windowHandles; - Thread thread; - - App() throws InterruptedException { - thread = new Thread(this, "test"); - thread.start(); - } - - @SuppressWarnings("unused") - public void run() { - String currentHandle = null; - - try { - System.err.println("Thread: sleep 3 sec."); - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.err.println("Thread: wake."); - // With modal window, WebDriver appears to be hanging on [get current - // window handle] - instance = AutoItX.getInstance(); - - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - System.err.println( - String.format("The active window title is \"%s\"", windowTitle)); - sleep(100); - instance.Send("{DOWN}", true); // arrow key down - sleep(100); - instance.Send("{ENTER}", true); - sleep(10000); - result = instance.WinGetText(title, text); - // NOTE: Mozilla Firefox Download Manager dialog button does not return - // any - // text of interest - assertThat(result, notNullValue()); - System.err.println(String.format("The result is \"%s\"", result)); - // Downloaded file will be found in the default location, that is - } - - @SuppressWarnings("deprecation") - public static void main(String args[]) - throws InterruptedException, MalformedURLException { - - System.setProperty("webdriver.ie.driver", - "c:/java/selenium/IEDriverServer.exe"); - // Started InternetExplorerDriver server (32-bit) 2.42.0.0 - DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); - capabilities.setCapability( - InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, - true); - driver = new InternetExplorerDriver(capabilities); - // org.openqa.selenium.WebDriverException: java.net.SocketException: - // Software caused connection abort: recv failed - // https://stackoverflow.com/questions/21330079/i-o-exception-and-unable-to-find-element-in-ie-using-selenium-webdriver/21373224 - // possibly caused by incorrect IE security settings or the lagging - // iedriverserver.exe - // installing 3.14.0 (32 bit) from https://www.seleniumhq.org/download/ - // resolves the issue - // For IE Internet zones see https://github.com/allquixotic/iepmm (NOTE: - // cryptic) - - driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); - // launch second thread to monitor download dialog option - new App(); - WebDriverWait wait = new WebDriverWait(driver, 5); - wait.pollingEvery(500, TimeUnit.MILLISECONDS); - Actions actions = new Actions(driver); - - System.err.println("Navigating to: " + directURL); - driver.navigate().to(directURL); - - System.err.println("main: sleeping 10 sec"); - - Thread.sleep(10000); - System.err.println("main: closing the browser window"); - driver.close(); - System.err.println("main: quitting the browser"); - driver.quit(); - } - - public void sleep(Integer milliSeconds) { - try { - if (debug) { - System.err.println("Sleeping " + milliSeconds + " milliseconds."); - } - Thread.sleep((long) milliSeconds); - } catch ( - - InterruptedException e) { - e.printStackTrace(); - } - } - - } - -} \ No newline at end of file diff --git a/jna_autoit/src/test/java/example/InternetExplorerTest.java b/jna_autoit/src/test/java/example/InternetExplorerTest.java deleted file mode 100644 index 3586defb7..000000000 --- a/jna_autoit/src/test/java/example/InternetExplorerTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package example; - -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.util.concurrent.TimeUnit; - -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.ie.InternetExplorerDriver; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -public class InternetExplorerTest { - - private String title = null; - private String text = ""; - private static final int timeout = 1000; - private String result = null; - private AutoItX instance = null; - private static final boolean debug = true; - - public WebDriver driver; - public WebDriverWait wait; - public Actions actions; - public JavascriptExecutor js; - public TakesScreenshot screenshot; - @SuppressWarnings("unused") - private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; - private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; - private String originalHandle; - @SuppressWarnings("unused") - private StringBuffer verificationErrors = new StringBuffer(); - - @SuppressWarnings("deprecation") - @BeforeMethod - public void beforeMethod() throws Exception { - instance = AutoItX.getInstance(); - System.setProperty("webdriver.ie.driver", - "c:/java/selenium/IEDriverServer.exe"); - // Started InternetExplorerDriver server (32-bit) 2.42.0.0 - DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); - capabilities.setCapability( - InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, - true); - driver = new InternetExplorerDriver(capabilities); - // org.openqa.selenium.WebDriverException: java.net.SocketException: - // Software caused connection abort: recv failed - // https://stackoverflow.com/questions/21330079/i-o-exception-and-unable-to-find-element-in-ie-using-selenium-webdriver/21373224 - // possibly caused by incorrect IE security settings or the lagging - // iedriverserver.exe - // installing 3.14.0 (32 bit) from https://www.seleniumhq.org/download/ - // resolves the issue - // For IE Internet zones see https://github.com/allquixotic/iepmm (NOTE: - // cryptic) - - originalHandle = driver.getWindowHandle(); - System.err.println("The current window handle " + originalHandle); - - driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); - } - - @Test(enabled = false) - public void testDirectDownload() { - // System.err.println("Getting: " + directURL); - // driver.get(directURL); - System.err.println("Navigating to: " + directURL); - driver.navigate().to(directURL); - // IE and Java surefire hangs here: - // Windows Internet Explorer - // "What do you want to do with zip_9MB.zip" - - // is a modal dialog. - sleep(timeout); - title = "[ACTIVE]"; - String windowTitle = instance.WinGetTitle(title, text); - assertThat(windowTitle, notNullValue()); - System.err.println( - String.format("The active window title is \"%s\"", windowTitle)); - sleep(100); - instance.Send("{DOWN}", true); // arrow key down - sleep(100); - instance.Send("{ENTER}", true); - sleep(10000); - result = instance.WinGetText(title, text); - // NOTE: Mozilla Firefox Download Manager dialog button does not return any - // text of interest - assertThat(result, notNullValue()); - System.err.println(String.format("The result is \"%s\"", result)); - // Downloaded file will be found in the default location, that is - - } - - @AfterMethod - public void afterMethod() { - - if (debug) { - System.err.println("navigating to blank page"); - } - driver.get("about:blank"); - if (driver != null) { - try { - if (debug) { - System.err.println("closing the browser window " + originalHandle); - } - driver.close(); - if (debug) { - System.err.println("quitting the browser " + originalHandle); - } - driver.quit(); - } catch (Exception e) { - System.err.println("Exception (ignored)" + e.toString()); - } - } - } - - public void sleep(Integer milliSeconds) { - try { - if (debug) { - System.err.println("Sleeping " + milliSeconds + " milliseconds."); - } - Thread.sleep((long) milliSeconds); - } catch ( - - InterruptedException e) { - e.printStackTrace(); - } - - } -} diff --git a/jna_autoit/src/test/java/example/Utils.java b/jna_autoit/src/test/java/example/Utils.java deleted file mode 100644 index 61e1c0907..000000000 --- a/jna_autoit/src/test/java/example/Utils.java +++ /dev/null @@ -1,40 +0,0 @@ -package example; - -import java.net.*; -import org.openqa.selenium.WebDriver; -import java.io.*; - -// origin: https://gist.github.com/daluu/4411221 -public class Utils { - - // for download completion and validation readiness - public static String downloadFileDirect(String url, String filenamePrefix, - String fileExtension, WebDriver driver) throws Exception { - // request setup... - URLConnection request = null; - request = new URL(url).openConnection(); - // extract session cookie from browser and use with HTTP request calls - final String sessionCookie = "PHPSESSID"; - request.setRequestProperty("Cookie", String.format("%s=%s", sessionCookie, - driver.manage().getCookieNamed(sessionCookie).getValue())); - // other headers as needed... - // handle the download file request and return temp file path - // optionally check for HTTP status code 200 - InputStream in = request.getInputStream(); - File downloadedFile = File.createTempFile(filenamePrefix, fileExtension); - FileOutputStream out = new FileOutputStream(downloadedFile); - byte[] buffer = new byte[1024]; - int len = in.read(buffer); - while (len != -1) { - out.write(buffer, 0, len); - len = in.read(buffer); - if (Thread.interrupted()) { - throw new InterruptedException(); - } - } - in.close(); - out.close(); - return downloadedFile.getAbsolutePath(); - } - -} diff --git a/jna_pdh/README.md b/jna_pdh/README.md deleted file mode 100644 index 01140d17d..000000000 --- a/jna_pdh/README.md +++ /dev/null @@ -1,113 +0,0 @@ -### Info - -this directory contains -a derivative of the `PDHTest.java` [test class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/PdhTest.java) -and its dependencies - * `AbstractPlatformTestSupport` [class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/AbstractPlatformTestSupport.java) - * `AbstractWin32TestSupport` [class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/AbstractWin32TestSupport.java) - - from -[jna](https://github.com/java-native-access/jna) contribution project. - -Note, that since the code above is part of the test, it is not included in the `jna-platform.jar` released to [Maven Central](https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform) (the `Pdh.java` is ) - -The test is -focusing on collecting the Windows specific __Performance Counters__ metrics, -for example the `System\Processor Queue Length` or `Processor\0\% Processor Time` where the notation is: - - -token | description | comment ---- | --- | --- -`Processor` | category | -`% Processor Time`| counter | -`0` | Instance | blank for *single instance* counters - -The code was modeled after the native C app implementation found in [host-sflow](https://github.com/sflow/host-sflow): -```c -uint64_t readFormattedCounter(char* path) -{ - PDH_HQUERY Query = NULL; - PDH_HCOUNTER Counter; - DWORD dwType; - PDH_FMT_COUNTERVALUE Value; - LONGLONG ret = 0; - - if(PdhOpenQuery(NULL, 0, &Query) == ERROR_SUCCESS) { - if(PdhAddCounter(Query, path, 0, &Counter) == ERROR_SUCCESS && - PdhCollectQueryData(Query) == ERROR_SUCCESS && - PdhGetFormattedCounterValue(Counter, PDH_FMT_LARGE, &dwType, &Value) == ERROR_SUCCESS) { - ret = Value.largeValue; - } - if (Query) PdhCloseQuery(Query); - } - return (uint64_t)ret; -} - - -``` -the test copied from existing JNA PDH tests: -```java - - @Test - public void testProcessorQueueLength() { - PDH_COUNTER_PATH_ELEMENTS elems = new PDH_COUNTER_PATH_ELEMENTS(); - - elems.szObjectName = "System"; - elems.szInstanceName = null; - elems.szCounterName = "Processor Queue Length"; - String counterName = makeCounterPath(pdh, elems); - - HANDLEByReference ref = new HANDLEByReference(); - assertErrorSuccess("PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), true); - - HANDLE hQuery = ref.getValue(); - try { - ref.setValue(null); - assertErrorSuccess("PdhAddEnglishCounter", - pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), true); - - HANDLE hCounter = ref.getValue(); - try { - assertErrorSuccess("PdhCollectQueryData", - pdh.PdhCollectQueryData(hQuery), true); - - DWORDByReference lpdwType = new DWORDByReference(); - PDH_RAW_COUNTER rawCounter = new PDH_RAW_COUNTER(); - assertErrorSuccess("PdhGetRawCounterValue", - pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), true); - assertEquals("Counter data status", WinError.ERROR_SUCCESS, - rawCounter.CStatus); - showRawCounterData(System.out, counterName, rawCounter); - } finally { - assertErrorSuccess("PdhRemoveCounter", pdh.PdhRemoveCounter(hCounter), - true); - } - } finally { - assertErrorSuccess("PdhCloseQuery", pdh.PdhCloseQuery(hQuery), true); - } - } - -``` -### Usage - -The easiest way to see a non-zero value of the Processor Queue is to run the test in the underpowered VM. - -```sh -mvn test -``` -```text -[INFO] Running com.sun.jna.platform.win32.PdhTest -``` -```text -\System\Processor Queue Length Thu Mar 03 08:50:27 PST 2022 1st=14 2nd=0 multi=1 -``` -### See Also - * [Performance Counters](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-portal) - + [About Performance Counters](https://learn.microsoft.com/en-us/windows/win32/perfctrs/about-performance-counters) - + [Using Performance Counters](https://learn.microsoft.com/en-us/windows/win32/perfctrs/using-performance-counters) - + [Performance Counters Reference](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-reference) - + [Performance Counter functions](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-functions) - + [performance Counters XML Schema](https://learn.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-schema) - -### Author -[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/jna_pdh/pom.xml b/jna_pdh/pom.xml deleted file mode 100644 index 74696c327..000000000 --- a/jna_pdh/pom.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - 4.0.0 - com.sun.jna.platform - jna_pdh - 0.5.0-SNAPSHOT - jar - ${project.groupId}:${project.artifactId} - jna pdh test - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - ${encoding} - ${encoding} - 1.10 - 4.2 - 1.3 - 2.7 - 3.3.1 - 30.0-jre - 1.3 - 1.8 - 5.4.0 - 4.13.1 - 2.17.1 - 1.7.5 - 3.6.1 - 2.20 - 3.0.2 - 3.2.0 - 3.1.1 - 3.0.2 - 1.8 - - - - org.apache.logging.log4j - log4j-core - ${log4j-core.version} - - - org.apache.logging.log4j - log4j-api - ${log4j-core.version} - - - org.slf4j - slf4j-api - ${slf4j.version} - - - org.slf4j - slf4j-log4j12 - ${slf4j.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - - - - net.java.dev.jna - jna-platform - ${jna-platform.version} - - - com.google.guava - guava - ${guava.version} - - - commons-configuration - commons-configuration - ${commons-configuration.version} - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - junit - junit - ${junit.version} - - - - src/main/java - src/test/java - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - ${encoding} - -Xlint:all - true - true - - - - - org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} - - ${project.groupId}.${project.artifactId} - false - - jar-with-dependencies - - - - ${project.groupId}.${mainClass} - - - - - - make-assembly - package - - single - - - - - - org.apache.maven.plugins - maven-dependency-plugin - ${maven-dependency-plugin.version} - - - copy-dependencies - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - ${project.groupId}.${mainClass} - true - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - ${project.build.sourceEncoding} - -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp - - - - - - - diff --git a/jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java b/jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java deleted file mode 100644 index b2b45272c..000000000 --- a/jna_pdh/src/test/java/com/sun/jna/platform/AbstractPlatformTestSupport.java +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2007 Timothy Wall, All Rights Reserved - * - * The contents of this file is dual-licensed under 2 - * alternative Open Source/Free licenses: LGPL 2.1 or later and - * Apache License 2.0. (starting with JNA version 4.0.0). - * - * You can freely decide which license you want to apply to - * the project. - * - * You may obtain a copy of the LGPL License at: - * - * http://www.gnu.org/licenses/licenses.html - * - * A copy is also included in the downloadable source code package - * containing JNA, in file "LGPL2.1". - * - * You may obtain a copy of the Apache License at: - * - * http://www.apache.org/licenses/ - * - * A copy is also included in the downloadable source code package - * containing JNA, in file "AL2.0". - */ -package com.sun.jna.platform; - -import org.junit.Assert; -import org.junit.Rule; -import org.junit.rules.TestName; -/** - * @author lgoldstein - */ -public abstract class AbstractPlatformTestSupport extends Assert { - @Rule public final TestName TEST_NAME_HOLDER=new TestName(); - - protected AbstractPlatformTestSupport() { - super(); - } - - public final String getCurrentTestName() { - return TEST_NAME_HOLDER.getMethodName(); - } -} diff --git a/jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java b/jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java deleted file mode 100644 index b7401ac1c..000000000 --- a/jna_pdh/src/test/java/com/sun/jna/platform/win32/AbstractWin32TestSupport.java +++ /dev/null @@ -1,210 +0,0 @@ -/* Copyright (c) 2007 Timothy Wall, All Rights Reserved - * - * The contents of this file is dual-licensed under 2 - * alternative Open Source/Free licenses: LGPL 2.1 or later and - * Apache License 2.0. (starting with JNA version 4.0.0). - * - * You can freely decide which license you want to apply to - * the project. - * - * You may obtain a copy of the LGPL License at: - * - * http://www.gnu.org/licenses/licenses.html - * - * A copy is also included in the downloadable source code package - * containing JNA, in file "LGPL2.1". - * - * You may obtain a copy of the Apache License at: - * - * http://www.apache.org/licenses/ - * - * A copy is also included in the downloadable source code package - * containing JNA, in file "AL2.0". - */ -package com.sun.jna.platform.win32; - -import com.sun.jna.Native; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import com.sun.jna.platform.AbstractPlatformTestSupport; -import static com.sun.jna.platform.win32.Tlhelp32.TH32CS_SNAPALL; -import com.sun.jna.platform.win32.WinDef.LCID; -import com.sun.jna.platform.win32.WinNT.HANDLE; -import java.util.Arrays; -import java.util.Collections; - - -public abstract class AbstractWin32TestSupport extends AbstractPlatformTestSupport { - protected AbstractWin32TestSupport() { - super(); - } - - /** - * Makes sure that the method names (which represent APIs) do not repeat - * themselves. This check is in order where APIs are WIN32 API - * functions since these are C functions - which means no overloading - * is possible. - * - * @param ifc - * The interface (not checked) class to test - * @see #detectDuplicateMethods(Class) - */ - public static final void assertNoDuplicateMethodsNames(Class ifc) { - Collection dupSet = detectDuplicateMethods(ifc); - assertTrue("Duplicate names found in " + ifc.getSimpleName() + ": " + dupSet, dupSet.isEmpty()); - } - - /** - * Checks if there are methods with the same name - regardless of the - * signature - * - * @param ifc - * The interface (not checked) class to test - * @return The {@link Set} of duplicate names - empty if no duplicates - */ - public static final Set detectDuplicateMethods(Class ifc) { - Method[] methods = ifc.getMethods(); - Set nameSet = new HashSet(methods.length); - Set dupSet = new HashSet(); - for (Method m : methods) { - String name = m.getName(); - if (!nameSet.add(name)) { - dupSet.add(name); - } - } - - return dupSet; - } - - /** - * Checks if the API call result is {@code true}. If not, then calls - * {@link Kernel32#GetLastError()} and fails with the error code. - * Note: if the error code is {@link WinError#ERROR_SUCCESS} then an - * "unknown reason code" is reported - * - * @param message - * Message to display if call failed - * @param result - * The API call result - */ - public static final void assertCallSucceeded(String message, boolean result) { - if (result) { - return; - } - - int hr = Kernel32.INSTANCE.GetLastError(); - if (hr == WinError.ERROR_SUCCESS) { - fail(message + " failed with unknown reason code"); - } else { - fail(message + " failed: hr=" + hr + " - 0x" + Integer.toHexString(hr)); - } - } - - /** - * Checks if the status code is ERROR_SUCCESS - * - * @param message - * Message to display if code is an error - * @param statusCode - * Status code to check - * @param showHex - * If status code is not error success then show it as HEX - */ - public static final void assertErrorSuccess(String message, int statusCode, boolean showHex) { - if (showHex) { - if (statusCode != WinError.ERROR_SUCCESS) { - fail(message + " - failed - hr=0x" + Integer.toHexString(statusCode)); - } - } else { - assertEquals(message, WinError.ERROR_SUCCESS, statusCode); - } - } - - /** - * Makes sure that the handle argument is not {@code null} or - * {@link WinBase#INVALID_HANDLE_VALUE}. If invalid handle detected, then it - * invokes {@link Kernel32#GetLastError()} in order to display the error - * code - * - * @param message - * Message to display if bad handle - * @param handle - * The {@link HANDLE} to test - * @return The same as the input handle if good handle - otherwise does not - * return and throws an assertion error - */ - public static final HANDLE assertValidHandle(String message, HANDLE handle) { - if ((handle == null) || WinBase.INVALID_HANDLE_VALUE.equals(handle)) { - int hr = Kernel32.INSTANCE.GetLastError(); - if (hr == WinError.ERROR_SUCCESS) { - fail(message + " failed with unknown reason code"); - } else { - fail(message + " failed: hr=" + hr + " - 0x" + Integer.toHexString(hr)); - } - } - - return handle; - } - - public static final LCID systemLCID = Kernel32.INSTANCE.GetSystemDefaultLCID(); - public static final boolean isEnglishLocale = systemLCID.intValue() == 0x409 // en_US - || systemLCID.intValue() == 0x809 // en_GB - ; - - public static void killProcessByName(String filename) { - HANDLE hSnapShot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(TH32CS_SNAPALL, null); - Tlhelp32.PROCESSENTRY32 process = new Tlhelp32.PROCESSENTRY32(); - boolean hRes = Kernel32.INSTANCE.Process32First(hSnapShot, process); - while (hRes) { - String imageName = Native.toString(process.szExeFile); - if (imageName.equalsIgnoreCase(filename)) { - HANDLE hProcess = Kernel32.INSTANCE.OpenProcess(Kernel32.PROCESS_TERMINATE, false, - process.th32ProcessID.intValue()); - if (hProcess != null) { - Kernel32.INSTANCE.TerminateProcess(hProcess, 9); - Kernel32.INSTANCE.CloseHandle(hProcess); - } - } - hRes = Kernel32.INSTANCE.Process32Next(hSnapShot, process); - } - Kernel32.INSTANCE.CloseHandle(hSnapShot); - } - - /** - * Return true if the supplied uuid can be found in the registry. - * - * @param uuid - * Format: {<UID>} - */ - public static boolean checkCOMRegistered(String uuid) { - WinReg.HKEYByReference phkKey = null; - try { - phkKey = Advapi32Util.registryGetKey(WinReg.HKEY_CLASSES_ROOT, "Interface\\" + uuid, WinNT.KEY_READ); - if (phkKey != null) { - return true; - } - } catch (Win32Exception ex) { - // Ok - failed ... - } finally { - if (phkKey != null && phkKey.getValue() != null) { - Advapi32Util.registryCloseKey(phkKey.getValue()); - } - } - try { - phkKey = Advapi32Util.registryGetKey(WinReg.HKEY_CLASSES_ROOT, "CLSID\\" + uuid, WinNT.KEY_READ); - if (phkKey != null) { - return true; - } - } catch (Win32Exception ex) { - // Ok - failed ... - } finally { - if (phkKey != null && phkKey.getValue() != null) { - Advapi32Util.registryCloseKey(phkKey.getValue()); - } - } - return false; - } -} diff --git a/jna_pdh/src/test/java/example/ProcessorQueueLengthTest.java b/jna_pdh/src/test/java/example/ProcessorQueueLengthTest.java deleted file mode 100644 index 13c7a6d67..000000000 --- a/jna_pdh/src/test/java/example/ProcessorQueueLengthTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package example; -/** - * Copyright 2022,2024 Serguei Kouzmine - */ - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.greaterThan; - -import java.io.PrintStream; - -import org.junit.Test; - -import com.sun.jna.Native; -import com.sun.jna.platform.win32.Pdh; -import com.sun.jna.platform.win32.Pdh.PDH_COUNTER_PATH_ELEMENTS; -import com.sun.jna.platform.win32.Pdh.PDH_RAW_COUNTER; -import com.sun.jna.platform.win32.PdhMsg; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.DWORDByReference; -import com.sun.jna.platform.win32.WinError; -import com.sun.jna.platform.win32.WinNT.HANDLE; -import com.sun.jna.platform.win32.WinNT.HANDLEByReference; -import com.sun.jna.platform.win32.AbstractWin32TestSupport; - -@SuppressWarnings({ "deprecation", "unused" }) -public class ProcessorQueueLengthTest extends AbstractWin32TestSupport { - private static final Pdh pdh = Pdh.INSTANCE; - - private static void showRawCounterData(PrintStream out, String counterName, PDH_RAW_COUNTER rawCounter) { - out.append('\t').append(counterName).append(" ").append(String.valueOf(rawCounter.TimeStamp.toDate())) - .append(" 1st=").append(String.valueOf(rawCounter.FirstValue)).append(" 2nd=") - .append(String.valueOf(rawCounter.SecondValue)).append(" multi=") - .append(String.valueOf(rawCounter.MultiCount)).println(); - } - - private static String makeCounterPath(Pdh pdh, PDH_COUNTER_PATH_ELEMENTS pathElements) { - DWORDByReference pcchBufferSize = new DWORDByReference(); - int status = pdh.PdhMakeCounterPath(pathElements, null, pcchBufferSize, 0); - assertThat("Unexpected status code: 0x" + Integer.toHexString(status), status, is(PdhMsg.PDH_MORE_DATA)); - - DWORD bufSize = pcchBufferSize.getValue(); - int numChars = bufSize.intValue(); - assertThat("Bad required buffer size: " + numChars, numChars, greaterThan(0)); - - char[] szFullPathBuffer = new char[numChars + 1 /* the \0 */]; - pcchBufferSize.setValue(new DWORD(szFullPathBuffer.length)); - assertThat("Error in PdhMakeCounterPath", - pdh.PdhMakeCounterPath(pathElements, szFullPathBuffer, pcchBufferSize, 0), is(WinError.ERROR_SUCCESS)); - return Native.toString(szFullPathBuffer); - } - - @Test - public void test() { - PDH_COUNTER_PATH_ELEMENTS elems = new PDH_COUNTER_PATH_ELEMENTS(); - - elems.szObjectName = "System"; - elems.szInstanceName = null; - elems.szCounterName = "Processor Queue Length"; - String counterName = makeCounterPath(pdh, elems); - - HANDLEByReference ref = new HANDLEByReference(); - assertThat("Error in PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), is(WinError.ERROR_SUCCESS)); - - HANDLE hQuery = ref.getValue(); - try { - ref.setValue(null); - assertThat("Error in PdhAddEnglishCounter", pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), - is(WinError.ERROR_SUCCESS)); - - HANDLE hCounter = ref.getValue(); - try { - - assertThat("Error in PdhCollectQueryData call", pdh.PdhCollectQueryData(hQuery), - is(WinError.ERROR_SUCCESS)); - DWORDByReference lpdwType = new DWORDByReference(); - PDH_RAW_COUNTER rawCounter = new PDH_RAW_COUNTER(); - assertThat("Error in PdhGetRawCounterValue", pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), - is(WinError.ERROR_SUCCESS)); - assertThat("unexected Counter data status", rawCounter.CStatus, is(WinError.ERROR_SUCCESS)); - showRawCounterData(System.out, counterName, rawCounter); - } finally { - assertThat("Error in PdhRemoveCounter", pdh.PdhRemoveCounter(hCounter), is(WinError.ERROR_SUCCESS)); - } - } finally { - assertThat("Error in PdhCloseQuery", pdh.PdhCloseQuery(hQuery), is(WinError.ERROR_SUCCESS)); - } - } -} diff --git a/jna_versioninfo/README.md b/jna_versioninfo/README.md deleted file mode 100644 index eac1fb189..000000000 --- a/jna_versioninfo/README.md +++ /dev/null @@ -1,87 +0,0 @@ -### Info -this directory contains -a fragment of the `PDHTest.java` [test class](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/PdhTest.java) from -[jna](https://github.com/java-native-access/jna) project focusing on collecting the `System\Processor Queue Length` performance metric - -The code was modeled after the native app implementation found in [host-sflow](https://github.com/sflow/host-sflow): -```c -uint64_t readFormattedCounter(char* path) -{ - PDH_HQUERY Query = NULL; - PDH_HCOUNTER Counter; - DWORD dwType; - PDH_FMT_COUNTERVALUE Value; - LONGLONG ret = 0; - - if(PdhOpenQuery(NULL, 0, &Query) == ERROR_SUCCESS) { - if(PdhAddCounter(Query, path, 0, &Counter) == ERROR_SUCCESS && - PdhCollectQueryData(Query) == ERROR_SUCCESS && - PdhGetFormattedCounterValue(Counter, PDH_FMT_LARGE, &dwType, &Value) == ERROR_SUCCESS) { - ret = Value.largeValue; - } - if (Query) PdhCloseQuery(Query); - } - return (uint64_t)ret; -} - - -``` -the test copied from existing JNA PDH tests: -```java - - @Test - public void testProcessorQueueLength() { - PDH_COUNTER_PATH_ELEMENTS elems = new PDH_COUNTER_PATH_ELEMENTS(); - - elems.szObjectName = "System"; - elems.szInstanceName = null; - elems.szCounterName = "Processor Queue Length"; - String counterName = makeCounterPath(pdh, elems); - - HANDLEByReference ref = new HANDLEByReference(); - assertErrorSuccess("PdhOpenQuery", pdh.PdhOpenQuery(null, null, ref), true); - - HANDLE hQuery = ref.getValue(); - try { - ref.setValue(null); - assertErrorSuccess("PdhAddEnglishCounter", - pdh.PdhAddEnglishCounter(hQuery, counterName, null, ref), true); - - HANDLE hCounter = ref.getValue(); - try { - assertErrorSuccess("PdhCollectQueryData", - pdh.PdhCollectQueryData(hQuery), true); - - DWORDByReference lpdwType = new DWORDByReference(); - PDH_RAW_COUNTER rawCounter = new PDH_RAW_COUNTER(); - assertErrorSuccess("PdhGetRawCounterValue", - pdh.PdhGetRawCounterValue(hCounter, lpdwType, rawCounter), true); - assertEquals("Counter data status", WinError.ERROR_SUCCESS, - rawCounter.CStatus); - showRawCounterData(System.out, counterName, rawCounter); - } finally { - assertErrorSuccess("PdhRemoveCounter", pdh.PdhRemoveCounter(hCounter), - true); - } - } finally { - assertErrorSuccess("PdhCloseQuery", pdh.PdhCloseQuery(hQuery), true); - } - } - -``` -### Usage - -The easiest way to see a non-zero value of the Processor Queue is to run the test in the underpowered VM. - -```sh -mvn test -``` -```text -[INFO] Running com.sun.jna.platform.win32.PdhTest -``` -```text -\System\Processor Queue Length Thu Mar 03 08:50:27 PST 2022 1st=14 2nd=0 multi=1 -``` - -### Author -[Serguei Kouzmine](kouzmine_serguei@yahoo.com) diff --git a/jna_versioninfo/pom.xml b/jna_versioninfo/pom.xml deleted file mode 100644 index e1e4200e1..000000000 --- a/jna_versioninfo/pom.xml +++ /dev/null @@ -1,305 +0,0 @@ - - - 4.0.0 - com.sun.jna.platform - jna_versioninfo - 0.1.0-SNAPSHOT - jar - ${project.groupId}:${project.artifactId} - jna version info test - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - 1.10 - 4.2 - 1.3 - 2.7 - 3.3.1 - 30.0-jre - 1.3 - 1.8 - 5.4.0 - 4.13.1 - 2.17.1 - 1.7.5 - 3.6.1 - 2.20 - 3.0.2 - 3.2.0 - 3.1.1 - 3.0.2 - 1.8 - - - - org.apache.logging.log4j - log4j-core - ${log4j-core.version} - - - org.apache.logging.log4j - log4j-api - ${log4j-core.version} - - - org.slf4j - slf4j-api - ${slf4j.version} - - - org.slf4j - slf4j-log4j12 - ${slf4j.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - - - - net.java.dev.jna - jna-platform - ${jna-platform.version} - - - com.google.guava - guava - ${guava.version} - - - commons-configuration - commons-configuration - ${commons-configuration.version} - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - junit - junit - ${junit.version} - - - - src/main/java - src/test/java - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - utf-8 - -Xlint:all - true - true - - - - - org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} - - SWTsample - false - - jar-with-dependencies - - - - ${project.groupId}.${mainClass} - - - - - - make-assembly - package - - single - - - - - - org.apache.maven.plugins - maven-dependency-plugin - ${maven-dependency-plugin.version} - - - copy-dependencies - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - ${project.groupId}.${mainClass} - true - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - ${project.build.sourceEncoding} - -Dfile.encoding=${project.build.sourceEncoding} -DAPP_LOG_ROOT=c:/temp - - - - - - - - - - - - windows 8.1 - - - windows - Windows 8.1 - - - - win32 - - - - - diff --git a/jna_versioninfo/src/test/java/example/VersionHelpers.java b/jna_versioninfo/src/test/java/example/VersionHelpers.java deleted file mode 100644 index 20b4dd9c3..000000000 --- a/jna_versioninfo/src/test/java/example/VersionHelpers.java +++ /dev/null @@ -1,158 +0,0 @@ -package example; - -import com.sun.jna.platform.win32.Kernel32; -import com.sun.jna.platform.win32.WinNT; -import com.sun.jna.platform.win32.WinDef.DWORD; -import com.sun.jna.platform.win32.WinDef.WORD; -import com.sun.jna.platform.win32.WinNT.OSVERSIONINFOEX; - -// origin: https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/VersionHelpers.java -// NOTE: the origin code is not published anywhere -public class VersionHelpers { - - public static boolean IsWindowsVersionOrGreater(int wMajorVersion, - int wMinorVersion, int wServicePackMajor) { - OSVERSIONINFOEX osvi = new OSVERSIONINFOEX(); - osvi.dwOSVersionInfoSize = new DWORD(osvi.size()); - osvi.dwMajorVersion = new DWORD(wMajorVersion); - osvi.dwMinorVersion = new DWORD(wMinorVersion); - osvi.wServicePackMajor = new WORD(wServicePackMajor); - - long dwlConditionMask = 0; - dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(dwlConditionMask, - WinNT.VER_MAJORVERSION, (byte) WinNT.VER_GREATER_EQUAL); - dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(dwlConditionMask, - WinNT.VER_MINORVERSION, (byte) WinNT.VER_GREATER_EQUAL); - dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(dwlConditionMask, - WinNT.VER_SERVICEPACKMAJOR, (byte) WinNT.VER_GREATER_EQUAL); - - return Kernel32.INSTANCE.VerifyVersionInfoW(osvi, WinNT.VER_MAJORVERSION - | WinNT.VER_MINORVERSION | WinNT.VER_SERVICEPACKMAJOR, - dwlConditionMask); - } - - public static boolean IsWindowsXPOrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), - (byte) Kernel32.WIN32_WINNT_WINXP, 0); - } - - public static boolean IsWindowsXPSP1OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), - (byte) Kernel32.WIN32_WINNT_WINXP, 1); - } - - public static boolean IsWindowsXPSP2OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), - (byte) Kernel32.WIN32_WINNT_WINXP, 2); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows XP with Service Pack 3 (SP3) version. - */ - public static boolean IsWindowsXPSP3OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WINXP >>> 8), - (byte) Kernel32.WIN32_WINNT_WINXP, 3); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows Vista version. - */ - public static boolean IsWindowsVistaOrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_VISTA >>> 8), - (byte) Kernel32.WIN32_WINNT_VISTA, 0); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows Vista with Service Pack 1 (SP1) version. - */ - public static boolean IsWindowsVistaSP1OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_VISTA >>> 8), - (byte) Kernel32.WIN32_WINNT_VISTA, 1); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows Vista with Service Pack 2 (SP2) version. - */ - public static boolean IsWindowsVistaSP2OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_VISTA >>> 8), - (byte) Kernel32.WIN32_WINNT_VISTA, 2); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows 7 version. - */ - public static boolean IsWindows7OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN7 >>> 8), - (byte) Kernel32.WIN32_WINNT_WIN7, 0); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows 7 with Service Pack 1 (SP1) version. - */ - public static boolean IsWindows7SP1OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN7 >>> 8), - (byte) Kernel32.WIN32_WINNT_WIN7, 1); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows 8 version. - */ - public static boolean IsWindows8OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN8 >>> 8), - (byte) Kernel32.WIN32_WINNT_WIN8, 0); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows 8.1 version. For Windows 8.1 and/or Windows 10, - * {@link #IsWindows8Point1OrGreater} returns false unless the - * application contains a manifest that includes a compatibility - * section that contains the GUIDs that designate Windows 8.1 and/or - * Windows 10. - */ - public static boolean IsWindows8Point1OrGreater() { - return IsWindowsVersionOrGreater( - (byte) (Kernel32.WIN32_WINNT_WINBLUE >>> 8), - (byte) Kernel32.WIN32_WINNT_WINBLUE, 0); - } - - /** - * @return true if the current OS version matches, or is greater than, the - * Windows 10 version. For Windows 10, - * {@link #IsWindows8Point1OrGreater} returns false unless the - * application contains a manifest that includes a compatibility - * section that contains the GUID that designates Windows 10. - */ - public static boolean IsWindows10OrGreater() { - return IsWindowsVersionOrGreater((byte) (Kernel32.WIN32_WINNT_WIN10 >>> 8), - (byte) Kernel32.WIN32_WINNT_WIN10, 0); - } - - /** - * Applications that need to distinguish between server and client versions - * of Windows should call this function. - * - * @return true if the current OS is a Windows Server release. - */ - public static boolean IsWindowsServer() { - // This should properly be OSVERSIONINFOEXW which is not defined in JNA. - // The OSVERSIONINFOEX structure in JNA is the (W) Unicode-compliant - // version. - OSVERSIONINFOEX osvi = new OSVERSIONINFOEX(); - osvi.dwOSVersionInfoSize = new DWORD(osvi.size()); - osvi.wProductType = WinNT.VER_NT_WORKSTATION; - - long dwlConditionMask = Kernel32.INSTANCE.VerSetConditionMask(0, - WinNT.VER_PRODUCT_TYPE, (byte) WinNT.VER_EQUAL); - - return !Kernel32.INSTANCE.VerifyVersionInfoW(osvi, WinNT.VER_PRODUCT_TYPE, - dwlConditionMask); - } -} diff --git a/jna_versioninfo/src/test/java/example/VersionHelpersTest.java b/jna_versioninfo/src/test/java/example/VersionHelpersTest.java deleted file mode 100644 index 2d5acfbaf..000000000 --- a/jna_versioninfo/src/test/java/example/VersionHelpersTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package example; -/** - * Copyright 2023 Serguei Kouzmine - */ - -import org.junit.Ignore; -import org.junit.Test; - -import com.sun.jna.platform.win32.VersionHelpers; - -import java.io.*; -import java.util.Properties; - -@SuppressWarnings({ "deprecation", "unused" }) -public class VersionHelpersTest { - - @Test - public void test1() { - System.err.println("status: " + VersionHelpers.IsWindows8Point1OrGreater()); - } - // origin: - // https://stackoverflow.com/questions/6109679/how-to-check-windows-edition-in-java - // msinfo32.exe /report %temp%/sysinfo.txt - // systeminfo.exe /fo list - // NOTE: both msinfo32.exe and systeminfo.exe run for a very long time and - // produce excessive inventory - // there appears no way to limit to summary: - // msinfo32.exe /nfo mysummary.nfo /categories +systemsummary /report - // %temp%/sysinfo1.txt - // especially for running tasks and loaded modules and error reporting - - @Ignore - @Test - public void test2() { - Runtime rt; - Process pr; - BufferedReader in; - String line = ""; - String sysInfo = ""; - String edition = ""; - String fullOSName = ""; - final String SEARCH_TERM = "OS Name:"; - final String[] EDITIONS = { "Basic", "Home", "Professional", "Enterprise" }; - - try { - rt = Runtime.getRuntime(); - pr = rt.exec("SYSTEMINFO"); - in = new BufferedReader(new InputStreamReader(pr.getInputStream())); - - // add all the lines into a variable - while ((line = in.readLine()) != null) { - if (line.contains(SEARCH_TERM)) // found the OS you are using - { - // extract the full os name - fullOSName = line.substring( - line.lastIndexOf(SEARCH_TERM) + SEARCH_TERM.length(), - line.length() - 1); - break; - } - } - - // extract the edition of windows you are using - for (String s : EDITIONS) { - if (fullOSName.trim().contains(s)) { - edition = s; - } - } - System.err - .println("status: " + VersionHelpers.IsWindows8Point1OrGreater()); - System.out.println("The edition of Windows you are using is " + edition); - - } catch (IOException ioe) { - System.err.println(ioe.getMessage()); - } - - } - - @Test - public void test3() { - - Properties properties = System.getProperties(); - System.err.println("System.Properties: " + properties.get("os.name") + " " - + "version: " + properties.get("os.version")); - } -} From 79548a18e499e218b22f7a8c287159b9759dae9b Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 7 Aug 2024 04:42:13 +0200 Subject: [PATCH 111/171] intermediate revision - make the $REMOTE_DIR directory if not exists --- utils/connect.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/utils/connect.sh b/utils/connect.sh index e50ce9b1f..18ebeb51e 100755 --- a/utils/connect.sh +++ b/utils/connect.sh @@ -1,18 +1,20 @@ #!/bin/bash # origin: https://serverfault.com/questions/167416/how-can-i-automatically-change-directory-on-ssh-login # see also https://serverfault.com/questions/499565/change-default-directory-when-i-ssh-to-server +# NOTE: `whoami` in Windows in git bash can be different from the user name on Linux box +DEFAULT_HOST='192.168.0.64' +DEFAULT_USER='sergueik' # about customizing ~/.ssh/authorized_keys and ~/.ssh/config env | grep -q 'OS=' if [ $? = 0 ] ; then - PROJECTS_DIR='/c/developer/sergueik' + PROJECTS_DIR="/c/developer/${DEFAULT_USER}" else PROJECTS_DIR="${HOME}/src" fi TARGET_PROJECTS_DIR='src' PROJECT_DIR=$(pwd | sed "s|^${PROJECTS_DIR}/||") # current directory with swapped base dir -# NOTE: `whoami` in Windows in git bash can be different from -REMOTE_HOST=${1:-192.168.0.64} -REMOTE_USER=${2:-sergueik} - -ssh -t $REMOTE_USER@${REMOTE_HOST} "cd ~/$TARGET_PROJECTS_DIR/$PROJECT_DIR; exec \$SHELL --login" +REMOTE_HOST=${1:-$DEFAULT_HOST} +REMOTE_USER=${2:-$DEFAULT_USER} +REMOTE_DIR="${TARGET_PROJECTS_DIR}/${PROJECT_DIR}" +ssh -t $REMOTE_USER@${REMOTE_HOST} "test -d ~/$REMOTE_DIR || mkdir ~/$REMOTE_DIR; cd ~/$REMOTE_DIR; exec \$SHELL --login" From a8a588815160938078933e23eeea0066391c915f Mon Sep 17 00:00:00 2001 From: Serguei Kozumine Date: Mon, 2 Jun 2025 21:33:42 -0400 Subject: [PATCH 112/171] added tool wrapper --- utils/yt-dlp-caller.cmd | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 utils/yt-dlp-caller.cmd diff --git a/utils/yt-dlp-caller.cmd b/utils/yt-dlp-caller.cmd new file mode 100644 index 000000000..bde0ff27a --- /dev/null +++ b/utils/yt-dlp-caller.cmd @@ -0,0 +1,37 @@ +@echo OFF +goto :EOF +REM I will have to do it along with job search. +REM I had to resign WF AI Vertex because they ceased to +REM onboard me technicallty +REM The system cannot find the batch label specified - EOF +REM +REM https://github.com/getffmpeg/ffmpeg/releases/download/v7.1/ffmpeg-setup.exe +put + Directory of C:\Users\kouzm\AppData\Local\Programs\FFmpeg\bin + +06/02/2025 01:44 PM

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 literal 0 HcmV?d00001 diff --git a/jna_autoit/src/test/java/example/EnvironmentTest.java b/jna_autoit/src/test/java/example/EnvironmentTest.java new file mode 100644 index 000000000..69b4a5e30 --- /dev/null +++ b/jna_autoit/src/test/java/example/EnvironmentTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2018-2019 midorlo, sergueik + * + * Licensed 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. + */ +package example; + +import java.util.Arrays; +import java.util.List; + +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * @author midorlo + * @author sergueik + */ +public class EnvironmentTest { + + /** + * Tests Plattform. This will fail on non-windows, + * and also on windows xp and older (chosen voluntarily). + */ + @Test(enabled = true) + public void testEnvironment() { + System.err.println("OS test is Running: " + System.getProperty("os.name")); + String result = System.getProperty("os.name"); + + List osNames = Arrays.asList("Windows 10", "Windows 8", + "Windows 8.1", "Windows 7", "Windows Server 2012 R2"); + Assert.assertTrue(osNames.contains(result)); + // see also: + // https://www.programcreek.com/java-api-examples/index.php?api=org.hamcrest.core.AnyOf + // NOTE: anyOf(containsString(expResult1),...) does not work with testng ? + } + +} diff --git a/jna_autoit/src/test/java/example/FirefoxTest.java b/jna_autoit/src/test/java/example/FirefoxTest.java new file mode 100644 index 000000000..365f47366 --- /dev/null +++ b/jna_autoit/src/test/java/example/FirefoxTest.java @@ -0,0 +1,245 @@ +package example; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.logging.LogType; +import org.openqa.selenium.logging.LoggingPreferences; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.sun.jna.Pointer; +import com.sun.jna.WString; +import com.sun.jna.platform.win32.User32; +import com.sun.jna.platform.win32.WinDef.HWND; + +public class FirefoxTest { + + private String title = null; + private String text = ""; + private String result = null; + private AutoItX instance = null; + private static final boolean debug = true; + + // for Selenium part of the test + public int scriptTimeout = 5; + public int flexibleWait = 60; // too long + public int implicitWait = 1; + public int pollingInterval = 500; + @SuppressWarnings("unused") + private static long highlightInterval = 100; + public WebDriver driver; + public WebDriverWait wait; + public Actions actions; + public JavascriptExecutor js; + public TakesScreenshot screenshot; + + private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; + private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; + // see also: + // private final static String baseURL = + // "http://spreadsheetpage.com/index.php/file/C35/P10/" + // private final static String xpath = + // String.format"//*[@id='content']//a[contains(text(), '%s')]", "xls"); + private final static String locator = "table#table-files a.btn"; + private static final int timeout = 2000; + private static String fileType = "zip"; + private final static String xpath = String.format( + "//table[@id='table-files']//a[contains(@class,'btn')][contains(text(), '%s')]", + fileType.toUpperCase()); + private static List elements; + private static WebElement element; + private static String osName = getOSName(); + + @SuppressWarnings("deprecation") + @BeforeMethod + public void beforeMethod() throws IOException { + instance = AutoItX.getInstance(); + + System.setProperty("webdriver.gecko.driver", osName.equals("windows") + ? new File("c:/java/selenium/geckodriver.exe").getAbsolutePath() + : /* String.format("%s/Downloads/geckodriver", System.getenv("HOME"))*/ + Paths.get(System.getProperty("user.home")).resolve("Downloads") + .resolve("geckodriver").toAbsolutePath().toString()); + System.setProperty("webdriver.firefox.bin", + osName.equals("windows") + // TODO: detect architecture + ? new File("c:/Program Files/Mozilla Firefox/firefox.exe") + .getAbsolutePath() + : "/usr/bin/firefox"); + // https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + FirefoxProfile profile = new FirefoxProfile(); + capabilities.setCapability("marionette", false); + capabilities.setCapability(FirefoxDriver.PROFILE, profile); + try { + driver = new FirefoxDriver(capabilities); + } catch (WebDriverException e) { + e.printStackTrace(); + throw new RuntimeException( + "Cannot initialize Firefox driver: " + e.toString()); + } + + assertThat(driver, notNullValue()); + actions = new Actions(driver); + + driver.manage().timeouts().setScriptTimeout(scriptTimeout, + TimeUnit.SECONDS); + wait = new WebDriverWait(driver, flexibleWait); + + wait.pollingEvery(Duration.ofMillis(pollingInterval)); + + screenshot = ((TakesScreenshot) driver); + js = ((JavascriptExecutor) driver); + + } + + // using arrow and tab keys to select "Download" + // https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm + @Test(enabled = true) + public void testDirectURLDownoadManagerDialog() { + driver.navigate().to(directURL); + sleep(timeout); + title = "[ACTIVE]"; + String windowTitle = instance.WinGetTitle(title, text); + assertThat(windowTitle, notNullValue()); + System.err.println( + String.format("The active window title is \"%s\"", windowTitle)); + sleep(100); + instance.Send("{DOWN}", true); // arrow key down + sleep(100); + instance.Send("{TAB}", true); + sleep(100); + instance.Send("{TAB}", true); + sleep(100); + instance.Send("{TAB}", true); + sleep(100); + instance.Send("{ENTER}", true); + sleep(10000); + result = instance.WinGetText(title, text); + // NOTE: Mozilla Firefox Download Manager dialog button does not return any + // text of interest + assertThat(result, notNullValue()); + System.err.println(String.format("The result is \"%s\"", result)); + // Downloaded file will be found in the default location, that is + // configurable through Mozilla Firefox profile e.g. + // $env:USERPROFILE:/Downloads + sleep(1000); + + } + + @Test(enabled = false) + public void testButtonClickDownoadManagerDialog() { + driver.navigate().to(baseURL); + elements = driver.findElements(By.cssSelector(locator)); + // inventory + elements.stream().map(e -> e.getText()).forEach(System.err::println); + elements.stream().forEach(button -> { + actions.moveToElement(button).build().perform(); + highlight(button, 500); + }); + // click on a mime type in question + element = driver.findElement(By.xpath(xpath)); + assertThat(element, notNullValue()); + element.click(); + sleep(timeout); + } + + // Utilities + private static String getOSName() { + if (osName == null) { + osName = System.getProperty("os.name").toLowerCase(); + if (osName.startsWith("windows")) { + osName = "windows"; + } + } + return osName; + } + + public void sleep(Integer milliSeconds) { + try { + Thread.sleep((long) milliSeconds); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public Object executeScript(String script, Object... arguments) { + if (driver instanceof JavascriptExecutor) { + JavascriptExecutor javascriptExecutor = JavascriptExecutor.class + .cast(driver); + return javascriptExecutor.executeScript(script, arguments); + } else { + throw new RuntimeException("Script execution failed."); + } + } + + public void highlight(WebElement element) { + highlight(element, 100, "solid yellow"); + } + + public void highlight(WebElement element, long highlightInterval) { + highlight(element, highlightInterval, "solid yellow"); + + } + + public void highlight(WebElement element, long highlightInterval, + String color) { + System.err.println("Color: " + color); + if (wait == null) { + wait = new WebDriverWait(driver, flexibleWait); + } + wait.pollingEvery(Duration.ofMillis(pollingInterval)); + try { + // wait.until(ExpectedConditions.visibilityOf(element)); + executeScript(String.format("arguments[0].style.border='3px %s'", color), + element); + Thread.sleep(highlightInterval); + executeScript("arguments[0].style.border=''", element); + } catch (InterruptedException e) { + // System.err.println("Exception (ignored): " + e.toString()); + } + } + + @AfterMethod + public void afterMethod() { + + driver.get("about:blank"); + if (driver != null) { + try { + driver.close(); + driver.quit(); + } catch (Exception e) { + } + } + + } +} diff --git a/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java b/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java new file mode 100644 index 000000000..ffb3be9c5 --- /dev/null +++ b/jna_autoit/src/test/java/example/InternetExplorerMultiThreadTest.java @@ -0,0 +1,169 @@ +package example; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.net.MalformedURLException; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class InternetExplorerMultiThreadTest { + + @SuppressWarnings("unused") + private String title = null; + @SuppressWarnings("unused") + private String text = ""; + @SuppressWarnings("unused") + private static final int timeout = 1000; + @SuppressWarnings("unused") + private String result = null; + @SuppressWarnings("unused") + private AutoItX instance = null; + @SuppressWarnings("unused") + private static final boolean debug = true; + + public WebDriver driver; + public WebDriverWait wait; + public Actions actions; + public JavascriptExecutor js; + public TakesScreenshot screenshot; + @SuppressWarnings("unused") + private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; + private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; + @SuppressWarnings("unused") + private String originalHandle; + @SuppressWarnings("unused") + private StringBuffer verificationErrors = new StringBuffer(); + + @BeforeMethod + public void beforeMethod() throws Exception { + } + + @Test(enabled = true) + public void multiThreadTest() { + try { + App.main(new String[] { "dummy" }); + } catch (InterruptedException | MalformedURLException e) { + System.err.println("Exception (ignored) " + e.toString()); + } + } + + private static class App implements Runnable { + private String title = null; + private String text = ""; + @SuppressWarnings("unused") + private static final int timeout = 1000; + private String result = null; + private AutoItX instance = null; + private static final boolean debug = true; + public static WebDriver driver; + @SuppressWarnings("unused") + private static Set windowHandles; + Thread thread; + + App() throws InterruptedException { + thread = new Thread(this, "test"); + thread.start(); + } + + @SuppressWarnings("unused") + public void run() { + String currentHandle = null; + + try { + System.err.println("Thread: sleep 3 sec."); + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.err.println("Thread: wake."); + // With modal window, WebDriver appears to be hanging on [get current + // window handle] + instance = AutoItX.getInstance(); + + title = "[ACTIVE]"; + String windowTitle = instance.WinGetTitle(title, text); + assertThat(windowTitle, notNullValue()); + System.err.println( + String.format("The active window title is \"%s\"", windowTitle)); + sleep(100); + instance.Send("{DOWN}", true); // arrow key down + sleep(100); + instance.Send("{ENTER}", true); + sleep(10000); + result = instance.WinGetText(title, text); + // NOTE: Mozilla Firefox Download Manager dialog button does not return + // any + // text of interest + assertThat(result, notNullValue()); + System.err.println(String.format("The result is \"%s\"", result)); + // Downloaded file will be found in the default location, that is + } + + @SuppressWarnings("deprecation") + public static void main(String args[]) + throws InterruptedException, MalformedURLException { + + System.setProperty("webdriver.ie.driver", + "c:/java/selenium/IEDriverServer.exe"); + // Started InternetExplorerDriver server (32-bit) 2.42.0.0 + DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); + capabilities.setCapability( + InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, + true); + driver = new InternetExplorerDriver(capabilities); + // org.openqa.selenium.WebDriverException: java.net.SocketException: + // Software caused connection abort: recv failed + // https://stackoverflow.com/questions/21330079/i-o-exception-and-unable-to-find-element-in-ie-using-selenium-webdriver/21373224 + // possibly caused by incorrect IE security settings or the lagging + // iedriverserver.exe + // installing 3.14.0 (32 bit) from https://www.seleniumhq.org/download/ + // resolves the issue + // For IE Internet zones see https://github.com/allquixotic/iepmm (NOTE: + // cryptic) + + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + // launch second thread to monitor download dialog option + new App(); + WebDriverWait wait = new WebDriverWait(driver, 5); + wait.pollingEvery(500, TimeUnit.MILLISECONDS); + Actions actions = new Actions(driver); + + System.err.println("Navigating to: " + directURL); + driver.navigate().to(directURL); + + System.err.println("main: sleeping 10 sec"); + + Thread.sleep(10000); + System.err.println("main: closing the browser window"); + driver.close(); + System.err.println("main: quitting the browser"); + driver.quit(); + } + + public void sleep(Integer milliSeconds) { + try { + if (debug) { + System.err.println("Sleeping " + milliSeconds + " milliseconds."); + } + Thread.sleep((long) milliSeconds); + } catch ( + + InterruptedException e) { + e.printStackTrace(); + } + } + + } + +} \ No newline at end of file diff --git a/jna_autoit/src/test/java/example/InternetExplorerTest.java b/jna_autoit/src/test/java/example/InternetExplorerTest.java new file mode 100644 index 000000000..3586defb7 --- /dev/null +++ b/jna_autoit/src/test/java/example/InternetExplorerTest.java @@ -0,0 +1,134 @@ +package example; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class InternetExplorerTest { + + private String title = null; + private String text = ""; + private static final int timeout = 1000; + private String result = null; + private AutoItX instance = null; + private static final boolean debug = true; + + public WebDriver driver; + public WebDriverWait wait; + public Actions actions; + public JavascriptExecutor js; + public TakesScreenshot screenshot; + @SuppressWarnings("unused") + private final static String baseURL = "https://file-examples.com/index.php/text-files-and-archives-download/"; + private final static String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip"; + private String originalHandle; + @SuppressWarnings("unused") + private StringBuffer verificationErrors = new StringBuffer(); + + @SuppressWarnings("deprecation") + @BeforeMethod + public void beforeMethod() throws Exception { + instance = AutoItX.getInstance(); + System.setProperty("webdriver.ie.driver", + "c:/java/selenium/IEDriverServer.exe"); + // Started InternetExplorerDriver server (32-bit) 2.42.0.0 + DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); + capabilities.setCapability( + InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, + true); + driver = new InternetExplorerDriver(capabilities); + // org.openqa.selenium.WebDriverException: java.net.SocketException: + // Software caused connection abort: recv failed + // https://stackoverflow.com/questions/21330079/i-o-exception-and-unable-to-find-element-in-ie-using-selenium-webdriver/21373224 + // possibly caused by incorrect IE security settings or the lagging + // iedriverserver.exe + // installing 3.14.0 (32 bit) from https://www.seleniumhq.org/download/ + // resolves the issue + // For IE Internet zones see https://github.com/allquixotic/iepmm (NOTE: + // cryptic) + + originalHandle = driver.getWindowHandle(); + System.err.println("The current window handle " + originalHandle); + + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test(enabled = false) + public void testDirectDownload() { + // System.err.println("Getting: " + directURL); + // driver.get(directURL); + System.err.println("Navigating to: " + directURL); + driver.navigate().to(directURL); + // IE and Java surefire hangs here: + // Windows Internet Explorer + // "What do you want to do with zip_9MB.zip" - + // is a modal dialog. + sleep(timeout); + title = "[ACTIVE]"; + String windowTitle = instance.WinGetTitle(title, text); + assertThat(windowTitle, notNullValue()); + System.err.println( + String.format("The active window title is \"%s\"", windowTitle)); + sleep(100); + instance.Send("{DOWN}", true); // arrow key down + sleep(100); + instance.Send("{ENTER}", true); + sleep(10000); + result = instance.WinGetText(title, text); + // NOTE: Mozilla Firefox Download Manager dialog button does not return any + // text of interest + assertThat(result, notNullValue()); + System.err.println(String.format("The result is \"%s\"", result)); + // Downloaded file will be found in the default location, that is + + } + + @AfterMethod + public void afterMethod() { + + if (debug) { + System.err.println("navigating to blank page"); + } + driver.get("about:blank"); + if (driver != null) { + try { + if (debug) { + System.err.println("closing the browser window " + originalHandle); + } + driver.close(); + if (debug) { + System.err.println("quitting the browser " + originalHandle); + } + driver.quit(); + } catch (Exception e) { + System.err.println("Exception (ignored)" + e.toString()); + } + } + } + + public void sleep(Integer milliSeconds) { + try { + if (debug) { + System.err.println("Sleeping " + milliSeconds + " milliseconds."); + } + Thread.sleep((long) milliSeconds); + } catch ( + + InterruptedException e) { + e.printStackTrace(); + } + + } +} diff --git a/jna_autoit/src/test/java/example/Utils.java b/jna_autoit/src/test/java/example/Utils.java new file mode 100644 index 000000000..61e1c0907 --- /dev/null +++ b/jna_autoit/src/test/java/example/Utils.java @@ -0,0 +1,40 @@ +package example; + +import java.net.*; +import org.openqa.selenium.WebDriver; +import java.io.*; + +// origin: https://gist.github.com/daluu/4411221 +public class Utils { + + // for download completion and validation readiness + public static String downloadFileDirect(String url, String filenamePrefix, + String fileExtension, WebDriver driver) throws Exception { + // request setup... + URLConnection request = null; + request = new URL(url).openConnection(); + // extract session cookie from browser and use with HTTP request calls + final String sessionCookie = "PHPSESSID"; + request.setRequestProperty("Cookie", String.format("%s=%s", sessionCookie, + driver.manage().getCookieNamed(sessionCookie).getValue())); + // other headers as needed... + // handle the download file request and return temp file path + // optionally check for HTTP status code 200 + InputStream in = request.getInputStream(); + File downloadedFile = File.createTempFile(filenamePrefix, fileExtension); + FileOutputStream out = new FileOutputStream(downloadedFile); + byte[] buffer = new byte[1024]; + int len = in.read(buffer); + while (len != -1) { + out.write(buffer, 0, len); + len = in.read(buffer); + if (Thread.interrupted()) { + throw new InterruptedException(); + } + } + in.close(); + out.close(); + return downloadedFile.getAbsolutePath(); + } + +} From 35343037b3cb43d09264815f8ca1c5ebcd2b6a08 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Thu, 21 Sep 2023 21:53:02 -0400 Subject: [PATCH 041/171] intermediate revision - fixed typo in the launcher for Linux / JDK11, cosmetic changes in Windows launcher glob mask and added same for Linux / JDK8 --- javafx-markdown/test-jdk11.cmd | 4 ++-- javafx-markdown/test-jdk11.sh | 2 +- javafx-markdown/test.cmd | 6 +++--- javafx-markdown/test.sh | 4 ++++ 4 files changed, 10 insertions(+), 6 deletions(-) create mode 100755 javafx-markdown/test.sh diff --git a/javafx-markdown/test-jdk11.cmd b/javafx-markdown/test-jdk11.cmd index 903aa04de..d036d456b 100644 --- a/javafx-markdown/test-jdk11.cmd +++ b/javafx-markdown/test-jdk11.cmd @@ -1,5 +1,5 @@ @echo OFF -REM do not name this script run.cmd +REM avoid naming this script "run.cmd" where.exe mvn.cmd 2>NUL 1>NUL if errorlevel 1 goto :SKIP @@ -13,7 +13,7 @@ echo done :SKIP echo Launching with classpath ^+ modulepath semantics -java -Dprism.order=sw -cp target\example.javafx_markdown.jar;target\lib\* ^ +java -Dprism.order=sw -cp target\example.javafx_markdown.jar;target\lib\*.* ^ --module-path target/lib ^ --add-modules=javafx.base,javafx.graphics,javafx.controls ^ example.Example diff --git a/javafx-markdown/test-jdk11.sh b/javafx-markdown/test-jdk11.sh index 2951ff375..4ebe49ebb 100755 --- a/javafx-markdown/test-jdk11.sh +++ b/javafx-markdown/test-jdk11.sh @@ -2,7 +2,7 @@ mvn -f ./pom-java11.xml clean package echo 'Launching with classpath + modulepath semantics' -java -Dprism.order=sw -cp target/example.javafx_markdown.jar:target/lib.* \ +java -Dprism.order=sw -cp target/example.javafx_markdown.jar:target/lib/* \ --module-path target/lib \ --add-modules=javafx.controls,javafx.base,javafx.graphics,commons.configuration \ example.Example diff --git a/javafx-markdown/test.cmd b/javafx-markdown/test.cmd index 16e651c67..77d8a6acd 100644 --- a/javafx-markdown/test.cmd +++ b/javafx-markdown/test.cmd @@ -1,13 +1,13 @@ @echo OFF -REM Does not work with JDK 11 +REM NOTE: this scropt does not work with JDK 11 set JAVA_HOME=c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64 call c:\java\init.cmd -REM do not name this script run.cmd where.exe mvn.cmd 2>NUL 1>NUL +REM avoid naming this script "run.cmd" if errorlevel 1 goto :SKIP call mvn package echo done :SKIP -java -cp target\example.javafx_markdown.jar;target\lib\* example.Example +java -cp target\example.javafx_markdown.jar;target\lib\*.* example.Example REM java -jar target\example.javafx_markdown.jar diff --git a/javafx-markdown/test.sh b/javafx-markdown/test.sh new file mode 100755 index 000000000..798876408 --- /dev/null +++ b/javafx-markdown/test.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +mvn -f ./pom.xml clean package +java -cp target/example.javafx_markdown.jar:target/lib/* example.Example From bfbd874a11569ac1dfb594b7372b50c0f4b4544b Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 24 Sep 2023 11:08:21 -0400 Subject: [PATCH 042/171] initial snapshot --- utils/generate_convert.vbs | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 utils/generate_convert.vbs diff --git a/utils/generate_convert.vbs b/utils/generate_convert.vbs new file mode 100644 index 000000000..440c2f987 --- /dev/null +++ b/utils/generate_convert.vbs @@ -0,0 +1,55 @@ +' origin: https://www.cyberforum.ru/vbscript-wsh/thread2794648.html +Option Explicit +Const iExt = "mp4" +Const oExt = "mkv" +Const List = "filelist.txt" +Dim oWSH, oShA, oWMI, oFSO, SINK, PID, TF, c,_ +oPids, oList, Str, oFolder, oItems, F, iName, fName + +Set oWSH = CreateObject("WScript.Shell") +Set oShA = CreateObject("Shell.Application") +Set oWMI = GetObject("winmgmts:\root\CIMV2") +Set oFSO = CreateObject("Scripting.FileSystemObject") +Set SINK = WSH.CreateObject("WbemScripting.SWbemSink", "SINK_") +With oWMI.Get("Win32_Process.Handle='" & oWSH.Exec("rundll32 kernel32,Sleep").ProcessId & "'") + PID = .ParentProcessID: .Terminate +End With +oWMI.ExecNotificationQueryAsync SINK, "SELECT * FROM __InstanceCreationEvent " &_ +"WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name='ffmpeg.exe'" + +TF = oFSO.GetSpecialFolder(2) & "\2PIDs.tmp": Del +Set oList = oFSO.OpenTextFile(List) +Do: Str = oList.ReadLine + If Str <> Empty Then + If oFSO.FolderExists(Str) Then + ' https://learn.microsoft.com/en-us/windows/win32/shell/shell-namespace + Set oItems = oShA.NameSpace(Str).Items + ' https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/ne-shobjidl_core-_shcontf + ' SHCONTF_NONFOLDERS + ' SHCONTF_FASTITEMS + oItems.Filter 8256, "*." & iExt + For Each F In oItems + iName = oFSO.GetBaseName(F): fName = iName & "." & oExt + While oFSO.FileExists(oFSO.BuildPath(Str, fName)) + c = c + 1: fName = iName & "_" & c & "." & oExt + Wend + If oWSH.Run("C:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe -loglevel -8 -i """ & F.Path & """ -c:a copy -c:v libx264 " &_ + "-qmin 0 """ & oFSO.BuildPath(Str, fName) & """", 0, 1) = 0 Then oFSO.DeleteFile F.Path, 1 + Next + End If + End If +Loop Until oList.AtEndOfStream: oList.Close +' NOTE: not used +If IsObject(oPids) Then oPids.Close :End If: Del +Set oList = Nothing: Set oFSO = Nothing: Set oShA = Nothing: Set oWSH = Nothing +MsgBox "Done!", 4160, " Conversion *." & iExt & " into *." & oExt & " " + +Sub Del + If oFSO.FileExists(TF) Then oFSO.DeleteFile TF, 1 +End Sub + +Sub SINK_OnObjectReady(oEvent, oAsyncContext) + If oEvent.TargetInstance.ParentProcessId = PID Then + With oFSO.CreateTextFile(TF, 1) .Write PID & " " & oEvent.TargetInstance.Handle: .Close: End With + End If +End Sub From 9bb95ca183b77db9c413d4e5f0bfc09872ba13a9 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 25 Sep 2023 01:16:49 +0200 Subject: [PATCH 043/171] intermediate revision - added utility --- utils/get_size.cmd | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 utils/get_size.cmd diff --git a/utils/get_size.cmd b/utils/get_size.cmd new file mode 100644 index 000000000..9beba9251 --- /dev/null +++ b/utils/get_size.cmd @@ -0,0 +1,65 @@ +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION + +if "!DEBUG!"=="" ( set DEBUG=false +) else ( + set DEBUG=true +) +set NAME=%1 +if "!NAME!"=="" echo Usage: %0 [NAME] && exit /b 0 +set EXT=%2 +if "!EXT!"=="" set EXT=mp4 +if /I "!DEBUG!"=="true" 1>&2 echo EXT=!EXT! +set FLAG=%3 +if "!FLAG!"=="" goto :BEGIN +if /I "!DEBUG!"=="true" 1>&2 echo FLAG=%FLAG% +:BEGIN +REM Determine the video dimensions for conversion of high-res mp4 to lower res mkv, directly + +REM dir /b/s *.!EXT! + +PATH=%PATH%;C:\tools\ffmpeg-4.0.2-win64-static\bin + +REM C:\tools\ffmpeg-4.0.2-win64-static\bin\ffprobe.exe +REM C:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe +set /A URL_COUNT=100 +set /A RANDOM_INDEX=%RANDOM% +set /A RANDOM_INDEX=!RANDOM_INDEX! %% !URL_COUNT! +set /A RANDOM_INDEX=!RANDOM_INDEX! + 1 + +set TMPFILE=%TEMP%\a!RANDOM_INDEX!.txt +if /I "!DEBUG!"=="true" 1>&2 echo TMPFILE=%TMPFILE% +for /F "tokens=*" %%. in ('dir /b/s !NAME!.!EXT!') do ( + >!TMPFILE! ffprobe.exe -select_streams v -show_streams "%%." 2>&1 +) +if /I "!DEBUG!"=="true" ( +1>&2 findstr.exe "\&2 findstr.exe "\&2 echo SIZE=!SIZE! +) +1>&2 echo SIZE=!SIZE! +del /q %TMPFILE% +set SIZES="1024x768:svga 1024x576:hd480 1920x1080:qhd 800x600:spal 1278x718:qhd 1280x720:qhd 1280x800:852x532" +set SIZES=!SIZES:"=! +if /I "!DEBUG!"=="true" ( +1>&2 echo !SIZES! +) +for %%. in ( !SIZES! ) do ( +for /F "tokens=1,2 delims=:" %%s in ('echo %%.') do ( +if /I "!SIZE!" == "%%s" set NEWSIZE=%%t +) +) +echo !NEWSIZE! +REM +REM Usage: +REM for /F %%. in ('call get_size.cmd !NAME! !EXT!' ) do set NEWSIZE=%%. +REM echo %NEWSIZE% From 74b5b2cc50881ef54fc8af621d03d1794bbcb2f2 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 25 Sep 2023 01:21:16 +0200 Subject: [PATCH 044/171] initil snnapshot, updated to working release of TagLibSharp.dll --- utils/add_art_mp3.ps1 | 74 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 utils/add_art_mp3.ps1 diff --git a/utils/add_art_mp3.ps1 b/utils/add_art_mp3.ps1 new file mode 100644 index 000000000..eb42dcff5 --- /dev/null +++ b/utils/add_art_mp3.ps1 @@ -0,0 +1,74 @@ +param( + [string] $collection = '.', + [string] $image = 'folder.png', + [switch]$debug + ) +# based on: https://stuart-moore.com/using-powershell-add-images-mp3-files/ +# see also: https://github.com/yevster/AlbumArtist/tree/master/src/AlbumArtist +# NOTE: inherited from powershell_selenium +[string]$shared_assemblies_path = 'c:\java\selenium\csharp\sharedassemblies' +# Flat directory seems a better choice for Selenium dlls +# than a subfolder-heavy C:\Windows\System32\WindowsPowerShell\v1.0\Modules +# or ${env:LOCALAPPDATA}\Microsoft\Windows\PowerShell +# the ${env:USERPROFILE}\Downloads is popular alternative +[string[]]$shared_assemblies = @( + 'taglibsharp.dll', + 'WebDriver.Support.dll', + 'nunit.core.dll', + 'Newtonsoft.Json.dll', + 'nunit.framework.dll' + ) + +# SHARED_ASSEMBLIES_PATH environment overrides parameter, for Team City/Jenkinks +if (($env:SHARED_ASSEMBLIES_PATH -ne $null) -and ($env:SHARED_ASSEMBLIES_PATH -ne '')) { + $shared_assemblies_path = $env:SHARED_ASSEMBLIES_PATH +} + +# write-debug "load_shared_assemblies -shared_assemblies_path ${shared_assemblies_path} -shared_assemblies ${shared_assemblies}" + # start-sleep -milliseconds 1000 +pushd $shared_assemblies_path + + $shared_assemblies | ForEach-Object { + $filepath = $_ + if ($host.Version.Major -gt 2) { + Unblock-File -Path $filepath + } + write-debug $_ + [Reflection.Assembly]::LoadFrom( (Resolve-Path $filepath) ) + Add-Type -Path $filepath + } + popd +Add-Type -TypeDefinition @" + +using System; +using TagLib; + + public class ExceptionTest + { + public static void Test (String filepath) + { + try { + File file = File.Create (filepath); + } catch (CorruptFileException e) { + Console.WriteLine ("That file is corrupt: {0}", e.ToString ()); + } catch (Exception e) { + Console.WriteLine ("Exception: {0}", e.ToString ()); + } + } + } + +"@ -ReferencedAssemblies 'System.dll', ($shared_assemblies_path +'\'+ 'taglibsharp.dll') +foreach ($file in get-childitem -path $collection -filter *.mp3 -recurse){ + # [ExceptionTest]::Test($file.FullName) + $mp = [TagLib.File]::Create($file.FullName.ToString()) + # With TagLibSharp 2.3.0 observing + # Exception calling "Create" with "1" argument(s): "Method not found: 'System.String System.String.Format(System.IFormatProvider, System.String, System.Object, System.Object)'." + if (test-path ($file.Directoryname + '\' + $image)){ + $pic = [taglib.picture]::createfrompath($file.Directoryname + '\' + $image ) + } + + $mp.tag.Pictures = $pic + $mp.save() + write-output ($file.BaseName + '.' + $file.Extension + ' updated' ) +} + From 18a8938cb9fed538d189f77f825f308fb67de747 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 8 Oct 2023 02:42:36 +0200 Subject: [PATCH 045/171] fixed typo in the java command - the mask "*.*" should not be used --- javafx-markdown/test.cmd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/javafx-markdown/test.cmd b/javafx-markdown/test.cmd index 77d8a6acd..67b4792f0 100644 --- a/javafx-markdown/test.cmd +++ b/javafx-markdown/test.cmd @@ -9,5 +9,7 @@ if errorlevel 1 goto :SKIP call mvn package echo done :SKIP -java -cp target\example.javafx_markdown.jar;target\lib\*.* example.Example +REM the *.* mask should not be used here +java -cp target\example.javafx_markdown.jar;target\lib\* example.Example REM java -jar target\example.javafx_markdown.jar + From 9a57d0a6d6f380190b0769b45cc447575c17b966 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 20 Oct 2023 00:44:41 +0200 Subject: [PATCH 046/171] bumped to the latest Selenium compatible with Windows 7 and Windowws 8.1 version --- protractor/pom.xml | 729 +++++++++++++++++++++++---------------------- 1 file changed, 371 insertions(+), 358 deletions(-) diff --git a/protractor/pom.xml b/protractor/pom.xml index 9e3b8ffba..21d5b4d03 100644 --- a/protractor/pom.xml +++ b/protractor/pom.xml @@ -1,358 +1,371 @@ - - - 4.0.0 - com.github.sergueik.jprotractor - jprotractor - 2.1-SNAPSHOT - jar - ${project.groupId}:${project.artifactId} - jProtractor is a port of Angular Protractor functionality to Java. - https://github.com/sergueik/jprotractor - - - Carlos Alexandro Becker - caarlos0@gmail.com - - https://github.com/caarlos0 - - - Serguei Kouzmine - kouzmine_serguei@yahoo.com - - https://github.com/sergueik - - - - UTF-8 - UTF-8 - 1.3 - 2.7 - 3.0.1 - 4.2 - 1.10 - 1.3 - 2.0.4 - 1.8 - 4.13.1 - 1.8 - 1.8 - 3.6.1 - 2.20 - 1.4.2 - - 3.13.0 - - 4.5.3 - ${selenium.version} - ${selenium.version} - ${selenium.version} - ${selenium.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - org.apache.commons - commons-exec - ${commons-exec.version} - - - commons-configuration - commons-configuration - ${commons-configuration.version} - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - org.exparity - hamcrest-date - ${hamcrest-date.version} - - - org.hamcrest - hamcrest-all - ${hamcrest-all.version} - - - com.jcabi - jcabi-matchers - 1.3 - test - - - junit - junit - ${junit.version} - test - - - org.seleniumhq.selenium - selenium-api - ${selenium.version} - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-devtools-v105 - - - org.seleniumhq.selenium - selenium-devtools-v104 - - - org.seleniumhq.selenium - selenium-devtools-v103 - - - org.seleniumhq.selenium - selenium-devtools-v102 - - - org.seleniumhq.selenium - selenium-devtools-v101 - - - org.seleniumhq.selenium - selenium-devtools-v100 - - - org.seleniumhq.selenium - selenium-devtools-v99 - - - org.seleniumhq.selenium - selenium-devtools-v97 - - - org.seleniumhq.selenium - selenium-devtools-v96 - - - org.seleniumhq.selenium - selenium-devtools-v95 - - - org.seleniumhq.selenium - selenium-devtools-v85 - - - - - org.seleniumhq.selenium - selenium-devtools-v106 - ${selenium-devtools-v106.version} - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium-firefox-driver.version} - - - org.seleniumhq.selenium - selenium-chrome-driver - ${selenium-chrome-driver.version} - - - org.seleniumhq.selenium - selenium-ie-driver - ${selenium-ie-driver.version} - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - - - com.codeborne - phantomjsdriver - ${phantomjsdriver.version} - - - org.seleniumhq.selenium - selenium-remote-driver - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - compile - - - ${java.version} - ${java.version} - utf-8 - -Xlint:all - true - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - true - - false - - - - unit-tests - test - - test - - - - false - - - **/*Test.java - - - - **/*IntegrationTest.java - - - - - integration-tests - integration-test - - test - - - - false - - - **/*IntegrationTest.java - - - - - - - - - maven-source-plugin - 3.0.0 - - - - jar - - - - - - maven-jar-plugin - 2.6 - - - - ${main.class} - - - - - - - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - + + + 4.0.0 + com.github.sergueik.jprotractor + jprotractor + 2.2-SNAPSHOT + jar + ${project.groupId}:${project.artifactId} + jProtractor is a port of Angular Protractor functionality to Java. + https://github.com/sergueik/jprotractor + + + Carlos Alexandro Becker + caarlos0@gmail.com + + https://github.com/caarlos0 + + + Serguei Kouzmine + kouzmine_serguei@yahoo.com + + https://github.com/sergueik + + + + UTF-8 + UTF-8 + 1.3 + 2.7 + 3.0.1 + 4.2 + 1.10 + 1.3 + 2.0.4 + 1.8 + 4.13.1 + 1.8 + 1.8 + 3.6.1 + 2.20 + 1.4.2 + + 3.13.0 + + 4.8.3 + + ${selenium.version} + ${selenium.version} + ${selenium.version} + ${selenium.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + commons-configuration + commons-configuration + ${commons-configuration.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.exparity + hamcrest-date + ${hamcrest-date.version} + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + + + com.jcabi + jcabi-matchers + 1.3 + test + + + junit + junit + ${junit.version} + test + + + org.seleniumhq.selenium + selenium-api + ${selenium.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + org.seleniumhq.selenium + selenium-devtools-v108 + + + org.seleniumhq.selenium + selenium-devtools-v107 + + + org.seleniumhq.selenium + selenium-devtools-v106 + + + org.seleniumhq.selenium + selenium-devtools-v105 + + + org.seleniumhq.selenium + selenium-devtools-v104 + + + org.seleniumhq.selenium + selenium-devtools-v103 + + + org.seleniumhq.selenium + selenium-devtools-v102 + + + org.seleniumhq.selenium + selenium-devtools-v101 + + + org.seleniumhq.selenium + selenium-devtools-v100 + + + org.seleniumhq.selenium + selenium-devtools-v99 + + + org.seleniumhq.selenium + selenium-devtools-v97 + + + org.seleniumhq.selenium + selenium-devtools-v96 + + + org.seleniumhq.selenium + selenium-devtools-v95 + + + org.seleniumhq.selenium + selenium-devtools-v85 + + + + + org.seleniumhq.selenium + selenium-devtools-v109 + ${selenium-devtools-v109.version} + + + org.seleniumhq.selenium + selenium-remote-driver + ${selenium.version} + + + org.seleniumhq.selenium + selenium-firefox-driver + ${selenium-firefox-driver.version} + + + org.seleniumhq.selenium + selenium-chrome-driver + ${selenium-chrome-driver.version} + + + org.seleniumhq.selenium + selenium-ie-driver + ${selenium-ie-driver.version} + + + org.seleniumhq.selenium + selenium-support + ${selenium.version} + + + org.seleniumhq.selenium + selenium-remote-driver + ${selenium.version} + + + com.codeborne + phantomjsdriver + ${phantomjsdriver.version} + + + org.seleniumhq.selenium + selenium-remote-driver + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + compile + + + ${java.version} + ${java.version} + utf-8 + -Xlint:all + true + true + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + true + + false + + + + unit-tests + test + + test + + + + false + + + **/*Test.java + + + + **/*IntegrationTest.java + + + + + integration-tests + integration-test + + test + + + + false + + + **/*IntegrationTest.java + + + + + + + + + maven-source-plugin + 3.0.0 + + + + jar + + + + + + maven-jar-plugin + 2.6 + + + + ${main.class} + + + + + + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + From 1a1fe85f42c8cf58e22c1c51db3ad1eae272d95f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Thu, 26 Oct 2023 21:27:50 -0400 Subject: [PATCH 047/171] added utility to use clipboard --- utils/uuencode.ps1 | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 utils/uuencode.ps1 diff --git a/utils/uuencode.ps1 b/utils/uuencode.ps1 new file mode 100644 index 000000000..9330641f5 --- /dev/null +++ b/utils/uuencode.ps1 @@ -0,0 +1,21 @@ +# origin: https://stackoverflow.com/questions/42592518/encode-decode-exe-into-base64 +# +param ( + [string] $inputfile, + [string] $outputfile, + [switch] $decode, + [switch] $help +) +if ([bool]$psboundparameters['help'].ispresent) { + write-host @' + Usage: uuencode.ps1 [-decode] -inputfile [INPUTFILE] -outputfile [OUTPUTFILE] +'@ + exit 0 +} +if ([bool]$psboundparameters['decode'].ispresent) { + $o = get-content -encoding ascii -raw -path $inputfile + [IO.File]::WriteAllBytes($outputfile, [Convert]::FromBase64String($o)) +} else { + $o = [Convert]::ToBase64String([IO.File]::ReadAllBytes($inputfile)) + out-file -encoding ascii -filepath $outputfile -inputobject $o +} From c12271ec45545ece6b25488823f8fe22b5dd7c4f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 31 Oct 2023 15:21:16 -0400 Subject: [PATCH 048/171] intermediate revision - put OUTPUTFILE explicitly in the current drectory - observed sometimes not to be the case without explicit --- utils/uuencode.ps1 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/utils/uuencode.ps1 b/utils/uuencode.ps1 index 9330641f5..61c3889d4 100644 --- a/utils/uuencode.ps1 +++ b/utils/uuencode.ps1 @@ -1,5 +1,4 @@ # origin: https://stackoverflow.com/questions/42592518/encode-decode-exe-into-base64 -# param ( [string] $inputfile, [string] $outputfile, @@ -9,13 +8,16 @@ param ( if ([bool]$psboundparameters['help'].ispresent) { write-host @' Usage: uuencode.ps1 [-decode] -inputfile [INPUTFILE] -outputfile [OUTPUTFILE] + The [INPUTFILE] and [OUTPUTFILE] are read and created in the current directory '@ exit 0 } +# Powershell found to create files under $env:USERPROFILE unless full path is specified +$outputfilepath = (( resolve-path -path '.').path + '\' + $outputfile ) if ([bool]$psboundparameters['decode'].ispresent) { $o = get-content -encoding ascii -raw -path $inputfile - [IO.File]::WriteAllBytes($outputfile, [Convert]::FromBase64String($o)) + [IO.File]::WriteAllBytes($outputfilepath, [Convert]::FromBase64String($o)) } else { $o = [Convert]::ToBase64String([IO.File]::ReadAllBytes($inputfile)) - out-file -encoding ascii -filepath $outputfile -inputobject $o + out-file -encoding ascii -filepath $outputfilepath -inputobject $o } From d49754e96c26660469b17854bf5db8b36cb8fb86 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 6 Nov 2023 13:47:16 -0500 Subject: [PATCH 049/171] intermedate revision - cometic changes in "resampler.cmd" and made attempt to run several conversions in "generate_convert.cmd" --- utils/generate_convert.cmd | 29 ++++++++++++++----- utils/generate_convert2.cmd | 58 +++++++++++++++++++++++++++++++++++++ utils/generate_convert3.cmd | 50 ++++++++++++++++++++++++++++++++ utils/randomize.cmd | 11 +++++++ utils/resampler.cmd | 24 +++++++-------- 5 files changed, 153 insertions(+), 19 deletions(-) create mode 100644 utils/generate_convert2.cmd create mode 100644 utils/generate_convert3.cmd create mode 100644 utils/randomize.cmd diff --git a/utils/generate_convert.cmd b/utils/generate_convert.cmd index 1278130f3..33c1f48b4 100644 --- a/utils/generate_convert.cmd +++ b/utils/generate_convert.cmd @@ -7,24 +7,36 @@ REM ffmpeg options taken from: REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats REM https://ffmpeg.org/ffmpeg-utils.html#Video-size REM e.g. nhd, svga, hd480, hd720 -if "!DEBUG!"=="" set DEBUG=false +REM see also: https://github.com/nneeoo/PSffmpeg +if "!DEBUG!"=="" ( set DEBUG=false +) else ( + set DEBUG=true +) set SIZE=%1 if "!SIZE!"=="" set SIZE=svga +set EXT=%2 if "!EXT!"=="" set EXT=mp4 echo EXT=!EXT! + +set FLAG=%3 +if "!FLAG!"=="" goto :BEGIN +echo FLAG=%FLAG% +:BEGIN dir /b/s *.!EXT! PATH=%PATH%;C:\tools\ffmpeg-4.0.2-win64-static\bin +REM C:\tools\ffmpeg-4.0.2-win64-static\bin\ffprobe.exe +REM C:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe for /F "tokens=*" %%. in ('dir /b/s *.!EXT!') do ( set D=%%~dp. set S=%%~nx. set T=%%~n..mkv -if NOT "!D!" equ "." 1>NUL 2>NUL pushd %D% +if NOT "!D!" equ "." 1>NUL 2>NUL pushd !D! if NOT exist !T! ( echo Converting "!S!" "!T!" if /I "!DEBUG!"=="true" echo ffmpeg.exe -i "!S!" -c:v vp9 -s !SIZE! -v 0 "!T!" REM ffmpeg.exe -i "!S!" -c:v vp9 -s !SIZE! -v 0 "!T!" REM echo call :convert "!S!" -call :convert "!S!" +call :convert "!S!" "!T!" !SIZE! ) if NOT "!D!" equ "." 1>NUL 2>NUL popd @@ -33,7 +45,10 @@ goto :EOF REM Only captures part of the name :convert set S=%~1 -set F=%~n1 -echo ffmpeg.exe -i "%S%" -c:v vp9 -s !SIZE! -v 0 "%F%.mkv" -ffmpeg.exe -i "%S%" -c:v vp9 -s !SIZE! -v 0 "%F%.mkv" -goto :EOF \ No newline at end of file +set F=%~2 +set SIZE=%3 +if exist "%F%" goto :EOF +if /I "!DEBUG!"=="true" echo ffmpeg.exe -i "%S%" -c:v vp9 -s %SIZE% -v 0 "%F%" + +ffmpeg.exe -i "%S%" -c:v vp9 -s %SIZE% -v 0 "%F%" +goto :EOF diff --git a/utils/generate_convert2.cmd b/utils/generate_convert2.cmd new file mode 100644 index 000000000..3208ae3a4 --- /dev/null +++ b/utils/generate_convert2.cmd @@ -0,0 +1,58 @@ +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION + +REM Convert high-res mp4 to low res mkv, directly +REM ffmpeg options taken from: +REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +REM https://ffmpeg.org/ffmpeg-utils.html#Video-size +REM e.g. nhd, svga, hd480, hd720 +REM see also: https://github.com/nneeoo/PSffmpeg +if "!DEBUG!"=="" ( set DEBUG=false +) else ( + set DEBUG=true +) +set SIZE=%1 +if "!SIZE!"=="" set SIZE=svga +set EXT=%2 +if "!EXT!"=="" set EXT=mp4 +REM echo EXT=!EXT! + +set FLAG=%3 +if "!FLAG!"=="" goto :BEGIN +REM echo FLAG=%FLAG% +goto :EOF +:BEGIN +set RUN=c:\temp\convert0374.cmd +echo @echo OFF >%RUN% + +echo SETLOCAL ENABLEDELAYEDEXPANSION >>%RUN% +echo set /a N=%%RANDOM%% >>%RUN% +echo set /a N=^^!N^^! %%%% 20 >>%RUN% +echo set N=%%1 >>%RUN% +echo echo N=^^!N^^! >>%RUN% +echo echo timeout.exe /T ^^!N^^! /nobreak >>%RUN% +echo if NOT "^^!N^^!" equ "" timeout.exe /T ^^!N^^! /nobreak >>%RUN% +REM echo goto :EOF >>%RUN% +echo echo Start >>%RUN% +echo PATH=%PATH%;C:\tools\ffmpeg-4.0.2-win64-static\bin >>%RUN% +for /F "tokens=*" %%. in ('dir /b/s *.!EXT!') do ( +set D=%%~dp. +set S=%%~nx. +set T=%%~n..mkv +if NOT "!D!" equ "." echo 1^>NUL 2^>NUL pushd "!D!" >>%RUN% +echo if NOT exist "!T!" ^( >>%RUN% +echo C:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe -i "!S!" -c:v vp9 -s !SIZE! -v 0 "!T!" >>%RUN% +echo ^) >>%RUN% +if NOT "!D!" equ "." echo 1^>NUL 2^>NUL popd >>%RUN% +) +for /L %%. in ( 1 1 4) do ( + set /a N=!RANDOM! + set /a N=!N! %% 10 + set /a N=!N! + 1 + echo start cmd /c %RUN% !N! + REM set /A N=%%. + REM echo start cmd /c %RUN% !N! + start cmd /c %RUN% !N! +) +goto :EOF diff --git a/utils/generate_convert3.cmd b/utils/generate_convert3.cmd new file mode 100644 index 000000000..a3575ecb9 --- /dev/null +++ b/utils/generate_convert3.cmd @@ -0,0 +1,50 @@ +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION + +REM Convert high-res mp4 to low res mkv, directly +REM ffmpeg options taken from: +REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +REM https://ffmpeg.org/ffmpeg-utils.html#Video-size +REM e.g. nhd, svga, hd480, hd720 +REM see also: https://github.com/nneeoo/PSffmpeg +if "!DEBUG!"=="" ( set DEBUG=false +) else ( + set DEBUG=true +) +set SIZE=%1 +if "!SIZE!"=="" set SIZE=svga +set EXT=%2 +if "!EXT!"=="" set EXT=mp4 +REM echo EXT=!EXT! + +set FLAG=%3 +if "!FLAG!"=="" goto :BEGIN +REM echo FLAG=%FLAG% +set RUN=c:\temp\convert0374.cmd +:BEGIN +echo @echo OFF +echo SETLOCAL ENABLEDELAYEDEXPANSION +echo set /a N=%%RANDOM%% +echo set /a N=^^!N^^! %%%% 20 +echo echo N=^^!N^^! +echo set N=%%1 +echo timeout.exe /T ^^!N^^! /nobreak +echo goto :EOF +echo PATH=%PATH%;C:\tools\ffmpeg-4.0.2-win64-static\bin +REM Using +REM ffprobe.exe +REM ffmpeg.exe + +REM dir /b/s *.!EXT! +for /F "tokens=*" %%. in ('dir /b/s *.!EXT!') do ( +set D=%%~dp. +set S=%%~nx. +set T=%%~n..mkv +if NOT "!D!" equ "." echo 1^>NUL 2^>NUL pushd "!D!" +echo if NOT exist "!T!" ^( +echo ffmpeg.exe -i "!S!" -c:v vp9 -s !SIZE! -v 0 "!T!" +echo ^) +if NOT "!D!" equ "." echo 1^>NUL 2^>NUL popd +) +goto :EOF diff --git a/utils/randomize.cmd b/utils/randomize.cmd new file mode 100644 index 000000000..ad1dddf81 --- /dev/null +++ b/utils/randomize.cmd @@ -0,0 +1,11 @@ +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION +set RUN=script +for /L %%. in ( 1 1 4) do ( + call set /a N=!RANDOM! + echo start cmd /c %RUN% !N! + set /a N=!N! %% 10 + echo start cmd /c %RUN% !N! +) +goto :EOF diff --git a/utils/resampler.cmd b/utils/resampler.cmd index 776ab02e9..347ea0935 100644 --- a/utils/resampler.cmd +++ b/utils/resampler.cmd @@ -54,13 +54,13 @@ for %OPT% %%_ in (*.flac) do ( ) :WAIT_FOR_PROCESS -echo Wait untill all processes finish + rem Wait untill all processes finish -C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak -set IMAGENAME=ReSampler.exe -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH') do ( - if "%%_" == "!IMAGENAME!" ( - rem There is still at least one instance of the ReSampler.exe tool running +timeout.exe /T !TIMEOUT! /nobreak +set TOOL=ReSampler.exe +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !TOOL!" /NH') do ( + if "%%_" == "!TOOL!" ( + rem There is still at least one instance of the !TOOL! running goto :WAIT_FOR_PROCESS ) ) @@ -71,14 +71,14 @@ goto :EOF REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803 :COUNT_FOR_PROCESS -echo Wait untill at least one processes finish -rem Wait untill at least one processes finish -C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak -set IMAGENAME=ReSampler.exe + +rem Wait untill at least one !TOOL! process finishes +timeout.exe /T !TIMEOUT! /nobreak +set TOOL=ReSampler.exe set /A RUNNING_PPOCESS_COUNT=0 -for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !IMAGENAME!" /NH ^| C:\Windows\System32\find.exe /i "!IMAGENAME!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( +for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !TOOL!" /NH ^| C:\Windows\System32\find.exe /i "!TOOL!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( set /A RUNNING_PPOCESS_COUNT=%%_ - echo !RUNNING_PPOCESS_COUNT! !IMAGENAME! is running + echo !RUNNING_PPOCESS_COUNT! !TOOL! processes are running if !RUNNING_PPOCESS_COUNT! equ !MAX_PROCESSES! ( goto :COUNT_FOR_PROCESS ) From 2d700b4e43affa8b643d7ea8f1ffebfe95f1d39f Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 7 Nov 2023 00:52:19 +0100 Subject: [PATCH 050/171] intermediate revision - cleaner variable names, still suspect the system load is painfully high for safe use --- utils/generate_convert2.cmd | 105 ++++++++++++++++-------------------- utils/generate_convert3.cmd | 100 +++++++++++++++++----------------- utils/randomize.cmd | 17 +++--- 3 files changed, 103 insertions(+), 119 deletions(-) diff --git a/utils/generate_convert2.cmd b/utils/generate_convert2.cmd index 3208ae3a4..986aa791d 100644 --- a/utils/generate_convert2.cmd +++ b/utils/generate_convert2.cmd @@ -1,58 +1,47 @@ -@echo OFF - -SETLOCAL ENABLEDELAYEDEXPANSION - -REM Convert high-res mp4 to low res mkv, directly -REM ffmpeg options taken from: -REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats -REM https://ffmpeg.org/ffmpeg-utils.html#Video-size -REM e.g. nhd, svga, hd480, hd720 -REM see also: https://github.com/nneeoo/PSffmpeg -if "!DEBUG!"=="" ( set DEBUG=false -) else ( - set DEBUG=true -) -set SIZE=%1 -if "!SIZE!"=="" set SIZE=svga -set EXT=%2 -if "!EXT!"=="" set EXT=mp4 -REM echo EXT=!EXT! - -set FLAG=%3 -if "!FLAG!"=="" goto :BEGIN -REM echo FLAG=%FLAG% -goto :EOF -:BEGIN -set RUN=c:\temp\convert0374.cmd -echo @echo OFF >%RUN% - -echo SETLOCAL ENABLEDELAYEDEXPANSION >>%RUN% -echo set /a N=%%RANDOM%% >>%RUN% -echo set /a N=^^!N^^! %%%% 20 >>%RUN% -echo set N=%%1 >>%RUN% -echo echo N=^^!N^^! >>%RUN% -echo echo timeout.exe /T ^^!N^^! /nobreak >>%RUN% -echo if NOT "^^!N^^!" equ "" timeout.exe /T ^^!N^^! /nobreak >>%RUN% -REM echo goto :EOF >>%RUN% -echo echo Start >>%RUN% -echo PATH=%PATH%;C:\tools\ffmpeg-4.0.2-win64-static\bin >>%RUN% -for /F "tokens=*" %%. in ('dir /b/s *.!EXT!') do ( -set D=%%~dp. -set S=%%~nx. -set T=%%~n..mkv -if NOT "!D!" equ "." echo 1^>NUL 2^>NUL pushd "!D!" >>%RUN% -echo if NOT exist "!T!" ^( >>%RUN% -echo C:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe -i "!S!" -c:v vp9 -s !SIZE! -v 0 "!T!" >>%RUN% -echo ^) >>%RUN% -if NOT "!D!" equ "." echo 1^>NUL 2^>NUL popd >>%RUN% -) -for /L %%. in ( 1 1 4) do ( - set /a N=!RANDOM! - set /a N=!N! %% 10 - set /a N=!N! + 1 - echo start cmd /c %RUN% !N! - REM set /A N=%%. - REM echo start cmd /c %RUN% !N! - start cmd /c %RUN% !N! -) -goto :EOF +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION + +REM Convert high-res mp4 to low res mkv, directly +REM ffmpeg options taken from: +REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +REM https://ffmpeg.org/ffmpeg-utils.html#Video-size +REM e.g. nhd, svga, hd480, hd720 +REM see also: https://github.com/nneeoo/PSffmpeg +if "!DEBUG!"=="" ( set DEBUG=false +) else ( + set DEBUG=true +) +set SIZE=%1 +if "!SIZE!"=="" set SIZE=svga +set EXT=%2 +if "!EXT!"=="" set EXT=mp4 +REM echo EXT=!EXT! + +set FLAG=%3 +if "!FLAG!"=="" goto :BEGIN +REM echo FLAG=%FLAG% +goto :EOF +:BEGIN +set RUN=c:\temp\convert0374.cmd +echo @echo OFF >%RUN% + +echo SETLOCAL ENABLEDELAYEDEXPANSION >>%RUN% +echo set DELAY=%%1 >>%RUN% +echo echo DELAY=^^!DELAY^^! >>%RUN% +echo echo timeout.exe /T ^^!DELAY^^! /nobreak >>%RUN% +echo if NOT "^^!DELAY^^!" equ "" timeout.exe /T ^^!DELAY^^! /nobreak >>%RUN% +echo echo Start >>%RUN% +echo PATH=%%PATH%%;C:\tools\ffmpeg-4.0.2-win64-static\bin >>%RUN% +for /F "tokens=*" %%. in ('dir /b/s *.!EXT!') do ( +set DIRECTORY=%%~dp. +set INPUTFILE=%%~nx. +set OUTPUTFILE=%%~n..mkv +if NOT "!DIRECTORY!" equ "." echo 1^>NUL 2^>NUL pushd "!DIRECTORY!" >>%RUN% +echo if NOT exist "!OUTPUTFILE!" ^( >>%RUN% +echo C:\tools\ffmpeg-4.0.2-win64-static\bin\ffmpeg.exe -i "!INPUTFILE!" -c:v vp9 -s !SIZE! -v 0 "!OUTPUTFILE!" >>%RUN% +echo ^) >>%RUN% +if NOT "!DIRECTORY!" equ "." echo 1^>NUL 2^>NUL popd >>%RUN% +) +for /L %%. in ( 1 1 4) do set /a DELAY=!RANDOM! %% 10 + 1 &&start cmd /c %RUN% !DELAY! +goto :EOF diff --git a/utils/generate_convert3.cmd b/utils/generate_convert3.cmd index a3575ecb9..92bd97774 100644 --- a/utils/generate_convert3.cmd +++ b/utils/generate_convert3.cmd @@ -1,50 +1,50 @@ -@echo OFF - -SETLOCAL ENABLEDELAYEDEXPANSION - -REM Convert high-res mp4 to low res mkv, directly -REM ffmpeg options taken from: -REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats -REM https://ffmpeg.org/ffmpeg-utils.html#Video-size -REM e.g. nhd, svga, hd480, hd720 -REM see also: https://github.com/nneeoo/PSffmpeg -if "!DEBUG!"=="" ( set DEBUG=false -) else ( - set DEBUG=true -) -set SIZE=%1 -if "!SIZE!"=="" set SIZE=svga -set EXT=%2 -if "!EXT!"=="" set EXT=mp4 -REM echo EXT=!EXT! - -set FLAG=%3 -if "!FLAG!"=="" goto :BEGIN -REM echo FLAG=%FLAG% -set RUN=c:\temp\convert0374.cmd -:BEGIN -echo @echo OFF -echo SETLOCAL ENABLEDELAYEDEXPANSION -echo set /a N=%%RANDOM%% -echo set /a N=^^!N^^! %%%% 20 -echo echo N=^^!N^^! -echo set N=%%1 -echo timeout.exe /T ^^!N^^! /nobreak -echo goto :EOF -echo PATH=%PATH%;C:\tools\ffmpeg-4.0.2-win64-static\bin -REM Using -REM ffprobe.exe -REM ffmpeg.exe - -REM dir /b/s *.!EXT! -for /F "tokens=*" %%. in ('dir /b/s *.!EXT!') do ( -set D=%%~dp. -set S=%%~nx. -set T=%%~n..mkv -if NOT "!D!" equ "." echo 1^>NUL 2^>NUL pushd "!D!" -echo if NOT exist "!T!" ^( -echo ffmpeg.exe -i "!S!" -c:v vp9 -s !SIZE! -v 0 "!T!" -echo ^) -if NOT "!D!" equ "." echo 1^>NUL 2^>NUL popd -) -goto :EOF +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION + +REM Convert high-res mp4 to low res mkv, directly +REM ffmpeg options taken from: +REM https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +REM https://ffmpeg.org/ffmpeg-utils.html#Video-size +REM e.g. nhd, svga, hd480, hd720 +REM see also: https://github.com/nneeoo/PSffmpeg +if "!DEBUG!"=="" ( set DEBUG=false +) else ( + set DEBUG=true +) +set SIZE=%1 +if "!SIZE!"=="" set SIZE=svga +set EXT=%2 +if "!EXT!"=="" set EXT=mp4 +REM echo EXT=!EXT! + +set FLAG=%3 +if "!FLAG!"=="" goto :BEGIN +REM echo FLAG=%FLAG% +set RUN=c:\temp\convert0374.cmd +:BEGIN +echo @echo OFF +echo SETLOCAL ENABLEDELAYEDEXPANSION +echo set /a DELAY=%%RANDOM%% +echo set /a DELAY=^^!DELAY^^! %%%% 10 + 1 +echo echo DELAY=^^!DELAY^^! +echo set DELAY=%%1 +echo timeout.exe /T ^^!DELAY^^! /nobreak +echo goto :EOF +echo PATH=%%PATH%%;C:\tools\ffmpeg-4.0.2-win64-static\bin +REM Using +REM ffprobe.exe +REM ffmpeg.exe + +REM dir /b/s *.!EXT! +for /F "tokens=*" %%. in ('dir /b/s *.!EXT!') do ( +set DIRECTORY=%%~dp. +set INPUTFILE=%%~nx. +set OUTPUTFILE=%%~n..mkv +if NOT "!DIRECTORY!" equ "." echo 1^>NUL 2^>NUL pushd "!DIRECTORY!" +echo if NOT exist "!OUTPUTFILE!" ^( +echo ffmpeg.exe -i "!INPUTFILE!" -c:v vp9 -s !SIZE! -v 0 "!OUTPUTFILE!" +echo ^) +if NOT "!DIRECTORY!" equ "." echo 1^>NUL 2^>NUL popd +) +goto :EOF diff --git a/utils/randomize.cmd b/utils/randomize.cmd index ad1dddf81..32ee09811 100644 --- a/utils/randomize.cmd +++ b/utils/randomize.cmd @@ -1,11 +1,6 @@ -@echo OFF - -SETLOCAL ENABLEDELAYEDEXPANSION -set RUN=script -for /L %%. in ( 1 1 4) do ( - call set /a N=!RANDOM! - echo start cmd /c %RUN% !N! - set /a N=!N! %% 10 - echo start cmd /c %RUN% !N! -) -goto :EOF +@echo OFF + +SETLOCAL ENABLEDELAYEDEXPANSION +set RUN=script +for /L %%. in ( 1 1 4) do set /a N=!RANDOM! %% 10 + 1&& echo start cmd /c %RUN% !N! +goto :EOF From 3eb33c2e3f8614e445b70f0dcb7f70771e2d5b40 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 18 Nov 2023 00:06:50 +0100 Subject: [PATCH 051/171] intermediate revision - added split / join ( work in progress ) - successfully tested but more optins to be provided before useful --- utils/split.ps1 | 57 ++++++++++++++++++++++++++++++ utils/uuencode.ps1 | 86 +++++++++++++++++++++++++++++++++------------- 2 files changed, 120 insertions(+), 23 deletions(-) create mode 100644 utils/split.ps1 diff --git a/utils/split.ps1 b/utils/split.ps1 new file mode 100644 index 000000000..d5a8a49e9 --- /dev/null +++ b/utils/split.ps1 @@ -0,0 +1,57 @@ +# based on: https://stackoverflow.com/questions/1001776/how-can-i-split-a-text-file-using-powershell +param( + [string]$filename = "test.txt", + [string]$rootName = "result", + [string]$ext = ".txt", + [int]$maxlines = 10000, #10k + [switch]$debug +) +function spliti_file { + param( + [string]$filename = "test.txt", + [string]$rootName = "result", + [string]$ext = ".txt", + [int]$maxlines = 10000, #10k + [boolean]$debug + ) + $filecount = 1 + $reader = $null + try{ + $reader = [io.file]::OpenText($filename) + try{ + write-host ('Creating file number {0}' -f $filecount) + $writer = [io.file]::CreateText(('{0}{1}.{2}' -f $rootName,$filecount.ToString("000"),$ext)) + $filecount++ + $linecount = 0 + + while($reader.EndOfStream -ne $true) { + write-host ('Reading {0}' -f $maxlines ) + while( ($linecount -lt $maxlines) -and ($reader.EndOfStream -ne $true)){ + $writer.WriteLine($reader.ReadLine()); + $linecount++ + } + + if($reader.EndOfStream -ne $true) { + write-hosr 'Closing file' + $writer.Dispose(); + + write-host ('Creating file number {0}' -f $filecount) + $writer = [io.file]::CreateText(('{0}{1}.{2}' -f $rootName,$filecount.ToString("000"),$ext)) + $filecount++ + $linecount = 0 + } + } + } finally { + $writer.Dispose(); + } + } finally { + $reader.Dispose(); + } + +} +#split test +# $sw = new-object System.Diagnostics.Stopwatch +# $sw.Start() +split_file -rootname $rootname -filename $filename -maxlines $maxlines +# $sw.Stop() +# Write-Host "Split complete in " $sw.Elapsed.TotalSeconds "seconds" diff --git a/utils/uuencode.ps1 b/utils/uuencode.ps1 index 61c3889d4..9f1371127 100644 --- a/utils/uuencode.ps1 +++ b/utils/uuencode.ps1 @@ -1,23 +1,63 @@ -# origin: https://stackoverflow.com/questions/42592518/encode-decode-exe-into-base64 -param ( - [string] $inputfile, - [string] $outputfile, - [switch] $decode, - [switch] $help -) -if ([bool]$psboundparameters['help'].ispresent) { - write-host @' - Usage: uuencode.ps1 [-decode] -inputfile [INPUTFILE] -outputfile [OUTPUTFILE] - The [INPUTFILE] and [OUTPUTFILE] are read and created in the current directory -'@ - exit 0 -} -# Powershell found to create files under $env:USERPROFILE unless full path is specified -$outputfilepath = (( resolve-path -path '.').path + '\' + $outputfile ) -if ([bool]$psboundparameters['decode'].ispresent) { - $o = get-content -encoding ascii -raw -path $inputfile - [IO.File]::WriteAllBytes($outputfilepath, [Convert]::FromBase64String($o)) -} else { - $o = [Convert]::ToBase64String([IO.File]::ReadAllBytes($inputfile)) - out-file -encoding ascii -filepath $outputfilepath -inputobject $o -} +# origin: https://stackoverflow.com/questions/42592518/encode-decode-exe-into-base64 +param ( + [string] $inputfile, + [string] $outputfile, + [int]$length = 1000, + [switch] $decode, + [switch] $split, + [switch] $join, + [switch] $help +) +if ([bool]$psboundparameters['help'].ispresent) { + write-host @' + Usage: uuencode.ps1 [-decode] -inputfile [INPUTFILE] -outputfile [OUTPUTFILE] [-split] [-join] [-length LENGTH] + The [INPUTFILE] and [OUTPUTFILE] are read and created in the current directory +'@ + exit 0 +} +# Powershell found to create files under $env:USERPROFILE unless full path is specified +$outputfilepath = (( resolve-path -path '.').path + '\' + $outputfile ) +[bool]$split_flag = [bool]$psboundparameters['split'].ispresent +[bool]$join_flag = [bool]$psboundparameters['join'].ispresent +[bool]$decode_flag = [bool]$psboundparameters['decode'].ispresent +if ($decode_flag) { + $o = get-content -encoding ascii -raw -path $inputfile + if ($join_flag) { + $o = $o -replace '\r?\n', '' + } + [IO.File]::WriteAllBytes($outputfilepath, [Convert]::FromBase64String($o)) +} else { + $o = [Convert]::ToBase64String([IO.File]::ReadAllBytes($inputfile)) + if ($split_flag) { + # https://stackoverflow.com/questions/1450774/splitting-a-string-into-chunks-of-a-certain-size + add-type -typeDefinition @' + using System; + using System.Collections; + using System.Collections.Generic; +public static class EnumerableEx { + public static IEnumerable SplitBy(this string str, int chunkLength) { + if (String.IsNullOrEmpty(str)) throw new ArgumentException(); + if (chunkLength < 1) throw new ArgumentException(); + + for (int i = 0; i < str.Length; i += chunkLength) + { + if (chunkLength + i > str.Length) + chunkLength = str.Length - i; + + yield return str.Substring(i, chunkLength); + } + } +} +'@ + # NOTE: cannot use the extension methods defined in inline Classes in Powershell: + # Method invocation failed because [System.String] does not contain a method named 'SplitBy'. + # $o.SplitBy($length) | foreach-object { write-output $_ } + + out-file -encoding ascii -filepath $outputfilepath -inputobject '' + [EnumerableEx]::SplitBy($o, $length) | foreach-object { + $line = $_ + out-file -encoding ascii -filepath $outputfilepath -inputobject $line -append } + } else { + out-file -encoding ascii -filepath $outputfilepath -inputobject $o + } +} From bea05fa3e79d5aeb47d955cc47235359a4a5d40d Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 19 Nov 2023 01:03:51 -0500 Subject: [PATCH 052/171] intermediate revision - added "CallNamedPipe" test --- jna_named-pipe/README.md | 9 +++- jna_named-pipe/pom.xml | 9 ++-- .../src/test/java/example/NamedPipeTest.java | 52 +++++++++++++++---- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/jna_named-pipe/README.md b/jna_named-pipe/README.md index 94f4aa5be..7ef2a5e6d 100644 --- a/jna_named-pipe/README.md +++ b/jna_named-pipe/README.md @@ -1,6 +1,11 @@ ### Info + this directory contains minimally modified [code example test](https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java) reading and writing to Windows [named pipe](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes) -https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java +it can be used to communicate with .Net application, e.g. with [basic-named-pipe](https://github.com/sergueik/powershell_samples/tree/master/external/csharp/basic-named-pipe) -http://v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html +### See Also: + + * http://v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html + * https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/Winevt.java#L41 + * https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/WevtapiUtil.java#L28 diff --git a/jna_named-pipe/pom.xml b/jna_named-pipe/pom.xml index a9302b321..be4d1d93d 100644 --- a/jna_named-pipe/pom.xml +++ b/jna_named-pipe/pom.xml @@ -17,7 +17,9 @@ UTF-8 - 1.32 + + + 1.10 4.2 1.3 2.7 @@ -71,11 +73,6 @@ snakeyaml ${snakeyaml.version} - - org.apache.maven.plugins - maven-antrun-plugin - ${maven-antrun-plugin.version} - net.java.dev.jna jna-platform diff --git a/jna_named-pipe/src/test/java/example/NamedPipeTest.java b/jna_named-pipe/src/test/java/example/NamedPipeTest.java index fa82157d5..9190e87ec 100644 --- a/jna_named-pipe/src/test/java/example/NamedPipeTest.java +++ b/jna_named-pipe/src/test/java/example/NamedPipeTest.java @@ -1,8 +1,6 @@ package example; -//based on: -//Copyright (c) 2007 Timothy Wall, All Rights Reserved -// +// based on: https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.is; @@ -27,17 +25,22 @@ import com.sun.jna.platform.win32.WinDef.ULONGByReference; import com.sun.jna.platform.win32.WinNT.HANDLE; import com.sun.jna.ptr.IntByReference; +import java.util.Random; -/** - * @author lgoldstein - */ public class NamedPipeTest { + private String pipeName; private String name = "demo"; + private final int MAX_BUFFER_SIZE = 1024; + // https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/Kernel32.java#L2045 + // see also ConnectNamedPipe. NOTE: needs HANDLE + // https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/Kernel32.java#L2015 @Test - public void testNamedPipeServerAPI() { - String pipeName = "\\\\.\\pipe\\" + name; + public void test2() { + WinBase.OVERLAPPED lpOverlapped; + Random random = new Random(); + pipeName = "\\\\.\\pipe\\" + name + random.nextInt(); HANDLE hNamedPipe = Kernel32.INSTANCE.CreateNamedPipe(pipeName, WinBase.PIPE_ACCESS_DUPLEX, // dwOpenMode WinBase.PIPE_TYPE_BYTE | WinBase.PIPE_READMODE_BYTE | WinBase.PIPE_WAIT, // dwPipeMode @@ -47,6 +50,9 @@ public void testNamedPipeServerAPI() { 1000, // nDefaultTimeOut, null); // lpSecurityAttributes assertThat(hNamedPipe, is(not(equalTo(WinBase.INVALID_HANDLE_VALUE)))); + // NOTE: for existing pipe + // Expected: is not + // but: was try { IntByReference lpFlags = new IntByReference(0); @@ -65,14 +71,13 @@ public void testNamedPipeServerAPI() { Kernel32.INSTANCE.GetNamedPipeServerSessionId(hNamedPipe, ServerSessionId); - String expMessage = Thread.currentThread().getName() + " says hello"; + String expMessage = Thread.currentThread().getName() + " says test2"; byte[] expData = expMessage.getBytes(); IntByReference lpNumberOfBytesWritten = new IntByReference(0); Kernel32.INSTANCE.WriteFile(hNamedPipe, expData, expData.length, lpNumberOfBytesWritten, null); // assertEquals("Mismatched write buffer size", expData.length, // lpNumberOfBytesWritten.getValue()); - final int MAX_BUFFER_SIZE = 1024; byte[] readBuffer = new byte[MAX_BUFFER_SIZE]; IntByReference lpNumberOfBytesRead = new IntByReference(0); Kernel32.INSTANCE.ReadFile(hNamedPipe, readBuffer, readBuffer.length, @@ -83,11 +88,36 @@ public void testNamedPipeServerAPI() { String actMessage = new String(readBuffer, 0, readSize); assertThat("Mismatched server data", actMessage, is(expMessage)); - + // https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/Kernel32.java#L2056 Kernel32.INSTANCE.DisconnectNamedPipe(hNamedPipe); } finally { Kernel32.INSTANCE.CloseHandle(hNamedPipe); } } + // CallNamedPipe + // https://github.com/java-native-access/jna/blob/master/contrib/platform/src/com/sun/jna/platform/win32/Kernel32.java#L1994 + @Test + public void test1() { + pipeName = "\\\\.\\pipe\\" + name; + String message = Thread.currentThread().getName() + " says test1"; + // The data to be written to the pipe + byte[] readBuffer = message.getBytes(); + byte[] outBuffer = new byte[MAX_BUFFER_SIZE]; + IntByReference lpNumberOfBytesRead = new IntByReference(0); + boolean status = Kernel32.INSTANCE.CallNamedPipe(pipeName, readBuffer, + readBuffer.length, // nInBufferSize + outBuffer, MAX_BUFFER_SIZE, // nOutBufferSize + lpNumberOfBytesRead, 1000 // nTimeOut + ); + assertThat("Bad status", status, is(true)); + int readSize = lpNumberOfBytesRead.getValue(); + // assertThat(readSize, is(0)); + assertThat(readSize, greaterThan(0)); + + String message2 = new String(readBuffer, 0, readSize); + System.err.println(message2); + + } + } From 168e5d880d191738d20f15b33261549b56205975 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 2 Dec 2023 23:59:14 +0100 Subject: [PATCH 053/171] intermediate vesion - fixed path to "timeout.exe" to address case when resampler.cmd launched fro git bash --- utils/resampler.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/resampler.cmd b/utils/resampler.cmd index 347ea0935..90bc2a726 100644 --- a/utils/resampler.cmd +++ b/utils/resampler.cmd @@ -56,7 +56,7 @@ for %OPT% %%_ in (*.flac) do ( :WAIT_FOR_PROCESS rem Wait untill all processes finish -timeout.exe /T !TIMEOUT! /nobreak +C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak set TOOL=ReSampler.exe for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !TOOL!" /NH') do ( if "%%_" == "!TOOL!" ( @@ -73,7 +73,7 @@ REM use trick from https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=980 :COUNT_FOR_PROCESS rem Wait untill at least one !TOOL! process finishes -timeout.exe /T !TIMEOUT! /nobreak +C:\Windows\System32\timeout.exe /T !TIMEOUT! /nobreak set TOOL=ReSampler.exe set /A RUNNING_PPOCESS_COUNT=0 for /f "tokens=1" %%_ in ('tasklist.exe /FI "IMAGENAME eq !TOOL!" /NH ^| C:\Windows\System32\find.exe /i "!TOOL!" ^|C:\Windows\System32\find.exe/c /v "" ') do ( From d2bec1dc7d5fb1baae0c495326120263824372c3 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sun, 3 Dec 2023 00:18:30 +0100 Subject: [PATCH 054/171] bumped "junit.version" per dependabot --- pdf_content_test/pom.xml | 2 +- protractor/test_examples/maven/junit/pom.xml | 2 +- protractor/test_examples/maven/testng/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pdf_content_test/pom.xml b/pdf_content_test/pom.xml index c2a1ed55a..736d87625 100644 --- a/pdf_content_test/pom.xml +++ b/pdf_content_test/pom.xml @@ -18,7 +18,7 @@ 2.0.4 2.0.22 1.8 - 4.12 + 4.13.1 3.6.0 1.8 1.8 diff --git a/protractor/test_examples/maven/junit/pom.xml b/protractor/test_examples/maven/junit/pom.xml index b185f2eb8..536bdc6eb 100644 --- a/protractor/test_examples/maven/junit/pom.xml +++ b/protractor/test_examples/maven/junit/pom.xml @@ -12,7 +12,7 @@ 1.7 1.7 1.7 - 4.11 + 4.13.1 1.0-SNAPSHOT 2.47.0 2.46.0 diff --git a/protractor/test_examples/maven/testng/pom.xml b/protractor/test_examples/maven/testng/pom.xml index 705592a05..c0f9d36a7 100644 --- a/protractor/test_examples/maven/testng/pom.xml +++ b/protractor/test_examples/maven/testng/pom.xml @@ -12,7 +12,7 @@ 1.7 1.7 1.7 - 4.11 + 4.13.1 1.0-SNAPSHOT 2.47.0 2.46.0 From 9927cb0b8631327781a73aaf2a6c8d26e5632326 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 18 Dec 2023 01:57:34 +0100 Subject: [PATCH 055/171] intermediate revision - bumped logback-classic version per dependabot --- cdp4j/pom.xml | 2 +- junit-retry-failed/pom.xml | 3 ++- mongodb_basic/pom.xml | 2 +- pageobject-generator/pom.xml | 2 +- webdrivermanager/pom.xml | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cdp4j/pom.xml b/cdp4j/pom.xml index 64155d2d2..49796fc0f 100644 --- a/cdp4j/pom.xml +++ b/cdp4j/pom.xml @@ -159,7 +159,7 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.13 test diff --git a/junit-retry-failed/pom.xml b/junit-retry-failed/pom.xml index 85452f5ae..60976f004 100644 --- a/junit-retry-failed/pom.xml +++ b/junit-retry-failed/pom.xml @@ -19,6 +19,7 @@ 1.8.1 4.13.2 1.2.9 + 1.2.13 3.8.1 2.22.2 1.7.32 @@ -43,7 +44,7 @@ ch.qos.logback logback-classic - ${logback.version} + ${logback-classic.version} ch.qos.logback diff --git a/mongodb_basic/pom.xml b/mongodb_basic/pom.xml index 6b636eeb3..b18a8957f 100644 --- a/mongodb_basic/pom.xml +++ b/mongodb_basic/pom.xml @@ -23,7 +23,7 @@ 1.8 20170516 4.13.1 - 1.2.3 + 1.2.13 3.6.1 3.0.2 1.8 diff --git a/pageobject-generator/pom.xml b/pageobject-generator/pom.xml index 75007db93..dd9a33c72 100644 --- a/pageobject-generator/pom.xml +++ b/pageobject-generator/pom.xml @@ -9,7 +9,7 @@ UTF-8 1.8 1.15.3 - 1.2.0 + 1.2.13 1.8 1.8 3.6.0 diff --git a/webdrivermanager/pom.xml b/webdrivermanager/pom.xml index 43795746e..6c5718213 100644 --- a/webdrivermanager/pom.xml +++ b/webdrivermanager/pom.xml @@ -6,7 +6,7 @@ 2.2.2-SNAPSHOT 1.7.24 - 1.2.3 + 1.2.13 2.7 2.8.9 3.5 From 8a3fb2469cb5055459ab5f8fe0bf75dbb61478b7 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 18 Dec 2023 02:24:29 +0100 Subject: [PATCH 056/171] bumped junit version per dependabot --- cdp4j/pom.xml | 2 +- javafx_tray_notification/pom.xml | 23 +++++++++++++++++++++++ selenese-runner-java/pom.xml | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 javafx_tray_notification/pom.xml diff --git a/cdp4j/pom.xml b/cdp4j/pom.xml index 49796fc0f..22bb64149 100644 --- a/cdp4j/pom.xml +++ b/cdp4j/pom.xml @@ -165,7 +165,7 @@ junit junit - 4.12 + 4.13.1 test diff --git a/javafx_tray_notification/pom.xml b/javafx_tray_notification/pom.xml new file mode 100644 index 000000000..ef4e90635 --- /dev/null +++ b/javafx_tray_notification/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + com.github.plushaze.traynotification + TrayNotification + 0.3 + + + junit + junit + 4.13.1 + test + + + + + 1.8 + 1.8 + + diff --git a/selenese-runner-java/pom.xml b/selenese-runner-java/pom.xml index de1bfc3a4..a1b175ce2 100644 --- a/selenese-runner-java/pom.xml +++ b/selenese-runner-java/pom.xml @@ -577,7 +577,7 @@ It supports test-case and test-suite which are Selenium IDE's native format. junit junit - 4.12 + 4.13.1 test From 5f275c222c1886ea1efdea87b6611a9f1af5e9c6 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 18 Dec 2023 02:49:44 +0100 Subject: [PATCH 057/171] bumped commons-io version per dependabot --- android/client/pom.xml | Bin 5928 -> 6064 bytes event_firing_all/pom.xml | 3 ++- excel-testng/integration/pom.xml | 3 ++- fluentwait/pom.xml | 3 ++- iedriver/pom.xml | 3 ++- log4j/pom.xml | 3 ++- parallel/cucumber/pom.xml | 3 ++- parallel/junit/pom.xml | 3 ++- search_basic/pom.xml | 3 ++- 9 files changed, 16 insertions(+), 8 deletions(-) diff --git a/android/client/pom.xml b/android/client/pom.xml index 388ae669aa7df917a464b1f879f5a289177ac6a9..7578577562ebcceb3d3980cd4187254559c1981b 100644 GIT binary patch delta 67 zcmZ3Xw?TiyGM32)_(d4?Ci@GBvYIp4Fz8R-&o2t(Z{(DptidWY`4@}Azd~=rGM33btU{CHSQR$guy$}yUdPHdS%|A+bD5wO8vx6A3g7?$ diff --git a/event_firing_all/pom.xml b/event_firing_all/pom.xml index a7064a716..4664ae836 100644 --- a/event_firing_all/pom.xml +++ b/event_firing_all/pom.xml @@ -9,6 +9,7 @@ http://maven.apache.org UTF-8 + 2.7 UTF-8 4.13.1 2.53.0 @@ -55,7 +56,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/excel-testng/integration/pom.xml b/excel-testng/integration/pom.xml index 57f815b03..983ce94c8 100644 --- a/excel-testng/integration/pom.xml +++ b/excel-testng/integration/pom.xml @@ -9,6 +9,7 @@ http://maven.apache.org UTF-8 + 2.7 1.8 1.8 1.8 @@ -33,7 +34,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/fluentwait/pom.xml b/fluentwait/pom.xml index 17cc8b424..c277e114e 100644 --- a/fluentwait/pom.xml +++ b/fluentwait/pom.xml @@ -9,6 +9,7 @@ http://maven.apache.org UTF-8 + 2.7 4.13.1 2.44.0 2.0.2 @@ -54,7 +55,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/iedriver/pom.xml b/iedriver/pom.xml index 17cc8b424..c277e114e 100644 --- a/iedriver/pom.xml +++ b/iedriver/pom.xml @@ -9,6 +9,7 @@ http://maven.apache.org UTF-8 + 2.7 4.13.1 2.44.0 2.0.2 @@ -54,7 +55,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/log4j/pom.xml b/log4j/pom.xml index bdd1af160..da04c4e02 100644 --- a/log4j/pom.xml +++ b/log4j/pom.xml @@ -12,6 +12,7 @@ UTF-8 UTF-8 + 2.7 4.13.1 2.44.0 2.0.2 @@ -60,7 +61,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/parallel/cucumber/pom.xml b/parallel/cucumber/pom.xml index 4f278805b..450759def 100644 --- a/parallel/cucumber/pom.xml +++ b/parallel/cucumber/pom.xml @@ -10,6 +10,7 @@ UTF-8 2 + 2.7 1.0.1 1.2.4 1.7 @@ -77,7 +78,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/parallel/junit/pom.xml b/parallel/junit/pom.xml index bbc0fe668..0c48131ca 100644 --- a/parallel/junit/pom.xml +++ b/parallel/junit/pom.xml @@ -10,6 +10,7 @@ UTF-8 + 2.7 4.13.1 2.53.0 2.0.2 @@ -54,7 +55,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/search_basic/pom.xml b/search_basic/pom.xml index e9caa32e7..5fe8741e7 100644 --- a/search_basic/pom.xml +++ b/search_basic/pom.xml @@ -9,6 +9,7 @@ http://maven.apache.org UTF-8 + 2.7 4.13.1 2.44.0 2.0.2 @@ -54,7 +55,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons From adc3f37e08145a8592490bd3a00795eaf0e0410b Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 25 Dec 2023 04:16:35 +0100 Subject: [PATCH 058/171] bumped commons-io version per depednabot --- excel-testng/pom.xml | 3 ++- inject_jquery/pom.xml | 3 ++- protractor/test_examples/maven/testng/pom.xml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/excel-testng/pom.xml b/excel-testng/pom.xml index d6956bbc2..918f022d9 100644 --- a/excel-testng/pom.xml +++ b/excel-testng/pom.xml @@ -9,6 +9,7 @@ UTF-8 + 2.7 1.8 1.8 1.7 @@ -100,7 +101,7 @@ xsdlib-20030807.jar commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/inject_jquery/pom.xml b/inject_jquery/pom.xml index 308c02ecf..c1214cf40 100644 --- a/inject_jquery/pom.xml +++ b/inject_jquery/pom.xml @@ -12,6 +12,7 @@ UTF-8 UTF-8 4.13.1 + 2.7 2.53.0 3.6.0 1.8 @@ -55,7 +56,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/protractor/test_examples/maven/testng/pom.xml b/protractor/test_examples/maven/testng/pom.xml index c0f9d36a7..362f01cd1 100644 --- a/protractor/test_examples/maven/testng/pom.xml +++ b/protractor/test_examples/maven/testng/pom.xml @@ -13,6 +13,7 @@ 1.7 1.7 4.13.1 + 2.7 1.0-SNAPSHOT 2.47.0 2.46.0 @@ -41,7 +42,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons From 17a616691ef66f9204431d226aeae4380d836669 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 25 Dec 2023 04:37:45 +0100 Subject: [PATCH 059/171] bumped commons-io version per depednabot --- selenese-runner-java/pom.xml | 32 ++------------------------------ window_handle_iterator/pom.xml | 5 ----- 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/selenese-runner-java/pom.xml b/selenese-runner-java/pom.xml index a1b175ce2..b9b312151 100644 --- a/selenese-runner-java/pom.xml +++ b/selenese-runner-java/pom.xml @@ -10,40 +10,12 @@ https://github.com/vmi/selenese-runner-java This is selenese script interpreter implemented by Java. It supports test-case and test-suite which are Selenium IDE's native format. - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - scm:git:git@github.com:vmi/selenese-runner-java.git - scm:git:git@github.com:vmi/selenese-runner-java.git - git@github.com:vmi/selenese-runner-java.git - HEAD - - - - - vmi - IWAMURO Motonori - vmi@nifty.com - - - hayato1980 - ITO Hayato - haya10.ito@gmail.com - - - UTF-8 UTF-8 1.8 1.8 + 2.7 true 4.1.1 2.56.0 @@ -527,7 +499,7 @@ It supports test-case and test-suite which are Selenium IDE's native format. commons-io commons-io - 2.6 + ${commons-io.version} args4j diff --git a/window_handle_iterator/pom.xml b/window_handle_iterator/pom.xml index dc34612dd..d30133cd3 100644 --- a/window_handle_iterator/pom.xml +++ b/window_handle_iterator/pom.xml @@ -103,11 +103,6 @@ not the 1.3 --> selenium-remote-driver ${selenium.version} - - commons-io - commons-io - 2.4 - org.apache.commons commons-exec From 0ee6e280ff1d4333bc42acb0006b9b5678888539 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 25 Dec 2023 00:29:15 -0500 Subject: [PATCH 060/171] updated junit version per dependabot --- element_locator/pom.xml | 3 ++- selenium-groovy/pom.xml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/element_locator/pom.xml b/element_locator/pom.xml index 74d19e085..11b3ac899 100644 --- a/element_locator/pom.xml +++ b/element_locator/pom.xml @@ -13,12 +13,13 @@ 1.8 2.8.9 1.15.3 + 4.13.1 junit junit - 3.8.1 + ${junit.version} test diff --git a/selenium-groovy/pom.xml b/selenium-groovy/pom.xml index 3a319cc81..b8e804830 100644 --- a/selenium-groovy/pom.xml +++ b/selenium-groovy/pom.xml @@ -12,6 +12,7 @@ 2.44.0 2.2.2 2.17.1 + 4.13.1 1.7.5 ./target @@ -26,7 +27,7 @@ junit junit - 4.13.1 + ${junit.version} test From 86a97c57bda688d6a006832984944efb6f77ea00 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 25 Dec 2023 00:39:59 -0500 Subject: [PATCH 061/171] updated junit version per dependabot --- jProcesses/pom.xml | 15 ++++++++------- multiplatform-swt/loader/pom.xml | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/jProcesses/pom.xml b/jProcesses/pom.xml index 12fe07621..6f730a9d6 100644 --- a/jProcesses/pom.xml +++ b/jProcesses/pom.xml @@ -7,11 +7,18 @@ jar jProcesses Library to manage system processes using Java + + UTF-8 + 1.8 + 4.13.1 + 3.6.0 + 1.8 + junit junit - 4.10 + ${junit.version} test @@ -26,12 +33,6 @@ test - - UTF-8 - 1.8 - 3.6.0 - 1.8 - diff --git a/multiplatform-swt/loader/pom.xml b/multiplatform-swt/loader/pom.xml index 5f9e84a00..e29218c9f 100644 --- a/multiplatform-swt/loader/pom.xml +++ b/multiplatform-swt/loader/pom.xml @@ -7,6 +7,7 @@ lib 4.6 + 4.13.1 1.3.6.RELEASE UTF-8 1.8 @@ -28,7 +29,7 @@ junit junit - 4.12 + ${junit.version} test From 8bf5814dfa00e2ce25686767eac23a03200a06de Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 25 Dec 2023 00:59:10 -0500 Subject: [PATCH 062/171] updated commons-io version per dependabot --- hover/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hover/pom.xml b/hover/pom.xml index 17cc8b424..7a3145930 100644 --- a/hover/pom.xml +++ b/hover/pom.xml @@ -10,6 +10,7 @@ UTF-8 4.13.1 + 2.7 2.44.0 2.0.2 1.6 @@ -54,7 +55,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons From e015343b2762f269de368721a1e8d153ddad2511 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 26 Dec 2023 00:18:22 +0100 Subject: [PATCH 063/171] bumped commons-io version per dependabot and other pending change --- capture/pom.xml | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/capture/pom.xml b/capture/pom.xml index 746e4a299..5d84b8e3d 100644 --- a/capture/pom.xml +++ b/capture/pom.xml @@ -2,20 +2,22 @@ 4.0.0 com.mycompany.app - app + capture jar - 1.1-SNAPSHOT + 1.2-SNAPSHOT app http://maven.apache.org UTF-8 + 0.5.0-SNAPSHOT 1.3 2.7 2.6 4.2 4.13.1 - 2.53.0 + 3.13.0 + 2.17.13.0 2.0.2 1.8 @@ -41,6 +43,25 @@ selenium-support ${selenium.version} + + example + commandline-parser + ${commandline-parser.version} + + + com.google.guava + guava + + + org.json + json + + + com.google.code.gson + gson + + + com.github.detro phantomjsdriver @@ -59,7 +80,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons @@ -108,7 +129,7 @@ maven-dependency-plugin - install + package copy-dependencies From 0166c7757e4b681c6429e74ab7120595fc8dac2c Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 26 Dec 2023 00:26:48 +0100 Subject: [PATCH 064/171] bumped version of commons-io per dependabot and made uniform with other projects --- parallel/cucumber-jvm-parallel-plugin/pom.xml | 3 ++- parallel/testng/pom.xml | 3 ++- parallel1/pom.xml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/parallel/cucumber-jvm-parallel-plugin/pom.xml b/parallel/cucumber-jvm-parallel-plugin/pom.xml index 137da5366..618d66ce1 100644 --- a/parallel/cucumber-jvm-parallel-plugin/pom.xml +++ b/parallel/cucumber-jvm-parallel-plugin/pom.xml @@ -14,6 +14,7 @@ https://github.com/temyers/cucumber-jvm-parallel-plugin UTF-8 + 2.7 3.2.5 @@ -38,7 +39,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.velocity diff --git a/parallel/testng/pom.xml b/parallel/testng/pom.xml index 0f0044b78..4879ed474 100644 --- a/parallel/testng/pom.xml +++ b/parallel/testng/pom.xml @@ -11,6 +11,7 @@ UTF-8 6.9.8 + 2.7 2.53.0 2.0.2 1.7 @@ -54,7 +55,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons diff --git a/parallel1/pom.xml b/parallel1/pom.xml index bbc0fe668..0c48131ca 100644 --- a/parallel1/pom.xml +++ b/parallel1/pom.xml @@ -10,6 +10,7 @@ UTF-8 + 2.7 4.13.1 2.53.0 2.0.2 @@ -54,7 +55,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} org.apache.commons From c7c2905d06fcd548e7b303084aba07b49e7de82d Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 26 Dec 2023 00:39:04 +0100 Subject: [PATCH 065/171] bumped snakeyaml version per dependabot --- auto_excel/pom.xml | 2 +- data_extractor/pom.xml | 2 +- dto_exlore/pom.xml | 2 +- javagrok/pom.xml | 4 ++-- jna_named-pipe/pom.xml | 4 ++-- junit5-dataproviders/pom.xml | 10 +++++----- launch_direct/pom.xml | 4 ++-- node_selector/pom.xml | 2 +- page_object_model/pom.xml | 8 ++++---- remote_browser_log/pom.xml | 8 ++++---- selenide-pr/pom.xml | 4 ++-- sqljet/pom.xml | 6 +++--- xslt-example/pom.xml | 4 ++-- yaml_config_extend/pom.xml | 2 +- 14 files changed, 31 insertions(+), 31 deletions(-) diff --git a/auto_excel/pom.xml b/auto_excel/pom.xml index f32f2178c..fbcdf7fe2 100644 --- a/auto_excel/pom.xml +++ b/auto_excel/pom.xml @@ -13,7 +13,7 @@ 3.17 ${poi.version} - 1.32 + 2.0 6.14.3 4.13.1 EntryPoint diff --git a/data_extractor/pom.xml b/data_extractor/pom.xml index 0acd03a64..f4b913e6a 100644 --- a/data_extractor/pom.xml +++ b/data_extractor/pom.xml @@ -35,7 +35,7 @@ 1.8 3.1.0 2.20 - 1.32 + 2.0 2.8.9 diff --git a/dto_exlore/pom.xml b/dto_exlore/pom.xml index 2a6cdaea9..fd33da89c 100644 --- a/dto_exlore/pom.xml +++ b/dto_exlore/pom.xml @@ -17,7 +17,7 @@ 20080701 29.0-jre - 1.28 + 2.0 2.5.0 3.6.1 diff --git a/javagrok/pom.xml b/javagrok/pom.xml index afaaf8aa6..b25078d96 100644 --- a/javagrok/pom.xml +++ b/javagrok/pom.xml @@ -11,7 +11,7 @@ UTF-8 0.8.0-SNAPSHOT - 1.32 + 2.0 4.2 1.3 2.7 @@ -31,7 +31,7 @@ 3.1.1 3.0.2 1.8 - 1.32 + 2.0 diff --git a/jna_named-pipe/pom.xml b/jna_named-pipe/pom.xml index be4d1d93d..e02bb98fe 100644 --- a/jna_named-pipe/pom.xml +++ b/jna_named-pipe/pom.xml @@ -17,7 +17,7 @@ UTF-8 - + 1.10 4.2 @@ -39,7 +39,7 @@ 3.2.0 3.1.1 1.8 - 1.32 + 2.0 diff --git a/junit5-dataproviders/pom.xml b/junit5-dataproviders/pom.xml index 9da4d2005..9dd17dd9e 100644 --- a/junit5-dataproviders/pom.xml +++ b/junit5-dataproviders/pom.xml @@ -17,13 +17,13 @@ UTF-8 - 1.32 + 2.0 1.3 2.7 3.5 - 1.32.0 - 1.32.0 - v4-rev493-1.32.0 + 2.0.0 + 2.0.0 + v4-rev493-2.0.0 1.3 1.8 @@ -38,7 +38,7 @@ 1.8 3.17 ${poi.version} - 1.32 + 2.0 diff --git a/launch_direct/pom.xml b/launch_direct/pom.xml index 90ee1820d..6d3f4c142 100644 --- a/launch_direct/pom.xml +++ b/launch_direct/pom.xml @@ -8,7 +8,7 @@ YAML inventory parsing app UTF-8 - 1.32 + 2.0 LaunchDirect 0.11.0-SNAPSHOT 1.3 @@ -23,7 +23,7 @@ 2.19.1 3.17 3.17 - 1.32 + 2.0 2.8 diff --git a/node_selector/pom.xml b/node_selector/pom.xml index 46dc79d3d..abab0bda0 100644 --- a/node_selector/pom.xml +++ b/node_selector/pom.xml @@ -35,7 +35,7 @@ 3.0.2 1.8 1.7.30 - 1.32 + 2.0 win64 diff --git a/page_object_model/pom.xml b/page_object_model/pom.xml index 0394b082f..ece8ef163 100644 --- a/page_object_model/pom.xml +++ b/page_object_model/pom.xml @@ -21,7 +21,7 @@ from ossrh e.g.: https://oss.sonatype.org/content/repositories/snapshots/ om/fasterxml/jackson/core/jackson-annotations/2.10.0-SNAPSHOT/jackson-annotatio -s-2.10.0-20190601.324115-4.pom +s-2.10.0-20190602.04115-4.pom which will lead to quickly polluting the maven local repository cache ~/.m2/repository/com/fasterxml/jackson with snapshot versions. --> 2.13.4.1 1.15.3 @@ -36,8 +36,8 @@ s-2.10.0-20190601.324115-4.pom 1.4.4 4.0.0-alpha-2 - - 3.141.32 + + 3.142.0 3.13.0 ${selenium.version} ${selenium.version} @@ -48,7 +48,7 @@ java.lang.NoClassDefFoundError: org/openqa/selenium/remote/DesiredCapabilities with 3.13.0 java.lang.NoClassDefFoundError: org/openqa/selenium/remote/JsonToBeanConverter --> - 1.32 + 2.0 3.25.2 2.9.9 2.11.4 @@ -54,8 +54,8 @@ s-2.10.0-20190601.324115-4.pom 1.4.4 4.0.0-alpha-2 - - 3.141.32 + + 3.142.0 3.13.0 ${selenium.version} ${selenium.version} @@ -66,7 +66,7 @@ java.lang.NoClassDefFoundError: org/openqa/selenium/remote/DesiredCapabilities with 3.13.0 java.lang.NoClassDefFoundError: org/openqa/selenium/remote/JsonToBeanConverter --> - 1.32 + 2.0 3.25.2 SimpleToolBarEx UTF-8 - 1.32 + 2.0 1.4 4.2 1.3 @@ -54,7 +54,7 @@ 4.3.0 ${selenium.version} ${selenium.version} - 1.32 + 2.0 diff --git a/sqljet/pom.xml b/sqljet/pom.xml index 661872c03..fc27a5277 100755 --- a/sqljet/pom.xml +++ b/sqljet/pom.xml @@ -22,7 +22,7 @@ UTF-8 1.8 1.4 - 1.32 + 2.0 4.2 1.8 1.3 @@ -38,8 +38,8 @@ 1.8 1.8 2.17.1 - 1.32 - 1.1.32 + 2.0 + 1.2.0 diff --git a/xslt-example/pom.xml b/xslt-example/pom.xml index 20f91a3d4..b5f34df5f 100644 --- a/xslt-example/pom.xml +++ b/xslt-example/pom.xml @@ -14,7 +14,7 @@ UTF-8 1.8 0.5.0-SNAPSHOT - 1.32 + 2.0 4.2 1.3 2.7 @@ -26,7 +26,7 @@ 3.6.0 1.8 1.8 - 1.32 + 2.0 diff --git a/yaml_config_extend/pom.xml b/yaml_config_extend/pom.xml index 1e28edae7..f00fd4eca 100644 --- a/yaml_config_extend/pom.xml +++ b/yaml_config_extend/pom.xml @@ -9,7 +9,7 @@ 1.3 4.13.1 - 1.32 + 2.0 1.0.1 From ec2528c297b41262d5f074fb7796d359748d5fbc Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Fri, 29 Dec 2023 02:27:19 +0100 Subject: [PATCH 066/171] imtermediate reision - added "certutil.exe" option --- utils/uuencode.ps1 | 66 +++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/utils/uuencode.ps1 b/utils/uuencode.ps1 index 9f1371127..d6d3eeaaa 100644 --- a/utils/uuencode.ps1 +++ b/utils/uuencode.ps1 @@ -5,32 +5,59 @@ param ( [int]$length = 1000, [switch] $decode, [switch] $split, + [switch] $useutil, [switch] $join, [switch] $help ) if ([bool]$psboundparameters['help'].ispresent) { write-host @' - Usage: uuencode.ps1 [-decode] -inputfile [INPUTFILE] -outputfile [OUTPUTFILE] [-split] [-join] [-length LENGTH] + Usage: uuencode.ps1 [-decode] -inputfile [INPUTFILE] -outputfile [OUTPUTFILE] [-split] [-join] [-length LENGTH] [-useutil] The [INPUTFILE] and [OUTPUTFILE] are read and created in the current directory '@ exit 0 } -# Powershell found to create files under $env:USERPROFILE unless full path is specified +# Powershell found prone to create files under $env:USERPROFILE when specified path is relative $outputfilepath = (( resolve-path -path '.').path + '\' + $outputfile ) [bool]$split_flag = [bool]$psboundparameters['split'].ispresent [bool]$join_flag = [bool]$psboundparameters['join'].ispresent [bool]$decode_flag = [bool]$psboundparameters['decode'].ispresent +[bool]$useutil_flag = [bool]$psboundparameters['useutil'].ispresent if ($decode_flag) { - $o = get-content -encoding ascii -raw -path $inputfile - if ($join_flag) { - $o = $o -replace '\r?\n', '' + if ($useutil_flag) { + if (test-path -path $outputfilepath ) { + remove-item -path $outputfilepath -erroraction silentlycontinue -force + # prevent + # EncodeToFile returned The file exists. 0x80070050 (WIN32: 80 ERROR_FILE_EXISTS) + } + # cmd %% - /c "echo C:\Windows\System32\certutil.exe -decode ""${inputfile}"" ""${outputfile}"" >nul 2>&1" + cmd %% - /c "C:\Windows\System32\certutil.exe -decode ""${inputfile}"" ""${outputfile}"" >nul 2>nul" + # NOTE: without the quotes, will get an error + # Redirection to 'nul' failed: FileStream will not open Win32 devices such as disk partitions and tape drives. Avoid use of "\\.\" in the path. + } else { + $o = get-content -encoding ascii -raw -path $inputfile + if ($join_flag) { + $o = $o -replace '\r?\n', '' + } + [IO.File]::WriteAllBytes($outputfilepath, [Convert]::FromBase64String($o)) } - [IO.File]::WriteAllBytes($outputfilepath, [Convert]::FromBase64String($o)) } else { - $o = [Convert]::ToBase64String([IO.File]::ReadAllBytes($inputfile)) - if ($split_flag) { - # https://stackoverflow.com/questions/1450774/splitting-a-string-into-chunks-of-a-certain-size - add-type -typeDefinition @' + # see also: https://raw.githubusercontent.com/Empyreal96/win-10-services-toolbox/master/Windows-Toolkit.cmd + if ($useutil_flag) { + if (test-path -path $outputfilepath ) { + remove-item -path $outputfilepath -erroraction silentlycontinue -force + } + write-host ("C:\Windows\System32\certutil.exe -encode ""${inputfile}"" ""${outputfile}"" >nul 2>nul") + cmd %% - /c "C:\Windows\System32\certutil.exe -encode ""${inputfile}"" ""${outputfile}"" >nul 2>nul" + # NOTE: certutil.exe will add + # -----BEGIN CERTIFICATE----- + # -----END CERTIFICATE----- + # around base64 data + # Redirection to 'nul' failed: FileStream will not open Win32 devices such as disk partitions and tape drives. Avoid use of "\\.\" in the path. + } else { + $o = [Convert]::ToBase64String([IO.File]::ReadAllBytes((( resolve-path -path '.' ).path + '\' + $inputfile))) + if ($split_flag) { + # https://stackoverflow.com/questions/1450774/splitting-a-string-into-chunks-of-a-certain-size + add-type -typeDefinition @' using System; using System.Collections; using System.Collections.Generic; @@ -49,15 +76,16 @@ public static class EnumerableEx { } } '@ - # NOTE: cannot use the extension methods defined in inline Classes in Powershell: - # Method invocation failed because [System.String] does not contain a method named 'SplitBy'. - # $o.SplitBy($length) | foreach-object { write-output $_ } + # NOTE: cannot use the extension methods defined in inline Classes in Powershell: + # Method invocation failed because [System.String] does not contain a method named 'SplitBy'. + # $o.SplitBy($length) | foreach-object { write-output $_ } - out-file -encoding ascii -filepath $outputfilepath -inputobject '' - [EnumerableEx]::SplitBy($o, $length) | foreach-object { - $line = $_ - out-file -encoding ascii -filepath $outputfilepath -inputobject $line -append } - } else { - out-file -encoding ascii -filepath $outputfilepath -inputobject $o + out-file -encoding ascii -filepath $outputfilepath -inputobject '' + [EnumerableEx]::SplitBy($o, $length) | foreach-object { + $line = $_ + out-file -encoding ascii -filepath $outputfilepath -inputobject $line -append } + } else { + out-file -encoding ascii -filepath $outputfilepath -inputobject $o + } } } From 367976b500eb6d1f954a02a4bef1b1ead6059cda Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 1 Jan 2024 00:09:29 +0100 Subject: [PATCH 067/171] bumped logback version per dependabot --- java_puppeteer/pom.xml | 2 +- junit-retry-failed/pom.xml | 5 ++--- logback/pom.xml | 2 +- selenese-runner-java/pom.xml | 3 ++- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/java_puppeteer/pom.xml b/java_puppeteer/pom.xml index 638eb3ee0..85bad08b1 100644 --- a/java_puppeteer/pom.xml +++ b/java_puppeteer/pom.xml @@ -24,7 +24,7 @@ 3.3.1 1.10.0 1.7.25 - 1.2.3 + 1.2.13 28.0-jre 4.5.9 1.5.0 diff --git a/junit-retry-failed/pom.xml b/junit-retry-failed/pom.xml index 60976f004..5e2a47ac9 100644 --- a/junit-retry-failed/pom.xml +++ b/junit-retry-failed/pom.xml @@ -18,8 +18,7 @@ 1.3.2 1.8.1 4.13.2 - 1.2.9 - 1.2.13 + 1.2.13 3.8.1 2.22.2 1.7.32 @@ -44,7 +43,7 @@ ch.qos.logback logback-classic - ${logback-classic.version} + ${logback.version} ch.qos.logback diff --git a/logback/pom.xml b/logback/pom.xml index 7656a7835..1ad882bcc 100644 --- a/logback/pom.xml +++ b/logback/pom.xml @@ -19,7 +19,7 @@ 2.6 1.7 4.13.1 - 1.2.2 + 1.2.13 2.0.2 2.44.0 1.7.6 diff --git a/selenese-runner-java/pom.xml b/selenese-runner-java/pom.xml index b9b312151..db7466971 100644 --- a/selenese-runner-java/pom.xml +++ b/selenese-runner-java/pom.xml @@ -21,6 +21,7 @@ It supports test-case and test-suite which are Selenium IDE's native format.2.56.0 ${htmlunit.version} ${htmlunit.version} + 1.2.13 3.56.0 1.7.32 file://${basedir}/version-rules.xml @@ -519,7 +520,7 @@ It supports test-case and test-suite which are Selenium IDE's native format. ch.qos.logback logback-classic - 1.2.3 + ${logback.version} xalan From 1232989609e1d000e375d53e1e8b60a493fd6fe8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 31 Dec 2023 23:17:40 +0000 Subject: [PATCH 068/171] Bump commons-io from 2.5 to 2.7 in /jenkins-audit2db-plugin Bumps commons-io from 2.5 to 2.7. Signed-off-by: dependabot[bot] --- jenkins-audit2db-plugin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins-audit2db-plugin/pom.xml b/jenkins-audit2db-plugin/pom.xml index 9a4fe6391..55b1b58f5 100644 --- a/jenkins-audit2db-plugin/pom.xml +++ b/jenkins-audit2db-plugin/pom.xml @@ -32,7 +32,7 @@ 2.2 - 2.5 + 2.7 3.5.6-Final 3.2.0.Final 1.0.0.Final From 132c9255cbc7e3b2f6542bbe4faa20aaebbb64ae Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Wed, 3 Jan 2024 21:36:19 -0500 Subject: [PATCH 069/171] intermediate revision - added demo of Windows-specfic "isAlive" "isProcessIdRunningOnWindows" method --- basic-processhandle/README.md | 13 +++++++++++++ basic-processhandle/pom.xml | 2 +- basic-processhandle/src/main/java/example/App.java | 6 +++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/basic-processhandle/README.md b/basic-processhandle/README.md index 9ea2ca141..ab2d4450a 100644 --- a/basic-processhandle/README.md +++ b/basic-processhandle/README.md @@ -69,6 +69,10 @@ ascii;, 2021-09-19 18:41:39 [main] - INFO Waiting for 30000 millisecond 2021-09-19 18:42:09 [main] - INFO C:\TEMP\pidfile.txt data:2832 2021-09-19 18:42:09 [main] - INFO is alive: true +2021-09-19 18:42:20 [main] - INFO Running the command: [cmd, /c, tasklist /FI "PID eq 2832"] +2021-09-19 18:42:29 [main] - INFO is alive (Windows version): true +2021-09-19 18:42:49 [main] - INFO Killing the process pid: 2832 +``` 2021-09-19 18:42:09 [main] - INFO Killing the process pid: 2832 ``` NOTE the doubled commas in the `ProcessBuilder arguments` above is expected - needed to build Powershell's `start-process` `ArgumentListt` part: @@ -122,6 +126,15 @@ currentdir: C:\developer\sergueik\selenium_java\basic-processhandle path:C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\local\bin;C:\Program Files\Git\usr\bin;C:\Program Files\Git\usr\bin;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\Users\sergueik\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;c:\java\zulu11.45.27-ca-jdk11.0.10-win_x64\bin ``` without `--debug` flag there will be no logging + +### TODO + +can not use the XML comment: +```text +[ERROR] Non-parseable POM c:\developer\sergueik\selenium_java\basic-processhandle\pom.xml: in comment after two dashes (--) next character must be > not r ( position: END_TAG seen ...${java.version}\r\n 2.0 - 2.5.0 + 2.9.0 3.6.1 diff --git a/html-pdf-service/pom.xml b/html-pdf-service/pom.xml index c7f063593..8a44e21ea 100644 --- a/html-pdf-service/pom.xml +++ b/html-pdf-service/pom.xml @@ -187,7 +187,7 @@ com.jayway.jsonpath json-path - 2.2.0 + 2.9.0 diff --git a/sample_selenium_cdp/pom.xml b/sample_selenium_cdp/pom.xml index 9f027db2d..722f9cd1f 100644 --- a/sample_selenium_cdp/pom.xml +++ b/sample_selenium_cdp/pom.xml @@ -11,6 +11,7 @@ 2.7 2.6 4.13.1 + 2.9.0 3.6.1 4.0.0-alpha-2 @@ -44,8 +45,8 @@ com.jayway.jsonpath - json-path-assert - 2.4.0 + json-path + ${json-path.version} commons-codec From ec8779d674038f5a96d9a724e841e77f117bdd96 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 17 Feb 2024 00:28:04 +0100 Subject: [PATCH 072/171] intermediate revision - removed unused testng dependency, fixd the Invalid PDF Test --- pdf_content_test/dummy.pdf | Bin pdf_content_test/pom.xml | 23 +----------------- .../src/test/java/example/InvalidPdfTest.java | 8 +++--- 3 files changed, 6 insertions(+), 25 deletions(-) create mode 100644 pdf_content_test/dummy.pdf diff --git a/pdf_content_test/dummy.pdf b/pdf_content_test/dummy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pdf_content_test/pom.xml b/pdf_content_test/pom.xml index 736d87625..12c14f115 100644 --- a/pdf_content_test/pom.xml +++ b/pdf_content_test/pom.xml @@ -4,7 +4,7 @@ com.mycompany.app pdf_content_test jar - 0.1-SNAPSHOT + 0.2.0-SNAPSHOT app http://maven.apache.org @@ -24,7 +24,6 @@ 1.8 3.1.0 2.20 - 6.14.3 @@ -64,17 +63,6 @@ junit ${junit.version} - - org.testng - testng - ${testng.version} - - - junit - junit - - - @@ -126,15 +114,6 @@ Fatal error compiling: invalid flag: -Dfile.encoding=UTF-8 -> [Help 1] false ${encoding} - - -Dfile.encoding=${encoding} true diff --git a/pdf_content_test/src/test/java/example/InvalidPdfTest.java b/pdf_content_test/src/test/java/example/InvalidPdfTest.java index 2e430ebb4..48bbc3090 100644 --- a/pdf_content_test/src/test/java/example/InvalidPdfTest.java +++ b/pdf_content_test/src/test/java/example/InvalidPdfTest.java @@ -18,16 +18,18 @@ public class InvalidPdfTest { public void throws_IOException_ifFailedToReadPdfFile() throws IOException { new PDF(new File("src/test/resources/invalid-file.pdf")); } - + // NOTE: need to create the file + // touch dummy.pdf @Test public void throws_IllegalArgumentException_inCaseOfInvalidPdfFile() throws IOException { + final String filename = "dummy.pdf"; try { - new PDF(new File("build.gradle")); + new PDF(new File(filename)); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) { assertThat(expected.getMessage(), is("Invalid PDF file: " - + System.getProperty("user.dir") + "/build.gradle")); + + System.getProperty("user.dir") + "/" + filename)); assertThat(expected.getCause(), is(notNullValue())); } } From 4729a207416de8ba169613bc7d15d732268f4fc9 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Sat, 17 Feb 2024 00:39:26 +0100 Subject: [PATCH 073/171] bumped testng version per dependabot --- jna_autoit/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jna_autoit/pom.xml b/jna_autoit/pom.xml index e65e2a236..bb943cac8 100644 --- a/jna_autoit/pom.xml +++ b/jna_autoit/pom.xml @@ -3,7 +3,7 @@ 4.0.0 example jnautoit - 0.0.11-SNAPSHOT + 0.12.0-SNAPSHOT jar JNAutoIt JNAutoIt - Java Native wrapper of AutoItX dll @@ -21,7 +21,7 @@ ${selenium.version} ${selenium.version} ${selenium.version} - 6.14.3 + 7.5.1 From c089c0917fef400ed44febbfa14d30999b5ebdba Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 26 Feb 2024 16:26:16 -0500 Subject: [PATCH 074/171] bumped commons-compress version per dependabot --- selenium-drivers-download-plugin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selenium-drivers-download-plugin/pom.xml b/selenium-drivers-download-plugin/pom.xml index 5dc14efd3..0bd6f781f 100644 --- a/selenium-drivers-download-plugin/pom.xml +++ b/selenium-drivers-download-plugin/pom.xml @@ -35,7 +35,7 @@ 1.10 1.3.2 2.7 - 1.21 + 1.26.0 2.8.9 1.3 4.5.13 From 486101d5adac62824c6eb7e67aae3be5906332fa Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 27 Feb 2024 00:41:21 +0100 Subject: [PATCH 075/171] bumped version of commons-text per dependabot and made uniform through properties --- selenese-runner-clone/pom.xml | 3 ++- selenese-runner-java/pom.xml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/selenese-runner-clone/pom.xml b/selenese-runner-clone/pom.xml index 6bd6c8792..6cdcfc15a 100644 --- a/selenese-runner-clone/pom.xml +++ b/selenese-runner-clone/pom.xml @@ -46,6 +46,7 @@ 1.8 1.8 true + 1.10.0 4.0.0 2.52.0 ${htmlunit.version} @@ -563,7 +564,7 @@ org.apache.commons commons-text - 1.10.0 + ${commons-text.version} commons-io diff --git a/selenese-runner-java/pom.xml b/selenese-runner-java/pom.xml index db7466971..d4a51bf18 100644 --- a/selenese-runner-java/pom.xml +++ b/selenese-runner-java/pom.xml @@ -16,6 +16,7 @@ It supports test-case and test-suite which are Selenium IDE's native format.1.8 1.8 2.7 + 1.10.0 true 4.1.1 2.56.0 @@ -495,7 +496,7 @@ It supports test-case and test-suite which are Selenium IDE's native format. org.apache.commons commons-text - 1.10.0 + ${commons-text.version} commons-io From fb70dfe088b2b9c20c7f1bb3943682fa82de6bc0 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Tue, 27 Feb 2024 00:44:45 +0100 Subject: [PATCH 076/171] bumped the version of commons-fileupload and commonts-net per depenabot --- selenese-runner-clone/pom.xml | 3 ++- selenese-runner-java/pom.xml | 3 ++- selenide-pr/pom.xml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/selenese-runner-clone/pom.xml b/selenese-runner-clone/pom.xml index 6cdcfc15a..e6fa5988b 100644 --- a/selenese-runner-clone/pom.xml +++ b/selenese-runner-clone/pom.xml @@ -47,6 +47,7 @@ 1.8 true 1.10.0 + 3.9.0 4.0.0 2.52.0 ${htmlunit.version} @@ -400,7 +401,7 @@ commons-net commons-net - 3.8.0 + ${commons-net.version} org.apache.ant diff --git a/selenese-runner-java/pom.xml b/selenese-runner-java/pom.xml index d4a51bf18..47401ed71 100644 --- a/selenese-runner-java/pom.xml +++ b/selenese-runner-java/pom.xml @@ -16,6 +16,7 @@ It supports test-case and test-suite which are Selenium IDE's native format.1.8 1.8 2.7 + 3.9.0 1.10.0 true 4.1.1 @@ -323,7 +324,7 @@ It supports test-case and test-suite which are Selenium IDE's native format. commons-net commons-net - 3.6 + ${commons-net.version} org.apache.ant diff --git a/selenide-pr/pom.xml b/selenide-pr/pom.xml index 086b55a29..3b01ba667 100644 --- a/selenide-pr/pom.xml +++ b/selenide-pr/pom.xml @@ -13,7 +13,7 @@ SimpleToolBarEx UTF-8 2.0 - 1.4 + 1.5 4.2 1.3 2.7 From 5e9dbf8dfc313976b022c8aa102ad525ba6b0eb2 Mon Sep 17 00:00:00 2001 From: Serguei Kouzmine Date: Mon, 26 Feb 2024 14:10:02 -0800 Subject: [PATCH 077/171] addedlow diagram of the archutecture --- utils/install.pptx | Bin 0 -> 114514 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 utils/install.pptx diff --git a/utils/install.pptx b/utils/install.pptx new file mode 100644 index 0000000000000000000000000000000000000000..06cb0f3e04f456d6e0e04587d14cca55b73821b8 GIT binary patch literal 114514 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