Repository: apache/streampipes
Pull request #1177 (2023-01-30 02:34:33)

Bump checkstyle from 9.2.1 to 10.6.0
Bumps [checkstyle](https://github.com/checkstyle/checkstyle) from 9.2.1 to 10.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/checkstyle/checkstyle/releases">checkstyle's releases</a>.</em></p>
<blockquote>
<h2>checkstyle-10.6.0</h2>
<p>Checkstyle 10.6.0 - <a href="https://checkstyle.org/releasenotes.html#Release_10.6.0">https://checkstyle.org/releasenotes.html#Release_10.6.0</a></p>
<p>Breaking backward compatibility:</p>
<p><a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12520">#12520</a> - Simplify JavadocStyleCheck: remove functionality for missing package-info Javadoc</p>
<p>Bug fixes:</p>
<p><a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12409">#12409</a> - Inconsistent allowedAbbreviations when a method contains an underscore
<a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12486">#12486</a> - NoWhitespaceAfter false positive on synchronized method
<a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/11807">#11807</a> - Null pointer exception with records in RequireThisCheck</p>
<!-- raw HTML omitted -->
<h2>checkstyle-10.5.0</h2>
<p>Checkstyle 10.5.0 - <a href="https://checkstyle.org/releasenotes.html#Release_10.5.0">https://checkstyle.org/releasenotes.html#Release_10.5.0</a></p>
<p>New:</p>
<p><a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/11644">#11644</a> - Allow 3rd party Check providers to group modules under custom parent module</p>
<p>Bug fixes:</p>
<p><a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12443">#12443</a> - checkstyle 10.3.3 and newer throws NullPointerException on annotated generic types from IllegalType rule
<a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12345">#12345</a> - False positive in NoWhiteSpaceAfter
<a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12291">#12291</a> - EmptyForInitializerPad: ArrayIndexOutOfBoundsException</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/checkstyle/checkstyle/commit/233c91be45abc1ddf67c1df7bc8f9f8ab64caa1c"><code>233c91b</code></a> [maven-release-plugin] prepare release checkstyle-10.6.0</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/c9824616f9d4a36fc28e4ca74dc0a84f1abc1846"><code>c982461</code></a> config: maven has problems to push, moving push to action level</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/2826b1b187a0f6319cd5d82d9ab8dd080569cc27"><code>2826b1b</code></a> config: git push commands need write permission in actions</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/311a1b73a1b1dd78d8239c67afae3b9dcaebcdc3"><code>311a1b7</code></a> config: skip pgp sign plugin during release:prepare as we do not sign commits</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/04347b174250df76be234dc59089816f1419979c"><code>04347b1</code></a> doc: release notes for 10.6.0</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/d12ffc7ea53674a661c2702908b7242a1c442466"><code>d12ffc7</code></a> Issue <a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12409">#12409</a>: Inconsistentency In  Allowed Abbreviations</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/a5be3cff4896c82d35fc556ed684dbeb8ceaddc7"><code>a5be3cf</code></a> minor: Bump version to 10.6.0-SNAPSHOT</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/ebb46cba359037bddca15bf7b8b6264463920f3a"><code>ebb46cb</code></a> Issue <a href="https://github-redirect.dependabot.com/checkstyle/checkstyle/issues/12520">#12520</a>: removes missing package-info Javadoc check in JavadocStyle</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/475063f103bf321184a76179bfdd34f4be9f39ed"><code>475063f</code></a> supplemental: Forbid usage of <a href="https://github.com/BeforeAll"><code>@​BeforeAll</code></a> in tests</li>
<li><a href="https://github.com/checkstyle/checkstyle/commit/069905ab1bdd6a866a6b2c1090c192e82e83100c"><code>069905a</code></a> config: upgrade sevntu to 1.44.1</li>
<li>Additional commits viewable in <a href="https://github.com/checkstyle/checkstyle/compare/checkstyle-9.2.1...checkstyle-10.6.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.puppycrawl.tools:checkstyle&package-manager=maven&previous-version=9.2.1&new-version=10.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/pom.xml b/pom.xml
index 045286e085..f7d7615eb3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -205,7 +205,7 @@
 
 	<apache-rat-plugin.version>0.13</apache-rat-plugin.version>
 	<checksum-maven-plugin.version>1.11</checksum-maven-plugin.version>
-	<checkstyle.version>9.2.1</checkstyle.version>
+	<checkstyle.version>10.6.0</checkstyle.version>
 	<extra-enforcer-rules.version>1.6.1</extra-enforcer-rules.version>
 	<formatter-maven-plugin.version>2.21.0</formatter-maven-plugin.version>
 	<maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version>
diff --git a/streampipes-client-python/setup.py b/streampipes-client-python/setup.py
index f2c54a404e..56dfb64611 100644
--- a/streampipes-client-python/setup.py
+++ b/streampipes-client-python/setup.py
@@ -43,7 +43,7 @@ dev_packages = base_packages + [
     "blacken-docs==1.13.0",
     "flake8==6.0.0",
     "interrogate==1.5.0",
-    "isort==5.11.4",
+    "isort==5.12.0",
     "mypy==0.991",
     "pandas-stubs==1.5.2.230105",
     "pre-commit==3.0.0",
diff --git a/streampipes-client/pom.xml b/streampipes-client/pom.xml
index 7db3fee9f2..ee91bc71c4 100644
--- a/streampipes-client/pom.xml
+++ b/streampipes-client/pom.xml
@@ -71,6 +71,13 @@
             <version>0.91.0-SNAPSHOT</version>
         </dependency>
 
+        <!-- Test dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
         <!-- 3rd party Dependencies -->
         <dependency>
             <groupId>commons-collections</groupId>
diff --git a/streampipes-client/src/main/java/org/apache/streampipes/client/api/CustomRequestApi.java b/streampipes-client/src/main/java/org/apache/streampipes/client/api/CustomRequestApi.java
index b4e679fef8..9b9a453bcb 100644
--- a/streampipes-client/src/main/java/org/apache/streampipes/client/api/CustomRequestApi.java
+++ b/streampipes-client/src/main/java/org/apache/streampipes/client/api/CustomRequestApi.java
@@ -20,6 +20,8 @@ package org.apache.streampipes.client.api;
 import org.apache.streampipes.client.model.StreamPipesClientConfig;
 import org.apache.streampipes.client.util.StreamPipesApiPath;
 
+import java.util.Map;
+
 public class CustomRequestApi extends AbstractClientApi {
 
   public CustomRequestApi(StreamPipesClientConfig clientConfig) {
@@ -34,4 +36,11 @@ public class CustomRequestApi extends AbstractClientApi {
     return getSingle(StreamPipesApiPath.fromStreamPipesBasePath(apiPath), responseClass);
   }
 
+  public <T> T sendGet(String apiPath, Map<String, String> queryParameters, Class<T> responseClass) {
+    return getSingle(
+        StreamPipesApiPath.fromStreamPipesBasePath(apiPath)
+            .withQueryParameters(queryParameters),
+        responseClass);
+  }
+
 }
diff --git a/streampipes-client/src/main/java/org/apache/streampipes/client/util/StreamPipesApiPath.java b/streampipes-client/src/main/java/org/apache/streampipes/client/util/StreamPipesApiPath.java
index f083217e11..72fff42a5b 100644
--- a/streampipes-client/src/main/java/org/apache/streampipes/client/util/StreamPipesApiPath.java
+++ b/streampipes-client/src/main/java/org/apache/streampipes/client/util/StreamPipesApiPath.java
@@ -17,19 +17,25 @@
  */
 package org.apache.streampipes.client.util;
 
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.StringJoiner;
 
 public class StreamPipesApiPath {
 
   private static final List<String> BaseApiPathV2 = Arrays.asList("streampipes-backend", "api", "v2");
-  private List<String> pathItems;
+  private final List<String> pathItems;
+  private final Map<String, String> queryParameters;
 
   private StreamPipesApiPath(List<String> initialPathItems) {
     this.pathItems = initialPathItems;
+    this.queryParameters = new HashMap<>();
   }
 
   public static StreamPipesApiPath fromStreamPipesBasePath() {
@@ -51,10 +57,33 @@ public class StreamPipesApiPath {
     return this;
   }
 
+  public StreamPipesApiPath withQueryParameters(Map<String, String> queryParameters) {
+    this.queryParameters.putAll(queryParameters);
+    return this;
+  }
+
   @Override
   public String toString() {
     StringJoiner joiner = new StringJoiner("/");
     pathItems.forEach(joiner::add);
-    return joiner.toString();
+    return appendQueryParameters(joiner.toString());
+  }
+
+  private String appendQueryParameters(String input) {
+
+    StringJoiner joiner = new StringJoiner("&");
+    for (Map.Entry<String, String> parameter : queryParameters.entrySet()) {
+      joiner.add(applyEncoding(parameter.getKey()) + "=" + applyEncoding(parameter.getValue()));
+    }
+
+    if (joiner.length() > 0) {
+      return input + "?" + joiner;
+    } else {
+      return input;
+    }
+  }
+
+  private String applyEncoding(String value) {
+    return URLEncoder.encode(value, StandardCharsets.UTF_8);
   }
 }
diff --git a/ui/package-lock.json b/ui/package-lock.json
index d9e2b12b16..17fd69e83a 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -91,7 +91,7 @@
         "@types/node": "^18.11.18",
         "@types/rx": "^4.1.2",
         "@types/showdown": "1.9.4",
-        "@typescript-eslint/eslint-plugin": "5.48.0",
+        "@typescript-eslint/eslint-plugin": "5.49.0",
         "@typescript-eslint/parser": "5.48.0",
         "ajv-keywords": "^5.1.0",
         "assert": "^2.0.0",
@@ -6171,14 +6171,14 @@
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "5.48.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz",
-      "integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==",
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz",
+      "integrity": "sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.48.0",
-        "@typescript-eslint/type-utils": "5.48.0",
-        "@typescript-eslint/utils": "5.48.0",
+        "@typescript-eslint/scope-manager": "5.49.0",
+        "@typescript-eslint/type-utils": "5.49.0",
+        "@typescript-eslint/utils": "5.49.0",
         "debug": "^4.3.4",
         "ignore": "^5.2.0",
         "natural-compare-lite": "^1.4.0",
@@ -6203,14 +6203,31 @@
         }
       }
     },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz",
+      "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.49.0",
+        "@typescript-eslint/visitor-keys": "5.49.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
     "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
-      "version": "5.48.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz",
-      "integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==",
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz",
+      "integrity": "sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "5.48.0",
-        "@typescript-eslint/utils": "5.48.0",
+        "@typescript-eslint/typescript-estree": "5.49.0",
+        "@typescript-eslint/utils": "5.49.0",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
       },
@@ -6230,17 +6247,57 @@
         }
       }
     },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz",
+      "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz",
+      "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.49.0",
+        "@typescript-eslint/visitor-keys": "5.49.0",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
-      "version": "5.48.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz",
-      "integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==",
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz",
+      "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==",
       "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.9",
         "@types/semver": "^7.3.12",
-        "@typescript-eslint/scope-manager": "5.48.0",
-        "@typescript-eslint/types": "5.48.0",
-        "@typescript-eslint/typescript-estree": "5.48.0",
+        "@typescript-eslint/scope-manager": "5.49.0",
+        "@typescript-eslint/types": "5.49.0",
+        "@typescript-eslint/typescript-estree": "5.49.0",
         "eslint-scope": "^5.1.1",
         "eslint-utils": "^3.0.0",
         "semver": "^7.3.7"
@@ -6256,6 +6313,23 @@
         "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz",
+      "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.49.0",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
     "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-scope": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -31057,14 +31131,14 @@
       }
     },
     "@typescript-eslint/eslint-plugin": {
-      "version": "5.48.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz",
-      "integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==",
+      "version": "5.49.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz",
+      "integrity": "sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "5.48.0",
-        "@typescript-eslint/type-utils": "5.48.0",
-        "@typescript-eslint/utils": "5.48.0",
+        "@typescript-eslint/scope-manager": "5.49.0",
+        "@typescript-eslint/type-utils": "5.49.0",
+        "@typescript-eslint/utils": "5.49.0",
         "debug": "^4.3.4",
         "ignore": "^5.2.0",
         "natural-compare-lite": "^1.4.0",
@@ -31073,34 +31147,75 @@
         "tsutils": "^3.21.0"
       },
       "dependencies": {
+        "@typescript-eslint/scope-manager": {
+          "version": "5.49.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz",
+          "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.49.0",
+            "@typescript-eslint/visitor-keys": "5.49.0"
+          }
+        },
         "@typescript-eslint/type-utils": {
-          "version": "5.48.0",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz",
-          "integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==",
+          "version": "5.49.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz",
+          "integrity": "sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA==",
           "dev": true,
           "requires": {
-            "@typescript-eslint/typescript-estree": "5.48.0",
-            "@typescript-eslint/utils": "5.48.0",
+            "@typescript-eslint/typescript-estree": "5.49.0",
+            "@typescript-eslint/utils": "5.49.0",
             "debug": "^4.3.4",
             "tsutils": "^3.21.0"
           }
         },
+        "@typescript-eslint/types": {
+          "version": "5.49.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz",
+          "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==",
+          "dev": true
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "5.49.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz",
+          "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.49.0",
+            "@typescript-eslint/visitor-keys": "5.49.0",
+            "debug": "^4.3.4",
+            "globby": "^11.1.0",
+            "is-glob": "^4.0.3",
+            "semver": "^7.3.7",
+            "tsutils": "^3.21.0"
+          }
+        },
         "@typescript-eslint/utils": {
-          "version": "5.48.0",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz",
-          "integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==",
+          "version": "5.49.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz",
+          "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==",
           "dev": true,
           "requires": {
             "@types/json-schema": "^7.0.9",
             "@types/semver": "^7.3.12",
-            "@typescript-eslint/scope-manager": "5.48.0",
-            "@typescript-eslint/types": "5.48.0",
-            "@typescript-eslint/typescript-estree": "5.48.0",
+            "@typescript-eslint/scope-manager": "5.49.0",
+            "@typescript-eslint/types": "5.49.0",
+            "@typescript-eslint/typescript-estree": "5.49.0",
             "eslint-scope": "^5.1.1",
             "eslint-utils": "^3.0.0",
             "semver": "^7.3.7"
           }
         },
+        "@typescript-eslint/visitor-keys": {
+          "version": "5.49.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz",
+          "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.49.0",
+            "eslint-visitor-keys": "^3.3.0"
+          }
+        },
         "eslint-scope": {
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
diff --git a/ui/package.json b/ui/package.json
index 27f1da31eb..0296b449db 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -113,7 +113,7 @@
     "@types/node": "^18.11.18",
     "@types/rx": "^4.1.2",
     "@types/showdown": "1.9.4",
-    "@typescript-eslint/eslint-plugin": "5.48.0",
+    "@typescript-eslint/eslint-plugin": "5.49.0",
     "@typescript-eslint/parser": "5.48.0",
     "ajv-keywords": "^5.1.0",
     "assert": "^2.0.0",


Test patch:
diff --git a/streampipes-client/src/test/java/org/apache/streampipes/client/util/StreamPipesApiPathTest.java b/streampipes-client/src/test/java/org/apache/streampipes/client/util/StreamPipesApiPathTest.java
new file mode 100644
index 0000000000..96444594f3
--- /dev/null
+++ b/streampipes-client/src/test/java/org/apache/streampipes/client/util/StreamPipesApiPathTest.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.streampipes.client.util;
+
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class StreamPipesApiPathTest {
+  Map<String, String> queryParameters = new HashMap();
+
+  StreamPipesApiPath streamPipesApiPath = StreamPipesApiPath
+      .fromBaseApiPath();
+
+  String baseRoute = streamPipesApiPath.toString();
+
+  @Test
+  public void testWithEmptyQueryParameters() {
+
+    var result = streamPipesApiPath
+        .withQueryParameters(queryParameters)
+        .toString();
+
+    assertEquals(baseRoute, result);
+  }
+
+  @Test
+  public void testWithOneQueryParameter() {
+    queryParameters.put("one", "v1");
+
+    var result = streamPipesApiPath
+        .withQueryParameters(queryParameters)
+        .toString();
+
+    assertEquals(baseRoute + "?one=v1", result);
+  }
+
+  @Test
+  public void testWithMultipleQueryParameters() {
+    queryParameters.put("one", "v1");
+    queryParameters.put("two", "v2");
+
+    var result = streamPipesApiPath
+        .withQueryParameters(queryParameters)
+        .toString();
+
+    assertEquals(baseRoute + "?two=v2&one=v1", result);
+  }
+
+  @Test
+  public void testEncodeParameters() {
+    queryParameters.put("one", "[v1]");
+
+    var result = streamPipesApiPath
+        .withQueryParameters(queryParameters)
+        .toString();
+
+    assertEquals(baseRoute + "?one=%5Bv1%5D", result);
+  }
+
+}
\ No newline at end of file