From bacec1ccfb35517cfe25df028825eaf52bc29c5d Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Fri, 2 Jul 2021 17:04:08 +1000 Subject: [PATCH 01/68] Fix Webstorm/other IDEA IDE installs by removing XML declared dependency. --- src/ServiceStackIDEA/build.gradle | 2 +- src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ServiceStackIDEA/build.gradle b/src/ServiceStackIDEA/build.gradle index 1e06d97..3bcdd32 100644 --- a/src/ServiceStackIDEA/build.gradle +++ b/src/ServiceStackIDEA/build.gradle @@ -1,7 +1,7 @@ plugins { id "org.jetbrains.intellij" version "0.6.5" } -version = '1.0.41' +version = '1.0.43' repositories { mavenCentral() } diff --git a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml index af362d5..649ec40 100644 --- a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml +++ b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml @@ -36,7 +36,6 @@ on how to target different products --> com.intellij.modules.platform com.intellij.modules.lang - com.intellij.java From ec1479236cdb671143dade8903e1103d626060d7 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 5 Jul 2021 16:53:36 +1000 Subject: [PATCH 02/68] Update build.gradle as per Jetbrains review email. --- src/ServiceStackIDEA/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStackIDEA/build.gradle b/src/ServiceStackIDEA/build.gradle index 3bcdd32..a0386db 100644 --- a/src/ServiceStackIDEA/build.gradle +++ b/src/ServiceStackIDEA/build.gradle @@ -27,7 +27,7 @@ jbToken = properties.getProperty("jetbrains.plugins.token") intellij { version '2019.2' - plugins = ['maven','com.intellij.java'] + plugins = ['maven','java'] pluginName 'ServiceStackIDEA' updateSinceUntilBuild false From 9cb8a12b1f369b4efd3671a3194383be911094f1 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 5 Jul 2021 17:20:16 +1000 Subject: [PATCH 03/68] Update plugin.xml as I think both are needed.. Both builds with/without work locally with webstorm but seems I am just trying to get it to pass 'review'. --- src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml index 649ec40..7ebb779 100644 --- a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml +++ b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml @@ -36,6 +36,7 @@ on how to target different products --> com.intellij.modules.platform com.intellij.modules.lang + com.intellij.modules.java From ed1c2b538644cac5cc5e9fffb79444acf9680ff5 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 6 Jul 2021 15:52:23 +1000 Subject: [PATCH 04/68] Set `com.intellij.modules.java` as optional dependency. --- src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml index 7ebb779..e6430cb 100644 --- a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml +++ b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml @@ -36,7 +36,7 @@ on how to target different products --> com.intellij.modules.platform com.intellij.modules.lang - com.intellij.modules.java + com.intellij.modules.java From d59b638490df6d4cbd89ce808f14d726a312358e Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 7 Jul 2021 16:33:32 +1000 Subject: [PATCH 05/68] Remove ServiceStackIDEA from this repository as it has been moved to github.com/ServiceStack/ServiceStackIDEA --- src/ServiceStackIDEA/.idea/.name | 1 - .../.idea/copyright/profiles_settings.xml | 3 - src/ServiceStackIDEA/.idea/vcs.xml | 6 - src/ServiceStackIDEA/README.md | 53 --- src/ServiceStackIDEA/ServiceStackIDEA.iml | 131 ------ src/ServiceStackIDEA/build.gradle | 38 -- .../gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - src/ServiceStackIDEA/gradlew | 185 --------- src/ServiceStackIDEA/gradlew.bat | 89 ---- src/ServiceStackIDEA/settings.gradle | 2 - .../java/net/servicestack/idea/AddRef.form | 167 -------- .../java/net/servicestack/idea/AddRef.java | 392 ------------------ .../idea/AddServiceStackAction.java | 210 ---------- .../idea/AddServiceStackRefHandler.java | 213 ---------- .../idea/AddTypeScriptAction.java | 93 ----- .../servicestack/idea/AddTypeScriptRef.form | 159 ------- .../servicestack/idea/AddTypeScriptRef.java | 310 -------------- .../idea/AddTypeScriptRefHandler.java | 77 ---- .../java/net/servicestack/idea/Analytics.java | 49 --- .../idea/BaseNativeTypesHandler.java | 77 ---- .../idea/DartNativeTypesHandler.java | 18 - .../java/net/servicestack/idea/DepConfig.java | 22 - .../idea/DialogErrorMessages.java | 26 -- .../idea/GradleBuildFileHelper.java | 132 ------ .../servicestack/idea/IDEAPomFileHelper.java | 196 --------- .../java/net/servicestack/idea/IDEAUtils.java | 119 ------ .../idea/INativeTypesHandler.java | 21 - .../idea/JavaNativeTypesHandler.java | 34 -- .../idea/KotlinNativeTypesHandler.java | 34 -- .../idea/NativeTypesLanguage.java | 12 - .../idea/PluginSettingsConfigurable.java | 90 ---- .../idea/PluginSettingsService.java | 29 -- .../servicestack/idea/PluginSettingsView.form | 26 -- .../servicestack/idea/PluginSettingsView.java | 59 --- .../TypeScriptConcreteNativeTypesHandler.java | 21 - .../idea/TypeScriptNativeTypesHandler.java | 21 - .../idea/UpdateServiceStackReference.java | 102 ----- .../UpdateServiceStackReferenceIntention.java | 62 --- .../idea/UpdateServiceStackUtils.java | 166 -------- .../src/main/resources/META-INF/plugin.xml | 73 ---- .../after.java.template | 0 .../before.java.template | 0 .../description.html | 7 - .../src/main/resources/logo-16.png | Bin 3057 -> 0 bytes .../src/test/java/AddRefTest.java | 48 --- 46 files changed, 3578 deletions(-) delete mode 100644 src/ServiceStackIDEA/.idea/.name delete mode 100644 src/ServiceStackIDEA/.idea/copyright/profiles_settings.xml delete mode 100644 src/ServiceStackIDEA/.idea/vcs.xml delete mode 100644 src/ServiceStackIDEA/README.md delete mode 100644 src/ServiceStackIDEA/ServiceStackIDEA.iml delete mode 100644 src/ServiceStackIDEA/build.gradle delete mode 100644 src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar delete mode 100644 src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties delete mode 100644 src/ServiceStackIDEA/gradlew delete mode 100644 src/ServiceStackIDEA/gradlew.bat delete mode 100644 src/ServiceStackIDEA/settings.gradle delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.form delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackAction.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackRefHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptAction.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.form delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRefHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/Analytics.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/BaseNativeTypesHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DartNativeTypesHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DepConfig.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DialogErrorMessages.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/GradleBuildFileHelper.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAPomFileHelper.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAUtils.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/INativeTypesHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/JavaNativeTypesHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/KotlinNativeTypesHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/NativeTypesLanguage.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsConfigurable.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.form delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptConcreteNativeTypesHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptNativeTypesHandler.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReference.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReferenceIntention.java delete mode 100644 src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackUtils.java delete mode 100644 src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml delete mode 100644 src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/after.java.template delete mode 100644 src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/before.java.template delete mode 100644 src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/description.html delete mode 100644 src/ServiceStackIDEA/src/main/resources/logo-16.png delete mode 100644 src/ServiceStackIDEA/src/test/java/AddRefTest.java diff --git a/src/ServiceStackIDEA/.idea/.name b/src/ServiceStackIDEA/.idea/.name deleted file mode 100644 index bd17f1d..0000000 --- a/src/ServiceStackIDEA/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -ServiceStackIDEA.iml \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/copyright/profiles_settings.xml b/src/ServiceStackIDEA/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/src/ServiceStackIDEA/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/vcs.xml b/src/ServiceStackIDEA/.idea/vcs.xml deleted file mode 100644 index b2bdec2..0000000 --- a/src/ServiceStackIDEA/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/README.md b/src/ServiceStackIDEA/README.md deleted file mode 100644 index efe61fe..0000000 --- a/src/ServiceStackIDEA/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# ServiceStackIDEA plugin - -ServiceStackIDEA is a plugin for Jetbrains' IntelliJ based IDEs to support building client applications for ServiceStack services in the simplest possible way. Leveraging ServiceStack's NativeTypes feature, ServiceStackIDEA makes it easy to work with ServiceStack DTOs by providing intuitive menus for adding ServiceStack references and importing the associated client libraries as dependencies. - -ServiceStackIDEA now supports many of the most popular Jetbrains IDEs including: - -- IntelliJ - - Java, Kotlin and TypeScript -- Android Studio - - Java and Kotlin -- WebStorm, RubyMine, PhpStorm & PyCharm - - TypeScript - - -## New TypeScript Support -Since version 1.0.11, ServiceStackIDEA now supports adding new TypeScript References! - -![](https://raw.githubusercontent.com/ServiceStack/Assets/master/img/servicestackidea/webstorm-add-typescript.png) - -By right clicking on any folder in your Project explorer, you can add a TypeScript reference by simply providing any based URL of your ServiceStack server. - -![](https://raw.githubusercontent.com/ServiceStack/Assets/7474c03bdb0ea1982db2e7be57567ad1b8a4ad38/img/servicestackidea/add-typescript-ref.png) - -Once this file as been added to your project, you can update your service DTOs simply right clicking `Update Servicestack Reference` or using the light bulb action (Alt+Enter by default). - -![](https://raw.githubusercontent.com/ServiceStack/Assets/master/img/servicestackidea/webstorm-update-typescript.png) - -This now means you can integrate with a ServiceStack service easily from your favorite Jetbrains IDE when working with TypeScript! - -#### Install ServiceStack IDEA from the Plugin repository - -The ServiceStack IDEA is now available to install directly from within a supported IDE Plugins Repository, to Install Go to: - - 1. `File -> Settings...` Main Menu Item - 2. Select **Plugins** on left menu then click **Browse repositories...** at bottom - 3. Search for **ServiceStack** and click **Install plugin** - 4. Restart to load the installed ServiceStack IDEA plugin - -![](https://raw.githubusercontent.com/ServiceStack/Assets/master/img/servicestackidea/android-plugin-download.gif) - -### Development -Local development of the plugin requires: - - Java SDK 1.8 - - IntelliJ Ultimate/Community 2019.2+ (ideally 2020.3+) - -Once loaded into IntelliJ for the first time, `import gradle` project by right clicking on `build.gradle` in the Project menu. - -Once imported, run the `build` task, this should try to resolve the gradle version to use. - -#### Debugging -Use the gradle task `runIde` on Debug, this should launch 2019.2 of IntelliJ Community edition which is the ealiest version supported after ServiceStackIDEA 1.0.40. - -This breaking change came from 2019.2+ separation of Java lang features in the `com.intellij.psi.*` packages which SSIDEA uses for IntelliJ + Android studio Java support. diff --git a/src/ServiceStackIDEA/ServiceStackIDEA.iml b/src/ServiceStackIDEA/ServiceStackIDEA.iml deleted file mode 100644 index 9d0ffd9..0000000 --- a/src/ServiceStackIDEA/ServiceStackIDEA.iml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/build.gradle b/src/ServiceStackIDEA/build.gradle deleted file mode 100644 index a0386db..0000000 --- a/src/ServiceStackIDEA/build.gradle +++ /dev/null @@ -1,38 +0,0 @@ -plugins { - id "org.jetbrains.intellij" version "0.6.5" -} -version = '1.0.43' -repositories { - mavenCentral() -} -tasks.buildSearchableOptions { - enabled = false -} -apply plugin: 'org.jetbrains.intellij' -dependencies { - -} -Properties properties = System.properties -if(System.env.BUILD_NUMBER != null && System.env.SERVICESTACKIDEA_PUBLISH_NIGHTLY != null) { - // Append build number to version for a new nightly build version to be published. - version = "${version}.$System.env.BUILD_NUMBER" -} - -String jbToken - -if (properties.getProperty("jetbrains.plugins.user", null) == null) { - properties.load(project.file('./local.properties').newDataInputStream()) -} -jbToken = properties.getProperty("jetbrains.plugins.token") - -intellij { - version '2019.2' - plugins = ['maven','java'] - pluginName 'ServiceStackIDEA' - updateSinceUntilBuild false - - publishPlugin { - token jbToken - channels 'beta' - } -} diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index be52383..0000000 --- a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/src/ServiceStackIDEA/gradlew b/src/ServiceStackIDEA/gradlew deleted file mode 100644 index 4f906e0..0000000 --- a/src/ServiceStackIDEA/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# 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 -# -# https://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. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/src/ServiceStackIDEA/gradlew.bat b/src/ServiceStackIDEA/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/src/ServiceStackIDEA/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/src/ServiceStackIDEA/settings.gradle b/src/ServiceStackIDEA/settings.gradle deleted file mode 100644 index 8911fba..0000000 --- a/src/ServiceStackIDEA/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'ServiceStackIDEA' - diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.form b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.form deleted file mode 100644 index 641022f..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.form +++ /dev/null @@ -1,167 +0,0 @@ - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java deleted file mode 100644 index 49e18e0..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java +++ /dev/null @@ -1,392 +0,0 @@ -package net.servicestack.idea; - -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import com.intellij.ide.util.PackageChooserDialog; -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationType; -import com.intellij.notification.Notifications; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.TextFieldWithBrowseButton; -import com.intellij.psi.PsiPackage; -import com.intellij.ui.JBColor; -import com.intellij.uiDesigner.core.GridConstraints; -import com.intellij.uiDesigner.core.GridLayoutManager; -import com.intellij.uiDesigner.core.Spacer; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.*; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.util.*; - -public class AddRef extends JDialog { - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; - private JTextPane errorTextPane; - private JTextField addressUrlTextField; - private TextFieldWithBrowseButton packageBrowse; - private JTextField nameTextField; - private JTextPane infoTextPane; - private Module module; - - private String errorMessage; - private String selectedDirectory; - - private INativeTypesHandler defaultNativeTypesHandler; - - public AddRef(@NotNull Module module) { - this.module = module; - setContentPane(contentPane); - setModal(true); - getRootPane().setDefaultButton(buttonOK); - ImageIcon imageIcon = createImageIcon("/logo-16.png", "ServiceStack"); - if (imageIcon != null) { - this.setIconImage(imageIcon.getImage()); - } - errorTextPane.setForeground(JBColor.RED); - - buttonOK.setEnabled(false); - - addressUrlTextField.setInputVerifier(new InputVerifier() { - @Override - public boolean verify(JComponent input) { - String text = null; - if (input instanceof JTextField) { - text = ((JTextField) input).getText(); - } - - return text != null && text.length() > 0; - } - - @Override - public boolean shouldYieldFocus(JComponent input) { - boolean valid = verify(input); - if (!valid) { - errorMessage = "URL Address is required"; - errorTextPane.setVisible(true); - errorTextPane.setText(errorMessage); - } - - return true; - } - }); - nameTextField.setInputVerifier(new InputVerifier() { - @Override - public boolean verify(JComponent input) { - String text = null; - if (input instanceof JTextField) { - text = ((JTextField) input).getText(); - } - - return text != null && text.length() > 0; - } - - @Override - public boolean shouldYieldFocus(JComponent input) { - boolean valid = verify(input); - if (!valid) { - errorMessage = "A file name is required."; - errorTextPane.setVisible(true); - errorTextPane.setText(errorMessage); - } - - return true; - } - }); - - nameTextField.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - warn(); - } - - public void warn() { - buttonOK.setEnabled( - nameTextField.getInputVerifier().verify(nameTextField) && - addressUrlTextField.getInputVerifier().verify(addressUrlTextField) - ); - } - }); - - addressUrlTextField.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - warn(); - } - - public void warn() { - buttonOK.setEnabled( - nameTextField.getInputVerifier().verify(nameTextField) && - addressUrlTextField.getInputVerifier().verify(addressUrlTextField) - ); - } - }); - - buttonOK.addActionListener(e -> processOK()); - - packageBrowse.addActionListener(new BrowsePackageListener(packageBrowse, module.getProject(), "Browse packages")); - - buttonCancel.addActionListener(e -> onCancel()); - -// call onCancel() when cross is clicked - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - onCancel(); - } - }); - -// call onCancel() on ESCAPE - contentPane.registerKeyboardAction(e -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - } - - public void setSelectedPackage(@NotNull PsiPackage selectedPackage) { - setPackageBrowseText(selectedPackage.getQualifiedName()); - } - - public void setFileName(@NotNull String fileName) { - nameTextField.setText(fileName); - } - - public void setDefaultNativeTypesHandler(INativeTypesHandler nativeTypesHandler) { - defaultNativeTypesHandler = nativeTypesHandler; - } - - public void setSelectedDirectory(@NotNull String selectedDirectory) { - this.selectedDirectory = selectedDirectory; - } - - private void processOK() { - buttonOK.setEnabled(false); - buttonCancel.setEnabled(false); - errorMessage = null; - errorTextPane.setVisible(false); - - URL serviceUrl; - try { - serviceUrl = new URL("https://api.github.com/repos/ServiceStack/ServiceStack.Java/tags"); - URLConnection javaResponseConnection = serviceUrl.openConnection(); - StringBuilder builder = new StringBuilder(); - BufferedReader javaResponseReader = new BufferedReader( - new InputStreamReader( - javaResponseConnection.getInputStream())); - String metadataInputLine; - - while ((metadataInputLine = javaResponseReader.readLine()) != null) - builder.append(metadataInputLine); - - - JsonElement jElement = new JsonParser().parse(builder.toString()); - if (jElement.getAsJsonArray().size() > 0) { - String latestTag = jElement.getAsJsonArray().get(0).getAsJsonObject().get("name").getAsJsonPrimitive().getAsString(); - DepConfig.setServiceStackVersion(latestTag.substring(1)); - } - - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - Notification notification = new Notification( - "ServiceStackIDEA", - "Warning Add ServiceStack Reference", - "Unable to get latest version of required dependencies, falling back to known available version.\n" + - "Please check the JCenter/Maven Central for the latest published versions of the ServiceStack java clients and update your dependencies.", - NotificationType.WARNING); - Notifications.Bus.notify(notification); - } - - ApplicationManager.getApplication().invokeLater(() -> { - try { - onOK(); - } catch (Exception e1) { - e1.printStackTrace(); - errorMessage = errorMessage != null ? errorMessage : "An error occurred adding reference - " + e1.getMessage(); - } - if (errorMessage != null) { - errorTextPane.setVisible(true); - errorTextPane.setText(errorMessage); - } - buttonOK.setEnabled(true); - buttonCancel.setEnabled(true); - }); - - } - - private void setPackageBrowseText(String packageName) { - packageBrowse.setText(packageName); - } - - private ImageIcon createImageIcon(String path, String description) { - URL imgURL = getClass().getResource(path); - if (imgURL != null) { - return new ImageIcon(imgURL, description); - } else { - System.err.println("Couldn't find file: " + path); - return null; - } - } - - private void onOK() { - StringBuilder errorMessage = new StringBuilder(); - AddServiceStackRefHandler.handleOk( - addressUrlTextField.getText(), - packageBrowse.getText(), - nameTextField.getText(), - selectedDirectory, - module, - errorMessage); - - if (errorMessage.toString().length() > 0) { - errorTextPane.setText(errorMessage.toString()); - errorTextPane.setVisible(true); - } else { - dispose(); - } - } - - { -// GUI initializer generated by IntelliJ IDEA GUI Designer -// >>> IMPORTANT!! <<< -// DO NOT EDIT OR ADD ANY CODE HERE! - $$$setupUI$$$(); - } - - /** - * Method generated by IntelliJ IDEA GUI Designer - * >>> IMPORTANT!! <<< - * DO NOT edit this method OR call it in your code! - * - * @noinspection ALL - */ - private void $$$setupUI$$$() { - contentPane = new JPanel(); - contentPane.setLayout(new GridLayoutManager(3, 1, new Insets(10, 10, 10, 10), -1, -1)); - contentPane.setMaximumSize(new Dimension(700, 420)); - contentPane.setMinimumSize(new Dimension(400, 220)); - contentPane.setOpaque(true); - contentPane.setPreferredSize(new Dimension(550, 220)); - contentPane.setRequestFocusEnabled(true); - final JPanel panel1 = new JPanel(); - panel1.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); - contentPane.add(panel1, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, 1, null, null, null, 0, false)); - final Spacer spacer1 = new Spacer(); - panel1.add(spacer1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); - final JPanel panel2 = new JPanel(); - panel2.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1, true, false)); - panel1.add(panel2, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - buttonOK = new JButton(); - buttonOK.setText("OK"); - panel2.add(buttonOK, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - buttonCancel = new JButton(); - buttonCancel.setText("Cancel"); - panel2.add(buttonCancel, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JPanel panel3 = new JPanel(); - panel3.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1)); - panel3.setFocusable(false); - contentPane.add(panel3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - errorTextPane = new JTextPane(); - errorTextPane.setEditable(false); - errorTextPane.setFocusCycleRoot(false); - errorTextPane.setFocusable(true); - errorTextPane.setFont(new Font("Arial", errorTextPane.getFont().getStyle(), errorTextPane.getFont().getSize())); - errorTextPane.setOpaque(false); - errorTextPane.setVisible(false); - panel3.add(errorTextPane, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(150, 25), null, 0, false)); - infoTextPane = new JTextPane(); - infoTextPane.setEditable(false); - infoTextPane.setFocusCycleRoot(false); - infoTextPane.setFocusable(false); - infoTextPane.setFont(new Font("Arial", infoTextPane.getFont().getStyle(), infoTextPane.getFont().getSize())); - infoTextPane.setOpaque(false); - infoTextPane.setRequestFocusEnabled(false); - infoTextPane.setText("To generate the DTO Service Model types for a specific ServiceStack instance, enter the base URI for the remote ServiceStack server and click OK."); - panel3.add(infoTextPane, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(150, 25), null, 0, false)); - final JPanel panel4 = new JPanel(); - panel4.setLayout(new GridLayoutManager(3, 3, new Insets(0, 0, 0, 0), -1, -1)); - contentPane.add(panel4, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - final JLabel label1 = new JLabel(); - label1.setText("Address Url"); - panel4.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - addressUrlTextField = new JTextField(); - addressUrlTextField.setToolTipText("eg, http://example.com/"); - panel4.add(addressUrlTextField, new GridConstraints(0, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label2 = new JLabel(); - label2.setText("Package"); - panel4.add(label2, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - packageBrowse = new TextFieldWithBrowseButton(); - panel4.add(packageBrowse, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label3 = new JLabel(); - label3.setText("Name"); - panel4.add(label3, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - nameTextField = new JTextField(); - nameTextField.setText("dtos.java"); - panel4.add(nameTextField, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - label1.setLabelFor(addressUrlTextField); - label3.setLabelFor(nameTextField); - } - - /** - */ - public JComponent $$$getRootComponent$$$() { - return contentPane; - } - - private class BrowsePackageListener implements ActionListener { - private TextFieldWithBrowseButton _textField; - private Project _project; - private String _title; - - public BrowsePackageListener(TextFieldWithBrowseButton textField, Project project, String title) { - _textField = textField; - _project = project; - _title = title; - } - - public void actionPerformed(ActionEvent e) { - PackageChooserDialog dialog = new PackageChooserDialog(_title, _project); - dialog.selectPackage(_textField.getText()); - dialog.show(); - - if (dialog.getExitCode() == PackageChooserDialog.CANCEL_EXIT_CODE) { - return; - } - _textField.setText(dialog.getSelectedPackage().getQualifiedName()); - } - } - - private void onCancel() { - dispose(); - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackAction.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackAction.java deleted file mode 100644 index 1fd05a9..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackAction.java +++ /dev/null @@ -1,210 +0,0 @@ -package net.servicestack.idea; - -import com.google.common.collect.Lists; -import com.intellij.facet.Facet; -import com.intellij.facet.FacetManager; -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationType; -import com.intellij.notification.Notifications; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; -import com.intellij.util.PlatformUtils; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class AddServiceStackAction extends AnAction { - - public void actionPerformed(AnActionEvent e) { - Module module = getModule(e); - AddRef dialog = new AddRef(module); - dialog.pack(); - dialog.setLocationRelativeTo(null); - dialog.setSize(dialog.getPreferredSize()); - dialog.setResizable(true); - dialog.setTitle("Add ServiceStack Reference"); - - //Check if a package was selected in the left hand menu, populate package name - PsiElement element = LangDataKeys.PSI_ELEMENT.getData(e.getDataContext()); - if (element instanceof PsiPackage) { - PsiPackage psiPackage = (PsiPackage) element; - dialog.setSelectedPackage(psiPackage); - dialog.setVisible(true); - return; - } - - //Check if a directory containing a Java file was selected, populate package name - if (element instanceof PsiDirectory) { - PsiElement firstChild = element.getFirstChild(); - dialog.setSelectedDirectory(((PsiDirectory) element).getVirtualFile().getPath()); - if (firstChild instanceof PsiJavaFile) { - PsiJavaFile firstJavaFile = (PsiJavaFile) firstChild; - PsiPackage mainPackage = JavaPsiFacade.getInstance(module.getProject()).findPackage(firstJavaFile.getPackageName()); - if (mainPackage != null) { - dialog.setSelectedPackage(mainPackage); - } - } else if (module.getModuleFile() != null) { - try { - PsiDirectory selectedDir = (PsiDirectory) element; - String packageName = ""; - String moduleDirectoryPath = module.getModuleFile().getParent().getPath(); - List packageArray = new ArrayList(); - while (selectedDir != null && !(moduleDirectoryPath.equals(selectedDir.getVirtualFile().getPath()))) { - packageArray.add(selectedDir.getName()); - selectedDir = selectedDir.getParent(); - PsiPackage mainPackage = testPackage(module, packageName, packageArray); - if (mainPackage != null) { - //"java" is a valid package name in an empty project according to openapi so we have to ignore it and no pre-populate package name.... - if(mainPackage.getQualifiedName().equals("java")) { - break; - } - dialog.setSelectedPackage(mainPackage); - break; - } - } - } catch (Exception ex) { - //do nothing, can't get package name. - } - } - ShowDialog(module, dialog); - return; - } - - //Check if a Java file was selected, display without a package name if no file. - VirtualFile selectedFile = LangDataKeys.VIRTUAL_FILE.getData(e.getDataContext()); - if (selectedFile == null) { - Notification notification = new Notification("ServiceStackIDEA", "Error Add ServiceStack Reference", "Context menu failed find folder or file.", NotificationType.ERROR); - Notifications.Bus.notify(notification); - return; - } - if (selectedFile.isDirectory()) { - dialog.setSelectedDirectory(selectedFile.getPath()); - } else if (selectedFile.getParent().isDirectory()) { - dialog.setSelectedDirectory(selectedFile.getParent().getPath()); - } else { - Notification notification = new Notification("ServiceStackIDEA", "Error Add ServiceStack Reference", "Context menu failed find folder or file.", NotificationType.ERROR); - Notifications.Bus.notify(notification); - return; - } - - //Check for document, display without a package name if no document. - Document document = FileDocumentManager.getInstance().getDocument(selectedFile); - if (document == null) { - ShowDialog(module, dialog); - return; - } - - //Check if a 'PsiFile', display without a package name if no PsiFile. - PsiFile psiFile = PsiDocumentManager.getInstance(module.getProject()).getPsiFile(document); - if (psiFile == null) { - ShowDialog(module, dialog); - return; - } - - //Finally check if a Java file and populate package name with class package name. - if (psiFile.getFileType().getName().equals("JAVA")) { - PsiJavaFile javaFile = (PsiJavaFile) psiFile; - PsiPackage mainPackage = JavaPsiFacade.getInstance(module.getProject()).findPackage(javaFile.getPackageName()); - if (mainPackage != null) { - dialog.setSelectedPackage(mainPackage); - } - } - ShowDialog(module, dialog); - } - - private void ShowDialog(Module module, AddRef dialog) { - if (GradleBuildFileHelper.isGradleModule(module) && GradleBuildFileHelper.isUsingKotlin(module)) { - dialog.setFileName("dtos.kt"); - } - else if (IDEAPomFileHelper.isMavenProjectWithKotlin(module)) { - dialog.setFileName("dtos.kt"); - } - else if (GradleBuildFileHelper.isDartProject(module)) { - dialog.setFileName("dtos.dart"); - } - - dialog.setVisible(true); - } - - private PsiPackage testPackage(Module module, String packageName, List packageArray) { - List packageNameOrderedList = Lists.reverse(packageArray); - for (int i = 0; i < packageNameOrderedList.size(); i++) { - if (i < packageNameOrderedList.size() - 1) { - packageName += packageNameOrderedList.get(i) + "."; - } else { - packageName += packageNameOrderedList.get(i); - } - } - return JavaPsiFacade.getInstance(module.getProject()).findPackage(packageName); - } - - @Override - public void update(AnActionEvent e) { - Module module = getModule(e); - if(module == null) { - e.getPresentation().setEnabled(false); - return; - } - - if (!(PlatformUtils.isIntelliJ() || isAndroidProject(module) || isDartProject(module))) { - e.getPresentation().setVisible(false); - return; - } - - boolean isMavenModule = IDEAPomFileHelper.isMavenModule(module); - - if (isAndroidProject(module) || isMavenModule || isDartProject(module)) { - e.getPresentation().setEnabled(true); - } else { - e.getPresentation().setEnabled(false); - return; - } - - super.update(e); - } - - static Module getModule(Project project) { - if (project == null) - return null; - Module[] modules = ModuleManager.getInstance(project).getModules(); - if (modules.length > 0) { - return modules[0]; - } - return null; - } - - private static boolean isAndroidProject(@NotNull Module module) { - Facet[] facetsByType = FacetManager.getInstance(module).getAllFacets(); - for (Facet facet : facetsByType) { - if (facet.getTypeId().toString().equals("android")) { - return true; - } - } - return false; - } - - private static boolean isDartProject(@NotNull Module module) { - return GradleBuildFileHelper.isDartProject(module); - } - - static Module getModule(AnActionEvent e) { - Module module = e.getData(LangDataKeys.MODULE); - if (module == null) { - Project project = e.getData(LangDataKeys.PROJECT); - return getModule(project); - } else { - return module; - } - } - -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackRefHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackRefHandler.java deleted file mode 100644 index caf2e68..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackRefHandler.java +++ /dev/null @@ -1,213 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationType; -import com.intellij.notification.Notifications; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiManager; -import com.intellij.psi.PsiPackage; -import org.jetbrains.annotations.Nullable; - -import java.io.*; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -public class AddServiceStackRefHandler { - - private static INativeTypesHandler defaultNativeTypesHandler; - - public static void handleOk(String addressUrl, String qualifiedPackageName, - String fileName, String selectedDirectory, - Module module, StringBuilder errorMessage) { - List javaCodeLines = getDtoLines(addressUrl, qualifiedPackageName, fileName, errorMessage); - if (javaCodeLines == null) return; - defaultNativeTypesHandler = IDEAUtils.getDefaultNativeTypesHandler(module); - boolean showDto = true; - boolean isMavenModule = IDEAPomFileHelper.isMavenModule(module); - if(isMavenModule) { - showDto = !tryAddMavenDependency(module); - } else { - //Gradle - try { - showDto = !addGradleDependencyIfRequired(module); - } catch (FileNotFoundException e) { - e.printStackTrace(); - String message = "Failed to update build.gradle with '" + - DepConfig.getClientVersionString() + - "'. " + e.getLocalizedMessage(); - Notification notification = new Notification( - "ServiceStackIDEA", - "Warning Add ServiceStack Reference", - message, - NotificationType.WARNING); - Notifications.Bus.notify(notification); - } - } - - String dtoPath; - try { - dtoPath = getDtoPath(module,qualifiedPackageName, selectedDirectory, fileName, errorMessage); - } catch (Exception e) { - return; - } - - if (!IDEAUtils.writeDtoFile(javaCodeLines, dtoPath, errorMessage)) { - return; - } - Analytics.SubmitAnonymousAddReferenceUsage(getNativeTypesHandler(fileName)); - IDEAUtils.refreshFile(module, dtoPath, showDto); - VirtualFileManager.getInstance().syncRefresh(); - } - - @Nullable - private static List getDtoLines(String addressUrl, String qualifiedPackageName, String fileName, StringBuilder errorMessage) { - Map options = new HashMap<>(); - List javaCodeLines; - try { - options.put("Package", qualifiedPackageName); - String name = getDtoNameWithoutExtension(fileName).replaceAll("\\.", "_"); - options.put("GlobalNamespace", name); - javaCodeLines = getNativeTypesHandler(fileName).getUpdatedCode(addressUrl, options); - - if (!javaCodeLines.get(0).startsWith("/* Options:")) { - //Invalid endpoint - errorMessage.append("The address url is not a valid ServiceStack endpoint."); - return null; - } - } - catch (URISyntaxException | MalformedURLException e) { - e.printStackTrace(); - DialogErrorMessages.appendInvalidEndpoint(errorMessage, addressUrl, e); - return null; - } catch (IOException e) { - e.printStackTrace(); - DialogErrorMessages.appendReadResponseError(errorMessage, addressUrl, e); - return null; - } - return javaCodeLines; - } - - private static INativeTypesHandler getNativeTypesHandler(String fileName) { - INativeTypesHandler nativeTypesHandler = IDEAUtils.getNativeTypesHandler(fileName); - if(nativeTypesHandler != null) { - return nativeTypesHandler; - } - return defaultNativeTypesHandler; - } - - private static boolean tryAddMavenDependency(Module module) { - boolean showDto; - String message = "Unable to locate module pom.xml file. Can't add required dependency '" + - DepConfig.getClientVersionString() + - "'."; - Notification notification = new Notification( - "ServiceStackIDEA", - "Warning Add ServiceStack Reference", - message, - NotificationType.WARNING); - try { - IDEAPomFileHelper pomFileHelper = new IDEAPomFileHelper(); - String pomFilePath = IDEAPomFileHelper.findNearestModulePomFile(module); - if (pomFilePath == null) { - Notifications.Bus.notify(notification); - return false; - } - File pomLibFile = new File(pomFilePath); - showDto = pomFileHelper.addMavenDependency(module,pomLibFile, DepConfig.servicestackGroupId, DepConfig.clientPackageId, DepConfig.servicestackVersion); - if (pomFileHelper.addMavenDependency(module,pomLibFile, DepConfig.gsonGroupId, DepConfig.gsonPackageId, DepConfig.gsonVersion)) - showDto = true; - - IDEAUtils.refreshFile(module,pomFilePath,showDto); - } catch(Exception e) { - showDto = false; - e.printStackTrace(); - notification = new Notification( - "ServiceStackIDEA", - "Warning Add ServiceStack Reference", - "Unable to add maven dependency. " + e.getLocalizedMessage(), - NotificationType.WARNING); - Notifications.Bus.notify(notification); - } - return showDto; - } - - private static boolean addGradleDependencyIfRequired(Module module) throws FileNotFoundException { - boolean depAdded = GradleBuildFileHelper.addDependency(module, DepConfig.servicestackGroupId, DepConfig.androidPackageId, DepConfig.servicestackVersion); - if (GradleBuildFileHelper.addDependency(module, DepConfig.gsonGroupId, DepConfig.gsonPackageId, DepConfig.gsonVersion)) - depAdded = true; - - if (depAdded) { - IDEAUtils.refreshBuildFile(module); - return true; - } - return false; - } - - private static String getDtoPath(Module module, String qualifiedPackageName, String selectedDirectory, String fileName, StringBuilder errorMessage) throws FileNotFoundException { - VirtualFile moduleFile = module.getModuleFile(); - if(moduleFile == null) { - throw new FileNotFoundException("Module file not found. Unable to add DTO to project."); - } - String fullDtoPath; - - PsiPackage mainPackage = JavaPsiFacade.getInstance(module.getProject()).findPackage(qualifiedPackageName); - if (mainPackage != null && mainPackage.isValid() && mainPackage.getDirectories().length > 0) { - File file = new File(selectedDirectory); - VirtualFile selectedFolder = LocalFileSystem.getInstance().findFileByIoFile(file); - if (selectedFolder == null) { - errorMessage.append("Unable to determine path for DTO file."); - throw new FileNotFoundException(); - } - PsiDirectory rootPackageDir = PsiManager.getInstance(module.getProject()).findDirectory(selectedFolder); - if (rootPackageDir == null) { - errorMessage.append("Unable to determine path for DTO file."); - throw new FileNotFoundException(); - } - fullDtoPath = rootPackageDir.getVirtualFile().getPath() + - File.separator + - getDtoFileName(fileName); - } else { - String moduleSourcePath; - if(moduleFile.getParent() == null) { - moduleSourcePath = moduleFile.getPath() + "/main/java"; - } else { - moduleSourcePath = moduleFile.getParent().getPath() + "/src/main/java"; - } - fullDtoPath = moduleSourcePath + File.separator + getDtoFileName(fileName); - } - return fullDtoPath; - } - - public static String getDtoFileName(String name) { - INativeTypesHandler nativeTypesHandler = getNativeTypesHandler(name); - int p = name.lastIndexOf("."); - if (p == -1 || !name.substring(p).equals(nativeTypesHandler.getFileExtension())) { - /* file has no extension */ - return name + nativeTypesHandler.getFileExtension(); - } else { - /* file has extension e */ - return name; - } - } - - public static String getDtoNameWithoutExtension(String name) { - INativeTypesHandler nativeTypesHandler = getNativeTypesHandler(name); - int p = name.lastIndexOf("."); - if (p == -1 || !name.substring(p).equals(nativeTypesHandler.getFileExtension())) { - /* file has no extension */ - return name; - } else { - /* file has extension e */ - return name.substring(0, p); - } - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptAction.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptAction.java deleted file mode 100644 index 3a57c28..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptAction.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiElement; -import com.intellij.util.PlatformUtils; - -import java.io.File; - -/** - * Created by Layoric on 28/05/2016. - */ -public class AddTypeScriptAction extends AnAction { - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - Module module = getModule(anActionEvent); - AddTypeScriptRef dialog = new AddTypeScriptRef(module); - dialog.pack(); - dialog.setLocationRelativeTo(null); - dialog.setSize(dialog.getPreferredSize()); - dialog.setResizable(true); - dialog.setTitle("Add TypeScript ServiceStack Reference"); - PsiElement element = LangDataKeys.PSI_ELEMENT.getData(anActionEvent.getDataContext()); - INativeTypesHandler defaultTsNativeTypesHandler = new TypeScriptNativeTypesHandler(); - if (element instanceof PsiDirectory) { - PsiDirectory selectedDir = (PsiDirectory)element; - dialog.setSelectedDirectory(selectedDir.getVirtualFile().getPath()); - String initialName = getInitialFileName(selectedDir.getVirtualFile().getPath(),defaultTsNativeTypesHandler); - dialog.setInitialDtoName(initialName); - } - showDialog(dialog); - } - - private void showDialog(AddTypeScriptRef dialog) { - dialog.setVisible(true); - } - - private String getInitialFileName(String path, INativeTypesHandler defaultTsNativeTypesHandler) { - String initName = "ServiceReference"; - Integer count = 1; - while(true) { - File existingFile = new File(path + "/" + initName + count.toString() + - defaultTsNativeTypesHandler.getFileExtension()); - if(existingFile.exists()) { - count++; - } else { - break; - } - } - return initName + count.toString(); - } - - @Override - public void update(AnActionEvent e) { - Module module = getModule(e); - if (module == null) { - e.getPresentation().setEnabled(false); - } - - if (!(PlatformUtils.isWebStorm() || PlatformUtils.isPhpStorm() || - PlatformUtils.isRubyMine() || PlatformUtils.isIntelliJ() || - PlatformUtils.isPyCharm())) { - e.getPresentation().setVisible(false); - } - - super.update(e); - } - - static Module getModule(Project project) { - if (project == null) - return null; - Module[] modules = ModuleManager.getInstance(project).getModules(); - if (modules.length > 0) { - return modules[0]; - } - return null; - } - - static Module getModule(AnActionEvent e) { - Module module = e.getData(LangDataKeys.MODULE); - if (module == null) { - Project project = e.getData(LangDataKeys.PROJECT); - return getModule(project); - } else { - return module; - } - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.form b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.form deleted file mode 100644 index ca733b1..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.form +++ /dev/null @@ -1,159 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.java deleted file mode 100644 index 9948af6..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRef.java +++ /dev/null @@ -1,310 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.module.Module; -import com.intellij.openapi.ui.TextFieldWithBrowseButton; -import com.intellij.ui.JBColor; -import com.intellij.uiDesigner.core.GridConstraints; -import com.intellij.uiDesigner.core.GridLayoutManager; -import com.intellij.uiDesigner.core.Spacer; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.*; -import java.net.URL; - -public class AddTypeScriptRef extends JDialog { - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; - private JTextField addressUrlTextField; - private JTextField nameTextField; - private JTextPane errorTextPane; - private JTextPane infoTextPane; - private JCheckBox onlyTypeScriptDefinitionsCheckBox; - - private String selectedDirectory; - private String errorMessage; - - private Module module; - - public AddTypeScriptRef(Module module) { - this.module = module; - setContentPane(contentPane); - setModal(true); - getRootPane().setDefaultButton(buttonOK); - ImageIcon imageIcon = createImageIcon("/logo-16.png", "ServiceStack"); - if (imageIcon != null) { - this.setIconImage(imageIcon.getImage()); - } - errorTextPane.setForeground(JBColor.RED); - - buttonOK.setEnabled(false); - - addressUrlTextField.setInputVerifier(new InputVerifier() { - @Override - public boolean verify(JComponent input) { - String text = null; - if (input instanceof JTextField) { - text = ((JTextField) input).getText(); - } - - return text != null && text.length() > 0; - } - - @Override - public boolean shouldYieldFocus(JComponent input) { - boolean valid = verify(input); - if (!valid) { - errorMessage = "URL Address is required"; - errorTextPane.setVisible(true); - errorTextPane.setText(errorMessage); - } - - return true; - } - }); - nameTextField.setInputVerifier(new InputVerifier() { - @Override - public boolean verify(JComponent input) { - String text = null; - if (input instanceof JTextField) { - text = ((JTextField) input).getText(); - } - - return text != null && text.length() > 0; - } - - @Override - public boolean shouldYieldFocus(JComponent input) { - boolean valid = verify(input); - if (!valid) { - errorMessage = "A file name is required."; - errorTextPane.setVisible(true); - errorTextPane.setText(errorMessage); - } - - return true; - } - }); - - nameTextField.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - warn(); - } - - public void warn() { - if (nameTextField.getInputVerifier().verify(nameTextField) && addressUrlTextField.getInputVerifier().verify(addressUrlTextField)) { - buttonOK.setEnabled(true); - } else { - buttonOK.setEnabled(false); - } - } - }); - - addressUrlTextField.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - warn(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - warn(); - } - - public void warn() { - if (nameTextField.getInputVerifier().verify(nameTextField) && addressUrlTextField.getInputVerifier().verify(addressUrlTextField)) { - buttonOK.setEnabled(true); - } else { - buttonOK.setEnabled(false); - } - } - }); - - buttonOK.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - onOK(); - } - }); - - buttonCancel.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - onCancel(); - } - }); - -// call onCancel() when cross is clicked - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - onCancel(); - } - }); - -// call onCancel() on ESCAPE - contentPane.registerKeyboardAction(new ActionListener() { - public void actionPerformed(ActionEvent e) { - onCancel(); - } - }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - } - - private void onOK() { - StringBuilder errorMessageBuilder = new StringBuilder(); - AddTypeScriptRefHandler.handleOk( - this.module, - this.addressUrlTextField.getText(), - this.nameTextField.getText(), - this.selectedDirectory, - this.onlyTypeScriptDefinitionsCheckBox.isSelected(), - errorMessageBuilder - ); - if (errorMessageBuilder.toString().length() > 0) { - errorTextPane.setText(errorMessageBuilder.toString()); - errorTextPane.setVisible(true); - } else { - dispose(); - } - } - - private void onCancel() { -// add your code here if necessary - dispose(); - } - - public static void main(String[] args) { - AddTypeScriptRef dialog = new AddTypeScriptRef(null); - dialog.pack(); - dialog.setVisible(true); - System.exit(0); - } - - private ImageIcon createImageIcon(String path, String description) { - URL imgURL = getClass().getResource(path); - if (imgURL != null) { - return new ImageIcon(imgURL, description); - } else { - System.err.println("Couldn't find file: " + path); - return null; - } - } - - - public String getSelectedDirectory() { - return selectedDirectory; - } - - public void setSelectedDirectory(String selectedDirectory) { - this.selectedDirectory = selectedDirectory; - } - - public String getInitialDtoName() { - return this.nameTextField.getText(); - } - - public void setInitialDtoName(String initialDtoName) { - this.nameTextField.setText(initialDtoName); - } - - { -// GUI initializer generated by IntelliJ IDEA GUI Designer -// >>> IMPORTANT!! <<< -// DO NOT EDIT OR ADD ANY CODE HERE! - $$$setupUI$$$(); - } - - /** - * Method generated by IntelliJ IDEA GUI Designer - * >>> IMPORTANT!! <<< - * DO NOT edit this method OR call it in your code! - * - * @noinspection ALL - */ - private void $$$setupUI$$$() { - contentPane = new JPanel(); - contentPane.setLayout(new GridLayoutManager(4, 1, new Insets(10, 10, 10, 10), -1, -1)); - contentPane.setMaximumSize(new Dimension(700, 420)); - contentPane.setMinimumSize(new Dimension(400, 220)); - contentPane.setPreferredSize(new Dimension(550, 220)); - contentPane.setRequestFocusEnabled(false); - final JPanel panel1 = new JPanel(); - panel1.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1)); - contentPane.add(panel1, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, 1, null, null, null, 0, false)); - final Spacer spacer1 = new Spacer(); - panel1.add(spacer1, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); - final JPanel panel2 = new JPanel(); - panel2.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1, true, false)); - panel1.add(panel2, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - buttonOK = new JButton(); - buttonOK.setText("OK"); - panel2.add(buttonOK, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - buttonCancel = new JButton(); - buttonCancel.setText("Cancel"); - panel2.add(buttonCancel, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - onlyTypeScriptDefinitionsCheckBox = new JCheckBox(); - onlyTypeScriptDefinitionsCheckBox.setSelected(false); - onlyTypeScriptDefinitionsCheckBox.setText("Only TypeScript definitions"); - panel1.add(onlyTypeScriptDefinitionsCheckBox, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JPanel panel3 = new JPanel(); - panel3.setLayout(new GridLayoutManager(2, 3, new Insets(0, 0, 0, 0), -1, -1)); - contentPane.add(panel3, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - final JLabel label1 = new JLabel(); - label1.setText("Address Url"); - panel3.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - addressUrlTextField = new JTextField(); - addressUrlTextField.setToolTipText("eg, http://example.com/"); - panel3.add(addressUrlTextField, new GridConstraints(0, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label2 = new JLabel(); - label2.setText("Name"); - panel3.add(label2, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - nameTextField = new JTextField(); - nameTextField.setText(""); - panel3.add(nameTextField, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JPanel panel4 = new JPanel(); - panel4.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1)); - panel4.setFocusable(false); - contentPane.add(panel4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - infoTextPane = new JTextPane(); - infoTextPane.setEditable(false); - infoTextPane.setFocusCycleRoot(false); - infoTextPane.setFocusable(false); - infoTextPane.setFont(new Font("Arial", infoTextPane.getFont().getStyle(), infoTextPane.getFont().getSize())); - infoTextPane.setOpaque(false); - infoTextPane.setRequestFocusEnabled(false); - infoTextPane.setText("To generate the DTO Service Model types for a specific ServiceStack instance, enter the base URI for the remote ServiceStack server and click OK."); - panel4.add(infoTextPane, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(150, 25), null, 0, false)); - errorTextPane = new JTextPane(); - errorTextPane.setEditable(false); - errorTextPane.setFocusCycleRoot(false); - errorTextPane.setFocusable(true); - errorTextPane.setFont(new Font("Arial", errorTextPane.getFont().getStyle(), errorTextPane.getFont().getSize())); - errorTextPane.setOpaque(false); - errorTextPane.setVisible(false); - panel4.add(errorTextPane, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(150, 25), null, 0, false)); - } - - /** - * @noinspection ALL - */ - public JComponent $$$getRootComponent$$$() { - return contentPane; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRefHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRefHandler.java deleted file mode 100644 index 95ed24a..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddTypeScriptRefHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.module.Module; -import com.intellij.openapi.vfs.VirtualFileManager; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.util.List; - -import static net.servicestack.idea.IDEAUtils.refreshFile; - -public class AddTypeScriptRefHandler { - - static void handleOk(Module module, - String addressUrl, - String fileName, - String selectedDirectory, - Boolean definitionsOnly, - StringBuilder errorMessage) { - File file = new File(selectedDirectory); - INativeTypesHandler nativeTypesHandler = - definitionsOnly ? - new TypeScriptNativeTypesHandler() : - new TypeScriptConcreteNativeTypesHandler(); - - String dtoPath = file.getAbsolutePath() + File.separator - + getDtoFileName(fileName,nativeTypesHandler); - List codeLines = getDtoLines(addressUrl,nativeTypesHandler,errorMessage); - - if(codeLines == null) { - return; - } - - if (!IDEAUtils.writeDtoFile(codeLines, dtoPath, errorMessage)) { - return; - } - - Analytics.SubmitAnonymousAddReferenceUsage(nativeTypesHandler); - refreshFile(module,dtoPath, true); - VirtualFileManager.getInstance().syncRefresh(); - } - - private static List getDtoLines(String addressUrl, INativeTypesHandler nativeTypesHandler, - StringBuilder errorMessage) { - List codeLines; - try { - codeLines = nativeTypesHandler.getUpdatedCode(addressUrl, null); - if (!codeLines.get(0).startsWith("/* Options:")) { - //Invalid endpoint - errorMessage.append("The address url is not a valid ServiceStack endpoint."); - return null; - } - } catch (URISyntaxException | MalformedURLException | FileNotFoundException e) { - e.printStackTrace(); - DialogErrorMessages.appendInvalidEndpoint(errorMessage, addressUrl, e); - return null; - } catch (IOException e) { - e.printStackTrace(); - DialogErrorMessages.appendReadResponseError(errorMessage, addressUrl, e); - return null; - } - return codeLines; - } - - public static String getDtoFileName(String name, INativeTypesHandler nativeTypesHandler) { - if (!name.endsWith(nativeTypesHandler.getFileExtension())) { - /* file has no extension */ - return name + nativeTypesHandler.getFileExtension(); - } else { - /* file has extension */ - return name; - } - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/Analytics.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/Analytics.java deleted file mode 100644 index bf50eed..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/Analytics.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.servicestack.idea; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; - -/** - * Helper to submit anonymous add reference usage. - */ -public final class Analytics { - - private final static String addRefUrl = "https://servicestack.net/stats/addref/record?Name="; - private final static String updateRefUrl = "https://servicestack.net/stats/updateref/record?Name="; - - public static void SubmitAnonymousAddReferenceUsage(INativeTypesHandler typesHandler) { - final String url = addRefUrl + typesHandler.getLanguageUrlName(); - SubmitAnonymousUsage(url); - } - - public static void SubmitAnonymousUpdateReferenceUsage(INativeTypesHandler typesHandler) { - final String url = updateRefUrl + typesHandler.getLanguageUrlName(); - SubmitAnonymousUsage(url); - } - - public static void SubmitAnonymousUsage(final String url) { - PluginSettingsService settings = PluginSettingsService.getInstance(); - if (!settings.optOutOfStats && !"1".equals(System.getenv("SERVICESTACK_TELEMETRY_OPTOUT"))) { - final URL[] serviceUrl = {null}; - final URLConnection[] responseConnection = {null}; - final BufferedReader[] responseReader = {null}; - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - try { - serviceUrl[0] = new URL(url); - responseConnection[0] = serviceUrl[0].openConnection(); - responseReader[0] = new BufferedReader(new InputStreamReader(responseConnection[0].getInputStream())); - responseReader[0].close(); - } catch (IOException e) { - // Ignore failure (eg no internet connection). - } - } - }); - thread.start(); - } - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/BaseNativeTypesHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/BaseNativeTypesHandler.java deleted file mode 100644 index 499be6b..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/BaseNativeTypesHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.servicestack.idea; - -import org.apache.http.client.utils.URIBuilder; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public abstract class BaseNativeTypesHandler implements INativeTypesHandler { - - @Override - public List getUpdatedCode(String baseUrl, Map options) throws IOException, URISyntaxException { - String url; - List javaCodeLines = new ArrayList(); - URIBuilder urlBuilder = this.getUrl(baseUrl); - if(options != null) { - for(Map.Entry option : options.entrySet()) { - urlBuilder.addParameter(option.getKey(),option.getValue()); - } - } - - url = urlBuilder.build().toString(); - - URL serviceUrl = new URL(url); - URLConnection javaResponseConnection = serviceUrl.openConnection(); - BufferedReader javaResponseReader = new BufferedReader( - new InputStreamReader( - javaResponseConnection.getInputStream())); - String metadataInputLine; - - while ((metadataInputLine = javaResponseReader.readLine()) != null) - javaCodeLines.add(metadataInputLine); - - javaResponseReader.close(); - - return javaCodeLines; - } - - @Override - public URIBuilder getUrl(String baseUrl) throws MalformedURLException, URISyntaxException { - String serverUrl = baseUrl.endsWith("/") ? baseUrl : (baseUrl + "/"); - serverUrl = (serverUrl.startsWith("http://") || serverUrl.startsWith("https://")) ? serverUrl : ("http://" + serverUrl); - URL url = new URL(serverUrl); - String path = url.getPath().contains("?") ? url.getPath().split("\\?", 2)[0] : url.getPath(); - if (!path.endsWith(this.getRelativeTypesUrl() + "/")) { - serverUrl += (this.getRelativeTypesUrl() + "/"); - } - serverUrl = toParentPath(serverUrl); - URIBuilder builder; - - try { - builder = new URIBuilder(serverUrl); - } catch (URISyntaxException e) { - e.printStackTrace(); - throw e; - } - return builder; - } - - public static String toParentPath(String path) { - int pos = path.lastIndexOf("/"); - if (pos == -1) return "/"; - return path.substring(0, pos); - } - - @Override - public String getLanguageUrlName() { - return this.getRelativeTypesUrl().substring(6); - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DartNativeTypesHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DartNativeTypesHandler.java deleted file mode 100644 index 7acc553..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DartNativeTypesHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.servicestack.idea; - -public class DartNativeTypesHandler extends BaseNativeTypesHandler { - @Override - public String getFileExtension() { - return ".dart"; - } - - @Override - public String getRelativeTypesUrl() { - return "types/dart"; - } - - @Override - public NativeTypesLanguage getTypesLanguage() { - return NativeTypesLanguage.Dart; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DepConfig.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DepConfig.java deleted file mode 100644 index eeaeda2..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DepConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.servicestack.idea; - -public class DepConfig { - public static final String servicestackGroupId = "net.servicestack"; - public static final String androidPackageId = "android"; - //Fallback version of dependencies if GitHub tags can't be checked. - public static final String clientPackageId = "client"; - public static String servicestackVersion = "1.0.43"; - - public static final String gsonGroupId = "com.google.code.gson"; - public static final String gsonPackageId = "gson"; - public static String gsonVersion = "2.8.6"; - - public static void setServiceStackVersion(String version) { - servicestackVersion = version; - } - - public static String getClientVersionString() { - return servicestackGroupId + ":" + clientPackageId + ":" + servicestackVersion; - } - -} \ No newline at end of file diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DialogErrorMessages.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DialogErrorMessages.java deleted file mode 100644 index 2889861..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DialogErrorMessages.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationType; -import com.intellij.notification.Notifications; - -/** - * Helper messages for common add reference dialog errors. - */ -public class DialogErrorMessages { - public static StringBuilder appendInvalidEndpoint(StringBuilder errorMessage, String addressUrl, Exception e) { - errorMessage.append(e.getClass().getName()).append(" - Invalid ServiceStack endpoint provided - ").append(addressUrl); - return errorMessage; - } - - public static StringBuilder appendReadResponseError(StringBuilder errorMessage,String addressUrl, Exception e) { - errorMessage.append(e.getClass().getName()).append(" - Failed to read response - ").append(addressUrl); - Notification notification = new Notification( - "ServiceStackIDEA", - "Add ServiceStack Reference failed to read response", - errorMessage.toString() + "\n" + e.getMessage(), - NotificationType.ERROR); - Notifications.Bus.notify(notification); - return errorMessage; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/GradleBuildFileHelper.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/GradleBuildFileHelper.java deleted file mode 100644 index 1647de7..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/GradleBuildFileHelper.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.module.Module; -import com.intellij.openapi.vfs.VirtualFile; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Layoric on 2/04/2015. - * Methods to help insert gradle dependency - */ -public class GradleBuildFileHelper { - - private static final String kotlinGroupName = "org.jetbrains.kotlin"; - - public static boolean addDependency(Module module,String groupId, String packageName, String version) throws FileNotFoundException { - File gradleFile = getGradleBuildFile(module); - if(gradleFile == null) { - return false; - } - Integer dependenciesStartIndex = -1; - Integer dependenciesEndIndex = -1; - List list = new ArrayList(); - BufferedReader br = new BufferedReader(new FileReader(gradleFile)); - try { - int count = 0; - for(String line; (line = br.readLine()) != null; ) { - list.add(line); - if(dependenciesStartIndex > -1 && line.startsWith("}") && dependenciesEndIndex == -1) { - dependenciesEndIndex = count; - } - if(dependenciesStartIndex == -1 && line.startsWith("dependencies {")) { - dependenciesStartIndex = count; - } - count++; - } - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - if (dependenciesStartIndex == -1 || dependenciesEndIndex == -1) { - return false; - } - - boolean dependencyRequired = true; - //Check if groupId + package already listed as dependency - for (int i = dependenciesStartIndex; i < dependenciesEndIndex; i++) { - String dependencyLoC = list.get(i); - if(dependencyLoC.contains(groupId + ":" + packageName)) { - dependencyRequired = false; - break; - } - } - - if (!dependencyRequired) { - return false; - } - list.add(dependenciesEndIndex, " implementation '" + groupId + ":" + packageName + ":" + version + "'"); - try { - PrintWriter writer = new PrintWriter(gradleFile); - for(String item : list) { - writer.println(item); - } - writer.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - return true; - } - - public static Boolean isGradleModule(Module module) { - return getGradleBuildFile(module) != null; - } - - public static Boolean isDartProject(Module module) { - return getDartPubspec(module) != null; - } - - public static Boolean isUsingKotlin(Module module){ - if (!isGradleModule(module)) { - return false; - } - File buildFile = getGradleBuildFile(module); - if (buildFile == null) { - return false; - } - boolean result = false; - try { - BufferedReader br = new BufferedReader(new FileReader(buildFile)); - for (String line; (line = br.readLine()) != null; ) { - if(line.contains(kotlinGroupName)) { - result = true; - break; - } - } - br.close(); - } catch (IOException e) { - e.printStackTrace(); - result = false; - } - return result; - } - - public static File getGradleBuildFile(Module module) { - VirtualFile moduleFile = module.getModuleFile(); - if (moduleFile == null) { - return null; - } - String moduleDirectory = moduleFile.getParent().getPath(); - File file = new File(moduleDirectory); - File[] matchingFiles = file.listFiles((dir, name) -> name.startsWith("build.gradle")); - return matchingFiles == null || matchingFiles.length == 0 - ? null - : matchingFiles[0]; - } - - public static File getDartPubspec(Module module) { - VirtualFile moduleFile = module.getModuleFile(); - if (moduleFile == null) { - return null; - } - String moduleDirectory = moduleFile.getParent().getPath(); - File file = new File(moduleDirectory); - File[] matchingFiles = file.listFiles((dir, name) -> name.startsWith("pubspec.yaml")); - return matchingFiles == null || matchingFiles.length == 0 - ? null - : matchingFiles[0]; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAPomFileHelper.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAPomFileHelper.java deleted file mode 100644 index 554f12e..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAPomFileHelper.java +++ /dev/null @@ -1,196 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.editor.DocumentRunnable; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiFile; -import com.intellij.psi.search.FilenameIndex; -import com.intellij.psi.search.GlobalSearchScope; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; - -public class IDEAPomFileHelper { - - public boolean addMavenDependency(final Module module,File pomFile, String groupId, String packageId, String version) throws Exception { - - try { - if (!pomHasMavenDependency(pomFile,groupId,packageId)) { - PomAppendDependency(module, pomFile,groupId,packageId,version); - return true; - } - } catch (IOException | ParserConfigurationException e) { - e.printStackTrace(); - throw new Exception("Unable to process pom.xml to add " + groupId + ":" + packageId + ":" + version); - } - - return false; - } - - - public static String findNearestModulePomFile(Module module) { - PsiFile[] pomLibFiles = FilenameIndex.getFilesByName(module.getProject(), "pom.xml", GlobalSearchScope.allScope(module.getProject())); - String pomFilePath = null; - for(PsiFile psiPom : pomLibFiles) { - PsiDirectory psiPomParent = psiPom.getParent(); - VirtualFile moduleVirtualFile = module.getModuleFile(); - if(psiPomParent == null || moduleVirtualFile == null) { - continue; - } - if(psiPomParent.getVirtualFile().getPath().equals(moduleVirtualFile.getParent().getPath())) { - pomFilePath = psiPom.getVirtualFile().getPath(); - } - } - return pomFilePath; - } - - private void PomAppendDependency(final Module module, final File pomFile, String groupId, String packageId, String version) throws ParserConfigurationException, IOException, SAXException, TransformerException { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - final Document doc = docBuilder.parse(pomFile); - Node root = doc.getFirstChild(); - - if (!pomHasDependenciesNode(doc)) { - root.appendChild(doc.createElement("dependencies")); - } - - Node dependenciesNode = getMavenDependenciesNode(doc); - Node newDepNode = doc.createElement("dependency"); - Node groupNode = doc.createElement("groupId"); - groupNode.appendChild(doc.createTextNode(groupId)); - Node artifactNode = doc.createElement("artifactId"); - artifactNode.appendChild(doc.createTextNode(packageId)); - Node versionNode = doc.createElement("version"); - versionNode.appendChild(doc.createTextNode(version)); - newDepNode.appendChild(groupNode); - newDepNode.appendChild(artifactNode); - newDepNode.appendChild(versionNode); - dependenciesNode.appendChild(newDepNode); - - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - - final StringWriter writer = new StringWriter(); - transformer.transform(new DOMSource(doc), new StreamResult(writer)); - - final Project project = module.getProject(); - final VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(pomFile); - final com.intellij.openapi.editor.Document document = FileDocumentManager.getInstance().getDocument(virtualFile); - final FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); - fileDocumentManager.saveDocument(document); //when file is edited and editor is closed, it is needed to save the text - PsiDocumentManager.getInstance(project).commitDocument(document); - PsiDocumentManager.getInstance(module.getProject()).commitAllDocuments(); - ApplicationManager.getApplication().runWriteAction(new DocumentRunnable(document, null) { - @Override public void run() { - PsiDocumentManager.getInstance(module.getProject()) - .doPostponedOperationsAndUnblockDocument(document); - document.setText(writer.getBuffer().toString().replaceAll("\r\n","\n")); - fileDocumentManager.saveDocument(document); - PsiDocumentManager.getInstance(project).commitDocument(document); - } - }); - } - - private static boolean pomHasDependenciesNode(Document document) { - return getMavenDependenciesNode(document) != null; - } - - private static Node getMavenDependenciesNode(Document document) { - Node rootNode = document.getFirstChild(); - NodeList firstChildren = rootNode.getChildNodes(); - for (int i = 0; i < firstChildren.getLength(); i++) { - Node child = firstChildren.item(i); - if (child == null) { - continue; - } - if (child.getNodeName().equals("dependencies")) { - return child; - } - } - return null; - } - - public static boolean pomHasMavenDependency(File pomFile, String groupId, String packageId) throws ParserConfigurationException, IOException, SAXException { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - Document doc = docBuilder.parse(pomFile); - - if (!pomHasDependenciesNode(doc)) { - return false; - } - - Node dependencies = getMavenDependenciesNode(doc); - NodeList depElements = dependencies.getChildNodes(); - for (int i = 0; i < depElements.getLength(); i++) { - Node dependencyElement = depElements.item(i); - if (pomDependencyElementMatch(dependencyElement, groupId, packageId)) { - return true; - } - } - return false; - } - - public static boolean pomHasKotlinDependency(Module module) { - String pomFilePath = findNearestModulePomFile(module); - if (pomFilePath == null) { - return false; - } - File pomFile = new File(pomFilePath); - if (!pomFile.exists()) { - return false; - } - - try { - return pomHasMavenDependency(pomFile,"org.jetbrains.kotlin","kotlin-stdlib"); - } catch (ParserConfigurationException | IOException | SAXException e) { - e.printStackTrace(); - } - return false; - } - - private static boolean pomDependencyElementMatch(Node dependencyElement, String groupId, String packageId) { - boolean groupIdMatch = false; - boolean artifactIdMatch = false; - NodeList dependencyProperties = dependencyElement.getChildNodes(); - for(int j = 0; j < dependencyProperties.getLength(); j++) { - Node depProp = dependencyProperties.item(j); - if(depProp.getNodeName().equals("groupId") && depProp.getTextContent() != null && depProp.getTextContent().trim().equals(groupId)) { - groupIdMatch = true; - } - if(depProp.getNodeName().equals("artifactId") && depProp.getTextContent() != null && depProp.getTextContent().trim().equals(packageId)) { - artifactIdMatch = true; - } - } - return groupIdMatch && artifactIdMatch; - } - - public static boolean isMavenModule(Module module) { - return findNearestModulePomFile(module) != null; - } - - public static boolean isMavenProjectWithKotlin(Module module) { - return isMavenModule(module) && pomHasKotlinDependency(module); - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAUtils.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAUtils.java deleted file mode 100644 index fc912da..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/IDEAUtils.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.util.PlatformUtils; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.List; - -/** - * Created by Layoric on 10/12/2015. - */ -public class IDEAUtils { - - public static void refreshBuildFile(Module module) { - VirtualFileManager.getInstance().syncRefresh(); - if(module.getModuleFile() == null) { return; } - - VirtualFile fileByUrl = VirtualFileManager.getInstance().findFileByUrl(module.getModuleFile().getParent().getUrl() + "/build.gradle"); - - if(fileByUrl == null) { return; } - - FileEditorManager.getInstance(module.getProject()).openFile(fileByUrl, false); - Editor currentEditor = FileEditorManager.getInstance(module.getProject()).getSelectedTextEditor(); - if(currentEditor == null) { return; } - Document document = currentEditor.getDocument(); - - FileDocumentManager.getInstance().reloadFromDisk(document); - VirtualFileManager.getInstance().syncRefresh(); - } - - public static void refreshFile(Module module, String filePath, boolean openFile) { - VirtualFileManager.getInstance().syncRefresh(); - File file = new File(filePath); - VirtualFile fileByUrl = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file); - - if (fileByUrl == null) { - return; - } - - FileEditorManager.getInstance(module.getProject()).openFile(fileByUrl, false); - Editor currentEditor = FileEditorManager.getInstance(module.getProject()).getSelectedTextEditor(); - if(currentEditor == null) { return; } - Document document = currentEditor.getDocument(); - if (!openFile) closeFile(module,filePath); - - FileDocumentManager.getInstance().reloadFromDisk(document); - VirtualFileManager.getInstance().syncRefresh(); - } - - public static boolean writeDtoFile(List codeLines, String path, StringBuilder errorMessage) { - BufferedWriter writer = null; - boolean result = true; - try { - writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8)); - for (String item : codeLines) { - writer.write(item); - writer.newLine(); - } - } catch (IOException ex) { - result = false; - errorMessage.append("Error writing DTOs to file - ").append(ex.getMessage()); - } finally { - try { - assert writer != null; - writer.close(); - } catch (Exception ignored) { - } - } - - return result; - } - - public static void closeFile(Module module, String filePath) { - File file = new File(filePath); - VirtualFile fileByUrl = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file); - if (fileByUrl == null) { - return; - } - FileEditorManager.getInstance(module.getProject()).closeFile(fileByUrl); - } - - public static INativeTypesHandler getDefaultNativeTypesHandler(Module module) { - if (GradleBuildFileHelper.isGradleModule(module) && GradleBuildFileHelper.isUsingKotlin(module)) { - return new KotlinNativeTypesHandler(); - } - - if (IDEAPomFileHelper.isMavenProjectWithKotlin(module)) { - return new KotlinNativeTypesHandler(); - } - - if (GradleBuildFileHelper.isDartProject(module)) { - return new DartNativeTypesHandler(); - } - - if (PlatformUtils.isWebStorm()) { - return new TypeScriptConcreteNativeTypesHandler(); - } - - return new JavaNativeTypesHandler(); - } - - public static INativeTypesHandler getNativeTypesHandler(String fileName) { - INativeTypesHandler result = null; - if (fileName.endsWith(".kt")) result = new KotlinNativeTypesHandler(); - if (fileName.endsWith(".java")) result = new JavaNativeTypesHandler(); - if (fileName.endsWith("dtos.dart")) result = new DartNativeTypesHandler(); - if (fileName.endsWith("dtos.ts")) result = new TypeScriptConcreteNativeTypesHandler(); - if (fileName.endsWith("dtos.d.ts")) result = new TypeScriptNativeTypesHandler(); - return result; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/INativeTypesHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/INativeTypesHandler.java deleted file mode 100644 index baf6c4e..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/INativeTypesHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.servicestack.idea; - -import org.apache.http.client.utils.URIBuilder; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.util.List; -import java.util.Map; - -/** - * Created by Layoric on 4/12/2015. - */ -public interface INativeTypesHandler { - String getFileExtension(); - URIBuilder getUrl(String baseUrl) throws MalformedURLException, URISyntaxException; - List getUpdatedCode(String baseUrl, Map options) throws IOException, URISyntaxException; - String getRelativeTypesUrl(); - NativeTypesLanguage getTypesLanguage(); - String getLanguageUrlName(); -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/JavaNativeTypesHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/JavaNativeTypesHandler.java deleted file mode 100644 index 8f45808..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/JavaNativeTypesHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.servicestack.idea; - -import org.apache.http.client.utils.URIBuilder; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Created by Layoric on 4/12/2015. - */ -public class JavaNativeTypesHandler extends BaseNativeTypesHandler { - @Override - public String getFileExtension() { - return ".java"; - } - - @Override - public String getRelativeTypesUrl() { - return "types/java"; - } - - @Override - public NativeTypesLanguage getTypesLanguage() { - return NativeTypesLanguage.Java; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/KotlinNativeTypesHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/KotlinNativeTypesHandler.java deleted file mode 100644 index b001037..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/KotlinNativeTypesHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.servicestack.idea; - -import org.apache.http.client.utils.URIBuilder; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Created by Layoric on 4/12/2015. - */ -public class KotlinNativeTypesHandler extends BaseNativeTypesHandler { - @Override - public String getFileExtension() { - return ".kt"; - } - - @Override - public String getRelativeTypesUrl() { - return "types/kotlin"; - } - - @Override - public NativeTypesLanguage getTypesLanguage() { - return NativeTypesLanguage.Kotlin; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/NativeTypesLanguage.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/NativeTypesLanguage.java deleted file mode 100644 index b4b554b..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/NativeTypesLanguage.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.servicestack.idea; - -/** - * Created by Layoric on 4/12/2015. - */ -public enum NativeTypesLanguage { - Java, - Kotlin, - Dart, - TypeScriptConcrete, - TypeScript -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsConfigurable.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsConfigurable.java deleted file mode 100644 index e333c9e..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsConfigurable.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.application.options.CodeStyleAbstractConfigurable; -import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.ConfigurableProvider; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.util.ui.CheckBox; -import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; - -/** - * Created by Layoric on 27/05/2016. - */ -public class PluginSettingsConfigurable implements SearchableConfigurable { - - private PluginSettingsView view; - - private PluginSettingsService settings; - - public PluginSettingsConfigurable(@NotNull PluginSettingsService settings) { - this.settings = settings; - } - - @NotNull - @Override - public String getId() { - return "Settings.ServiceStackIDEA.Preview"; - } - - @Nullable - @Override - public Runnable enableSearch(String s) { - return null; - } - - @Nls - @Override - public String getDisplayName() { - return "ServiceStackIDEA Settings"; - } - - @Nullable - @Override - public String getHelpTopic() { - return null; - } - - @Nullable - @Override - public JComponent createComponent() { - return getForm().getSettingsPanel(); - } - - - @Override - public boolean isModified() { - return !getForm().getOptOutOfUsage().equals(settings.optOutOfStats); - } - - @Override - public void apply() throws ConfigurationException { - if(settings == null) - settings = PluginSettingsService.getInstance(); - settings.optOutOfStats = getForm().getOptOutOfUsage(); - } - - @Override - public void reset() { - if(settings == null) - settings = PluginSettingsService.getInstance(); - getForm().setOptOutOfUsage(settings.optOutOfStats); - } - - @Override - public void disposeUIResources() { - view = null; - } - - @NotNull - public PluginSettingsView getForm() { - if (view == null) { - view = new PluginSettingsView(); - } - return view; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java deleted file mode 100644 index 7e65c08..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.components.*; -import com.intellij.util.xmlb.XmlSerializerUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Created by Layoric on 27/05/2016. - */ -@State(name = "PluginSettingsService", storages = @Storage("servicestack-settings.xml")) -public class PluginSettingsService implements PersistentStateComponent { - public Boolean optOutOfStats = false; - - @Nullable - @Override - public PluginSettingsService getState() { - return this; - } - - @Override - public void loadState(@NotNull PluginSettingsService pluginSettingsService) { - XmlSerializerUtil.copyBean(pluginSettingsService, this); - } - - public static PluginSettingsService getInstance() { - return ServiceManager.getService( PluginSettingsService.class ); - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.form b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.form deleted file mode 100644 index b98bd29..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.form +++ /dev/null @@ -1,26 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.java deleted file mode 100644 index 194abd5..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsView.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.uiDesigner.core.GridConstraints; -import com.intellij.uiDesigner.core.GridLayoutManager; -import com.intellij.uiDesigner.core.Spacer; - -import javax.swing.*; -import java.awt.*; - -/** - * Created by Layoric on 27/05/2016. - */ -public class PluginSettingsView { - private JCheckBox optOutOfUsageCheckBox; - private JPanel settingsPanel; - - public Boolean getOptOutOfUsage() { - return optOutOfUsageCheckBox.isSelected(); - } - - public void setOptOutOfUsage(Boolean value) { - optOutOfUsageCheckBox.setSelected(value); - } - - public JPanel getSettingsPanel() { - return this.settingsPanel; - } - - { -// GUI initializer generated by IntelliJ IDEA GUI Designer -// >>> IMPORTANT!! <<< -// DO NOT EDIT OR ADD ANY CODE HERE! - $$$setupUI$$$(); - } - - /** - * Method generated by IntelliJ IDEA GUI Designer - * >>> IMPORTANT!! <<< - * DO NOT edit this method OR call it in your code! - * - * @noinspection ALL - */ - private void $$$setupUI$$$() { - settingsPanel = new JPanel(); - settingsPanel.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1)); - optOutOfUsageCheckBox = new JCheckBox(); - optOutOfUsageCheckBox.setText("Opt out of usage collection "); - settingsPanel.add(optOutOfUsageCheckBox, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final Spacer spacer1 = new Spacer(); - settingsPanel.add(spacer1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); - } - - /** - * @noinspection ALL - */ - public JComponent $$$getRootComponent$$$() { - return settingsPanel; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptConcreteNativeTypesHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptConcreteNativeTypesHandler.java deleted file mode 100644 index 69e996e..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptConcreteNativeTypesHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.servicestack.idea; - -/** - * Created by Layoric on 13/05/2016. - */ -public class TypeScriptConcreteNativeTypesHandler extends BaseNativeTypesHandler { - @Override - public String getFileExtension() { - return ".dtos.ts"; - } - - @Override - public String getRelativeTypesUrl() { - return "types/typescript"; - } - - @Override - public NativeTypesLanguage getTypesLanguage() { - return NativeTypesLanguage.TypeScriptConcrete; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptNativeTypesHandler.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptNativeTypesHandler.java deleted file mode 100644 index 4ff97bd..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/TypeScriptNativeTypesHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.servicestack.idea; - -/** - * Created by Layoric on 29/05/2016. - */ -public class TypeScriptNativeTypesHandler extends BaseNativeTypesHandler { - @Override - public String getFileExtension() { - return ".dtos.d.ts"; - } - - @Override - public String getRelativeTypesUrl() { - return "types/typescript.d"; - } - - @Override - public NativeTypesLanguage getTypesLanguage() { - return NativeTypesLanguage.TypeScript; - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReference.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReference.java deleted file mode 100644 index 177736c..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReference.java +++ /dev/null @@ -1,102 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiFile; - -/** - * Created by Layoric on 9/04/2015. - * Update ServiceStack Reference Project menu context action - */ -public class UpdateServiceStackReference extends AnAction { - - @Override - public void actionPerformed(AnActionEvent anActionEvent) { - final PsiFile psiFile = getPsiFile(anActionEvent); - if(UpdateServiceStackUtils.containsOptionsHeader(psiFile)) { - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - UpdateServiceStackUtils.updateServiceStackReference(psiFile); - } - }); - } - } - - @Override - public void update(AnActionEvent e) { - PsiFile psiFile = getPsiFile(e); - if (psiFile == null) { - e.getPresentation().setVisible(false); - return; - } - - INativeTypesHandler nativeTypesHandler = IDEAUtils.getNativeTypesHandler(psiFile.getName()); - - if(nativeTypesHandler == null) { - e.getPresentation().setVisible(false); - return; - } - - if(!UpdateServiceStackUtils.containsOptionsHeader(psiFile)) { - e.getPresentation().setVisible(false); - return; - } - - e.getPresentation().setVisible(true); - super.update(e); - } - - static Module getModule(Project project) { - if (project == null) - return null; - Module[] modules = ModuleManager.getInstance(project).getModules(); - if (modules.length > 0) { - return modules[0]; - } - return null; - } - - private static PsiFile getPsiFile(AnActionEvent e) { - - Module module = getModule(e); - if(module == null) { - return null; - } - VirtualFile selectedFile = LangDataKeys.VIRTUAL_FILE.getData(e.getDataContext()); - if(selectedFile == null) { - return null; - } - Document document = FileDocumentManager.getInstance().getDocument(selectedFile); - if(document == null) { - return null; - } - - //Check if a 'PsiFile', display without a package name if no PsiFile. - PsiFile psiFile = PsiDocumentManager.getInstance(module.getProject()).getPsiFile(document); - if(psiFile == null) { - return null; - } - - return psiFile; - } - - static Module getModule(AnActionEvent e) { - Module module = e.getData(LangDataKeys.MODULE); - if (module == null) { - Project project = e.getData(LangDataKeys.PROJECT); - return getModule(project); - } else { - return module; - } - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReferenceIntention.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReferenceIntention.java deleted file mode 100644 index b26ada5..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackReferenceIntention.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.codeInsight.intention.impl.QuickEditAction; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Iconable; -import com.intellij.psi.*; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; - - -public class UpdateServiceStackReferenceIntention extends QuickEditAction implements Iconable { - - @NotNull - @Override - public String getText() { - return "Update ServiceStack Reference"; - } - - @NotNull - @Override - public String getFamilyName() { - return "UpdateServiceStackReferenceIntention"; - } - - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile psiFile) { - try { - if(psiFile == null) { - return false; - } - INativeTypesHandler nativeTypesHandler = IDEAUtils.getNativeTypesHandler(psiFile.getName()); - if(nativeTypesHandler == null) { - return false; - } - - if(UpdateServiceStackUtils.containsOptionsHeader(psiFile)) { - return true; - } - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - - @Override - public void invoke(@NotNull Project project, Editor editor, final PsiFile psiFile) throws IncorrectOperationException { - UpdateServiceStackUtils.updateServiceStackReference(psiFile); - } - - @Override - public boolean startInWriteAction() { - return true; - } - - @Override - public Icon getIcon(@IconFlags int i) { - return new ImageIcon(this.getClass().getResource("/logo-16.png")); - } -} diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackUtils.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackUtils.java deleted file mode 100644 index 5764eae..0000000 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/UpdateServiceStackUtils.java +++ /dev/null @@ -1,166 +0,0 @@ -package net.servicestack.idea; - -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationType; -import com.intellij.notification.Notifications; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiFile; -import org.apache.http.client.utils.URIBuilder; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.util.*; - -/** - * Created by Layoric on 9/04/2015. - * Helper methods to handle Update Reference intention. - */ -public class UpdateServiceStackUtils { - - public static void updateServiceStackReference(PsiFile psiFile) { - String code = psiFile.getText(); - Scanner scanner = new Scanner(code); - List linesOfCode = new ArrayList(); - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - linesOfCode.add(line); - if (line.startsWith("*/")) break; - } - scanner.close(); - - int startParamsIndex = 0; - String baseUrl = null; - for (String item : linesOfCode) { - startParamsIndex++; - if (item.startsWith("BaseUrl:")) { - baseUrl = item.split(":",2)[1].trim(); - break; - } - } - if (baseUrl == null) { - Notification notification = new Notification("ServiceStackIDEA", "Error Updating Reference", "BaseUrl property not found.", NotificationType.ERROR); - Notifications.Bus.notify(notification); - return; - } - if (!baseUrl.endsWith("/")) { - baseUrl += "/"; - } - - URIBuilder builder; - try { - builder = new URIBuilder(baseUrl); - } catch (URISyntaxException e) { - //Log error to IDEA warning bubble/window. - Notification notification = new Notification("ServiceStackIDEA", "Error Updating Reference", "Invalid BaseUrl provided", NotificationType.ERROR); - Notifications.Bus.notify(notification); - return; - } - - INativeTypesHandler nativeTypesHandler = IDEAUtils.getNativeTypesHandler(psiFile.getName()); - - String existingPath = builder.getPath(); - if (existingPath == null || existingPath.equals("/")) { - builder.setPath(combinePath("", nativeTypesHandler.getRelativeTypesUrl())); - } else { - builder.setPath(combinePath(existingPath, nativeTypesHandler.getRelativeTypesUrl())); - } - - Map options = new HashMap(); - for (int i = startParamsIndex; i < linesOfCode.size(); i++) { - String configLine = linesOfCode.get(i); - if (!configLine.startsWith("//") && configLine.contains(":")) { - String[] keyVal = configLine.split(":"); - options.put(keyVal[0], keyVal[1].trim()); - } - } - - try { - String serverUrl = builder.build().toString(); - int count = 0; - // Using URIBuilder with 'addParameter' URL encodes query values.. - // Append manually below to avoid issues https://github.com/ServiceStack/ServiceStack.Java/issues/6 - for (Map.Entry option : options.entrySet()) { - if(count == 0) { - serverUrl += "?"; - } else { - serverUrl += "&"; - } - //remove spaces - serverUrl += option.getKey() + "=" + option.getValue().trim().replaceAll("\\u0020",""); - count++; - } - URL javaCodeUrl = new URL(serverUrl); - - URLConnection javaCodeConnection = javaCodeUrl.openConnection(); - javaCodeConnection.setRequestProperty("content-type", "application/json; charset=utf-8"); - BufferedReader javaCodeBufferReader = new BufferedReader( - new InputStreamReader( - javaCodeConnection.getInputStream())); - String javaCodeInput; - StringBuilder javaCodeResponse = new StringBuilder(); - while ((javaCodeInput = javaCodeBufferReader.readLine()) != null) { - javaCodeResponse.append(javaCodeInput); - //All documents inside IntelliJ IDEA always use \n line separators. - //http://confluence.jetbrains.net/display/IDEADEV/IntelliJ+IDEA+Architectural+Overview - javaCodeResponse.append("\n"); - } - - String javaCode = javaCodeResponse.toString(); - if (!javaCode.startsWith("/* Options:")) { - Notification notification = new Notification("ServiceStackIDEA", "Error Updating Reference", "Invalid response from provided BaseUrl - " + baseUrl, NotificationType.ERROR); - Notifications.Bus.notify(notification); - return; - } - Document document = FileDocumentManager.getInstance().getDocument(psiFile.getVirtualFile()); - if (document != null) { - document.setText(javaCodeResponse); - Analytics.SubmitAnonymousUpdateReferenceUsage(nativeTypesHandler); - } else { - //Show error - Notification notification = new Notification("ServiceStackIDEA", "Error Updating Reference", "DTO file not found.", NotificationType.ERROR); - Notifications.Bus.notify(notification); - } - } catch (Exception e) { - Notification notification = new Notification("ServiceStackIDEA", "Error Updating Reference", e.getMessage(), NotificationType.ERROR); - Notifications.Bus.notify(notification); - e.printStackTrace(); - } - } - - public static String combinePath(String path, String segment) { - if (path == null || path.isEmpty()) { - return "/" + segment; - } - - if (path.charAt(path.length() - 1) == '/') { - return path + segment; - } - - return path + "/" + segment; - } - - public static boolean containsOptionsHeader(PsiFile psiJavaFile) { - Document dtoDocument = FileDocumentManager.getInstance().getDocument(psiJavaFile.getVirtualFile()); - if(dtoDocument == null) { - return false; - } - //Only pull in the first 1000 chars max to look for header. - int range = dtoDocument.getTextLength() > 1000 ? 1000 : dtoDocument.getTextLength(); - String code = dtoDocument.getText(new TextRange(0, range)); - - String[] codeLines = code.split("\n"); - for(String line : codeLines) { - if(line.startsWith("BaseUrl:")) { - return true; - } - } - return false; - } -} diff --git a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml deleted file mode 100644 index e6430cb..0000000 --- a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml +++ /dev/null @@ -1,73 +0,0 @@ - - net.servicestack.ideaplugin - ServiceStack - - 1.0.15 - ServiceStack - - - - -
  • 1.0.15 - Add Dart ServiceStack Reference support.
  • -
  • 1.0.14 - Fix adding Android dependencies.
  • -
  • 1.0.12 - Fix TypeScript dialog defaults to use classes over definitions only.
  • -
  • 1.0.11 - Small UI fixes.
  • -
  • 1.0.10 - Add TypeScript support. Fix issue with resolving URL to match behavior of other extensions.
  • -
  • 1.0.9 - Fix plugin to support Android Studio 2.0.
  • -
  • 1.0.8 - Add support for Kotlin projects with Add/Update ServiceStack reference.
  • -
  • 1.0.7 - Bug fixes and client now gets dependency version from ServiceStack.Java tags, falls back to 1.0.15 if it fails.
  • -
  • 1.0.6 - Update client and android dependency versions to 1.0.13.
  • -
  • 1.0.5 - Update client and android dependency versions to 1.0.12.
  • -
  • 1.0.4 - Bug fixes for Maven project support and new versions of net.servicestack:client.
  • -
  • 1.0.3 - Added support to detect Maven pom.xml and inject net.servicestack:client dependency for IntelliJ + Maven modules.
  • -
  • 1.0.2 - Fix plugin.xml template bug to enable search from IDE.
  • -
  • 1.0 - Initial release.
  • - - ]]> -
    - - - - - - com.intellij.modules.platform - com.intellij.modules.lang - com.intellij.modules.java - - - - - net.servicestack.idea.UpdateServiceStackReferenceIntention - - - - - - - - - - - - - - - - - - - - - -
    \ No newline at end of file diff --git a/src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/after.java.template b/src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/after.java.template deleted file mode 100644 index e69de29..0000000 diff --git a/src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/before.java.template b/src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/before.java.template deleted file mode 100644 index e69de29..0000000 diff --git a/src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/description.html b/src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/description.html deleted file mode 100644 index 774e9e1..0000000 --- a/src/ServiceStackIDEA/src/main/resources/intentionDescriptions/UpdateServiceStackReferenceIntention/description.html +++ /dev/null @@ -1,7 +0,0 @@ - - -Update the current ServiceStack reference. - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/src/main/resources/logo-16.png b/src/ServiceStackIDEA/src/main/resources/logo-16.png deleted file mode 100644 index e94cfb7090faddf2d8893f7a22e10e249e87fb60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3057 zcmV004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv 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 Date: Wed, 7 Jul 2021 16:34:51 +1000 Subject: [PATCH 06/68] Add .idea/ to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 807b29d..e06a792 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,4 @@ src/ServiceStackEclipse/**/target src/ServiceStackEclipse/**/.settings src/AndroidClient/client/pom.xml +.idea/ From f6d5d63c00431c719a50adab34d0b4f97af11560 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 18:10:15 +1100 Subject: [PATCH 07/68] Update gradle process. Try build and prep ability to push to oss.sonatype.org --- .github/workflows/publish.yml | 33 +++++++ src/AndroidClient/android/build.gradle | 107 +++++++++------------ src/AndroidClient/build.gradle | 5 +- src/AndroidClient/client/build.gradle | 127 ++++++++++++------------- 4 files changed, 141 insertions(+), 131 deletions(-) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..15d82f3 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,33 @@ +name: Publish to OSSRH + +on: + push: + branches: + - master + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Java + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + + - name: Build + run: ./gradlew build +# env: +# OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} +# OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 299de4f..4c001a5 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -1,21 +1,24 @@ +// Apply necessary plugins apply plugin: 'com.android.library' -apply plugin: 'com.github.dcendents.android-maven' -apply plugin: 'com.jfrog.bintray' - -version = "1.0.49" +apply plugin: 'maven-publish' +// Define the version and group for the Maven package +version = "1.0.50" +group = "net.servicestack" +// Specify dependencies dependencies { - implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6' - implementation 'com.squareup.okhttp3:okhttp:3.12.1' + implementation 'com.google.code.gson:gson:2.8.9' + implementation 'com.squareup.okhttp3:okhttp:4.4.1' implementation fileTree(include: '*.jar', dir: 'libs') - androidTestImplementation 'junit:junit:4.12' + androidTestImplementation 'junit:junit:4.13.1' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support:support-annotations:28.0.0' } +// Android specific configurations android { - compileSdkVersion 29 + compileSdkVersion 31 buildToolsVersion '29.0.2' lintOptions { @@ -24,7 +27,7 @@ android { defaultConfig { minSdkVersion 15 - targetSdkVersion 29 + targetSdkVersion 31 versionCode 1 versionName version @@ -41,74 +44,58 @@ android { } } -Properties properties = System.properties; -if(properties.getProperty("bintray.user", null) == null) { - properties.load(project.file('./local.properties').newDataInputStream()) -} - -def siteUrl = 'https://github.com/ServiceStack/ServiceStack.Java' // Homepage URL of the library -def gitUrl = 'https://github.com/ServiceStack/ServiceStack.Java.git' // Git repository URL -group = "net.servicestack" // Maven Group ID for the artifact - -bintray { - user = properties.getProperty("bintray.user") - key = properties.getProperty("bintray.apiKey") - - configurations = ['archives'] - pkg { - repo = "maven" - name = "ServiceStack.Android" - websiteUrl = siteUrl - vcsUrl = gitUrl - licenses = ["BSD 3-Clause"] - publish = properties.getProperty('bintray.publish') == 'true' - userOrg = 'servicestack' - } -} +// Configure the publishing block for Maven Central deployment +publishing { + publications { + mavenJava(MavenPublication) { + artifact("$buildDir/outputs/aar/${project.name}-release.aar") -install { - repositories.mavenInstaller { - // This generates POM.xml with proper parameters - pom { - project { - packaging 'aar' + groupId = group + artifactId = 'android' + version = version - // Add your description here - name 'ServiceStack.Android' - description 'A client library to call your ServiceStack webservices for Android clients.' - url siteUrl + pom { + name = 'ServiceStack.Android' + description = 'A client library to call your ServiceStack webservices for Android clients.' + url = 'https://github.com/ServiceStack/ServiceStack.Java' - // Set your license licenses { license { - name 'The BSD 3-Clause License' - url 'https://servicestack.net/bsd-license.txt' + name = 'The BSD 3-Clause License' + url = 'https://servicestack.net/bsd-license.txt' } } developers { developer { - id 'mythz' - name 'Demis Bellot' - email 'team@servicestack.net' + id = 'mythz' + name = 'Demis Bellot' + email = 'team@servicestack.net' } developer { - id 'layoric' - name 'Darren Reid' - email 'team@servicestack.net' + id = 'layoric' + name = 'Darren Reid' + email = 'team@servicestack.net' } } - scm { - connection 'https://github.com/ServiceStack/ServiceStack.Java' - developerConnection 'https://github.com/ServiceStack/ServiceStack.Java' - url 'https://github.com/ServiceStack/ServiceStack.Java' + scm { + connection = 'https://github.com/ServiceStack/ServiceStack.Java.git' + developerConnection = 'https://github.com/ServiceStack/ServiceStack.Java.git' + url = 'https://github.com/ServiceStack/ServiceStack.Java' } } } } -} -repositories { - mavenCentral() -} + repositories { + maven { + name = 'OSSRH' + url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") + credentials { + username = project.findProperty("ossrhUsername") ?: System.getenv("OSSRH_USERNAME") + password = project.findProperty("ossrhPassword") ?: System.getenv("OSSRH_TOKEN") + } + } + } +} \ No newline at end of file diff --git a/src/AndroidClient/build.gradle b/src/AndroidClient/build.gradle index 58bd80b..c6e03a0 100644 --- a/src/AndroidClient/build.gradle +++ b/src/AndroidClient/build.gradle @@ -3,7 +3,7 @@ buildscript { ext.kotlin_version = '1.3.61' repositories { - jcenter() + mavenCentral() maven { url 'https://maven.google.com/' name 'Google' @@ -12,7 +12,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.0.0' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong @@ -22,7 +21,7 @@ buildscript { allprojects { repositories { - jcenter() + mavenCentral() maven { url 'https://maven.google.com/' name 'Google' diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index f516914..fc4ea67 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -1,99 +1,90 @@ -apply plugin: 'com.jfrog.bintray' +// Apply necessary plugins apply plugin: 'java' -apply plugin: 'idea' -apply plugin: 'maven' +apply plugin: 'maven-publish' -version = "1.0.49" +// Define the version and group for the Maven package +version = "1.0.50" +group = "net.servicestack" +// Specify dependencies dependencies { - implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6' - testImplementation 'junit:junit:4.12' + implementation 'com.google.code.gson:gson:2.8.9' + testImplementation 'junit:junit:4.13.1' testImplementation 'pl.pragmatists:JUnitParams:1.1.1' } -group = "net.servicestack" // Maven Group ID for the artifact -String packageId = "client" -String groupID = group -String versionNum = version - -String siteUrl = 'https://github.com/ServiceStack/ServiceStack.Java' // Homepage URL of the library -String gitUrl = 'https://github.com/ServiceStack/ServiceStack.Java.git' // Git repository URL +// Additional tasks for generating source and Javadoc JARs +task sourcesJar(type: Jar) { + from sourceSets.main.allJava + archiveClassifier.set('sources') +} -Properties properties = System.properties; -if(properties.getProperty("bintray.user", null) == null) { - properties.load(project.file('./local.properties').newDataInputStream()) +task javadocJar(type: Jar, dependsOn: javadoc) { + from javadoc.destinationDir + archiveClassifier.set('javadoc') } -install { - repositories.mavenInstaller { - pom { - project { - packaging 'jar' - groupId groupID - artifactId packageId - version versionNum - // Add your description here - name 'ServiceStack.Client' - description 'A client library to call your ServiceStack webservices.' - url siteUrl +// Configure the publishing block for Maven Central deployment +publishing { + publications { + mavenJava(MavenPublication) { + from components.java - // Set your license + // Attach source and javadoc JARs + artifact sourcesJar + artifact javadocJar + + pom { + name = 'ServiceStack.Client' + description = 'A client library to call your ServiceStack webservices.' + url = 'https://github.com/ServiceStack/ServiceStack.Java' + + version = version licenses { license { - name 'The BSD 3-Clause License' - url 'https://servicestack.net/bsd-license.txt' + name = 'The BSD 3-Clause License' + url = 'https://servicestack.net/bsd-license.txt' } } developers { developer { - id 'mythz' - name 'Demis Bellot' - email 'team@servicestack.net' + id = 'mythz' + name = 'Demis Bellot' + email = 'team@servicestack.net' } developer { - id 'layoric' - name 'Darren Reid' - email 'team@servicestack.net' + id = 'layoric' + name = 'Darren Reid' + email = 'team@servicestack.net' } } + scm { - connection 'https://github.com/ServiceStack/ServiceStack.Java' - developerConnection 'https://github.com/ServiceStack/ServiceStack.Java' - url 'https://github.com/ServiceStack/ServiceStack.Java' + connection = 'https://github.com/ServiceStack/ServiceStack.Java.git' + developerConnection = 'https://github.com/ServiceStack/ServiceStack.Java.git' + url = 'https://github.com/ServiceStack/ServiceStack.Java' } } - }.writeTo('pom.xml') + } } -} -bintray { - user = properties.getProperty("bintray.user") - key = properties.getProperty("bintray.apiKey") - - configurations = ['archives'] - pkg { - repo = "maven" - userOrg = 'servicestack' - name = "ServiceStack.Client" - websiteUrl = siteUrl - vcsUrl = gitUrl - licenses = ["BSD 3-Clause"] - publish = properties.getProperty('bintray.publish') == 'true' + repositories { + maven { + name = 'OSSRH' + url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") + credentials { + username = project.findProperty("ossrhUsername") ?: System.getenv("OSSRH_USERNAME") + password = project.findProperty("ossrhPassword") ?: System.getenv("OSSRH_TOKEN") + } + } + maven { + url = uri("file://${project.rootDir}/localRepo") + } } } -task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives sourcesJar - archives javadocJar +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } \ No newline at end of file From c602ef87e76aaa7725b7a9e1b50120363dda92d7 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 18:27:18 +1100 Subject: [PATCH 08/68] Update gradle process. Try build and prep ability to push to oss.sonatype.org --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 15d82f3..abdc7b8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,7 +6,7 @@ on: - master jobs: - publish: + build: runs-on: ubuntu-latest steps: @@ -27,7 +27,7 @@ jobs: restore-keys: ${{ runner.os }}-gradle - name: Build - run: ./gradlew build + run: ./src/AndroidClient/client/gradlew build # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} # OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} From 21f5d9c1e0fce214a7b7c23e6359d9d640c49f81 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 18:42:45 +1100 Subject: [PATCH 09/68] Try fix permissions. --- .github/workflows/publish.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index abdc7b8..37e8404 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -26,6 +26,9 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} restore-keys: ${{ runner.os }}-gradle + - name: Set up permissions + run: chmod +x ./src/AndroidClient/client/gradlew + - name: Build run: ./src/AndroidClient/client/gradlew build # env: From acca573af26f3465a0cb382c3c51ce231140a6c2 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 18:48:07 +1100 Subject: [PATCH 10/68] Add client and android build. Attempt to publish local first. --- .github/workflows/publish.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 37e8404..228c32e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -26,11 +26,24 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} restore-keys: ${{ runner.os }}-gradle - - name: Set up permissions + - name: Set up permissions client run: chmod +x ./src/AndroidClient/client/gradlew - - name: Build + - name: Build client run: ./src/AndroidClient/client/gradlew build + + - name: Publish local client + run: ./src/AndroidClient/client/gradlew publicToMavenLocal + + - name: Set up permissions android + run: chmod +x ./src/AndroidClient/android/gradlew + + - name: Build android + run: ./src/AndroidClient/android/gradlew build + + - name: Publish local android + run: ./src/AndroidClient/android/gradlew publicToMavenLocal + # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} # OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} From 1b4c8d339cb920418eb4011365bb1f7caf6bcfa4 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 18:51:45 +1100 Subject: [PATCH 11/68] Add client and android build. Attempt to publish local first. --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 228c32e..82a487e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,7 +33,7 @@ jobs: run: ./src/AndroidClient/client/gradlew build - name: Publish local client - run: ./src/AndroidClient/client/gradlew publicToMavenLocal + run: ./src/AndroidClient/client/gradlew publishToMavenLocal - name: Set up permissions android run: chmod +x ./src/AndroidClient/android/gradlew @@ -42,7 +42,7 @@ jobs: run: ./src/AndroidClient/android/gradlew build - name: Publish local android - run: ./src/AndroidClient/android/gradlew publicToMavenLocal + run: ./src/AndroidClient/android/gradlew publishToMavenLocal # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} From 3a8ea661c1ed814b4fc1f94ea38f6b5000c21822 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 19:04:01 +1100 Subject: [PATCH 12/68] Try publish to GitHub Packages. --- .github/workflows/publish.yml | 14 ++++++++++---- src/AndroidClient/android/build.gradle | 9 +++++++++ src/AndroidClient/client/build.gradle | 8 +++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 82a487e..69a9240 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -32,8 +32,11 @@ jobs: - name: Build client run: ./src/AndroidClient/client/gradlew build - - name: Publish local client - run: ./src/AndroidClient/client/gradlew publishToMavenLocal + - name: Build and Publish + env: + USERNAME_GITHUB: ${{ github.actor }} + TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} + run: ./src/AndroidClient/client/gradlew publish - name: Set up permissions android run: chmod +x ./src/AndroidClient/android/gradlew @@ -41,8 +44,11 @@ jobs: - name: Build android run: ./src/AndroidClient/android/gradlew build - - name: Publish local android - run: ./src/AndroidClient/android/gradlew publishToMavenLocal + - name: Build and Publish + env: + USERNAME_GITHUB: ${{ github.actor }} + TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} + run: ./src/AndroidClient/android/gradlew publish # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 4c001a5..30df83e 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -97,5 +97,14 @@ publishing { password = project.findProperty("ossrhPassword") ?: System.getenv("OSSRH_TOKEN") } } + maven { + name = 'GitHubPackages' + url = uri("https://maven.pkg.github.com/ServiceStack/ServiceStack.Java") + + credentials { + username = project.findProperty("gpr.user") ?: System.getenv("USERNAME_GITHUB") + password = project.findProperty("gpr.token") ?: System.getenv("TOKEN_GITHUB") + } + } } } \ No newline at end of file diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index fc4ea67..0446228 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -79,7 +79,13 @@ publishing { } } maven { - url = uri("file://${project.rootDir}/localRepo") + name = 'GitHubPackages' + url = uri("https://maven.pkg.github.com/ServiceStack/ServiceStack.Java") + + credentials { + username = project.findProperty("gpr.user") ?: System.getenv("USERNAME_GITHUB") + password = project.findProperty("gpr.token") ?: System.getenv("TOKEN_GITHUB") + } } } } From 2a5237859c3336766550bafb2b3f32ef68851c5a Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 19:15:25 +1100 Subject: [PATCH 13/68] Update gradlew and specify correct publish task for GitHub Packages. --- .github/workflows/publish.yml | 4 ++-- .../client/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 69a9240..22ecd00 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -36,7 +36,7 @@ jobs: env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} - run: ./src/AndroidClient/client/gradlew publish + run: ./src/AndroidClient/client/gradlew publishAllPublicationsToGitHubPackagesRepository - name: Set up permissions android run: chmod +x ./src/AndroidClient/android/gradlew @@ -48,7 +48,7 @@ jobs: env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} - run: ./src/AndroidClient/android/gradlew publish + run: ./src/AndroidClient/android/gradlew publishAllPublicationsToGitHubPackagesRepository # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} diff --git a/src/AndroidClient/client/gradle/wrapper/gradle-wrapper.properties b/src/AndroidClient/client/gradle/wrapper/gradle-wrapper.properties index b6d1b47..a72fc18 100644 --- a/src/AndroidClient/client/gradle/wrapper/gradle-wrapper.properties +++ b/src/AndroidClient/client/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip From 009f03f05320856f720f593736e949b3538659cd Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 10 Oct 2023 19:23:04 +1100 Subject: [PATCH 14/68] Fix working directories. --- .github/workflows/publish.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 22ecd00..05256fb 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -30,25 +30,29 @@ jobs: run: chmod +x ./src/AndroidClient/client/gradlew - name: Build client - run: ./src/AndroidClient/client/gradlew build + working-directory: ./src/AndroidClient/client + run: ./gradlew build - name: Build and Publish env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} - run: ./src/AndroidClient/client/gradlew publishAllPublicationsToGitHubPackagesRepository + working-directory: ./src/AndroidClient/client + run: ./gradlew publishAllPublicationsToGitHubPackagesRepository - name: Set up permissions android run: chmod +x ./src/AndroidClient/android/gradlew - name: Build android - run: ./src/AndroidClient/android/gradlew build + working-directory: ./src/AndroidClient/android + run: ./gradlew build - name: Build and Publish + working-directory: ./src/AndroidClient/android env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} - run: ./src/AndroidClient/android/gradlew publishAllPublicationsToGitHubPackagesRepository + run: ./gradlew publishAllPublicationsToGitHubPackagesRepository # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} From d33c74b3aa5acd5b6830e2197134faa800284401 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 12:38:16 +1100 Subject: [PATCH 15/68] Use `https` for live URLs. Temporarily disable SSE tests due to their brittle nature when working on live deployed sample applications. --- .../servicestack/android/AndroidServiceClientTests.java | 2 +- .../android/techstacks/TechStacksServiceTests.java | 4 ++-- .../android/techstacks/TechStacksServiceTestsAsync.java | 2 +- .../java/net/servicestack/android/techstacks/dtos.java | 2 +- .../servicestack/android/test/JsonServiceClientTests.java | 6 +++--- .../android/test/TestInterfaceMarkerTests.java | 2 +- .../android/test/TestInterfaceMarkerTestsAsync.java | 2 +- .../net/servicestack/android/test/TestServiceTests.java | 8 ++++---- .../servicestack/android/test/TestServiceTestsAsync.java | 6 +++--- .../java/net/servicestack/android/test/dtos.java | 2 +- .../client/src/test/java/io/techstacks/dto.java | 2 +- .../net/servicestack/client/JsonServiceClientTests.java | 8 ++++---- .../src/test/java/net/servicestack/client/JsonTests.java | 4 ++-- .../net/servicestack/client/ServerEventClientTests.java | 4 +++- .../net/servicestack/client/TechStacksServiceTests.java | 2 +- .../test/java/net/servicestack/client/TestAuthTests.java | 2 +- .../net/servicestack/client/TestInterfaceMarkerTests.java | 2 +- .../java/net/servicestack/client/TestServiceTests.java | 8 ++++---- .../src/test/java/net/servicestack/client/testdtos.java | 2 +- src/AndroidClient/client/src/test/java/test/dtos.java | 2 +- .../java/test/servicestack/net/kotlin/ApplicationTest.kt | 2 +- .../net/kotlin/techstacks/TechStacksServiceTests.kt | 2 +- .../net/kotlin/techstacks/TechStacksServiceTestsAsync.kt | 2 +- .../java/test/servicestack/net/kotlin/techstacks/dtos.kt | 2 +- .../net/kotlin/test/JsonServiceClientTests.kt | 6 +++--- .../test/servicestack/net/kotlin/test/TestAuthTests.kt | 2 +- .../net/kotlin/test/TestInterfaceMarkerTests.kt | 2 +- .../net/kotlin/test/TestInterfaceMarkerTestsAsync.kt | 2 +- .../test/servicestack/net/kotlin/test/TestServiceTests.kt | 6 +++--- .../servicestack/net/kotlin/test/TestServiceTestsAsync.kt | 6 +++--- .../java/test/servicestack/net/kotlin/test/dtos.kt | 2 +- .../main/java/servicestack/net/techstackskotlin/App.kt | 2 +- .../main/java/servicestack/net/techstackskotlin/dtos.kt | 2 +- 33 files changed, 56 insertions(+), 54 deletions(-) diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/AndroidServiceClientTests.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/AndroidServiceClientTests.java index 7c84fc3..5c45597 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/AndroidServiceClientTests.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/AndroidServiceClientTests.java @@ -13,7 +13,7 @@ public AndroidServiceClientTests() { Log.Instance = new AndroidLogProvider("ZZZ"); } - AndroidServiceClient client = new AndroidServiceClient("https://www.techstacks.io"); + AndroidServiceClient client = new AndroidServiceClient("https://techstacks.io"); @Test public void test(){ diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTests.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTests.java index 6a5a6dd..0a06799 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTests.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTests.java @@ -38,7 +38,7 @@ public TechStacksServiceTests() { } - JsonServiceClient client = new JsonServiceClient("https://www.techstacks.io"); + JsonServiceClient client = new JsonServiceClient("https://techstacks.io"); @Test public void test_Can_GET_TechStacks_Overview(){ @@ -65,7 +65,7 @@ public void test_Can_GET_TechStacks_Overview_with_relative_url() { @Test public void test_Can_GET_TechStacks_Overview_with_absolute_url() { - OverviewResponse response = client.get("https://www.techstacks.io/overview", OverviewResponse.class); + OverviewResponse response = client.get("https://techstacks.io/overview", OverviewResponse.class); assertOverviewResponse(response); } diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTestsAsync.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTestsAsync.java index 537f2ee..322b7eb 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTestsAsync.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/TechStacksServiceTestsAsync.java @@ -33,7 +33,7 @@ public TechStacksServiceTestsAsync() { Log.Instance = new AndroidLogProvider("ZZZ"); } - AndroidServiceClient client = new AndroidServiceClient("https://www.techstacks.io"); + AndroidServiceClient client = new AndroidServiceClient("https://techstacks.io"); @Test public void test_Can_GET_TechStacks_Overview() throws InterruptedException { diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/dtos.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/dtos.java index 36fb642..35bcced 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/dtos.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/techstacks/dtos.java @@ -2,7 +2,7 @@ Date: 2021-03-01 09:48:32 Version: 5.105 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: https://www.techstacks.io +BaseUrl: https://techstacks.io Package: net.servicestack.android.techstacks //GlobalNamespace: dtos diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/JsonServiceClientTests.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/JsonServiceClientTests.java index 74a2c60..f6b0cff 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/JsonServiceClientTests.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/JsonServiceClientTests.java @@ -21,7 +21,7 @@ public JsonServiceClientTests() { } //10.0.2.2 = loopback //http://developer.android.com/tools/devices/emulator.html - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); public void test_can_GET_HelloAll(){ Hello request = new Hello() @@ -34,7 +34,7 @@ public void test_can_GET_HelloAll(){ public void test_can_use_request_filter() { final Boolean[] passTest = {false}; - JsonServiceClient localTestClient = new JsonServiceClient("http://test.servicestack.net/"); + JsonServiceClient localTestClient = new JsonServiceClient("https://test.servicestack.net/"); localTestClient.RequestFilter = new ConnectionFilter() { @Override @@ -64,7 +64,7 @@ public void test_does_process_missing_service_correctly() { } public void test_can_serialize_dates_correctly_via_get_request() { - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net/"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net/"); EchoTypes request = new EchoTypes(); Calendar cal = Calendar.getInstance(); diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTests.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTests.java index b977064..a2e19b9 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTests.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTests.java @@ -15,7 +15,7 @@ public TestInterfaceMarkerTests() { } - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); public void test_Does_SendDefault_as_POST(){ SendVerbResponse response = client.send(new SendDefault().setId(1)); diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTestsAsync.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTestsAsync.java index 77bed9a..ac3eeab 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTestsAsync.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestInterfaceMarkerTestsAsync.java @@ -23,7 +23,7 @@ */ public class TestInterfaceMarkerTestsAsync { - AndroidServiceClient client = new AndroidServiceClient("http://test.servicestack.net"); + AndroidServiceClient client = new AndroidServiceClient("https://test.servicestack.net"); @Test public void test_Does_SendDefault_as_POST() throws InterruptedException { diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTests.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTests.java index 07ea27d..b9653cc 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTests.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTests.java @@ -30,7 +30,7 @@ public TestServiceTests() { //Log.Instance = new AndroidLogProvider("ZZZ"); } - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); // JsonServiceClient client = new JsonServiceClient("http://10.0.2.2:2020"); public void test_Can_GET_Hello(){ @@ -44,7 +44,7 @@ public void test_Can_GET_Hello(){ public void test_does_fire_Request_and_Response_Filters(){ - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); final ArrayList events = new ArrayList<>(); @@ -126,7 +126,7 @@ public void test_Can_Serailize_AllTypes(){ } public void test_Does_handle_404_Error() { - JsonServiceClient testClient = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient testClient = new JsonServiceClient("https://test.servicestack.net"); final Exception[] globalError = new Exception[1]; //Wow Java, you suck. final Exception[] localError = new Exception[1]; @@ -169,7 +169,7 @@ public void exec(HttpURLConnection res, Exception ex) { } public void test_Does_handle_401_Error_with_empty_ResponseBody() { - JsonServiceClient testClient = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient testClient = new JsonServiceClient("https://test.servicestack.net"); final Exception[] globalError = new Exception[1]; //Wow Java, you suck. final Exception[] localError = new Exception[1]; diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTestsAsync.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTestsAsync.java index a1cdcef..6c6ad93 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTestsAsync.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/TestServiceTestsAsync.java @@ -49,12 +49,12 @@ @RunWith(AndroidJUnit4.class) public class TestServiceTestsAsync { - AndroidServiceClient client = new AndroidServiceClient("http://test.servicestack.net"); + AndroidServiceClient client = new AndroidServiceClient("https://test.servicestack.net"); @Test public void test_does_fire_Request_and_Response_Filters_Async() throws InterruptedException { - AndroidServiceClient client = new AndroidServiceClient("http://test.servicestack.net"); + AndroidServiceClient client = new AndroidServiceClient("https://test.servicestack.net"); final ArrayList events = new ArrayList<>(); @@ -151,7 +151,7 @@ public void complete() { @Test public void test_Does_handle_404_Error_Async() throws InterruptedException { - AndroidServiceClient testClient = new AndroidServiceClient("http://test.servicestack.net"); + AndroidServiceClient testClient = new AndroidServiceClient("https://test.servicestack.net"); final Exception[] globalError = new Exception[1]; //Wow Java, you suck. final Exception[] localError = new Exception[1]; diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/dtos.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/dtos.java index 8f12b18..7e425fb 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/dtos.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/test/dtos.java @@ -2,7 +2,7 @@ Date: 2021-03-01 10:48:35 Version: 5.105 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: http://test.servicestack.net +BaseUrl: https://test.servicestack.net Package: net.servicestack.android.test //GlobalNamespace: dtos diff --git a/src/AndroidClient/client/src/test/java/io/techstacks/dto.java b/src/AndroidClient/client/src/test/java/io/techstacks/dto.java index cbdad1c..de5b92d 100644 --- a/src/AndroidClient/client/src/test/java/io/techstacks/dto.java +++ b/src/AndroidClient/client/src/test/java/io/techstacks/dto.java @@ -2,7 +2,7 @@ Date: 2018-04-15 04:43:13 Version: 5.03 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: https://www.techstacks.io +BaseUrl: https://techstacks.io Package: io.techstacks GlobalNamespace: dto diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java index 2c90e62..6fbb92a 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java @@ -20,7 +20,7 @@ public JsonServiceClientTests() { } //10.0.2.2 = loopback //http://developer.android.com/tools/devices/emulator.html - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); public void test_can_GET_HelloAll(){ Hello request = new Hello() @@ -33,7 +33,7 @@ public void test_can_GET_HelloAll(){ public void test_can_use_request_filter() { final Boolean[] passTest = {false}; - JsonServiceClient localTestClient = new JsonServiceClient("http://test.servicestack.net/"); + JsonServiceClient localTestClient = new JsonServiceClient("https://test.servicestack.net/"); localTestClient.RequestFilter = new ConnectionFilter() { @Override @@ -52,7 +52,7 @@ public void exec(HttpURLConnection conn) { } public void test_does_process_missing_service_correctly() { - JsonServiceClient localTestClient = new JsonServiceClient("https://www.techstacks.io/"); + JsonServiceClient localTestClient = new JsonServiceClient("https://techstacks.io/"); try { localTestClient.get(new EchoTypes()); @@ -63,7 +63,7 @@ public void test_does_process_missing_service_correctly() { } public void test_can_serialize_dates_correctly_via_get_request() { - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net/"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net/"); EchoTypes request = new EchoTypes(); Calendar cal = Calendar.getInstance(); diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java index b315627..04faf92 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java @@ -39,13 +39,13 @@ public void test_Does_deserialize_TimeSpan(){ } public void test_Does_serialize_DateTime_in_QueryString() throws UnsupportedEncodingException { - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); testDateDtos.HelloDateTime request = new testDateDtos.HelloDateTime() .setDateTime(Utils.fromDateTime("2001-01-01T01:01:01Z")); String url = client.createUrl(request); - assertEquals("http://test.servicestack.net/json/reply/HelloDateTime?dateTime=" + URLEncoder.encode("/Date(978310861000-0000)/", "UTF-8"), url); + assertEquals("https://test.servicestack.net/json/reply/HelloDateTime?dateTime=" + URLEncoder.encode("/Date(978310861000-0000)/", "UTF-8"), url); } public void test_Can_get_time_components(){ diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/ServerEventClientTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/ServerEventClientTests.java index 97ca09b..6706764 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/ServerEventClientTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/ServerEventClientTests.java @@ -12,6 +12,7 @@ import net.servicestack.client.sse.SingletonInstanceResolver; import net.servicestack.func.Action; import net.servicestack.func.Func; +import org.junit.Ignore; import java.util.ArrayList; import java.util.HashMap; @@ -29,6 +30,7 @@ * Created by mythz on 2/10/2017. */ +@Ignore("Brittle tests when working with live server.") public class ServerEventClientTests extends TestCase { @@ -36,7 +38,7 @@ public ServerEventClientTests() { Log.setInstance(new LogProvider("", true)); } - public static String ChatUrl = "http://test.servicestack.net"; + public static String ChatUrl = "https://chat.netcore.io"; // public static String ChatUrl = "http://localhost:5000"; public ServerEventsClient createServerEventsClient(String baseUrl, String... channels){ diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/TechStacksServiceTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/TechStacksServiceTests.java index 4fcc1ba..fbd445e 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/TechStacksServiceTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/TechStacksServiceTests.java @@ -13,7 +13,7 @@ public TechStacksServiceTests() { } - JsonServiceClient client = new JsonServiceClient("https://www.techstacks.io"); + JsonServiceClient client = new JsonServiceClient("https://techstacks.io"); public void test_Can_GET_TechStacks_Overview(){ OverviewResponse response = client.get(new Overview()); diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestAuthTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestAuthTests.java index d7790a1..90fb19b 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestAuthTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestAuthTests.java @@ -8,7 +8,7 @@ public class TestAuthTests extends TestCase { public JsonServiceClient CreateClient(){ - return new JsonServiceClient("http://test.servicestack.net"); + return new JsonServiceClient("https://test.servicestack.net"); } public void test_AuthRequired_returns_401(){ diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java index 0a10551..f20ee6f 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java @@ -14,7 +14,7 @@ public TestInterfaceMarkerTests() { } - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); public void test_Does_SendDefault_as_POST(){ SendVerbResponse response = client.send(new SendDefault().setId(1)); diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestServiceTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestServiceTests.java index 65af58c..1d01d1d 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestServiceTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestServiceTests.java @@ -19,7 +19,7 @@ public TestServiceTests() { //Log.Instance = new AndroidLogProvider("ZZZ"); } - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); // JsonServiceClient client = new JsonServiceClient("http://10.0.2.2:2020"); public void test_Can_GET_Hello(){ @@ -42,7 +42,7 @@ public void test_Can_send_escaped_chars_in_String(){ public void test_does_fire_Request_and_Response_Filters(){ - JsonServiceClient client = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net"); final ArrayList events = new ArrayList<>(); @@ -124,7 +124,7 @@ public void test_Can_Serailize_AllTypes(){ } public void test_Does_handle_404_Error() { - JsonServiceClient testClient = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient testClient = new JsonServiceClient("https://test.servicestack.net"); final Exception[] globalError = new Exception[1]; //Wow Java, you suck. final Exception[] localError = new Exception[1]; @@ -168,7 +168,7 @@ public void exec(HttpURLConnection res, Exception ex) { @Ignore //test fails in CI public void IGNORE_test_Does_handle_401_Error_with_empty_ResponseBody() { - JsonServiceClient testClient = new JsonServiceClient("http://test.servicestack.net"); + JsonServiceClient testClient = new JsonServiceClient("https://test.servicestack.net"); final Exception[] globalError = new Exception[1]; //Wow Java, you suck. final Exception[] localError = new Exception[1]; diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/testdtos.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/testdtos.java index 26a07f7..892addb 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/testdtos.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/testdtos.java @@ -2,7 +2,7 @@ Date: 2021-03-08 20:21:53 Version: 5.105 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: http://test.servicestack.net +BaseUrl: https://test.servicestack.net Package: net.servicestack.client GlobalNamespace: testdtos diff --git a/src/AndroidClient/client/src/test/java/test/dtos.java b/src/AndroidClient/client/src/test/java/test/dtos.java index 0011445..cedf1fc 100644 --- a/src/AndroidClient/client/src/test/java/test/dtos.java +++ b/src/AndroidClient/client/src/test/java/test/dtos.java @@ -2,7 +2,7 @@ Date: 2021-03-11 05:48:39 Version: 5.105 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: http://test.servicestack.net +BaseUrl: https://test.servicestack.net Package: test GlobalNamespace: dtos diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/ApplicationTest.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/ApplicationTest.kt index da68387..8d569ae 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/ApplicationTest.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/ApplicationTest.kt @@ -19,7 +19,7 @@ public class AndroidServiceClientTests { fun setUp() { Log.Instance = AndroidLogProvider("ZZZ"); - val client = AndroidServiceClient("https://www.techstacks.io") + val client = AndroidServiceClient("https://techstacks.io") } @Test diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTests.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTests.kt index 55a99fa..7982b16 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTests.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTests.kt @@ -11,7 +11,7 @@ import java.util.ArrayList class TechStacksServiceTests : TestCase() { - internal var client = JsonServiceClient("https://www.techstacks.io") + internal var client = JsonServiceClient("https://techstacks.io") fun test_Can_GET_TechStacks_Overview() { val response = client.get(Overview()) diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTestsAsync.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTestsAsync.kt index 534bd2f..95ba65d 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTestsAsync.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTestsAsync.kt @@ -17,7 +17,7 @@ class TechStacksServiceTestsAsync { Log.Instance = AndroidLogProvider("ZZZ") } - internal var client = AndroidServiceClient("https://www.techstacks.io") + internal var client = AndroidServiceClient("https://techstacks.io") @Throws(InterruptedException::class) fun test_Can_GET_TechStacks_Overview() { diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/dtos.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/dtos.kt index 672e544..6a0112a 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/dtos.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/dtos.kt @@ -2,7 +2,7 @@ Date: 2018-04-15 04:44:25 Version: 5.03 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: https://www.techstacks.io +BaseUrl: https://techstacks.io Package: test.servicestack.net.kotlin.techstacks //AddServiceStackTypes: True diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/JsonServiceClientTests.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/JsonServiceClientTests.kt index ee6858a..085fa99 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/JsonServiceClientTests.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/JsonServiceClientTests.kt @@ -14,7 +14,7 @@ import java.util.* class JsonServiceClientTests : TestCase() { //10.0.2.2 = loopback //http://developer.android.com/tools/devices/emulator.html - internal var client = JsonServiceClient("http://test.servicestack.net") + internal var client = JsonServiceClient("https://test.servicestack.net") fun test_can_GET_HelloAll() { val request = Hello() @@ -27,7 +27,7 @@ class JsonServiceClientTests : TestCase() { fun test_can_use_request_filter() { val passTest = arrayOf(false) - val localTestClient = JsonServiceClient("http://test.servicestack.net/") + val localTestClient = JsonServiceClient("https://test.servicestack.net/") localTestClient.RequestFilter = ConnectionFilter { passTest[0] = true } @@ -53,7 +53,7 @@ class JsonServiceClientTests : TestCase() { } fun test_can_serialize_dates_correctly_via_get_request() { - val client = JsonServiceClient("http://test.servicestack.net/") + val client = JsonServiceClient("https://test.servicestack.net/") val request = EchoTypes() val cal = Calendar.getInstance() diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestAuthTests.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestAuthTests.kt index 3dbf628..c5d2b81 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestAuthTests.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestAuthTests.kt @@ -11,7 +11,7 @@ import net.servicestack.client.WebServiceException class TestAuthTests : TestCase() { fun CreateClient(): JsonServiceClient { - return JsonServiceClient("http://test.servicestack.net") + return JsonServiceClient("https://test.servicestack.net") } fun test_AuthRequired_returns_401() { diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTests.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTests.kt index d9831a8..dbc14f9 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTests.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTests.kt @@ -9,7 +9,7 @@ import net.servicestack.client.JsonServiceClient class TestInterfaceMarkerTests : TestCase() { - internal var client = JsonServiceClient("http://test.servicestack.net") + internal var client = JsonServiceClient("https://test.servicestack.net") fun test_Does_SendDefault_as_POST() { val request = SendDefault() diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTestsAsync.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTestsAsync.kt index c3d69e8..181be7c 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTestsAsync.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTestsAsync.kt @@ -12,7 +12,7 @@ import java.util.concurrent.TimeUnit class TestInterfaceMarkerTestsAsync { - internal var client = AndroidServiceClient("http://test.servicestack.net") + internal var client = AndroidServiceClient("https://test.servicestack.net") @Throws(InterruptedException::class) fun test_Does_SendDefault_as_POST() { diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTests.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTests.kt index 711298a..c900636 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTests.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTests.kt @@ -12,7 +12,7 @@ import java.util.* class TestServiceTests : TestCase() { - internal var client = JsonServiceClient("http://test.servicestack.net") + internal var client = JsonServiceClient("https://test.servicestack.net") // JsonServiceClient client = new JsonServiceClient("http://10.0.2.2:2020"); fun test_Can_GET_Hello() { @@ -26,7 +26,7 @@ class TestServiceTests : TestCase() { fun test_does_fire_Request_and_Response_Filters() { - val client = JsonServiceClient("http://test.servicestack.net") + val client = JsonServiceClient("https://test.servicestack.net") val events = ArrayList() @@ -95,7 +95,7 @@ class TestServiceTests : TestCase() { } fun test_Does_handle_404_Error() { - val testClient = JsonServiceClient("http://test.servicestack.net") + val testClient = JsonServiceClient("https://test.servicestack.net") var globalError:Exception? = null var localError:Exception? = null diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTestsAsync.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTestsAsync.kt index 2846efb..3fcde7c 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTestsAsync.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTestsAsync.kt @@ -18,12 +18,12 @@ class TestServiceTestsAsync { Log.Instance = AndroidLogProvider("ZZZ") } - internal var client = AndroidServiceClient("http://test.servicestack.net") + internal var client = AndroidServiceClient("https://test.servicestack.net") @Throws(InterruptedException::class) fun test_does_fire_Request_and_Response_Filters_Async() { - val client = AndroidServiceClient("http://test.servicestack.net") + val client = AndroidServiceClient("https://test.servicestack.net") val events = ArrayList() @@ -83,7 +83,7 @@ class TestServiceTestsAsync { @Throws(InterruptedException::class) fun test_Does_handle_404_Error_Async() { - val testClient = AndroidServiceClient("http://test.servicestack.net") + val testClient = AndroidServiceClient("https://test.servicestack.net") var globalError:Exception? = null var localError:Exception? = null diff --git a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/dtos.kt b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/dtos.kt index 259ee77..8d9c979 100644 --- a/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/dtos.kt +++ b/src/AndroidClient/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/dtos.kt @@ -2,7 +2,7 @@ Date: 2021-03-11 05:48:19 Version: 5.105 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: http://test.servicestack.net +BaseUrl: https://test.servicestack.net Package: test.servicestack.net.kotlin.test //AddServiceStackTypes: True diff --git a/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/App.kt b/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/App.kt index f099530..612419c 100644 --- a/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/App.kt +++ b/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/App.kt @@ -17,7 +17,7 @@ class App { var appData: AppData init { - client = AndroidServiceClient("https://www.techstacks.io") + client = AndroidServiceClient("https://techstacks.io") appData = AppData(client) } diff --git a/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/dtos.kt b/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/dtos.kt index 9eec91b..133033e 100644 --- a/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/dtos.kt +++ b/src/AndroidClient/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/dtos.kt @@ -2,7 +2,7 @@ Date: 2018-04-06 13:13:54 Version: 5.03 Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: https://www.techstacks.io +BaseUrl: https://techstacks.io Package: servicestack.net.techstackskotlin //AddServiceStackTypes: True From 6a1cebdf9924b013f5b07a7139408545c16bb99a Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 12:57:07 +1100 Subject: [PATCH 16/68] Use root gradlew for both. --- .github/workflows/publish.yml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 05256fb..750e788 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,32 +27,29 @@ jobs: restore-keys: ${{ runner.os }}-gradle - name: Set up permissions client - run: chmod +x ./src/AndroidClient/client/gradlew + run: chmod +x ./src/AndroidClient/gradlew - name: Build client - working-directory: ./src/AndroidClient/client - run: ./gradlew build + working-directory: ./src/AndroidClient + run: ./gradlew client:build - name: Build and Publish env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} - working-directory: ./src/AndroidClient/client - run: ./gradlew publishAllPublicationsToGitHubPackagesRepository - - - name: Set up permissions android - run: chmod +x ./src/AndroidClient/android/gradlew + working-directory: ./src/AndroidClient + run: ./gradlew client:publishAllPublicationsToGitHubPackagesRepository - name: Build android - working-directory: ./src/AndroidClient/android - run: ./gradlew build + working-directory: ./src/AndroidClient + run: ./gradlew android:build - name: Build and Publish - working-directory: ./src/AndroidClient/android + working-directory: ./src/AndroidClient env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} - run: ./gradlew publishAllPublicationsToGitHubPackagesRepository + run: ./gradlew android:publishAllPublicationsToGitHubPackagesRepository # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} From 34e0c9f15882da025d439818874d906f1c105a05 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 13:07:05 +1100 Subject: [PATCH 17/68] Use GITHUB RUN NUMBER as a preview build suffix. --- .github/workflows/publish.yml | 14 ++++++++------ src/AndroidClient/android/build.gradle | 5 +++++ src/AndroidClient/client/build.gradle | 5 +++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 750e788..4d8f813 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,4 @@ -name: Publish to OSSRH +name: Build and Publish to GitHub Packages on: push: @@ -33,23 +33,25 @@ jobs: working-directory: ./src/AndroidClient run: ./gradlew client:build - - name: Build and Publish + - name: Build and Publish Client env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} + VERSION_SUFFIX: ${{ github.run_number }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToGitHubPackagesRepository + run: ./gradlew client:publishAllPublicationsToGitHubPackagesRepository -PversionSuffix=$VERSION_SUFFIX - name: Build android working-directory: ./src/AndroidClient run: ./gradlew android:build - - name: Build and Publish - working-directory: ./src/AndroidClient + - name: Build and Publish Android env: USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} - run: ./gradlew android:publishAllPublicationsToGitHubPackagesRepository + VERSION_SUFFIX: ${{ github.run_number }} + working-directory: ./src/AndroidClient + run: ./gradlew android:publishAllPublicationsToGitHubPackagesRepository -PversionSuffix=$VERSION_SUFFIX # env: # OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 30df83e..07df85f 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -5,6 +5,11 @@ apply plugin: 'maven-publish' // Define the version and group for the Maven package version = "1.0.50" group = "net.servicestack" + +if (project.hasProperty('versionSuffix')) { + version = "${version}-${versionSuffix}" +} + // Specify dependencies dependencies { implementation 'com.google.code.gson:gson:2.8.9' diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 0446228..c6e246a 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -6,6 +6,11 @@ apply plugin: 'maven-publish' version = "1.0.50" group = "net.servicestack" +if (project.hasProperty('versionSuffix')) { + version = "${version}-${versionSuffix}" +} + + // Specify dependencies dependencies { implementation 'com.google.code.gson:gson:2.8.9' From 860f242d5d3001ea883c6f912504ca985befd0f6 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 13:19:30 +1100 Subject: [PATCH 18/68] Go back to a v3 version of `okhttp3` dependency. --- src/AndroidClient/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 07df85f..83061e4 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -13,7 +13,7 @@ if (project.hasProperty('versionSuffix')) { // Specify dependencies dependencies { implementation 'com.google.code.gson:gson:2.8.9' - implementation 'com.squareup.okhttp3:okhttp:4.4.1' + implementation 'com.squareup.okhttp3:okhttp:3.14.9' implementation fileTree(include: '*.jar', dir: 'libs') androidTestImplementation 'junit:junit:4.13.1' androidTestImplementation 'com.android.support.test:runner:1.0.2' From be1e9814c39c948442e398952060b79f26c9eebc Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 14:21:01 +1100 Subject: [PATCH 19/68] Setup manual push to OSSRH --- .../{publish.yml => build-test-publish.yml} | 0 .../publish-android-maven-central.yml | 39 +++++++++++++++++++ .../publish-client-maven-central.yml | 39 +++++++++++++++++++ 3 files changed, 78 insertions(+) rename .github/workflows/{publish.yml => build-test-publish.yml} (100%) create mode 100644 .github/workflows/publish-android-maven-central.yml create mode 100644 .github/workflows/publish-client-maven-central.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/build-test-publish.yml similarity index 100% rename from .github/workflows/publish.yml rename to .github/workflows/build-test-publish.yml diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml new file mode 100644 index 0000000..58c4290 --- /dev/null +++ b/.github/workflows/publish-android-maven-central.yml @@ -0,0 +1,39 @@ +name: Publish android to Maven Central + +on: + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Java + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + + - name: Set up permissions client + run: chmod +x ./src/AndroidClient/gradlew + + - name: Build android + working-directory: ./src/AndroidClient + run: ./gradlew android:build + + - name: Publish to Maven Central + env: + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + working-directory: ./src/AndroidClient + run: ./gradlew android:publishAllPublicationsToOSSRHRepository diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml new file mode 100644 index 0000000..416ac00 --- /dev/null +++ b/.github/workflows/publish-client-maven-central.yml @@ -0,0 +1,39 @@ +name: Publish client to Maven Central + +on: + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Java + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + + - name: Set up permissions client + run: chmod +x ./src/AndroidClient/gradlew + + - name: Build client + working-directory: ./src/AndroidClient + run: ./gradlew client:build + + - name: Publish to Maven Central + env: + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + working-directory: ./src/AndroidClient + run: ./gradlew client:publishAllPublicationsToOSSRHRepository From 409ca609054b98e1cd7dd24d93fe44ca834a0140 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 16:13:33 +1100 Subject: [PATCH 20/68] OSSRH now requires GPG signing. Added as a GitHub secret. --- .github/workflows/publish-android-maven-central.yml | 6 ++++++ .github/workflows/publish-client-maven-central.yml | 6 ++++++ src/AndroidClient/android/build.gradle | 10 ++++++++++ src/AndroidClient/client/build.gradle | 12 ++++++++++++ 4 files changed, 34 insertions(+) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 58c4290..22f57ad 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -17,6 +17,11 @@ jobs: java-version: '11' distribution: 'adopt' + - name: Import GPG key + run: | + echo "${{ secrets.OSSRH_GPG }}" > private-key.asc + gpg --import --batch private-key.asc + - name: Cache Gradle packages uses: actions/cache@v2 with: @@ -35,5 +40,6 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient run: ./gradlew android:publishAllPublicationsToOSSRHRepository diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index 416ac00..b42c45c 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -17,6 +17,11 @@ jobs: java-version: '11' distribution: 'adopt' + - name: Import GPG key + run: | + echo "${{ secrets.OSSRH_GPG }}" > private-key.asc + gpg --import --batch private-key.asc + - name: Cache Gradle packages uses: actions/cache@v2 with: @@ -35,5 +40,6 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient run: ./gradlew client:publishAllPublicationsToOSSRHRepository diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 83061e4..951463f 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -10,6 +10,16 @@ if (project.hasProperty('versionSuffix')) { version = "${version}-${versionSuffix}" } +if (project.hasProperty('signing.keyId') || System.getenv("SIGNING_KEY_ID")) { + println "Signing enabled" + signing { + sign configurations.archives + keyId = project.findProperty("signing.keyId") ?: System.getenv("SIGNING_KEY_ID") + } +} else { + println "Signing disabled" +} + // Specify dependencies dependencies { implementation 'com.google.code.gson:gson:2.8.9' diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index c6e246a..b6fae07 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -10,6 +10,18 @@ if (project.hasProperty('versionSuffix')) { version = "${version}-${versionSuffix}" } +apply plugin: 'signing' + + +if (project.hasProperty('signing.keyId') || System.getenv("SIGNING_KEY_ID")) { + println "Signing enabled" + signing { + sign configurations.archives + keyId = project.findProperty("signing.keyId") ?: System.getenv("SIGNING_KEY_ID") + } +} else { + println "Signing disabled" +} // Specify dependencies dependencies { From bc7a85687a0355da7ae00c7b5cdf59c8498b8cd9 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 16:24:02 +1100 Subject: [PATCH 21/68] Missing plugin for signing. --- src/AndroidClient/android/build.gradle | 1 + src/AndroidClient/client/build.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 951463f..1cfc5a3 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -1,6 +1,7 @@ // Apply necessary plugins apply plugin: 'com.android.library' apply plugin: 'maven-publish' +apply plugin: 'signing' // Define the version and group for the Maven package version = "1.0.50" diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index b6fae07..4e010fd 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -1,6 +1,7 @@ // Apply necessary plugins apply plugin: 'java' apply plugin: 'maven-publish' +apply plugin: 'signing' // Define the version and group for the Maven package version = "1.0.50" From baf3ab5a4c02618b82d891eb8de37716352bed01 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 16:46:32 +1100 Subject: [PATCH 22/68] Pass details via command line gradle property --- .github/workflows/publish-android-maven-central.yml | 5 ++++- .github/workflows/publish-client-maven-central.yml | 5 ++++- src/AndroidClient/android/build.gradle | 3 +-- src/AndroidClient/client/build.gradle | 6 +----- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 22f57ad..6a135fb 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -21,6 +21,7 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc + echo "SIGNING_SECRET_KEY_RING_FILE=$(pwd)/private-key.asc" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 @@ -42,4 +43,6 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew android:publishAllPublicationsToOSSRHRepository + run: ./gradlew android:publishAllPublicationsToOSSRHRepository \ + -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} \ + -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index b42c45c..e3e1b9a 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -21,6 +21,7 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc + echo "SIGNING_SECRET_KEY_RING_FILE=$(pwd)/private-key.asc" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 @@ -42,4 +43,6 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToOSSRHRepository + run: ./gradlew client:publishAllPublicationsToOSSRHRepository \ + -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} \ + -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 1cfc5a3..eaca8de 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -11,11 +11,10 @@ if (project.hasProperty('versionSuffix')) { version = "${version}-${versionSuffix}" } -if (project.hasProperty('signing.keyId') || System.getenv("SIGNING_KEY_ID")) { +if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { sign configurations.archives - keyId = project.findProperty("signing.keyId") ?: System.getenv("SIGNING_KEY_ID") } } else { println "Signing disabled" diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 4e010fd..e1e1829 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -11,14 +11,10 @@ if (project.hasProperty('versionSuffix')) { version = "${version}-${versionSuffix}" } -apply plugin: 'signing' - - -if (project.hasProperty('signing.keyId') || System.getenv("SIGNING_KEY_ID")) { +if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { sign configurations.archives - keyId = project.findProperty("signing.keyId") ?: System.getenv("SIGNING_KEY_ID") } } else { println "Signing disabled" From ac75563bb147fc5db6ab80256a883c63cb2b8a04 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 17:24:52 +1100 Subject: [PATCH 23/68] Pass details via command line gradle property --- .github/workflows/publish-android-maven-central.yml | 4 +--- .github/workflows/publish-client-maven-central.yml | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 6a135fb..890ef9c 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -43,6 +43,4 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew android:publishAllPublicationsToOSSRHRepository \ - -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} \ - -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} + run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index e3e1b9a..ccbee7a 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -43,6 +43,4 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToOSSRHRepository \ - -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} \ - -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} + run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} From db1484c2e583e373c3b19ea32f00c6f03a6f4aa8 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 17:45:21 +1100 Subject: [PATCH 24/68] Try to wire signing into publishing. --- src/AndroidClient/android/build.gradle | 2 +- src/AndroidClient/client/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index eaca8de..bc76298 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -14,7 +14,7 @@ if (project.hasProperty('versionSuffix')) { if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { - sign configurations.archives + sign publishing.publications.mavenJava } } else { println "Signing disabled" diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index e1e1829..77361f0 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -14,7 +14,7 @@ if (project.hasProperty('versionSuffix')) { if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { - sign configurations.archives + sign publishing.publications.mavenJava } } else { println "Signing disabled" From 4b6f98062dd6800fb0d2d8da14ee23156ff25f40 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 17:56:34 +1100 Subject: [PATCH 25/68] Try to wire signing into publishing. --- src/AndroidClient/android/build.gradle | 24 +++++++++++++-------- src/AndroidClient/client/build.gradle | 30 +++++++++++--------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index bc76298..7112bb4 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -11,15 +11,6 @@ if (project.hasProperty('versionSuffix')) { version = "${version}-${versionSuffix}" } -if (project.hasProperty('signing.keyId')) { - println "Signing enabled" - signing { - sign publishing.publications.mavenJava - } -} else { - println "Signing disabled" -} - // Specify dependencies dependencies { implementation 'com.google.code.gson:gson:2.8.9' @@ -59,6 +50,11 @@ android { } } +java { + withJavadocJar() + withSourcesJar() +} + // Configure the publishing block for Maven Central deployment publishing { publications { @@ -122,4 +118,14 @@ publishing { } } } +} + + +if (project.hasProperty('signing.keyId')) { + println "Signing enabled" + signing { + sign publishing.publications.mavenJava + } +} else { + println "Signing disabled" } \ No newline at end of file diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 77361f0..c17ff01 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -11,15 +11,6 @@ if (project.hasProperty('versionSuffix')) { version = "${version}-${versionSuffix}" } -if (project.hasProperty('signing.keyId')) { - println "Signing enabled" - signing { - sign publishing.publications.mavenJava - } -} else { - println "Signing disabled" -} - // Specify dependencies dependencies { implementation 'com.google.code.gson:gson:2.8.9' @@ -28,14 +19,9 @@ dependencies { } // Additional tasks for generating source and Javadoc JARs -task sourcesJar(type: Jar) { - from sourceSets.main.allJava - archiveClassifier.set('sources') -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - from javadoc.destinationDir - archiveClassifier.set('javadoc') +java { + withJavadocJar() + withSourcesJar() } // Configure the publishing block for Maven Central deployment @@ -104,6 +90,16 @@ publishing { } } +if (project.hasProperty('signing.keyId')) { + println "Signing enabled" + signing { + sign publishing.publications.mavenJava + } +} else { + println "Signing disabled" +} + + java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 From f0f15c9b1b2a663f67719e1c222b70e1500ed446 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 18:05:03 +1100 Subject: [PATCH 26/68] Try to wire signing into publishing. --- src/AndroidClient/android/build.gradle | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 7112bb4..16c1907 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -11,6 +11,7 @@ if (project.hasProperty('versionSuffix')) { version = "${version}-${versionSuffix}" } + // Specify dependencies dependencies { implementation 'com.google.code.gson:gson:2.8.9' @@ -50,11 +51,6 @@ android { } } -java { - withJavadocJar() - withSourcesJar() -} - // Configure the publishing block for Maven Central deployment publishing { publications { From 24885f20ac4c489d2e97f48b3e84c2b38b0b27ff Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 18:11:40 +1100 Subject: [PATCH 27/68] Try to wire signing into publishing. --- src/AndroidClient/client/build.gradle | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index c17ff01..16cd55b 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -19,9 +19,14 @@ dependencies { } // Additional tasks for generating source and Javadoc JARs -java { - withJavadocJar() - withSourcesJar() +task sourcesJar(type: Jar) { + from sourceSets.main.allJava + archiveClassifier.set('sources') +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + from javadoc.destinationDir + archiveClassifier.set('javadoc') } // Configure the publishing block for Maven Central deployment From adb4482c9e04ef06a26b31bf0cf47d7b6ad56a15 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 18:32:34 +1100 Subject: [PATCH 28/68] Try to wire signing into publishing. --- .github/workflows/publish-android-maven-central.yml | 2 +- .github/workflows/publish-client-maven-central.yml | 2 +- src/AndroidClient/android/build.gradle | 1 + src/AndroidClient/client/build.gradle | 3 +++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 890ef9c..ded9048 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -43,4 +43,4 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} + run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} -Psigning.password= diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index ccbee7a..d98915b 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -43,4 +43,4 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} + run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} -Psigning.password= diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 16c1907..e94fcbc 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -121,6 +121,7 @@ if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { sign publishing.publications.mavenJava + useInMemoryPgpKeys(findProperty("signing.keyId") as String, findProperty("signing.password") as String) } } else { println "Signing disabled" diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 16cd55b..37c6db0 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -99,6 +99,9 @@ if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { sign publishing.publications.mavenJava + useInMemoryPgpKeys(findProperty("signing.keyId") as String, findProperty("signing.password") as String) + + // useGpgCmd(findProperty("signing.secretKeyRingFile")) } } else { println "Signing disabled" From f854d04cee6b7bdd2e242a16e087af55273af3bd Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 18:42:14 +1100 Subject: [PATCH 29/68] Try to wire signing into publishing. --- .github/workflows/publish-android-maven-central.yml | 2 +- .github/workflows/publish-client-maven-central.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index ded9048..890ef9c 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -43,4 +43,4 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} -Psigning.password= + run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index d98915b..ccbee7a 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -43,4 +43,4 @@ jobs: OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} -Psigning.password= + run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} From f657cf5dacf809b8037808260de189ee7312e70e Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 11 Oct 2023 18:55:40 +1100 Subject: [PATCH 30/68] Try to wire signing into publishing. --- src/AndroidClient/android/build.gradle | 2 +- src/AndroidClient/client/build.gradle | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index e94fcbc..90ed29b 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -121,7 +121,7 @@ if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { sign publishing.publications.mavenJava - useInMemoryPgpKeys(findProperty("signing.keyId") as String, findProperty("signing.password") as String) + useInMemoryPgpKeys(findProperty("signing.keyId") as String, null) } } else { println "Signing disabled" diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 37c6db0..b948232 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -99,9 +99,8 @@ if (project.hasProperty('signing.keyId')) { println "Signing enabled" signing { sign publishing.publications.mavenJava - useInMemoryPgpKeys(findProperty("signing.keyId") as String, findProperty("signing.password") as String) - - // useGpgCmd(findProperty("signing.secretKeyRingFile")) + useInMemoryPgpKeys(findProperty("signing.keyId") as String, null) + //useGpgCmd(findProperty("signing.secretKeyRingFile")) } } else { println "Signing disabled" From f7181a7f9ca67fdd2f5595558beadbd59e7a4e09 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 12 Oct 2023 09:47:19 +1100 Subject: [PATCH 31/68] Try to wire signing into publishing. --- .../publish-android-maven-central.yml | 5 ++-- .../publish-client-maven-central.yml | 5 ++-- src/AndroidClient/android/build.gradle | 6 +++-- src/AndroidClient/client/build.gradle | 25 +++++++++++++------ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 890ef9c..bc3b6e8 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -21,7 +21,7 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc - echo "SIGNING_SECRET_KEY_RING_FILE=$(pwd)/private-key.asc" >> $GITHUB_ENV + echo "SIGNING_KEY=`cat $(pwd)/private-key.asc`" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 @@ -41,6 +41,5 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} - SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} + run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ env.SIGNING_KEY }} diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index ccbee7a..1fa5aa4 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -21,7 +21,7 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc - echo "SIGNING_SECRET_KEY_RING_FILE=$(pwd)/private-key.asc" >> $GITHUB_ENV + echo "SIGNING_KEY=`cat $(pwd)/private-key.asc`" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 @@ -41,6 +41,5 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} - SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.keyId=${{ secrets.SIGNING_KEY_ID }} -Psigning.secretKeyRingFile=${{ env.SIGNING_SECRET_KEY_RING_FILE }} + run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ env.SIGNING_KEY }} diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 90ed29b..db62c2f 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -117,11 +117,13 @@ publishing { } -if (project.hasProperty('signing.keyId')) { + +if (project.hasProperty('signing.key')) { println "Signing enabled" signing { sign publishing.publications.mavenJava - useInMemoryPgpKeys(findProperty("signing.keyId") as String, null) + useInMemoryPgpKeys(findProperty("signing.key") as String, null) + //useGpgCmd(findProperty("signing.secretKeyRingFile")) } } else { println "Signing disabled" diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index b948232..9dd0061 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -18,15 +18,20 @@ dependencies { testImplementation 'pl.pragmatists:JUnitParams:1.1.1' } -// Additional tasks for generating source and Javadoc JARs -task sourcesJar(type: Jar) { +task sourceJar(type: Jar) { + classifier "sources" from sourceSets.main.allJava - archiveClassifier.set('sources') } task javadocJar(type: Jar, dependsOn: javadoc) { + classifier "javadoc" from javadoc.destinationDir - archiveClassifier.set('javadoc') +} + +artifacts { + archives jar + archives sourceJar + archives javadocJar } // Configure the publishing block for Maven Central deployment @@ -36,8 +41,12 @@ publishing { from components.java // Attach source and javadoc JARs - artifact sourcesJar - artifact javadocJar + artifact(sourceJar) { + classifier = 'sources' + } + artifact(javadocJar) { + classifier = 'javadoc' + } pom { name = 'ServiceStack.Client' @@ -95,11 +104,11 @@ publishing { } } -if (project.hasProperty('signing.keyId')) { +if (project.hasProperty('signing.key')) { println "Signing enabled" signing { sign publishing.publications.mavenJava - useInMemoryPgpKeys(findProperty("signing.keyId") as String, null) + useInMemoryPgpKeys(findProperty("signing.key") as String, null) //useGpgCmd(findProperty("signing.secretKeyRingFile")) } } else { From e07830b3a00310c5c6b9880e5765c784b1cd0fd0 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 12 Oct 2023 11:50:09 +1100 Subject: [PATCH 32/68] Try to wire signing into publishing. --- .github/workflows/publish-android-maven-central.yml | 2 +- .github/workflows/publish-client-maven-central.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index bc3b6e8..bf4eccb 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -21,7 +21,7 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc - echo "SIGNING_KEY=`cat $(pwd)/private-key.asc`" >> $GITHUB_ENV + echo "SIGNING_KEY=$(cat ./private-key.asc)" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index 1fa5aa4..f300362 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -21,7 +21,7 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc - echo "SIGNING_KEY=`cat $(pwd)/private-key.asc`" >> $GITHUB_ENV + echo "SIGNING_KEY=$(cat ./private-key.asc)" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 From a956561aaffe5b1f1f302e8830682bef1b213393 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 12 Oct 2023 11:54:23 +1100 Subject: [PATCH 33/68] Try to wire signing into publishing. --- .github/workflows/publish-android-maven-central.yml | 3 +-- .github/workflows/publish-client-maven-central.yml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index bf4eccb..5a8f749 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -21,7 +21,6 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc - echo "SIGNING_KEY=$(cat ./private-key.asc)" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 @@ -42,4 +41,4 @@ jobs: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} working-directory: ./src/AndroidClient - run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ env.SIGNING_KEY }} + run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ secrets.OSSRH_GPG }} diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index f300362..1c07b5d 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -21,7 +21,6 @@ jobs: run: | echo "${{ secrets.OSSRH_GPG }}" > private-key.asc gpg --import --batch private-key.asc - echo "SIGNING_KEY=$(cat ./private-key.asc)" >> $GITHUB_ENV - name: Cache Gradle packages uses: actions/cache@v2 @@ -42,4 +41,4 @@ jobs: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ env.SIGNING_KEY }} + run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ secrets.OSSRH_GPG }} From 46644cd8fb199b324f07730d6fc78e0197460c8f Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 12 Oct 2023 12:12:16 +1100 Subject: [PATCH 34/68] Use environment variables to assign signatory details. --- .github/workflows/publish-android-maven-central.yml | 4 +++- .github/workflows/publish-client-maven-central.yml | 4 +++- src/AndroidClient/android/build.gradle | 7 ++++--- src/AndroidClient/client/build.gradle | 7 ++++--- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 5a8f749..4a55500 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -40,5 +40,7 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.SIGNING_KEY_ID }} + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_KEY }} working-directory: ./src/AndroidClient - run: ./gradlew android:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ secrets.OSSRH_GPG }} + run: ./gradlew android:publishAllPublicationsToOSSRHRepository diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index 1c07b5d..af54621 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -40,5 +40,7 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.SIGNING_KEY_ID }} + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_KEY }} working-directory: ./src/AndroidClient - run: ./gradlew client:publishAllPublicationsToOSSRHRepository -Psigning.key=${{ secrets.OSSRH_GPG }} + run: ./gradlew client:publishAllPublicationsToOSSRHRepository diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index db62c2f..0b94a57 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -118,12 +118,13 @@ publishing { -if (project.hasProperty('signing.key')) { +if (findProperty('signingKeyId')) { println "Signing enabled" signing { + def signingKeyId = findProperty("signingKeyId") + def signingKey = findProperty("signingKey") + useInMemoryPgpKeys(signingKeyId, signingKey, null) sign publishing.publications.mavenJava - useInMemoryPgpKeys(findProperty("signing.key") as String, null) - //useGpgCmd(findProperty("signing.secretKeyRingFile")) } } else { println "Signing disabled" diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 9dd0061..36566c6 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -104,12 +104,13 @@ publishing { } } -if (project.hasProperty('signing.key')) { +if (findProperty('signingKeyId')) { println "Signing enabled" signing { + def signingKeyId = findProperty("signingKeyId") + def signingKey = findProperty("signingKey") + useInMemoryPgpKeys(signingKeyId, signingKey, null) sign publishing.publications.mavenJava - useInMemoryPgpKeys(findProperty("signing.key") as String, null) - //useGpgCmd(findProperty("signing.secretKeyRingFile")) } } else { println "Signing disabled" From 292568980a98a7abc0092f04f10979e922010fde Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 12 Oct 2023 13:26:12 +1100 Subject: [PATCH 35/68] Use environment variables to assign signatory details. --- .github/workflows/publish-android-maven-central.yml | 4 ++-- .github/workflows/publish-client-maven-central.yml | 4 ++-- src/AndroidClient/android/build.gradle | 11 ++++++----- src/AndroidClient/client/build.gradle | 11 +++++++---- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 4a55500..435b86e 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -40,7 +40,7 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} - ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.SIGNING_KEY_ID }} - ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_KEY }} + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} working-directory: ./src/AndroidClient run: ./gradlew android:publishAllPublicationsToOSSRHRepository diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index af54621..a7586f1 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -40,7 +40,7 @@ jobs: env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} - ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.SIGNING_KEY_ID }} - ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_KEY }} + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} working-directory: ./src/AndroidClient run: ./gradlew client:publishAllPublicationsToOSSRHRepository diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 0b94a57..374f9f3 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -116,14 +116,15 @@ publishing { } } +// Check if the environment variables are set +def signingKey = System.getenv('SIGNING_KEY') +def signingPassword = System.getenv('SIGNING_PASSWORD') - -if (findProperty('signingKeyId')) { +// Conditionally apply the signing plugin and configuration +if (signingKey && signingPassword) { println "Signing enabled" signing { - def signingKeyId = findProperty("signingKeyId") - def signingKey = findProperty("signingKey") - useInMemoryPgpKeys(signingKeyId, signingKey, null) + useInMemoryPgpKeys(signingKey, signingPassword) sign publishing.publications.mavenJava } } else { diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 36566c6..63eb666 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -104,12 +104,15 @@ publishing { } } -if (findProperty('signingKeyId')) { +// Check if the environment variables are set +def signingKey = System.getenv('SIGNING_KEY') +def signingPassword = System.getenv('SIGNING_PASSWORD') + +// Conditionally apply the signing plugin and configuration +if (signingKey && signingPassword) { println "Signing enabled" signing { - def signingKeyId = findProperty("signingKeyId") - def signingKey = findProperty("signingKey") - useInMemoryPgpKeys(signingKeyId, signingKey, null) + useInMemoryPgpKeys(signingKey, signingPassword) sign publishing.publications.mavenJava } } else { From 76319628aa58378e6c9d8302fe18f8c43f6152e2 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 12 Oct 2023 13:28:42 +1100 Subject: [PATCH 36/68] Use environment variables to assign signatory details. --- .github/workflows/publish-android-maven-central.yml | 5 ----- .github/workflows/publish-client-maven-central.yml | 5 ----- 2 files changed, 10 deletions(-) diff --git a/.github/workflows/publish-android-maven-central.yml b/.github/workflows/publish-android-maven-central.yml index 435b86e..1299c29 100644 --- a/.github/workflows/publish-android-maven-central.yml +++ b/.github/workflows/publish-android-maven-central.yml @@ -17,11 +17,6 @@ jobs: java-version: '11' distribution: 'adopt' - - name: Import GPG key - run: | - echo "${{ secrets.OSSRH_GPG }}" > private-key.asc - gpg --import --batch private-key.asc - - name: Cache Gradle packages uses: actions/cache@v2 with: diff --git a/.github/workflows/publish-client-maven-central.yml b/.github/workflows/publish-client-maven-central.yml index a7586f1..a93095d 100644 --- a/.github/workflows/publish-client-maven-central.yml +++ b/.github/workflows/publish-client-maven-central.yml @@ -17,11 +17,6 @@ jobs: java-version: '11' distribution: 'adopt' - - name: Import GPG key - run: | - echo "${{ secrets.OSSRH_GPG }}" > private-key.asc - gpg --import --batch private-key.asc - - name: Cache Gradle packages uses: actions/cache@v2 with: From 7180c2880fdcd6646a0e6f5fad09c3cd1b44f220 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 3 Feb 2024 00:42:06 +0800 Subject: [PATCH 37/68] move outdated androidchat to legacy folder --- src/AndroidClient/.idea/runConfigurations.xml | 12 ---------- .../androidchat/build.gradle | 21 ++++++++---------- .../androidchat/google-services.json | 0 .../androidchat/proguard-rules.pro | 0 .../androidchat/ExampleInstrumentedTest.java | 0 .../androidchat/src/main/AndroidManifest.xml | 0 .../androidchat/ActionListViewAdapter.java | 0 .../servicestack/net/androidchat/App.java | 0 .../ChatActionBarDrawerToggle.java | 0 .../net/androidchat/ChatCommandHandler.java | 0 .../net/androidchat/ChatReceiver.java | 0 .../net/androidchat/CssReceiver.java | 0 .../net/androidchat/Extensions.java | 0 .../net/androidchat/LoginActivity.java | 0 .../net/androidchat/LoginButtonsActivity.java | 0 .../net/androidchat/MainActivity.java | 0 .../androidchat/MessageListViewAdapter.java | 0 .../net/androidchat/MessageResolver.java | 0 .../net/androidchat/TvReciever.java | 0 .../net/androidchat/UiHelpers.java | 0 .../servicestack/net/androidchat/dtos.java | 0 .../src/main/res/color/chat_list_drawable.xml | 0 .../src/main/res/color/drawer_item.xml | 0 .../src/main/res/color/drawer_item_bg.xml | 0 .../res/drawable-hdpi/ic_build_black_24dp.png | Bin .../src/main/res/drawable-hdpi/ic_discuss.png | Bin .../src/main/res/drawable-hdpi/ic_done.png | Bin .../ic_plus_circle_white_24dp.png | Bin .../main/res/drawable-hdpi/ic_stat_icon.png | Bin .../src/main/res/drawable-hdpi/nav_logo.png | Bin .../res/drawable-mdpi/ic_build_black_24dp.png | Bin .../src/main/res/drawable-mdpi/ic_discuss.png | Bin .../src/main/res/drawable-mdpi/ic_done.png | Bin .../ic_plus_circle_white_24dp.png | Bin .../main/res/drawable-mdpi/ic_stat_icon.png | Bin .../src/main/res/drawable-mdpi/nav_logo.png | Bin .../drawable-xhdpi/ic_build_black_24dp.png | Bin .../main/res/drawable-xhdpi/ic_discuss.png | Bin .../src/main/res/drawable-xhdpi/ic_done.png | Bin .../ic_plus_circle_white_24dp.png | Bin .../main/res/drawable-xhdpi/ic_stat_icon.png | Bin .../src/main/res/drawable-xhdpi/nav_logo.png | Bin .../drawable-xxhdpi/ic_build_black_24dp.png | Bin .../main/res/drawable-xxhdpi/ic_discuss.png | Bin .../src/main/res/drawable-xxhdpi/ic_done.png | Bin .../ic_plus_circle_white_24dp.png | Bin .../main/res/drawable-xxhdpi/ic_stat_icon.png | Bin .../src/main/res/drawable-xxhdpi/nav_logo.png | Bin .../src/main/res/drawable/circular.xml | 0 .../src/main/res/drawable/ic_action_help.xml | 0 .../main/res/drawable/ic_facebook_logo.xml | 0 .../src/main/res/drawable/ic_no_profile.xml | 0 .../res/drawable/ic_twitter_logo_blue.xml | 0 .../src/main/res/drawable/plus_circle.xml | 0 .../src/main/res/layout/action_row_item.xml | 0 .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/layout/chat_message_item.xml | 0 .../androidchat/src/main/res/layout/login.xml | 0 .../src/main/res/layout/login_buttons.xml | 0 .../src/main/res/layout/nav_header.xml | 0 .../src/main/res/menu/action_menu.xml | 0 .../src/main/res/menu/drawer_view.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../main/res/mipmap-hdpi/ic_no_profile.png | Bin .../src/main/res/mipmap-hdpi/icon.png | Bin .../src/main/res/mipmap-hdpi/logo_blue.png | Bin .../main/res/mipmap-hdpi/logo_transparent.png | Bin .../src/main/res/mipmap-hdpi/logo_white.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../main/res/mipmap-mdpi/ic_no_profile.png | Bin .../src/main/res/mipmap-mdpi/icon.png | Bin .../src/main/res/mipmap-mdpi/logo_blue.png | Bin .../main/res/mipmap-mdpi/logo_transparent.png | Bin .../src/main/res/mipmap-mdpi/logo_white.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xhdpi/ic_no_profile.png | Bin .../src/main/res/mipmap-xhdpi/icon.png | Bin .../src/main/res/mipmap-xhdpi/logo_blue.png | Bin .../res/mipmap-xhdpi/logo_transparent.png | Bin .../src/main/res/mipmap-xhdpi/logo_white.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_no_profile.png | Bin .../src/main/res/mipmap-xxhdpi/icon.png | Bin .../src/main/res/mipmap-xxhdpi/logo_blue.png | Bin .../res/mipmap-xxhdpi/logo_transparent.png | Bin .../src/main/res/mipmap-xxhdpi/logo_white.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_no_profile.png | Bin .../src/main/res/mipmap-xxxhdpi/icon.png | Bin .../src/main/res/mipmap-xxxhdpi/logo_blue.png | Bin .../res/mipmap-xxxhdpi/logo_transparent.png | Bin .../main/res/mipmap-xxxhdpi/logo_white.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/colors.xml | 0 .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../net/androidchat/ExampleUnitTest.java | 0 98 files changed, 9 insertions(+), 24 deletions(-) delete mode 100644 src/AndroidClient/.idea/runConfigurations.xml rename src/{AndroidClient => legacy}/androidchat/build.gradle (72%) rename src/{AndroidClient => legacy}/androidchat/google-services.json (100%) rename src/{AndroidClient => legacy}/androidchat/proguard-rules.pro (100%) rename src/{AndroidClient => legacy}/androidchat/src/androidTest/java/servicestack/net/androidchat/ExampleInstrumentedTest.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/AndroidManifest.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/ActionListViewAdapter.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/App.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/ChatActionBarDrawerToggle.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/ChatCommandHandler.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/ChatReceiver.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/CssReceiver.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/Extensions.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/LoginActivity.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/LoginButtonsActivity.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/MainActivity.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/MessageListViewAdapter.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/MessageResolver.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/TvReciever.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/UiHelpers.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/java/servicestack/net/androidchat/dtos.java (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/color/chat_list_drawable.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/color/drawer_item.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/color/drawer_item_bg.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-hdpi/ic_build_black_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-hdpi/ic_discuss.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-hdpi/ic_done.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-hdpi/ic_plus_circle_white_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-hdpi/ic_stat_icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-hdpi/nav_logo.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-mdpi/ic_build_black_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-mdpi/ic_discuss.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-mdpi/ic_done.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-mdpi/ic_plus_circle_white_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-mdpi/ic_stat_icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-mdpi/nav_logo.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xhdpi/ic_build_black_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xhdpi/ic_discuss.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xhdpi/ic_done.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xhdpi/ic_plus_circle_white_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xhdpi/ic_stat_icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xhdpi/nav_logo.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xxhdpi/ic_build_black_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xxhdpi/ic_discuss.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xxhdpi/ic_done.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xxhdpi/ic_plus_circle_white_24dp.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xxhdpi/ic_stat_icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable-xxhdpi/nav_logo.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable/circular.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable/ic_action_help.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable/ic_facebook_logo.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable/ic_no_profile.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable/ic_twitter_logo_blue.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/drawable/plus_circle.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/layout/action_row_item.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/layout/activity_main.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/layout/chat_message_item.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/layout/login.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/layout/login_buttons.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/layout/nav_header.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/menu/action_menu.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/menu/drawer_view.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-hdpi/ic_no_profile.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-hdpi/icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-hdpi/logo_blue.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-hdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-hdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-mdpi/ic_no_profile.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-mdpi/icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-mdpi/logo_blue.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-mdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-mdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xhdpi/ic_no_profile.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xhdpi/icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xhdpi/logo_blue.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xhdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xhdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxhdpi/ic_no_profile.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxhdpi/icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxhdpi/logo_blue.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxhdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxhdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxxhdpi/ic_no_profile.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxxhdpi/icon.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxxhdpi/logo_blue.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxxhdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/mipmap-xxxhdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/values-w820dp/dimens.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/values/colors.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/values/dimens.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/values/strings.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/main/res/values/styles.xml (100%) rename src/{AndroidClient => legacy}/androidchat/src/test/java/servicestack/net/androidchat/ExampleUnitTest.java (100%) diff --git a/src/AndroidClient/.idea/runConfigurations.xml b/src/AndroidClient/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/src/AndroidClient/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/androidchat/build.gradle b/src/legacy/androidchat/build.gradle similarity index 72% rename from src/AndroidClient/androidchat/build.gradle rename to src/legacy/androidchat/build.gradle index 23efb63..907e601 100644 --- a/src/AndroidClient/androidchat/build.gradle +++ b/src/legacy/androidchat/build.gradle @@ -1,32 +1,29 @@ apply plugin: 'com.android.application' -apply plugin: 'io.fabric' +apply plugin: 'com.google.firebase.crashlytics' +apply plugin: 'com.google.gms.google-services' buildscript { repositories { - maven { url 'https://maven.fabric.io/public' } + google() } - dependencies { - // These docs use an open ended version so that our plugin - // can be updated quickly in response to Android tooling updates - - // We recommend changing it to the latest version from our changelog: - // https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin - classpath 'io.fabric.tools:gradle:1.28.0' + classpath 'com.google.gms:google-services:4.4.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' } + } repositories { maven { url 'https://maven.fabric.io/public' } } android { - compileSdkVersion 28 + compileSdkVersion 34 buildToolsVersion '28.0.3' defaultConfig { applicationId "servicestack.net.androidchat" minSdkVersion 21 - targetSdkVersion 28 + targetSdkVersion 34 versionCode 1 versionName "1.0" @@ -57,5 +54,5 @@ dependencies { implementation('com.twitter.sdk.android:twitter:2.3.1@aar') { transitive = true; } - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.1' } diff --git a/src/AndroidClient/androidchat/google-services.json b/src/legacy/androidchat/google-services.json similarity index 100% rename from src/AndroidClient/androidchat/google-services.json rename to src/legacy/androidchat/google-services.json diff --git a/src/AndroidClient/androidchat/proguard-rules.pro b/src/legacy/androidchat/proguard-rules.pro similarity index 100% rename from src/AndroidClient/androidchat/proguard-rules.pro rename to src/legacy/androidchat/proguard-rules.pro diff --git a/src/AndroidClient/androidchat/src/androidTest/java/servicestack/net/androidchat/ExampleInstrumentedTest.java b/src/legacy/androidchat/src/androidTest/java/servicestack/net/androidchat/ExampleInstrumentedTest.java similarity index 100% rename from src/AndroidClient/androidchat/src/androidTest/java/servicestack/net/androidchat/ExampleInstrumentedTest.java rename to src/legacy/androidchat/src/androidTest/java/servicestack/net/androidchat/ExampleInstrumentedTest.java diff --git a/src/AndroidClient/androidchat/src/main/AndroidManifest.xml b/src/legacy/androidchat/src/main/AndroidManifest.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/AndroidManifest.xml rename to src/legacy/androidchat/src/main/AndroidManifest.xml diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ActionListViewAdapter.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ActionListViewAdapter.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ActionListViewAdapter.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ActionListViewAdapter.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/App.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/App.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/App.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/App.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ChatActionBarDrawerToggle.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ChatActionBarDrawerToggle.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ChatActionBarDrawerToggle.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ChatActionBarDrawerToggle.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ChatCommandHandler.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ChatCommandHandler.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ChatCommandHandler.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ChatCommandHandler.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ChatReceiver.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ChatReceiver.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/ChatReceiver.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/ChatReceiver.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/CssReceiver.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/CssReceiver.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/CssReceiver.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/CssReceiver.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/Extensions.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/Extensions.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/Extensions.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/Extensions.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/LoginActivity.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/LoginActivity.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/LoginActivity.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/LoginActivity.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/LoginButtonsActivity.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/LoginButtonsActivity.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/LoginButtonsActivity.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/LoginButtonsActivity.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/MainActivity.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/MainActivity.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/MainActivity.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/MainActivity.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/MessageListViewAdapter.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/MessageListViewAdapter.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/MessageListViewAdapter.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/MessageListViewAdapter.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/MessageResolver.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/MessageResolver.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/MessageResolver.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/MessageResolver.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/TvReciever.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/TvReciever.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/TvReciever.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/TvReciever.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/UiHelpers.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/UiHelpers.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/UiHelpers.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/UiHelpers.java diff --git a/src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/dtos.java b/src/legacy/androidchat/src/main/java/servicestack/net/androidchat/dtos.java similarity index 100% rename from src/AndroidClient/androidchat/src/main/java/servicestack/net/androidchat/dtos.java rename to src/legacy/androidchat/src/main/java/servicestack/net/androidchat/dtos.java diff --git a/src/AndroidClient/androidchat/src/main/res/color/chat_list_drawable.xml b/src/legacy/androidchat/src/main/res/color/chat_list_drawable.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/color/chat_list_drawable.xml rename to src/legacy/androidchat/src/main/res/color/chat_list_drawable.xml diff --git a/src/AndroidClient/androidchat/src/main/res/color/drawer_item.xml b/src/legacy/androidchat/src/main/res/color/drawer_item.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/color/drawer_item.xml rename to src/legacy/androidchat/src/main/res/color/drawer_item.xml diff --git a/src/AndroidClient/androidchat/src/main/res/color/drawer_item_bg.xml b/src/legacy/androidchat/src/main/res/color/drawer_item_bg.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/color/drawer_item_bg.xml rename to src/legacy/androidchat/src/main/res/color/drawer_item_bg.xml diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_build_black_24dp.png b/src/legacy/androidchat/src/main/res/drawable-hdpi/ic_build_black_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_build_black_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-hdpi/ic_build_black_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_discuss.png b/src/legacy/androidchat/src/main/res/drawable-hdpi/ic_discuss.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_discuss.png rename to src/legacy/androidchat/src/main/res/drawable-hdpi/ic_discuss.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_done.png b/src/legacy/androidchat/src/main/res/drawable-hdpi/ic_done.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_done.png rename to src/legacy/androidchat/src/main/res/drawable-hdpi/ic_done.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_plus_circle_white_24dp.png b/src/legacy/androidchat/src/main/res/drawable-hdpi/ic_plus_circle_white_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_plus_circle_white_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-hdpi/ic_plus_circle_white_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_stat_icon.png b/src/legacy/androidchat/src/main/res/drawable-hdpi/ic_stat_icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-hdpi/ic_stat_icon.png rename to src/legacy/androidchat/src/main/res/drawable-hdpi/ic_stat_icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-hdpi/nav_logo.png b/src/legacy/androidchat/src/main/res/drawable-hdpi/nav_logo.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-hdpi/nav_logo.png rename to src/legacy/androidchat/src/main/res/drawable-hdpi/nav_logo.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_build_black_24dp.png b/src/legacy/androidchat/src/main/res/drawable-mdpi/ic_build_black_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_build_black_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-mdpi/ic_build_black_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_discuss.png b/src/legacy/androidchat/src/main/res/drawable-mdpi/ic_discuss.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_discuss.png rename to src/legacy/androidchat/src/main/res/drawable-mdpi/ic_discuss.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_done.png b/src/legacy/androidchat/src/main/res/drawable-mdpi/ic_done.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_done.png rename to src/legacy/androidchat/src/main/res/drawable-mdpi/ic_done.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_plus_circle_white_24dp.png b/src/legacy/androidchat/src/main/res/drawable-mdpi/ic_plus_circle_white_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_plus_circle_white_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-mdpi/ic_plus_circle_white_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_stat_icon.png b/src/legacy/androidchat/src/main/res/drawable-mdpi/ic_stat_icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-mdpi/ic_stat_icon.png rename to src/legacy/androidchat/src/main/res/drawable-mdpi/ic_stat_icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-mdpi/nav_logo.png b/src/legacy/androidchat/src/main/res/drawable-mdpi/nav_logo.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-mdpi/nav_logo.png rename to src/legacy/androidchat/src/main/res/drawable-mdpi/nav_logo.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_build_black_24dp.png b/src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_build_black_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_build_black_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_build_black_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_discuss.png b/src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_discuss.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_discuss.png rename to src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_discuss.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_done.png b/src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_done.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_done.png rename to src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_done.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_plus_circle_white_24dp.png b/src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_plus_circle_white_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_plus_circle_white_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_plus_circle_white_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_stat_icon.png b/src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_stat_icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/ic_stat_icon.png rename to src/legacy/androidchat/src/main/res/drawable-xhdpi/ic_stat_icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/nav_logo.png b/src/legacy/androidchat/src/main/res/drawable-xhdpi/nav_logo.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xhdpi/nav_logo.png rename to src/legacy/androidchat/src/main/res/drawable-xhdpi/nav_logo.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_build_black_24dp.png b/src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_build_black_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_build_black_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_build_black_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_discuss.png b/src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_discuss.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_discuss.png rename to src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_discuss.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_done.png b/src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_done.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_done.png rename to src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_done.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_plus_circle_white_24dp.png b/src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_plus_circle_white_24dp.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_plus_circle_white_24dp.png rename to src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_plus_circle_white_24dp.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_stat_icon.png b/src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_stat_icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/ic_stat_icon.png rename to src/legacy/androidchat/src/main/res/drawable-xxhdpi/ic_stat_icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/nav_logo.png b/src/legacy/androidchat/src/main/res/drawable-xxhdpi/nav_logo.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable-xxhdpi/nav_logo.png rename to src/legacy/androidchat/src/main/res/drawable-xxhdpi/nav_logo.png diff --git a/src/AndroidClient/androidchat/src/main/res/drawable/circular.xml b/src/legacy/androidchat/src/main/res/drawable/circular.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable/circular.xml rename to src/legacy/androidchat/src/main/res/drawable/circular.xml diff --git a/src/AndroidClient/androidchat/src/main/res/drawable/ic_action_help.xml b/src/legacy/androidchat/src/main/res/drawable/ic_action_help.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable/ic_action_help.xml rename to src/legacy/androidchat/src/main/res/drawable/ic_action_help.xml diff --git a/src/AndroidClient/androidchat/src/main/res/drawable/ic_facebook_logo.xml b/src/legacy/androidchat/src/main/res/drawable/ic_facebook_logo.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable/ic_facebook_logo.xml rename to src/legacy/androidchat/src/main/res/drawable/ic_facebook_logo.xml diff --git a/src/AndroidClient/androidchat/src/main/res/drawable/ic_no_profile.xml b/src/legacy/androidchat/src/main/res/drawable/ic_no_profile.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable/ic_no_profile.xml rename to src/legacy/androidchat/src/main/res/drawable/ic_no_profile.xml diff --git a/src/AndroidClient/androidchat/src/main/res/drawable/ic_twitter_logo_blue.xml b/src/legacy/androidchat/src/main/res/drawable/ic_twitter_logo_blue.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable/ic_twitter_logo_blue.xml rename to src/legacy/androidchat/src/main/res/drawable/ic_twitter_logo_blue.xml diff --git a/src/AndroidClient/androidchat/src/main/res/drawable/plus_circle.xml b/src/legacy/androidchat/src/main/res/drawable/plus_circle.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/drawable/plus_circle.xml rename to src/legacy/androidchat/src/main/res/drawable/plus_circle.xml diff --git a/src/AndroidClient/androidchat/src/main/res/layout/action_row_item.xml b/src/legacy/androidchat/src/main/res/layout/action_row_item.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/layout/action_row_item.xml rename to src/legacy/androidchat/src/main/res/layout/action_row_item.xml diff --git a/src/AndroidClient/androidchat/src/main/res/layout/activity_main.xml b/src/legacy/androidchat/src/main/res/layout/activity_main.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/layout/activity_main.xml rename to src/legacy/androidchat/src/main/res/layout/activity_main.xml diff --git a/src/AndroidClient/androidchat/src/main/res/layout/chat_message_item.xml b/src/legacy/androidchat/src/main/res/layout/chat_message_item.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/layout/chat_message_item.xml rename to src/legacy/androidchat/src/main/res/layout/chat_message_item.xml diff --git a/src/AndroidClient/androidchat/src/main/res/layout/login.xml b/src/legacy/androidchat/src/main/res/layout/login.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/layout/login.xml rename to src/legacy/androidchat/src/main/res/layout/login.xml diff --git a/src/AndroidClient/androidchat/src/main/res/layout/login_buttons.xml b/src/legacy/androidchat/src/main/res/layout/login_buttons.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/layout/login_buttons.xml rename to src/legacy/androidchat/src/main/res/layout/login_buttons.xml diff --git a/src/AndroidClient/androidchat/src/main/res/layout/nav_header.xml b/src/legacy/androidchat/src/main/res/layout/nav_header.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/layout/nav_header.xml rename to src/legacy/androidchat/src/main/res/layout/nav_header.xml diff --git a/src/AndroidClient/androidchat/src/main/res/menu/action_menu.xml b/src/legacy/androidchat/src/main/res/menu/action_menu.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/menu/action_menu.xml rename to src/legacy/androidchat/src/main/res/menu/action_menu.xml diff --git a/src/AndroidClient/androidchat/src/main/res/menu/drawer_view.xml b/src/legacy/androidchat/src/main/res/menu/drawer_view.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/menu/drawer_view.xml rename to src/legacy/androidchat/src/main/res/menu/drawer_view.xml diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/ic_launcher.png b/src/legacy/androidchat/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/ic_launcher.png rename to src/legacy/androidchat/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/ic_no_profile.png b/src/legacy/androidchat/src/main/res/mipmap-hdpi/ic_no_profile.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/ic_no_profile.png rename to src/legacy/androidchat/src/main/res/mipmap-hdpi/ic_no_profile.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/icon.png b/src/legacy/androidchat/src/main/res/mipmap-hdpi/icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/icon.png rename to src/legacy/androidchat/src/main/res/mipmap-hdpi/icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/logo_blue.png b/src/legacy/androidchat/src/main/res/mipmap-hdpi/logo_blue.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/logo_blue.png rename to src/legacy/androidchat/src/main/res/mipmap-hdpi/logo_blue.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/logo_transparent.png b/src/legacy/androidchat/src/main/res/mipmap-hdpi/logo_transparent.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/logo_transparent.png rename to src/legacy/androidchat/src/main/res/mipmap-hdpi/logo_transparent.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/logo_white.png b/src/legacy/androidchat/src/main/res/mipmap-hdpi/logo_white.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-hdpi/logo_white.png rename to src/legacy/androidchat/src/main/res/mipmap-hdpi/logo_white.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/ic_launcher.png b/src/legacy/androidchat/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/ic_launcher.png rename to src/legacy/androidchat/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/ic_no_profile.png b/src/legacy/androidchat/src/main/res/mipmap-mdpi/ic_no_profile.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/ic_no_profile.png rename to src/legacy/androidchat/src/main/res/mipmap-mdpi/ic_no_profile.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/icon.png b/src/legacy/androidchat/src/main/res/mipmap-mdpi/icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/icon.png rename to src/legacy/androidchat/src/main/res/mipmap-mdpi/icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/logo_blue.png b/src/legacy/androidchat/src/main/res/mipmap-mdpi/logo_blue.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/logo_blue.png rename to src/legacy/androidchat/src/main/res/mipmap-mdpi/logo_blue.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/logo_transparent.png b/src/legacy/androidchat/src/main/res/mipmap-mdpi/logo_transparent.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/logo_transparent.png rename to src/legacy/androidchat/src/main/res/mipmap-mdpi/logo_transparent.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/logo_white.png b/src/legacy/androidchat/src/main/res/mipmap-mdpi/logo_white.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-mdpi/logo_white.png rename to src/legacy/androidchat/src/main/res/mipmap-mdpi/logo_white.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/ic_launcher.png b/src/legacy/androidchat/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/ic_launcher.png rename to src/legacy/androidchat/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/ic_no_profile.png b/src/legacy/androidchat/src/main/res/mipmap-xhdpi/ic_no_profile.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/ic_no_profile.png rename to src/legacy/androidchat/src/main/res/mipmap-xhdpi/ic_no_profile.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/icon.png b/src/legacy/androidchat/src/main/res/mipmap-xhdpi/icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/icon.png rename to src/legacy/androidchat/src/main/res/mipmap-xhdpi/icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/logo_blue.png b/src/legacy/androidchat/src/main/res/mipmap-xhdpi/logo_blue.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/logo_blue.png rename to src/legacy/androidchat/src/main/res/mipmap-xhdpi/logo_blue.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/logo_transparent.png b/src/legacy/androidchat/src/main/res/mipmap-xhdpi/logo_transparent.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/logo_transparent.png rename to src/legacy/androidchat/src/main/res/mipmap-xhdpi/logo_transparent.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/logo_white.png b/src/legacy/androidchat/src/main/res/mipmap-xhdpi/logo_white.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xhdpi/logo_white.png rename to src/legacy/androidchat/src/main/res/mipmap-xhdpi/logo_white.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src/legacy/androidchat/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to src/legacy/androidchat/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/ic_no_profile.png b/src/legacy/androidchat/src/main/res/mipmap-xxhdpi/ic_no_profile.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/ic_no_profile.png rename to src/legacy/androidchat/src/main/res/mipmap-xxhdpi/ic_no_profile.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/icon.png b/src/legacy/androidchat/src/main/res/mipmap-xxhdpi/icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/icon.png rename to src/legacy/androidchat/src/main/res/mipmap-xxhdpi/icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/logo_blue.png b/src/legacy/androidchat/src/main/res/mipmap-xxhdpi/logo_blue.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/logo_blue.png rename to src/legacy/androidchat/src/main/res/mipmap-xxhdpi/logo_blue.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/logo_transparent.png b/src/legacy/androidchat/src/main/res/mipmap-xxhdpi/logo_transparent.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/logo_transparent.png rename to src/legacy/androidchat/src/main/res/mipmap-xxhdpi/logo_transparent.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/logo_white.png b/src/legacy/androidchat/src/main/res/mipmap-xxhdpi/logo_white.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxhdpi/logo_white.png rename to src/legacy/androidchat/src/main/res/mipmap-xxhdpi/logo_white.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/ic_no_profile.png b/src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/ic_no_profile.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/ic_no_profile.png rename to src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/ic_no_profile.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/icon.png b/src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/icon.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/icon.png rename to src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/icon.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/logo_blue.png b/src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/logo_blue.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/logo_blue.png rename to src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/logo_blue.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/logo_transparent.png b/src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/logo_transparent.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/logo_transparent.png rename to src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/logo_transparent.png diff --git a/src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/logo_white.png b/src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/logo_white.png similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/mipmap-xxxhdpi/logo_white.png rename to src/legacy/androidchat/src/main/res/mipmap-xxxhdpi/logo_white.png diff --git a/src/AndroidClient/androidchat/src/main/res/values-w820dp/dimens.xml b/src/legacy/androidchat/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/values-w820dp/dimens.xml rename to src/legacy/androidchat/src/main/res/values-w820dp/dimens.xml diff --git a/src/AndroidClient/androidchat/src/main/res/values/colors.xml b/src/legacy/androidchat/src/main/res/values/colors.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/values/colors.xml rename to src/legacy/androidchat/src/main/res/values/colors.xml diff --git a/src/AndroidClient/androidchat/src/main/res/values/dimens.xml b/src/legacy/androidchat/src/main/res/values/dimens.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/values/dimens.xml rename to src/legacy/androidchat/src/main/res/values/dimens.xml diff --git a/src/AndroidClient/androidchat/src/main/res/values/strings.xml b/src/legacy/androidchat/src/main/res/values/strings.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/values/strings.xml rename to src/legacy/androidchat/src/main/res/values/strings.xml diff --git a/src/AndroidClient/androidchat/src/main/res/values/styles.xml b/src/legacy/androidchat/src/main/res/values/styles.xml similarity index 100% rename from src/AndroidClient/androidchat/src/main/res/values/styles.xml rename to src/legacy/androidchat/src/main/res/values/styles.xml diff --git a/src/AndroidClient/androidchat/src/test/java/servicestack/net/androidchat/ExampleUnitTest.java b/src/legacy/androidchat/src/test/java/servicestack/net/androidchat/ExampleUnitTest.java similarity index 100% rename from src/AndroidClient/androidchat/src/test/java/servicestack/net/androidchat/ExampleUnitTest.java rename to src/legacy/androidchat/src/test/java/servicestack/net/androidchat/ExampleUnitTest.java From 2845214e4a8130b519e4ec91bfdda8e75703f788 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 3 Feb 2024 00:48:27 +0800 Subject: [PATCH 38/68] Use /api basePath by default --- .../client/JsonServiceClient.java | 53 +++++++++++++------ .../client/JsonServiceClientTests.java | 19 ++++++- .../net/servicestack/client/JsonTests.java | 2 +- .../client/TestInterfaceMarkerTests.java | 10 ++-- 4 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java index 0522a42..a9bd6de 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -25,16 +25,19 @@ import java.net.URL; import java.net.URLEncoder; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; import java.util.Date; import java.util.List; import java.util.Map; import java.util.UUID; public class JsonServiceClient implements ServiceClient { - static Charset UTF8 = Charset.forName("UTF-8"); + static Charset UTF8 = StandardCharsets.UTF_8; String baseUrl; URI baseUri; String replyUrl; + String oneWayUrl; boolean alwaysSendBasicAuthHeaders; String userName; @@ -56,10 +59,11 @@ public JsonServiceClient(String baseUrl) { this(baseUrl, true); } public JsonServiceClient(String baseUrl, boolean initCookies) { - setBaseUrl(baseUrl); if (initCookies) { initCookieHandler(); } + setBaseUrl(baseUrl); + setBasePath("api"); } public void initCookieHandler() { @@ -76,24 +80,41 @@ public void setBaseUrl(String baseUrl) { } catch (URISyntaxException e) { throw new RuntimeException(e); } - this.replyUrl = this.baseUrl + "json/reply/"; } + public JsonServiceClient setBasePath() { return setBasePath(""); } + public JsonServiceClient setBasePath(String basePath) { + if (basePath == null || basePath.length() == 0) { + this.replyUrl = this.baseUri.resolve("json/reply") + "/"; + this.oneWayUrl = this.baseUri.resolve("json/oneway") + "/"; + } else { + if (basePath.endsWith("/")) { + basePath = basePath.substring(0, basePath.length() -1); + } + this.replyUrl = this.baseUri.resolve(basePath) + "/"; + this.oneWayUrl = this.baseUri.resolve(basePath) + "/"; + } + return this; + } + + public String getBaseUrl() { return this.baseUrl; } + public String getReplyUrl() { return this.replyUrl; } + public void setTimeout(int timeoutMs) { this.timeoutMs = timeoutMs; } public GsonBuilder getGsonBuilder() { return new GsonBuilder() - .registerTypeAdapterFactory(JsonSerializers.getCaseInsensitiveEnumTypeAdapterFactory()) - .registerTypeAdapter(Date.class, JsonSerializers.getDateSerializer()) - .registerTypeAdapter(Date.class, JsonSerializers.getDateDeserializer()) - .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanSerializer()) - .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanDeserializer()) - .registerTypeAdapter(UUID.class, JsonSerializers.getGuidSerializer()) - .registerTypeAdapter(UUID.class, JsonSerializers.getGuidDeserializer()) - .registerTypeAdapter(byte[].class, JsonSerializers.getByteArraySerializer()) - .registerTypeAdapter(byte[].class, JsonSerializers.getByteArrayDeserializer()); + .registerTypeAdapterFactory(JsonSerializers.getCaseInsensitiveEnumTypeAdapterFactory()) + .registerTypeAdapter(Date.class, JsonSerializers.getDateSerializer()) + .registerTypeAdapter(Date.class, JsonSerializers.getDateDeserializer()) + .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanSerializer()) + .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanDeserializer()) + .registerTypeAdapter(UUID.class, JsonSerializers.getGuidSerializer()) + .registerTypeAdapter(UUID.class, JsonSerializers.getGuidDeserializer()) + .registerTypeAdapter(byte[].class, JsonSerializers.getByteArraySerializer()) + .registerTypeAdapter(byte[].class, JsonSerializers.getByteArrayDeserializer()); } public Gson getGson() { @@ -103,23 +124,23 @@ public Gson getGson() { return gson; } - public String toJson(Object o){ + public String toJson(Object o) { String json = getGson().toJson(o); return json; } - public Object fromJson(String json, Class c){ + public Object fromJson(String json, Class c) { Object o = getGson().fromJson(json, c); return o; } public void setGson(Gson gson) { this.gson = gson; } - public String createUrl(Object requestDto){ + public String createUrl(Object requestDto) { return createUrl(requestDto, null); } - public String createUrl(Object requestDto, Map query){ + public String createUrl(Object requestDto, Map query) { String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); StringBuilder sb = new StringBuilder(); diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java index 6fbb92a..cf31857 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java @@ -52,13 +52,13 @@ public void exec(HttpURLConnection conn) { } public void test_does_process_missing_service_correctly() { - JsonServiceClient localTestClient = new JsonServiceClient("https://techstacks.io/"); + JsonServiceClient localTestClient = new JsonServiceClient("https://blazordiffusion.com/"); try { localTestClient.get(new EchoTypes()); fail("Should throw"); } catch (WebServiceException ex) { - assertEquals(ex.getStatusCode(), 405); + assertEquals(ex.getStatusCode(), 404); } } @@ -78,4 +78,19 @@ public void test_can_serialize_dates_correctly_via_get_request() { assertTrue(response != null); assertEquals(request.getDateTime(),response.getDateTime()); } + + public void test_can_change_basePath() { + JsonServiceClient client = new JsonServiceClient("https://test.servicestack.net/"); + assertEquals("https://test.servicestack.net/api/", client.getReplyUrl()); + + client.setBasePath(); + assertEquals("https://test.servicestack.net/json/reply/", client.getReplyUrl()); + + client.setBasePath("api"); + assertEquals("https://test.servicestack.net/api/", client.getReplyUrl()); + client.setBasePath("/api"); + assertEquals("https://test.servicestack.net/api/", client.getReplyUrl()); + client.setBasePath("/api/"); + assertEquals("https://test.servicestack.net/api/", client.getReplyUrl()); + } } diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java index 04faf92..4a1dcfb 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonTests.java @@ -45,7 +45,7 @@ public void test_Does_serialize_DateTime_in_QueryString() throws UnsupportedEnco String url = client.createUrl(request); - assertEquals("https://test.servicestack.net/json/reply/HelloDateTime?dateTime=" + URLEncoder.encode("/Date(978310861000-0000)/", "UTF-8"), url); + assertEquals("https://test.servicestack.net/api/HelloDateTime?dateTime=" + URLEncoder.encode("/Date(978310861000-0000)/", "UTF-8"), url); } public void test_Can_get_time_components(){ diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java index f20ee6f..056b8d4 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/TestInterfaceMarkerTests.java @@ -20,34 +20,34 @@ public void test_Does_SendDefault_as_POST(){ SendVerbResponse response = client.send(new SendDefault().setId(1)); assertEquals(1, (int)response.getId()); assertEquals(HttpMethods.Post, response.getRequestMethod()); - assertEquals("/json/reply/SendDefault", response.getPathInfo()); + assertEquals("/api/SendDefault", response.getPathInfo()); } public void test_Does_SendRestGet_as_GET_using_Predefined_Route(){ SendVerbResponse response = client.send(new SendRestGet().setId(1)); assertEquals(1, (int)response.getId()); assertEquals(HttpMethods.Get, response.getRequestMethod()); - assertEquals("/json/reply/SendRestGet", response.getPathInfo()); + assertEquals("/api/SendRestGet", response.getPathInfo()); } public void test_Does_SendGet_as_GET(){ SendVerbResponse response = client.send(new SendGet().setId(1)); assertEquals(1, (int)response.getId()); assertEquals(HttpMethods.Get, response.getRequestMethod()); - assertEquals("/json/reply/SendGet", response.getPathInfo()); + assertEquals("/api/SendGet", response.getPathInfo()); } public void test_Does_SendPost_as_POST(){ SendVerbResponse response = client.send(new SendPost().setId(1)); assertEquals(1, (int)response.getId()); assertEquals(HttpMethods.Post, response.getRequestMethod()); - assertEquals("/json/reply/SendPost", response.getPathInfo()); + assertEquals("/api/SendPost", response.getPathInfo()); } public void test_Does_SendPut_as_PUT(){ SendVerbResponse response = client.send(new SendPut().setId(1)); assertEquals(1, (int)response.getId()); assertEquals(HttpMethods.Put, response.getRequestMethod()); - assertEquals("/json/reply/SendPut", response.getPathInfo()); + assertEquals("/api/SendPut", response.getPathInfo()); } } From 5616c1f1e2f9c676a1d288f630ab4d423fafa543 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 3 Feb 2024 00:49:21 +0800 Subject: [PATCH 39/68] Update JsonServiceClient.java --- .../client/JsonServiceClient.java | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java index 0522a42..a9bd6de 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -25,16 +25,19 @@ import java.net.URL; import java.net.URLEncoder; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; import java.util.Date; import java.util.List; import java.util.Map; import java.util.UUID; public class JsonServiceClient implements ServiceClient { - static Charset UTF8 = Charset.forName("UTF-8"); + static Charset UTF8 = StandardCharsets.UTF_8; String baseUrl; URI baseUri; String replyUrl; + String oneWayUrl; boolean alwaysSendBasicAuthHeaders; String userName; @@ -56,10 +59,11 @@ public JsonServiceClient(String baseUrl) { this(baseUrl, true); } public JsonServiceClient(String baseUrl, boolean initCookies) { - setBaseUrl(baseUrl); if (initCookies) { initCookieHandler(); } + setBaseUrl(baseUrl); + setBasePath("api"); } public void initCookieHandler() { @@ -76,24 +80,41 @@ public void setBaseUrl(String baseUrl) { } catch (URISyntaxException e) { throw new RuntimeException(e); } - this.replyUrl = this.baseUrl + "json/reply/"; } + public JsonServiceClient setBasePath() { return setBasePath(""); } + public JsonServiceClient setBasePath(String basePath) { + if (basePath == null || basePath.length() == 0) { + this.replyUrl = this.baseUri.resolve("json/reply") + "/"; + this.oneWayUrl = this.baseUri.resolve("json/oneway") + "/"; + } else { + if (basePath.endsWith("/")) { + basePath = basePath.substring(0, basePath.length() -1); + } + this.replyUrl = this.baseUri.resolve(basePath) + "/"; + this.oneWayUrl = this.baseUri.resolve(basePath) + "/"; + } + return this; + } + + public String getBaseUrl() { return this.baseUrl; } + public String getReplyUrl() { return this.replyUrl; } + public void setTimeout(int timeoutMs) { this.timeoutMs = timeoutMs; } public GsonBuilder getGsonBuilder() { return new GsonBuilder() - .registerTypeAdapterFactory(JsonSerializers.getCaseInsensitiveEnumTypeAdapterFactory()) - .registerTypeAdapter(Date.class, JsonSerializers.getDateSerializer()) - .registerTypeAdapter(Date.class, JsonSerializers.getDateDeserializer()) - .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanSerializer()) - .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanDeserializer()) - .registerTypeAdapter(UUID.class, JsonSerializers.getGuidSerializer()) - .registerTypeAdapter(UUID.class, JsonSerializers.getGuidDeserializer()) - .registerTypeAdapter(byte[].class, JsonSerializers.getByteArraySerializer()) - .registerTypeAdapter(byte[].class, JsonSerializers.getByteArrayDeserializer()); + .registerTypeAdapterFactory(JsonSerializers.getCaseInsensitiveEnumTypeAdapterFactory()) + .registerTypeAdapter(Date.class, JsonSerializers.getDateSerializer()) + .registerTypeAdapter(Date.class, JsonSerializers.getDateDeserializer()) + .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanSerializer()) + .registerTypeAdapter(TimeSpan.class, JsonSerializers.getTimeSpanDeserializer()) + .registerTypeAdapter(UUID.class, JsonSerializers.getGuidSerializer()) + .registerTypeAdapter(UUID.class, JsonSerializers.getGuidDeserializer()) + .registerTypeAdapter(byte[].class, JsonSerializers.getByteArraySerializer()) + .registerTypeAdapter(byte[].class, JsonSerializers.getByteArrayDeserializer()); } public Gson getGson() { @@ -103,23 +124,23 @@ public Gson getGson() { return gson; } - public String toJson(Object o){ + public String toJson(Object o) { String json = getGson().toJson(o); return json; } - public Object fromJson(String json, Class c){ + public Object fromJson(String json, Class c) { Object o = getGson().fromJson(json, c); return o; } public void setGson(Gson gson) { this.gson = gson; } - public String createUrl(Object requestDto){ + public String createUrl(Object requestDto) { return createUrl(requestDto, null); } - public String createUrl(Object requestDto, Map query){ + public String createUrl(Object requestDto, Map query) { String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); StringBuilder sb = new StringBuilder(); From c715098b3fd2e372ba3f232a74d5645d2b1b3cf9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 3 Feb 2024 00:49:41 +0800 Subject: [PATCH 40/68] Upgrade to latest gradle + deps --- .../.idea/codeStyles/Project.xml | 116 ++++++- .../.idea/codeStyles/codeStyleConfig.xml | 1 + src/AndroidClient/.idea/compiler.xml | 8 +- src/AndroidClient/.idea/gradle.xml | 6 +- src/AndroidClient/.idea/misc.xml | 21 +- src/AndroidClient/.idea/modules.xml | 17 + .../modules/android/AndroidClient.android.iml | 94 +----- .../androidchat/AndroidClient.androidchat.iml | 158 +--------- .../.idea/modules/app/AndroidClient.app.iml | 117 +------ .../modules/client/AndroidClient.client.iml | 22 +- .../modules/kotlin/AndroidClient.kotlin.iml | 89 +----- .../techstacks/AndroidClient.techstacks.iml | 115 +------ .../AndroidClient.techstackskotlin.iml | 126 +------- src/AndroidClient/AndroidClient.iml | 13 +- src/AndroidClient/android/build.gradle | 3 - src/AndroidClient/app/build.gradle | 1 - src/AndroidClient/build.gradle | 4 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 51018 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 +- src/AndroidClient/gradlew | 294 +++++++++++------- src/AndroidClient/gradlew.bat | 53 ++-- src/AndroidClient/kotlin/build.gradle | 11 +- src/AndroidClient/techstacks/build.gradle | 2 +- .../techstackskotlin/build.gradle | 4 +- 24 files changed, 431 insertions(+), 849 deletions(-) diff --git a/src/AndroidClient/.idea/codeStyles/Project.xml b/src/AndroidClient/.idea/codeStyles/Project.xml index f5cb871..7643783 100644 --- a/src/AndroidClient/.idea/codeStyles/Project.xml +++ b/src/AndroidClient/.idea/codeStyles/Project.xml @@ -3,9 +3,119 @@ - - + + diff --git a/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml b/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml index a55e7a1..6e6eec1 100644 --- a/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml +++ b/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/src/AndroidClient/.idea/compiler.xml b/src/AndroidClient/.idea/compiler.xml index 61a9130..e0e4ac7 100644 --- a/src/AndroidClient/.idea/compiler.xml +++ b/src/AndroidClient/.idea/compiler.xml @@ -1,6 +1,12 @@ - + + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/.idea/gradle.xml b/src/AndroidClient/.idea/gradle.xml index 4bb13eb..5f817b7 100644 --- a/src/AndroidClient/.idea/gradle.xml +++ b/src/AndroidClient/.idea/gradle.xml @@ -5,9 +5,8 @@ diff --git a/src/AndroidClient/.idea/misc.xml b/src/AndroidClient/.idea/misc.xml index 3386629..a1dc1ca 100644 --- a/src/AndroidClient/.idea/misc.xml +++ b/src/AndroidClient/.idea/misc.xml @@ -1,11 +1,10 @@ - - + diff --git a/src/AndroidClient/.idea/modules.xml b/src/AndroidClient/.idea/modules.xml index 4737574..20d6b35 100644 --- a/src/AndroidClient/.idea/modules.xml +++ b/src/AndroidClient/.idea/modules.xml @@ -4,12 +4,29 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml b/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml index e5e1216..b29504a 100644 --- a/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml +++ b/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml @@ -1,110 +1,32 @@ - + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml b/src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml index 0cd547a..108c016 100644 --- a/src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml +++ b/src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml @@ -3,166 +3,18 @@ - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/app/AndroidClient.app.iml b/src/AndroidClient/.idea/modules/app/AndroidClient.app.iml index ed3af82..4e69f2b 100644 --- a/src/AndroidClient/.idea/modules/app/AndroidClient.app.iml +++ b/src/AndroidClient/.idea/modules/app/AndroidClient.app.iml @@ -3,24 +3,18 @@ - @@ -35,119 +29,26 @@ - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml b/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml index 4388c63..a859bcb 100644 --- a/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml +++ b/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml @@ -1,37 +1,21 @@ - + - - - - - - - - + - - - - + - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/kotlin/AndroidClient.kotlin.iml b/src/AndroidClient/.idea/modules/kotlin/AndroidClient.kotlin.iml index c960f12..9ba6632 100644 --- a/src/AndroidClient/.idea/modules/kotlin/AndroidClient.kotlin.iml +++ b/src/AndroidClient/.idea/modules/kotlin/AndroidClient.kotlin.iml @@ -3,24 +3,18 @@ - @@ -36,91 +30,26 @@ - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/techstacks/AndroidClient.techstacks.iml b/src/AndroidClient/.idea/modules/techstacks/AndroidClient.techstacks.iml index af79eb1..96322b2 100644 --- a/src/AndroidClient/.idea/modules/techstacks/AndroidClient.techstacks.iml +++ b/src/AndroidClient/.idea/modules/techstacks/AndroidClient.techstacks.iml @@ -3,24 +3,18 @@ - @@ -35,117 +29,26 @@ - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/techstackskotlin/AndroidClient.techstackskotlin.iml b/src/AndroidClient/.idea/modules/techstackskotlin/AndroidClient.techstackskotlin.iml index bcfedcc..8b2fbf4 100644 --- a/src/AndroidClient/.idea/modules/techstackskotlin/AndroidClient.techstackskotlin.iml +++ b/src/AndroidClient/.idea/modules/techstackskotlin/AndroidClient.techstackskotlin.iml @@ -3,9 +3,8 @@ - @@ -19,16 +18,14 @@ - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/AndroidClient.iml b/src/AndroidClient/AndroidClient.iml index 5eadafc..ce2b513 100644 --- a/src/AndroidClient/AndroidClient.iml +++ b/src/AndroidClient/AndroidClient.iml @@ -1,19 +1,12 @@ - - - - - - - + + - + \ No newline at end of file diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 374f9f3..f422176 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -26,7 +26,6 @@ dependencies { // Android specific configurations android { compileSdkVersion 31 - buildToolsVersion '29.0.2' lintOptions { abortOnError false @@ -35,8 +34,6 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 31 - versionCode 1 - versionName version testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' } diff --git a/src/AndroidClient/app/build.gradle b/src/AndroidClient/app/build.gradle index 44a4c44..8e97dfe 100644 --- a/src/AndroidClient/app/build.gradle +++ b/src/AndroidClient/app/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'kotlin-android' android { compileSdkVersion 28 - buildToolsVersion '28.0.3' defaultConfig { applicationId "servicestack.net.androidclient" diff --git a/src/AndroidClient/build.gradle b/src/AndroidClient/build.gradle index c6e03a0..cbd0cc1 100644 --- a/src/AndroidClient/build.gradle +++ b/src/AndroidClient/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.61' + ext.kotlin_version = '1.6.21' repositories { mavenCentral() maven { @@ -11,7 +11,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'com.android.tools.build:gradle:7.4.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/src/AndroidClient/gradle/wrapper/gradle-wrapper.jar b/src/AndroidClient/gradle/wrapper/gradle-wrapper.jar index c97a8bdb9088d370da7e88784a7a093b971aa23a..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch literal 59536 zcma&NbC71ylI~qywr$(CZQJHswz}-9F59+k+g;UV+cs{`J?GrGXYR~=-ydruB3JCa zB64N^cILAcWk5iofq)<(fq;O7{th4@;QxID0)qN`mJ?GIqLY#rX8-|G{5M0pdVW5^ zzXk$-2kQTAC?_N@B`&6-N-rmVFE=$QD?>*=4<|!MJu@}isLc4AW#{m2if&A5T5g&~ ziuMQeS*U5sL6J698wOd)K@oK@1{peP5&Esut<#VH^u)gp`9H4)`uE!2$>RTctN+^u z=ASkePDZA-X8)rp%D;p*~P?*a_=*Kwc<^>QSH|^<0>o37lt^+Mj1;4YvJ(JR-Y+?%Nu}JAYj5 z_Qc5%Ao#F?q32i?ZaN2OSNhWL;2oDEw_({7ZbgUjna!Fqn3NzLM@-EWFPZVmc>(fZ z0&bF-Ch#p9C{YJT9Rcr3+Y_uR^At1^BxZ#eo>$PLJF3=;t_$2|t+_6gg5(j{TmjYU zK12c&lE?Eh+2u2&6Gf*IdKS&6?rYbSEKBN!rv{YCm|Rt=UlPcW9j`0o6{66#y5t9C zruFA2iKd=H%jHf%ypOkxLnO8#H}#Zt{8p!oi6)7#NqoF({t6|J^?1e*oxqng9Q2Cc zg%5Vu!em)}Yuj?kaP!D?b?(C*w!1;>R=j90+RTkyEXz+9CufZ$C^umX^+4|JYaO<5 zmIM3#dv`DGM;@F6;(t!WngZSYzHx?9&$xEF70D1BvfVj<%+b#)vz)2iLCrTeYzUcL z(OBnNoG6Le%M+@2oo)&jdOg=iCszzv59e zDRCeaX8l1hC=8LbBt|k5?CXgep=3r9BXx1uR8!p%Z|0+4Xro=xi0G!e{c4U~1j6!) zH6adq0}#l{%*1U(Cb%4AJ}VLWKBPi0MoKFaQH6x?^hQ!6em@993xdtS%_dmevzeNl z(o?YlOI=jl(`L9^ z0O+H9k$_@`6L13eTT8ci-V0ljDMD|0ifUw|Q-Hep$xYj0hTO@0%IS^TD4b4n6EKDG z??uM;MEx`s98KYN(K0>c!C3HZdZ{+_53DO%9k5W%pr6yJusQAv_;IA}925Y%;+!tY z%2k!YQmLLOr{rF~!s<3-WEUs)`ix_mSU|cNRBIWxOox_Yb7Z=~Q45ZNe*u|m^|)d* zog=i>`=bTe!|;8F+#H>EjIMcgWcG2ORD`w0WD;YZAy5#s{65~qfI6o$+Ty&-hyMyJ z3Ra~t>R!p=5ZpxA;QkDAoPi4sYOP6>LT+}{xp}tk+<0k^CKCFdNYG(Es>p0gqD)jP zWOeX5G;9(m@?GOG7g;e74i_|SmE?`B2i;sLYwRWKLy0RLW!Hx`=!LH3&k=FuCsM=9M4|GqzA)anEHfxkB z?2iK-u(DC_T1};KaUT@3nP~LEcENT^UgPvp!QC@Dw&PVAhaEYrPey{nkcn(ro|r7XUz z%#(=$7D8uP_uU-oPHhd>>^adbCSQetgSG`e$U|7mr!`|bU0aHl_cmL)na-5x1#OsVE#m*+k84Y^+UMeSAa zbrVZHU=mFwXEaGHtXQq`2ZtjfS!B2H{5A<3(nb-6ARVV8kEmOkx6D2x7~-6hl;*-*}2Xz;J#a8Wn;_B5=m zl3dY;%krf?i-Ok^Pal-}4F`{F@TYPTwTEhxpZK5WCpfD^UmM_iYPe}wpE!Djai6_{ z*pGO=WB47#Xjb7!n2Ma)s^yeR*1rTxp`Mt4sfA+`HwZf%!7ZqGosPkw69`Ix5Ku6G z@Pa;pjzV&dn{M=QDx89t?p?d9gna*}jBly*#1!6}5K<*xDPJ{wv4& zM$17DFd~L*Te3A%yD;Dp9UGWTjRxAvMu!j^Tbc}2v~q^59d4bz zvu#!IJCy(BcWTc`;v$9tH;J%oiSJ_i7s;2`JXZF+qd4C)vY!hyCtl)sJIC{ebI*0> z@x>;EzyBv>AI-~{D6l6{ST=em*U( z(r$nuXY-#CCi^8Z2#v#UXOt`dbYN1z5jzNF2 z411?w)whZrfA20;nl&C1Gi+gk<`JSm+{|*2o<< zqM#@z_D`Cn|0H^9$|Tah)0M_X4c37|KQ*PmoT@%xHc3L1ZY6(p(sNXHa&49Frzto& zR`c~ClHpE~4Z=uKa5S(-?M8EJ$zt0&fJk~p$M#fGN1-y$7!37hld`Uw>Urri(DxLa;=#rK0g4J)pXMC zxzraOVw1+kNWpi#P=6(qxf`zSdUC?D$i`8ZI@F>k6k zz21?d+dw7b&i*>Kv5L(LH-?J%@WnqT7j#qZ9B>|Zl+=> z^U-pV@1y_ptHo4hl^cPRWewbLQ#g6XYQ@EkiP z;(=SU!yhjHp%1&MsU`FV1Z_#K1&(|5n(7IHbx&gG28HNT)*~-BQi372@|->2Aw5It z0CBpUcMA*QvsPy)#lr!lIdCi@1k4V2m!NH)%Px(vu-r(Q)HYc!p zJ^$|)j^E#q#QOgcb^pd74^JUi7fUmMiNP_o*lvx*q%_odv49Dsv$NV;6J z9GOXKomA{2Pb{w}&+yHtH?IkJJu~}Z?{Uk++2mB8zyvh*xhHKE``99>y#TdD z&(MH^^JHf;g(Tbb^&8P*;_i*2&fS$7${3WJtV7K&&(MBV2~)2KB3%cWg#1!VE~k#C z!;A;?p$s{ihyojEZz+$I1)L}&G~ml=udD9qh>Tu(ylv)?YcJT3ihapi!zgPtWb*CP zlLLJSRCj-^w?@;RU9aL2zDZY1`I3d<&OMuW=c3$o0#STpv_p3b9Wtbql>w^bBi~u4 z3D8KyF?YE?=HcKk!xcp@Cigvzy=lnFgc^9c%(^F22BWYNAYRSho@~*~S)4%AhEttv zvq>7X!!EWKG?mOd9&n>vvH1p4VzE?HCuxT-u+F&mnsfDI^}*-d00-KAauEaXqg3k@ zy#)MGX!X;&3&0s}F3q40ZmVM$(H3CLfpdL?hB6nVqMxX)q=1b}o_PG%r~hZ4gUfSp zOH4qlEOW4OMUc)_m)fMR_rl^pCfXc{$fQbI*E&mV77}kRF z&{<06AJyJ!e863o-V>FA1a9Eemx6>^F$~9ppt()ZbPGfg_NdRXBWoZnDy2;#ODgf! zgl?iOcF7Meo|{AF>KDwTgYrJLb$L2%%BEtO>T$C?|9bAB&}s;gI?lY#^tttY&hfr# zKhC+&b-rpg_?~uVK%S@mQleU#_xCsvIPK*<`E0fHE1&!J7!xD#IB|SSPW6-PyuqGn3^M^Rz%WT{e?OI^svARX&SAdU77V(C~ zM$H{Kg59op{<|8ry9ecfP%=kFm(-!W&?U0@<%z*+!*<e0XesMxRFu9QnGqun6R_%T+B%&9Dtk?*d$Q zb~>84jEAPi@&F@3wAa^Lzc(AJz5gsfZ7J53;@D<;Klpl?sK&u@gie`~vTsbOE~Cd4 z%kr56mI|#b(Jk&;p6plVwmNB0H@0SmgdmjIn5Ne@)}7Vty(yb2t3ev@22AE^s!KaN zyQ>j+F3w=wnx7w@FVCRe+`vUH)3gW%_72fxzqX!S&!dchdkRiHbXW1FMrIIBwjsai8`CB2r4mAbwp%rrO>3B$Zw;9=%fXI9B{d(UzVap7u z6piC-FQ)>}VOEuPpuqznpY`hN4dGa_1Xz9rVg(;H$5Te^F0dDv*gz9JS<|>>U0J^# z6)(4ICh+N_Q`Ft0hF|3fSHs*?a=XC;e`sJaU9&d>X4l?1W=|fr!5ShD|nv$GK;j46@BV6+{oRbWfqOBRb!ir88XD*SbC(LF}I1h#6@dvK%Toe%@ zhDyG$93H8Eu&gCYddP58iF3oQH*zLbNI;rN@E{T9%A8!=v#JLxKyUe}e}BJpB{~uN zqgxRgo0*-@-iaHPV8bTOH(rS(huwK1Xg0u+e!`(Irzu@Bld&s5&bWgVc@m7;JgELd zimVs`>vQ}B_1(2#rv#N9O`fJpVfPc7V2nv34PC);Dzbb;p!6pqHzvy?2pD&1NE)?A zt(t-ucqy@wn9`^MN5apa7K|L=9>ISC>xoc#>{@e}m#YAAa1*8-RUMKwbm|;5p>T`Z zNf*ph@tnF{gmDa3uwwN(g=`Rh)4!&)^oOy@VJaK4lMT&5#YbXkl`q?<*XtsqD z9PRK6bqb)fJw0g-^a@nu`^?71k|m3RPRjt;pIkCo1{*pdqbVs-Yl>4E>3fZx3Sv44grW=*qdSoiZ9?X0wWyO4`yDHh2E!9I!ZFi zVL8|VtW38}BOJHW(Ax#KL_KQzarbuE{(%TA)AY)@tY4%A%P%SqIU~8~-Lp3qY;U-} z`h_Gel7;K1h}7$_5ZZT0&%$Lxxr-<89V&&TCsu}LL#!xpQ1O31jaa{U34~^le*Y%L za?7$>Jk^k^pS^_M&cDs}NgXlR>16AHkSK-4TRaJSh#h&p!-!vQY%f+bmn6x`4fwTp z$727L^y`~!exvmE^W&#@uY!NxJi`g!i#(++!)?iJ(1)2Wk;RN zFK&O4eTkP$Xn~4bB|q8y(btx$R#D`O@epi4ofcETrx!IM(kWNEe42Qh(8*KqfP(c0 zouBl6>Fc_zM+V;F3znbo{x#%!?mH3`_ANJ?y7ppxS@glg#S9^MXu|FM&ynpz3o&Qh z2ujAHLF3($pH}0jXQsa#?t--TnF1P73b?4`KeJ9^qK-USHE)4!IYgMn-7z|=ALF5SNGkrtPG@Y~niUQV2?g$vzJN3nZ{7;HZHzWAeQ;5P|@Tl3YHpyznGG4-f4=XflwSJY+58-+wf?~Fg@1p1wkzuu-RF3j2JX37SQUc? zQ4v%`V8z9ZVZVqS8h|@@RpD?n0W<=hk=3Cf8R?d^9YK&e9ZybFY%jdnA)PeHvtBe- zhMLD+SSteHBq*q)d6x{)s1UrsO!byyLS$58WK;sqip$Mk{l)Y(_6hEIBsIjCr5t>( z7CdKUrJTrW%qZ#1z^n*Lb8#VdfzPw~OIL76aC+Rhr<~;4Tl!sw?Rj6hXj4XWa#6Tp z@)kJ~qOV)^Rh*-?aG>ic2*NlC2M7&LUzc9RT6WM%Cpe78`iAowe!>(T0jo&ivn8-7 zs{Qa@cGy$rE-3AY0V(l8wjI^uB8Lchj@?L}fYal^>T9z;8juH@?rG&g-t+R2dVDBe zq!K%{e-rT5jX19`(bP23LUN4+_zh2KD~EAYzhpEO3MUG8@}uBHH@4J zd`>_(K4q&>*k82(dDuC)X6JuPrBBubOg7qZ{?x!r@{%0);*`h*^F|%o?&1wX?Wr4b z1~&cy#PUuES{C#xJ84!z<1tp9sfrR(i%Tu^jnXy;4`Xk;AQCdFC@?V%|; zySdC7qS|uQRcH}EFZH%mMB~7gi}a0utE}ZE_}8PQH8f;H%PN41Cb9R%w5Oi5el^fd z$n{3SqLCnrF##x?4sa^r!O$7NX!}&}V;0ZGQ&K&i%6$3C_dR%I7%gdQ;KT6YZiQrW zk%q<74oVBV>@}CvJ4Wj!d^?#Zwq(b$E1ze4$99DuNg?6t9H}k_|D7KWD7i0-g*EO7 z;5{hSIYE4DMOK3H%|f5Edx+S0VI0Yw!tsaRS2&Il2)ea^8R5TG72BrJue|f_{2UHa z@w;^c|K3da#$TB0P3;MPlF7RuQeXT$ zS<<|C0OF(k)>fr&wOB=gP8!Qm>F41u;3esv7_0l%QHt(~+n; zf!G6%hp;Gfa9L9=AceiZs~tK+Tf*Wof=4!u{nIO90jH@iS0l+#%8=~%ASzFv7zqSB^?!@N7)kp0t&tCGLmzXSRMRyxCmCYUD2!B`? zhs$4%KO~m=VFk3Buv9osha{v+mAEq=ik3RdK@;WWTV_g&-$U4IM{1IhGX{pAu%Z&H zFfwCpUsX%RKg);B@7OUzZ{Hn{q6Vv!3#8fAg!P$IEx<0vAx;GU%}0{VIsmFBPq_mb zpe^BChDK>sc-WLKl<6 zwbW|e&d&dv9Wu0goueyu>(JyPx1mz0v4E?cJjFuKF71Q1)AL8jHO$!fYT3(;U3Re* zPPOe%*O+@JYt1bW`!W_1!mN&=w3G9ru1XsmwfS~BJ))PhD(+_J_^N6j)sx5VwbWK| zwRyC?W<`pOCY)b#AS?rluxuuGf-AJ=D!M36l{ua?@SJ5>e!IBr3CXIxWw5xUZ@Xrw z_R@%?{>d%Ld4p}nEsiA@v*nc6Ah!MUs?GA7e5Q5lPpp0@`%5xY$C;{%rz24$;vR#* zBP=a{)K#CwIY%p} zXVdxTQ^HS@O&~eIftU+Qt^~(DGxrdi3k}DdT^I7Iy5SMOp$QuD8s;+93YQ!OY{eB24%xY7ml@|M7I(Nb@K_-?F;2?et|CKkuZK_>+>Lvg!>JE~wN`BI|_h6$qi!P)+K-1Hh(1;a`os z55)4Q{oJiA(lQM#;w#Ta%T0jDNXIPM_bgESMCDEg6rM33anEr}=|Fn6)|jBP6Y}u{ zv9@%7*#RI9;fv;Yii5CI+KrRdr0DKh=L>)eO4q$1zmcSmglsV`*N(x=&Wx`*v!!hn6X-l0 zP_m;X??O(skcj+oS$cIdKhfT%ABAzz3w^la-Ucw?yBPEC+=Pe_vU8nd-HV5YX6X8r zZih&j^eLU=%*;VzhUyoLF;#8QsEfmByk+Y~caBqSvQaaWf2a{JKB9B>V&r?l^rXaC z8)6AdR@Qy_BxQrE2Fk?ewD!SwLuMj@&d_n5RZFf7=>O>hzVE*seW3U?_p|R^CfoY`?|#x9)-*yjv#lo&zP=uI`M?J zbzC<^3x7GfXA4{FZ72{PE*-mNHyy59Q;kYG@BB~NhTd6pm2Oj=_ zizmD?MKVRkT^KmXuhsk?eRQllPo2Ubk=uCKiZ&u3Xjj~<(!M94c)Tez@9M1Gfs5JV z->@II)CDJOXTtPrQudNjE}Eltbjq>6KiwAwqvAKd^|g!exgLG3;wP+#mZYr`cy3#39e653d=jrR-ulW|h#ddHu(m9mFoW~2yE zz5?dB%6vF}+`-&-W8vy^OCxm3_{02royjvmwjlp+eQDzFVEUiyO#gLv%QdDSI#3W* z?3!lL8clTaNo-DVJw@ynq?q!%6hTQi35&^>P85G$TqNt78%9_sSJt2RThO|JzM$iL zg|wjxdMC2|Icc5rX*qPL(coL!u>-xxz-rFiC!6hD1IR%|HSRsV3>Kq~&vJ=s3M5y8SG%YBQ|{^l#LGlg!D?E>2yR*eV%9m$_J6VGQ~AIh&P$_aFbh zULr0Z$QE!QpkP=aAeR4ny<#3Fwyw@rZf4?Ewq`;mCVv}xaz+3ni+}a=k~P+yaWt^L z@w67!DqVf7D%7XtXX5xBW;Co|HvQ8WR1k?r2cZD%U;2$bsM%u8{JUJ5Z0k= zZJARv^vFkmWx15CB=rb=D4${+#DVqy5$C%bf`!T0+epLJLnh1jwCdb*zuCL}eEFvE z{rO1%gxg>1!W(I!owu*mJZ0@6FM(?C+d*CeceZRW_4id*D9p5nzMY&{mWqrJomjIZ z97ZNnZ3_%Hx8dn;H>p8m7F#^2;T%yZ3H;a&N7tm=Lvs&lgJLW{V1@h&6Vy~!+Ffbb zv(n3+v)_D$}dqd!2>Y2B)#<+o}LH#%ogGi2-?xRIH)1!SD)u-L65B&bsJTC=LiaF+YOCif2dUX6uAA|#+vNR z>U+KQekVGon)Yi<93(d!(yw1h3&X0N(PxN2{%vn}cnV?rYw z$N^}_o!XUB!mckL`yO1rnUaI4wrOeQ(+&k?2mi47hzxSD`N#-byqd1IhEoh!PGq>t z_MRy{5B0eKY>;Ao3z$RUU7U+i?iX^&r739F)itdrTpAi-NN0=?^m%?{A9Ly2pVv>Lqs6moTP?T2-AHqFD-o_ znVr|7OAS#AEH}h8SRPQ@NGG47dO}l=t07__+iK8nHw^(AHx&Wb<%jPc$$jl6_p(b$ z)!pi(0fQodCHfM)KMEMUR&UID>}m^(!{C^U7sBDOA)$VThRCI0_+2=( zV8mMq0R(#z;C|7$m>$>`tX+T|xGt(+Y48@ZYu#z;0pCgYgmMVbFb!$?%yhZqP_nhn zy4<#3P1oQ#2b51NU1mGnHP$cf0j-YOgAA}A$QoL6JVLcmExs(kU{4z;PBHJD%_=0F z>+sQV`mzijSIT7xn%PiDKHOujX;n|M&qr1T@rOxTdxtZ!&u&3HHFLYD5$RLQ=heur zb>+AFokUVQeJy-#LP*^)spt{mb@Mqe=A~-4p0b+Bt|pZ+@CY+%x}9f}izU5;4&QFE zO1bhg&A4uC1)Zb67kuowWY4xbo&J=%yoXlFB)&$d*-}kjBu|w!^zbD1YPc0-#XTJr z)pm2RDy%J3jlqSMq|o%xGS$bPwn4AqitC6&e?pqWcjWPt{3I{>CBy;hg0Umh#c;hU3RhCUX=8aR>rmd` z7Orw(5tcM{|-^J?ZAA9KP|)X6n9$-kvr#j5YDecTM6n z&07(nD^qb8hpF0B^z^pQ*%5ePYkv&FabrlI61ntiVp!!C8y^}|<2xgAd#FY=8b*y( zuQOuvy2`Ii^`VBNJB&R!0{hABYX55ooCAJSSevl4RPqEGb)iy_0H}v@vFwFzD%>#I>)3PsouQ+_Kkbqy*kKdHdfkN7NBcq%V{x^fSxgXpg7$bF& zj!6AQbDY(1u#1_A#1UO9AxiZaCVN2F0wGXdY*g@x$ByvUA?ePdide0dmr#}udE%K| z3*k}Vv2Ew2u1FXBaVA6aerI36R&rzEZeDDCl5!t0J=ug6kuNZzH>3i_VN`%BsaVB3 zQYw|Xub_SGf{)F{$ZX5`Jc!X!;eybjP+o$I{Z^Hsj@D=E{MnnL+TbC@HEU2DjG{3-LDGIbq()U87x4eS;JXnSh;lRlJ z>EL3D>wHt-+wTjQF$fGyDO$>d+(fq@bPpLBS~xA~R=3JPbS{tzN(u~m#Po!?H;IYv zE;?8%^vle|%#oux(Lj!YzBKv+Fd}*Ur-dCBoX*t{KeNM*n~ZPYJ4NNKkI^MFbz9!v z4(Bvm*Kc!-$%VFEewYJKz-CQN{`2}KX4*CeJEs+Q(!kI%hN1!1P6iOq?ovz}X0IOi z)YfWpwW@pK08^69#wSyCZkX9?uZD?C^@rw^Y?gLS_xmFKkooyx$*^5#cPqntNTtSG zlP>XLMj2!VF^0k#ole7`-c~*~+_T5ls?x4)ah(j8vo_ zwb%S8qoaZqY0-$ZI+ViIA_1~~rAH7K_+yFS{0rT@eQtTAdz#8E5VpwnW!zJ_^{Utv zlW5Iar3V5t&H4D6A=>?mq;G92;1cg9a2sf;gY9pJDVKn$DYdQlvfXq}zz8#LyPGq@ z+`YUMD;^-6w&r-82JL7mA8&M~Pj@aK!m{0+^v<|t%APYf7`}jGEhdYLqsHW-Le9TL z_hZZ1gbrz7$f9^fAzVIP30^KIz!!#+DRLL+qMszvI_BpOSmjtl$hh;&UeM{ER@INV zcI}VbiVTPoN|iSna@=7XkP&-4#06C};8ajbxJ4Gcq8(vWv4*&X8bM^T$mBk75Q92j z1v&%a;OSKc8EIrodmIiw$lOES2hzGDcjjB`kEDfJe{r}yE6`eZL zEB`9u>Cl0IsQ+t}`-cx}{6jqcANucqIB>Qmga_&<+80E2Q|VHHQ$YlAt{6`Qu`HA3 z03s0-sSlwbvgi&_R8s={6<~M^pGvBNjKOa>tWenzS8s zR>L7R5aZ=mSU{f?ib4Grx$AeFvtO5N|D>9#)ChH#Fny2maHWHOf2G=#<9Myot#+4u zWVa6d^Vseq_0=#AYS(-m$Lp;*8nC_6jXIjEM`omUmtH@QDs3|G)i4j*#_?#UYVZvJ z?YjT-?!4Q{BNun;dKBWLEw2C-VeAz`%?A>p;)PL}TAZn5j~HK>v1W&anteARlE+~+ zj>c(F;?qO3pXBb|#OZdQnm<4xWmn~;DR5SDMxt0UK_F^&eD|KZ=O;tO3vy4@4h^;2 zUL~-z`-P1aOe?|ZC1BgVsL)2^J-&vIFI%q@40w0{jjEfeVl)i9(~bt2z#2Vm)p`V_ z1;6$Ae7=YXk#=Qkd24Y23t&GvRxaOoad~NbJ+6pxqzJ>FY#Td7@`N5xp!n(c!=RE& z&<<@^a$_Ys8jqz4|5Nk#FY$~|FPC0`*a5HH!|Gssa9=~66&xG9)|=pOOJ2KE5|YrR zw!w6K2aC=J$t?L-;}5hn6mHd%hC;p8P|Dgh6D>hGnXPgi;6r+eA=?f72y9(Cf_ho{ zH6#)uD&R=73^$$NE;5piWX2bzR67fQ)`b=85o0eOLGI4c-Tb@-KNi2pz=Ke@SDcPn za$AxXib84`!Sf;Z3B@TSo`Dz7GM5Kf(@PR>Ghzi=BBxK8wRp>YQoXm+iL>H*Jo9M3 z6w&E?BC8AFTFT&Tv8zf+m9<&S&%dIaZ)Aoqkak_$r-2{$d~0g2oLETx9Y`eOAf14QXEQw3tJne;fdzl@wV#TFXSLXM2428F-Q}t+n2g%vPRMUzYPvzQ9f# zu(liiJem9P*?0%V@RwA7F53r~|I!Ty)<*AsMX3J{_4&}{6pT%Tpw>)^|DJ)>gpS~1rNEh z0$D?uO8mG?H;2BwM5a*26^7YO$XjUm40XmBsb63MoR;bJh63J;OngS5sSI+o2HA;W zdZV#8pDpC9Oez&L8loZO)MClRz!_!WD&QRtQxnazhT%Vj6Wl4G11nUk8*vSeVab@N#oJ}`KyJv+8Mo@T1-pqZ1t|?cnaVOd;1(h9 z!$DrN=jcGsVYE-0-n?oCJ^4x)F}E;UaD-LZUIzcD?W^ficqJWM%QLy6QikrM1aKZC zi{?;oKwq^Vsr|&`i{jIphA8S6G4)$KGvpULjH%9u(Dq247;R#l&I0{IhcC|oBF*Al zvLo7Xte=C{aIt*otJD}BUq)|_pdR>{zBMT< z(^1RpZv*l*m*OV^8>9&asGBo8h*_4q*)-eCv*|Pq=XNGrZE)^(SF7^{QE_~4VDB(o zVcPA_!G+2CAtLbl+`=Q~9iW`4ZRLku!uB?;tWqVjB0lEOf}2RD7dJ=BExy=<9wkb- z9&7{XFA%n#JsHYN8t5d~=T~5DcW4$B%3M+nNvC2`0!#@sckqlzo5;hhGi(D9=*A4` z5ynobawSPRtWn&CDLEs3Xf`(8^zDP=NdF~F^s&={l7(aw&EG}KWpMjtmz7j_VLO;@ zM2NVLDxZ@GIv7*gzl1 zjq78tv*8#WSY`}Su0&C;2F$Ze(q>F(@Wm^Gw!)(j;dk9Ad{STaxn)IV9FZhm*n+U} zi;4y*3v%A`_c7a__DJ8D1b@dl0Std3F||4Wtvi)fCcBRh!X9$1x!_VzUh>*S5s!oq z;qd{J_r79EL2wIeiGAqFstWtkfIJpjVh%zFo*=55B9Zq~y0=^iqHWfQl@O!Ak;(o*m!pZqe9 z%U2oDOhR)BvW8&F70L;2TpkzIutIvNQaTjjs5V#8mV4!NQ}zN=i`i@WI1z0eN-iCS z;vL-Wxc^Vc_qK<5RPh(}*8dLT{~GzE{w2o$2kMFaEl&q zP{V=>&3kW7tWaK-Exy{~`v4J0U#OZBk{a9{&)&QG18L@6=bsZ1zC_d{{pKZ-Ey>I> z;8H0t4bwyQqgu4hmO`3|4K{R*5>qnQ&gOfdy?z`XD%e5+pTDzUt3`k^u~SaL&XMe= z9*h#kT(*Q9jO#w2Hd|Mr-%DV8i_1{J1MU~XJ3!WUplhXDYBpJH><0OU`**nIvPIof z|N8@I=wA)sf45SAvx||f?Z5uB$kz1qL3Ky_{%RPdP5iN-D2!p5scq}buuC00C@jom zhfGKm3|f?Z0iQ|K$Z~!`8{nmAS1r+fp6r#YDOS8V*;K&Gs7Lc&f^$RC66O|)28oh`NHy&vq zJh+hAw8+ybTB0@VhWN^0iiTnLsCWbS_y`^gs!LX!Lw{yE``!UVzrV24tP8o;I6-65 z1MUiHw^{bB15tmrVT*7-#sj6cs~z`wk52YQJ*TG{SE;KTm#Hf#a~|<(|ImHH17nNM z`Ub{+J3dMD!)mzC8b(2tZtokKW5pAwHa?NFiso~# z1*iaNh4lQ4TS)|@G)H4dZV@l*Vd;Rw;-;odDhW2&lJ%m@jz+Panv7LQm~2Js6rOW3 z0_&2cW^b^MYW3)@o;neZ<{B4c#m48dAl$GCc=$>ErDe|?y@z`$uq3xd(%aAsX)D%l z>y*SQ%My`yDP*zof|3@_w#cjaW_YW4BdA;#Glg1RQcJGY*CJ9`H{@|D+*e~*457kd z73p<%fB^PV!Ybw@)Dr%(ZJbX}xmCStCYv#K3O32ej{$9IzM^I{6FJ8!(=azt7RWf4 z7ib0UOPqN40X!wOnFOoddd8`!_IN~9O)#HRTyjfc#&MCZ zZAMzOVB=;qwt8gV?{Y2?b=iSZG~RF~uyx18K)IDFLl})G1v@$(s{O4@RJ%OTJyF+Cpcx4jmy|F3euCnMK!P2WTDu5j z{{gD$=M*pH!GGzL%P)V2*ROm>!$Y=z|D`!_yY6e7SU$~a5q8?hZGgaYqaiLnkK%?0 zs#oI%;zOxF@g*@(V4p!$7dS1rOr6GVs6uYCTt2h)eB4?(&w8{#o)s#%gN@BBosRUe z)@P@8_Zm89pr~)b>e{tbPC~&_MR--iB{=)y;INU5#)@Gix-YpgP<-c2Ms{9zuCX|3 z!p(?VaXww&(w&uBHzoT%!A2=3HAP>SDxcljrego7rY|%hxy3XlODWffO_%g|l+7Y_ zqV(xbu)s4lV=l7M;f>vJl{`6qBm>#ZeMA}kXb97Z)?R97EkoI?x6Lp0yu1Z>PS?2{ z0QQ(8D)|lc9CO3B~e(pQM&5(1y&y=e>C^X$`)_&XuaI!IgDTVqt31wX#n+@!a_A0ZQkA zCJ2@M_4Gb5MfCrm5UPggeyh)8 zO9?`B0J#rkoCx(R0I!ko_2?iO@|oRf1;3r+i)w-2&j?=;NVIdPFsB)`|IC0zk6r9c zRrkfxWsiJ(#8QndNJj@{@WP2Ackr|r1VxV{7S&rSU(^)-M8gV>@UzOLXu9K<{6e{T zXJ6b92r$!|lwjhmgqkdswY&}c)KW4A)-ac%sU;2^fvq7gfUW4Bw$b!i@duy1CAxSn z(pyh$^Z=&O-q<{bZUP+$U}=*#M9uVc>CQVgDs4swy5&8RAHZ~$)hrTF4W zPsSa~qYv_0mJnF89RnnJTH`3}w4?~epFl=D(35$ zWa07ON$`OMBOHgCmfO(9RFc<)?$x)N}Jd2A(<*Ll7+4jrRt9w zwGxExUXd9VB#I|DwfxvJ;HZ8Q{37^wDhaZ%O!oO(HpcqfLH%#a#!~;Jl7F5>EX_=8 z{()l2NqPz>La3qJR;_v+wlK>GsHl;uRA8%j`A|yH@k5r%55S9{*Cp%uw6t`qc1!*T za2OeqtQj7sAp#Q~=5Fs&aCR9v>5V+s&RdNvo&H~6FJOjvaj--2sYYBvMq;55%z8^o z|BJDA4vzfow#DO#ZQHh;Oq_{r+qP{R9ox2TOgwQiv7Ow!zjN+A@BN;0tA2lUb#+zO z(^b89eV)D7UVE+h{mcNc6&GtpOqDn_?VAQ)Vob$hlFwW%xh>D#wml{t&Ofmm_d_+; zKDxzdr}`n2Rw`DtyIjrG)eD0vut$}dJAZ0AohZ+ZQdWXn_Z@dI_y=7t3q8x#pDI-K z2VVc&EGq445Rq-j0=U=Zx`oBaBjsefY;%)Co>J3v4l8V(T8H?49_@;K6q#r~Wwppc z4XW0(4k}cP=5ex>-Xt3oATZ~bBWKv)aw|I|Lx=9C1s~&b77idz({&q3T(Y(KbWO?+ zmcZ6?WeUsGk6>km*~234YC+2e6Zxdl~<_g2J|IE`GH%n<%PRv-50; zH{tnVts*S5*_RxFT9eM0z-pksIb^drUq4>QSww=u;UFCv2AhOuXE*V4z?MM`|ABOC4P;OfhS(M{1|c%QZ=!%rQTDFx`+}?Kdx$&FU?Y<$x;j7z=(;Lyz+?EE>ov!8vvMtSzG!nMie zsBa9t8as#2nH}n8xzN%W%U$#MHNXmDUVr@GX{?(=yI=4vks|V)!-W5jHsU|h_&+kY zS_8^kd3jlYqOoiI`ZqBVY!(UfnAGny!FowZWY_@YR0z!nG7m{{)4OS$q&YDyw6vC$ zm4!$h>*|!2LbMbxS+VM6&DIrL*X4DeMO!@#EzMVfr)e4Tagn~AQHIU8?e61TuhcKD zr!F4(kEebk(Wdk-?4oXM(rJwanS>Jc%<>R(siF+>+5*CqJLecP_we33iTFTXr6W^G z7M?LPC-qFHK;E!fxCP)`8rkxZyFk{EV;G-|kwf4b$c1k0atD?85+|4V%YATWMG|?K zLyLrws36p%Qz6{}>7b>)$pe>mR+=IWuGrX{3ZPZXF3plvuv5Huax86}KX*lbPVr}L z{C#lDjdDeHr~?l|)Vp_}T|%$qF&q#U;ClHEPVuS+Jg~NjC1RP=17=aQKGOcJ6B3mp z8?4*-fAD~}sX*=E6!}^u8)+m2j<&FSW%pYr_d|p_{28DZ#Cz0@NF=gC-o$MY?8Ca8 zr5Y8DSR^*urS~rhpX^05r30Ik#2>*dIOGxRm0#0YX@YQ%Mg5b6dXlS!4{7O_kdaW8PFSdj1=ryI-=5$fiieGK{LZ+SX(1b=MNL!q#lN zv98?fqqTUH8r8C7v(cx#BQ5P9W>- zmW93;eH6T`vuJ~rqtIBg%A6>q>gnWb3X!r0wh_q;211+Om&?nvYzL1hhtjB zK_7G3!n7PL>d!kj){HQE zE8(%J%dWLh1_k%gVXTZt zEdT09XSKAx27Ncaq|(vzL3gm83q>6CAw<$fTnMU05*xAe&rDfCiu`u^1)CD<>sx0i z*hr^N_TeN89G(nunZoLBf^81#pmM}>JgD@Nn1l*lN#a=B=9pN%tmvYFjFIoKe_(GF z-26x{(KXdfsQL7Uv6UtDuYwV`;8V3w>oT_I<`Ccz3QqK9tYT5ZQzbop{=I=!pMOCb zCU68`n?^DT%^&m>A%+-~#lvF!7`L7a{z<3JqIlk1$<||_J}vW1U9Y&eX<}l8##6i( zZcTT@2`9(Mecptm@{3A_Y(X`w9K0EwtPq~O!16bq{7c0f7#(3wn-^)h zxV&M~iiF!{-6A@>o;$RzQ5A50kxXYj!tcgme=Qjrbje~;5X2xryU;vH|6bE(8z^<7 zQ>BG7_c*JG8~K7Oe68i#0~C$v?-t@~@r3t2inUnLT(c=URpA9kA8uq9PKU(Ps(LVH zqgcqW>Gm?6oV#AldDPKVRcEyQIdTT`Qa1j~vS{<;SwyTdr&3*t?J)y=M7q*CzucZ&B0M=joT zBbj@*SY;o2^_h*>R0e({!QHF0=)0hOj^B^d*m>SnRrwq>MolNSgl^~r8GR#mDWGYEIJA8B<|{{j?-7p zVnV$zancW3&JVDtVpIlI|5djKq0(w$KxEFzEiiL=h5Jw~4Le23@s(mYyXWL9SX6Ot zmb)sZaly_P%BeX_9 zw&{yBef8tFm+%=--m*J|o~+Xg3N+$IH)t)=fqD+|fEk4AAZ&!wcN5=mi~Vvo^i`}> z#_3ahR}Ju)(Px7kev#JGcSwPXJ2id9%Qd2A#Uc@t8~egZ8;iC{e! z%=CGJOD1}j!HW_sgbi_8suYnn4#Ou}%9u)dXd3huFIb!ytlX>Denx@pCS-Nj$`VO&j@(z!kKSP0hE4;YIP#w9ta=3DO$7f*x zc9M4&NK%IrVmZAe=r@skWD`AEWH=g+r|*13Ss$+{c_R!b?>?UaGXlw*8qDmY#xlR= z<0XFbs2t?8i^G~m?b|!Hal^ZjRjt<@a? z%({Gn14b4-a|#uY^=@iiKH+k?~~wTj5K1A&hU z2^9-HTC)7zpoWK|$JXaBL6C z#qSNYtY>65T@Zs&-0cHeu|RX(Pxz6vTITdzJdYippF zC-EB+n4}#lM7`2Ry~SO>FxhKboIAF#Z{1wqxaCb{#yEFhLuX;Rx(Lz%T`Xo1+a2M}7D+@wol2)OJs$TwtRNJ={( zD@#zTUEE}#Fz#&(EoD|SV#bayvr&E0vzmb%H?o~46|FAcx?r4$N z&67W3mdip-T1RIxwSm_&(%U|+WvtGBj*}t69XVd&ebn>KOuL(7Y8cV?THd-(+9>G7*Nt%T zcH;`p={`SOjaf7hNd(=37Lz3-51;58JffzIPgGs_7xIOsB5p2t&@v1mKS$2D$*GQ6 zM(IR*j4{nri7NMK9xlDy-hJW6sW|ZiDRaFiayj%;(%51DN!ZCCCXz+0Vm#};70nOx zJ#yA0P3p^1DED;jGdPbQWo0WATN=&2(QybbVdhd=Vq*liDk`c7iZ?*AKEYC#SY&2g z&Q(Ci)MJ{mEat$ZdSwTjf6h~roanYh2?9j$CF@4hjj_f35kTKuGHvIs9}Re@iKMxS-OI*`0S z6s)fOtz}O$T?PLFVSeOjSO26$@u`e<>k(OSP!&YstH3ANh>)mzmKGNOwOawq-MPXe zy4xbeUAl6tamnx))-`Gi2uV5>9n(73yS)Ukma4*7fI8PaEwa)dWHs6QA6>$}7?(L8 ztN8M}?{Tf!Zu22J5?2@95&rQ|F7=FK-hihT-vDp!5JCcWrVogEnp;CHenAZ)+E+K5 z$Cffk5sNwD_?4+ymgcHR(5xgt20Z8M`2*;MzOM#>yhk{r3x=EyM226wb&!+j`W<%* zSc&|`8!>dn9D@!pYow~(DsY_naSx7(Z4i>cu#hA5=;IuI88}7f%)bRkuY2B;+9Uep zpXcvFWkJ!mQai63BgNXG26$5kyhZ2&*3Q_tk)Ii4M>@p~_~q_cE!|^A;_MHB;7s#9 zKzMzK{lIxotjc};k67^Xsl-gS!^*m*m6kn|sbdun`O?dUkJ{0cmI0-_2y=lTAfn*Y zKg*A-2sJq)CCJgY0LF-VQvl&6HIXZyxo2#!O&6fOhbHXC?%1cMc6y^*dOS{f$=137Ds1m01qs`>iUQ49JijsaQ( zksqV9@&?il$|4Ua%4!O15>Zy&%gBY&wgqB>XA3!EldQ%1CRSM(pp#k~-pkcCg4LAT zXE=puHbgsw)!xtc@P4r~Z}nTF=D2~j(6D%gTBw$(`Fc=OOQ0kiW$_RDd=hcO0t97h zb86S5r=>(@VGy1&#S$Kg_H@7G^;8Ue)X5Y+IWUi`o;mpvoV)`fcVk4FpcT|;EG!;? zHG^zrVVZOm>1KFaHlaogcWj(v!S)O(Aa|Vo?S|P z5|6b{qkH(USa*Z7-y_Uvty_Z1|B{rTS^qmEMLEYUSk03_Fg&!O3BMo{b^*`3SHvl0 zhnLTe^_vVIdcSHe)SQE}r~2dq)VZJ!aSKR?RS<(9lzkYo&dQ?mubnWmgMM37Nudwo z3Vz@R{=m2gENUE3V4NbIzAA$H1z0pagz94-PTJyX{b$yndsdKptmlKQKaaHj@3=ED zc7L?p@%ui|RegVYutK$64q4pe9+5sv34QUpo)u{1ci?)_7gXQd{PL>b0l(LI#rJmN zGuO+%GO`xneFOOr4EU(Wg}_%bhzUf;d@TU+V*2#}!2OLwg~%D;1FAu=Un>OgjPb3S z7l(riiCwgghC=Lm5hWGf5NdGp#01xQ59`HJcLXbUR3&n%P(+W2q$h2Qd z*6+-QXJ*&Kvk9ht0f0*rO_|FMBALen{j7T1l%=Q>gf#kma zQlg#I9+HB+z*5BMxdesMND`_W;q5|FaEURFk|~&{@qY32N$G$2B=&Po{=!)x5b!#n zxLzblkq{yj05#O7(GRuT39(06FJlalyv<#K4m}+vs>9@q-&31@1(QBv82{}Zkns~K ze{eHC_RDX0#^A*JQTwF`a=IkE6Ze@j#-8Q`tTT?k9`^ZhA~3eCZJ-Jr{~7Cx;H4A3 zcZ+Zj{mzFZbVvQ6U~n>$U2ZotGsERZ@}VKrgGh0xM;Jzt29%TX6_&CWzg+YYMozrM z`nutuS)_0dCM8UVaKRj804J4i%z2BA_8A4OJRQ$N(P9Mfn-gF;4#q788C@9XR0O3< zsoS4wIoyt046d+LnSCJOy@B@Uz*#GGd#+Ln1ek5Dv>(ZtD@tgZlPnZZJGBLr^JK+!$$?A_fA3LOrkoDRH&l7 zcMcD$Hsjko3`-{bn)jPL6E9Ds{WskMrivsUu5apD z?grQO@W7i5+%X&E&p|RBaEZ(sGLR@~(y^BI@lDMot^Ll?!`90KT!JXUhYS`ZgX3jnu@Ja^seA*M5R@f`=`ynQV4rc$uT1mvE?@tz)TN<=&H1%Z?5yjxcpO+6y_R z6EPuPKM5uxKpmZfT(WKjRRNHs@ib)F5WAP7QCADvmCSD#hPz$V10wiD&{NXyEwx5S z6NE`3z!IS^$s7m}PCwQutVQ#~w+V z=+~->DI*bR2j0^@dMr9`p>q^Ny~NrAVxrJtX2DUveic5vM%#N*XO|?YAWwNI$Q)_) zvE|L(L1jP@F%gOGtnlXtIv2&1i8q<)Xfz8O3G^Ea~e*HJsQgBxWL(yuLY+jqUK zRE~`-zklrGog(X}$9@ZVUw!8*=l`6mzYLtsg`AvBYz(cxmAhr^j0~(rzXdiOEeu_p zE$sf2(w(BPAvO5DlaN&uQ$4@p-b?fRs}d7&2UQ4Fh?1Hzu*YVjcndqJLw0#q@fR4u zJCJ}>_7-|QbvOfylj+e^_L`5Ep9gqd>XI3-O?Wp z-gt*P29f$Tx(mtS`0d05nHH=gm~Po_^OxxUwV294BDKT>PHVlC5bndncxGR!n(OOm znsNt@Q&N{TLrmsoKFw0&_M9$&+C24`sIXGWgQaz=kY;S{?w`z^Q0JXXBKFLj0w0U6P*+jPKyZHX9F#b0D1$&(- zrm8PJd?+SrVf^JlfTM^qGDK&-p2Kdfg?f>^%>1n8bu&byH(huaocL>l@f%c*QkX2i znl}VZ4R1en4S&Bcqw?$=Zi7ohqB$Jw9x`aM#>pHc0x z0$!q7iFu zZ`tryM70qBI6JWWTF9EjgG@>6SRzsd}3h+4D8d~@CR07P$LJ}MFsYi-*O%XVvD@yT|rJ+Mk zDllJ7$n0V&A!0flbOf)HE6P_afPWZmbhpliqJuw=-h+r;WGk|ntkWN(8tKlYpq5Ow z(@%s>IN8nHRaYb*^d;M(D$zGCv5C|uqmsDjwy4g=Lz>*OhO3z=)VD}C<65;`89Ye} zSCxrv#ILzIpEx1KdLPlM&%Cctf@FqTKvNPXC&`*H9=l=D3r!GLM?UV zOxa(8ZsB`&+76S-_xuj?G#wXBfDY@Z_tMpXJS7^mp z@YX&u0jYw2A+Z+bD#6sgVK5ZgdPSJV3>{K^4~%HV?rn~4D)*2H!67Y>0aOmzup`{D zzDp3c9yEbGCY$U<8biJ_gB*`jluz1ShUd!QUIQJ$*1;MXCMApJ^m*Fiv88RZ zFopLViw}{$Tyhh_{MLGIE2~sZ)t0VvoW%=8qKZ>h=adTe3QM$&$PO2lfqH@brt!9j ziePM8$!CgE9iz6B<6_wyTQj?qYa;eC^{x_0wuwV~W+^fZmFco-o%wsKSnjXFEx02V zF5C2t)T6Gw$Kf^_c;Ei3G~uC8SM-xyycmXyC2hAVi-IfXqhu$$-C=*|X?R0~hu z8`J6TdgflslhrmDZq1f?GXF7*ALeMmOEpRDg(s*H`4>_NAr`2uqF;k;JQ+8>A|_6ZNsNLECC%NNEb1Y1dP zbIEmNpK)#XagtL4R6BC{C5T(+=yA-(Z|Ap}U-AfZM#gwVpus3(gPn}Q$CExObJ5AC z)ff9Yk?wZ}dZ-^)?cbb9Fw#EjqQ8jxF4G3=L?Ra zg_)0QDMV1y^A^>HRI$x?Op@t;oj&H@1xt4SZ9(kifQ zb59B*`M99Td7@aZ3UWvj1rD0sE)d=BsBuW*KwkCds7ay(7*01_+L}b~7)VHI>F_!{ zyxg-&nCO?v#KOUec0{OOKy+sjWA;8rTE|Lv6I9H?CI?H(mUm8VXGwU$49LGpz&{nQp2}dinE1@lZ1iox6{ghN&v^GZv9J${7WaXj)<0S4g_uiJ&JCZ zr8-hsu`U%N;+9N^@&Q0^kVPB3)wY(rr}p7{p0qFHb3NUUHJb672+wRZs`gd1UjKPX z4o6zljKKA+Kkj?H>Ew63o%QjyBk&1!P22;MkD>sM0=z_s-G{mTixJCT9@_|*(p^bz zJ8?ZZ&;pzV+7#6Mn`_U-)k8Pjg?a;|Oe^us^PoPY$Va~yi8|?+&=y$f+lABT<*pZr zP}D{~Pq1Qyni+@|aP;ixO~mbEW9#c0OU#YbDZIaw=_&$K%Ep2f%hO^&P67hApZe`x zv8b`Mz@?M_7-)b!lkQKk)JXXUuT|B8kJlvqRmRpxtQDgvrHMXC1B$M@Y%Me!BSx3P z#2Eawl$HleZhhTS6Txm>lN_+I`>eV$&v9fOg)%zVn3O5mI*lAl>QcHuW6!Kixmq`X zBCZ*Ck6OYtDiK!N47>jxI&O2a9x7M|i^IagRr-fmrmikEQGgw%J7bO|)*$2FW95O4 zeBs>KR)izRG1gRVL;F*sr8A}aRHO0gc$$j&ds8CIO1=Gwq1%_~E)CWNn9pCtBE}+`Jelk4{>S)M)`Ll=!~gnn1yq^EX(+y*ik@3Ou0qU`IgYi3*doM+5&dU!cho$pZ zn%lhKeZkS72P?Cf68<#kll_6OAO26bIbueZx**j6o;I0cS^XiL`y+>{cD}gd%lux} z)3N>MaE24WBZ}s0ApfdM;5J_Ny}rfUyxfkC``Awo2#sgLnGPewK};dORuT?@I6(5~ z?kE)Qh$L&fwJXzK){iYx!l5$Tt|^D~MkGZPA}(o6f7w~O2G6Vvzdo*a;iXzk$B66$ zwF#;wM7A+(;uFG4+UAY(2`*3XXx|V$K8AYu#ECJYSl@S=uZW$ksfC$~qrrbQj4??z-)uz0QL}>k^?fPnJTPw% zGz)~?B4}u0CzOf@l^um}HZzbaIwPmb<)< zi_3@E9lc)Qe2_`*Z^HH;1CXOceL=CHpHS{HySy3T%<^NrWQ}G0i4e1xm_K3(+~oi$ zoHl9wzb?Z4j#90DtURtjtgvi7uw8DzHYmtPb;?%8vb9n@bszT=1qr)V_>R%s!92_` zfnHQPANx z<#hIjIMm#*(v*!OXtF+w8kLu`o?VZ5k7{`vw{Yc^qYclpUGIM_PBN1+c{#Vxv&E*@ zxg=W2W~JuV{IuRYw3>LSI1)a!thID@R=bU+cU@DbR^_SXY`MC7HOsCN z!dO4OKV7(E_Z8T#8MA1H`99?Z!r0)qKW_#|29X3#Jb+5+>qUidbeP1NJ@)(qi2S-X zao|f0_tl(O+$R|Qwd$H{_ig|~I1fbp_$NkI!0E;Y z6JrnU{1Ra6^on{9gUUB0mwzP3S%B#h0fjo>JvV~#+X0P~JV=IG=yHG$O+p5O3NUgG zEQ}z6BTp^Fie)Sg<){Z&I8NwPR(=mO4joTLHkJ>|Tnk23E(Bo`FSbPc05lF2-+)X? z6vV3*m~IBHTy*^E!<0nA(tCOJW2G4DsH7)BxLV8kICn5lu6@U*R`w)o9;Ro$i8=Q^V%uH8n3q=+Yf;SFRZu z!+F&PKcH#8cG?aSK_Tl@K9P#8o+jry@gdexz&d(Q=47<7nw@e@FFfIRNL9^)1i@;A z28+$Z#rjv-wj#heI|<&J_DiJ*s}xd-f!{J8jfqOHE`TiHHZVIA8CjkNQ_u;Ery^^t zl1I75&u^`1_q)crO+JT4rx|z2ToSC>)Or@-D zy3S>jW*sNIZR-EBsfyaJ+Jq4BQE4?SePtD2+jY8*%FsSLZ9MY>+wk?}}}AFAw)vr{ml)8LUG-y9>^t!{~|sgpxYc0Gnkg`&~R z-pilJZjr@y5$>B=VMdZ73svct%##v%wdX~9fz6i3Q-zOKJ9wso+h?VME7}SjL=!NUG{J?M&i!>ma`eoEa@IX`5G>B1(7;%}M*%-# zfhJ(W{y;>MRz!Ic8=S}VaBKqh;~7KdnGEHxcL$kA-6E~=!hrN*zw9N+_=odt<$_H_8dbo;0=42wcAETPCVGUr~v(`Uai zb{=D!Qc!dOEU6v)2eHSZq%5iqK?B(JlCq%T6av$Cb4Rko6onlG&?CqaX7Y_C_cOC3 zYZ;_oI(}=>_07}Oep&Ws7x7-R)cc8zfe!SYxJYP``pi$FDS)4Fvw5HH=FiU6xfVqIM!hJ;Rx8c0cB7~aPtNH(Nmm5Vh{ibAoU#J6 zImRCr?(iyu_4W_6AWo3*vxTPUw@vPwy@E0`(>1Qi=%>5eSIrp^`` zK*Y?fK_6F1W>-7UsB)RPC4>>Ps9)f+^MqM}8AUm@tZ->j%&h1M8s*s!LX5&WxQcAh z8mciQej@RPm?660%>{_D+7er>%zX_{s|$Z+;G7_sfNfBgY(zLB4Ey}J9F>zX#K0f6 z?dVNIeEh?EIShmP6>M+d|0wMM85Sa4diw1hrg|ITJ}JDg@o8y>(rF9mXk5M z2@D|NA)-7>wD&wF;S_$KS=eE84`BGw3g0?6wGxu8ys4rwI?9U=*^VF22t3%mbGeOh z`!O-OpF7#Vceu~F`${bW0nYVU9ecmk31V{tF%iv&5hWofC>I~cqAt@u6|R+|HLMMX zVxuSlMFOK_EQ86#E8&KwxIr8S9tj_goWtLv4f@!&h8;Ov41{J~496vp9vX=(LK#j! zAwi*21RAV-LD>9Cw3bV_9X(X3)Kr0-UaB*7Y>t82EQ%!)(&(XuAYtTsYy-dz+w=$ir)VJpe!_$ z6SGpX^i(af3{o=VlFPC);|J8#(=_8#vdxDe|Cok+ANhYwbE*FO`Su2m1~w+&9<_9~ z-|tTU_ACGN`~CNW5WYYBn^B#SwZ(t4%3aPp z;o)|L6Rk569KGxFLUPx@!6OOa+5OjQLK5w&nAmwxkC5rZ|m&HT8G%GVZxB_@ME z>>{rnXUqyiJrT(8GMj_ap#yN_!9-lO5e8mR3cJiK3NE{_UM&=*vIU`YkiL$1%kf+1 z4=jk@7EEj`u(jy$HnzE33ZVW_J4bj}K;vT?T91YlO(|Y0FU4r+VdbmQ97%(J5 zkK*Bed8+C}FcZ@HIgdCMioV%A<*4pw_n}l*{Cr4}a(lq|injK#O?$tyvyE`S%(1`H z_wwRvk#13ElkZvij2MFGOj`fhy?nC^8`Zyo%yVcUAfEr8x&J#A{|moUBAV_^f$hpaUuyQeY3da^ zS9iRgf87YBwfe}>BO+T&Fl%rfpZh#+AM?Dq-k$Bq`vG6G_b4z%Kbd&v>qFjow*mBl z-OylnqOpLg}or7_VNwRg2za3VBK6FUfFX{|TD z`Wt0Vm2H$vdlRWYQJqDmM?JUbVqL*ZQY|5&sY*?!&%P8qhA~5+Af<{MaGo(dl&C5t zE%t!J0 zh6jqANt4ABdPxSTrVV}fLsRQal*)l&_*rFq(Ez}ClEH6LHv{J#v?+H-BZ2)Wy{K@9 z+ovXHq~DiDvm>O~r$LJo!cOuwL+Oa--6;UFE2q@g3N8Qkw5E>ytz^(&($!O47+i~$ zKM+tkAd-RbmP{s_rh+ugTD;lriL~`Xwkad#;_aM?nQ7L_muEFI}U_4$phjvYgleK~`Fo`;GiC07&Hq1F<%p;9Q;tv5b?*QnR%8DYJH3P>Svmv47Y>*LPZJy8_{9H`g6kQpyZU{oJ`m%&p~D=K#KpfoJ@ zn-3cqmHsdtN!f?~w+(t+I`*7GQA#EQC^lUA9(i6=i1PqSAc|ha91I%X&nXzjYaM{8$s&wEx@aVkQ6M{E2 zfzId#&r(XwUNtPcq4Ngze^+XaJA1EK-%&C9j>^9(secqe{}z>hR5CFNveMsVA)m#S zk)_%SidkY-XmMWlVnQ(mNJ>)ooszQ#vaK;!rPmGKXV7am^_F!Lz>;~{VrIO$;!#30XRhE1QqO_~#+Ux;B_D{Nk=grn z8Y0oR^4RqtcYM)7a%@B(XdbZCOqnX#fD{BQTeLvRHd(irHKq=4*jq34`6@VAQR8WG z^%)@5CXnD_T#f%@-l${>y$tfb>2LPmc{~5A82|16mH)R?&r#KKLs7xpN-D`=&Cm^R zvMA6#Ahr<3X>Q7|-qfTY)}32HkAz$_mibYV!I)u>bmjK`qwBe(>za^0Kt*HnFbSdO z1>+ryKCNxmm^)*$XfiDOF2|{-v3KKB?&!(S_Y=Ht@|ir^hLd978xuI&N{k>?(*f8H z=ClxVJK_%_z1TH0eUwm2J+2To7FK4o+n_na)&#VLn1m;!+CX+~WC+qg1?PA~KdOlC zW)C@pw75_xoe=w7i|r9KGIvQ$+3K?L{7TGHwrQM{dCp=Z*D}3kX7E-@sZnup!BImw z*T#a=+WcTwL78exTgBn|iNE3#EsOorO z*kt)gDzHiPt07fmisA2LWN?AymkdqTgr?=loT7z@d`wnlr6oN}@o|&JX!yPzC*Y8d zu6kWlTzE1)ckyBn+0Y^HMN+GA$wUO_LN6W>mxCo!0?oiQvT`z$jbSEu&{UHRU0E8# z%B^wOc@S!yhMT49Y)ww(Xta^8pmPCe@eI5C*ed96)AX9<>))nKx0(sci8gwob_1}4 z0DIL&vsJ1_s%<@y%U*-eX z5rN&(zef-5G~?@r79oZGW1d!WaTqQn0F6RIOa9tJ=0(kdd{d1{<*tHT#cCvl*i>YY zH+L7jq8xZNcTUBqj(S)ztTU!TM!RQ}In*n&Gn<>(60G7}4%WQL!o>hbJqNDSGwl#H z`4k+twp0cj%PsS+NKaxslAEu9!#U3xT1|_KB6`h=PI0SW`P9GTa7caD1}vKEglV8# zjKZR`pluCW19c2fM&ZG)c3T3Um;ir3y(tSCJ7Agl6|b524dy5El{^EQBG?E61H0XY z`bqg!;zhGhyMFl&(o=JWEJ8n~z)xI}A@C0d2hQGvw7nGv)?POU@(kS1m=%`|+^ika zXl8zjS?xqW$WlO?Ewa;vF~XbybHBor$f<%I&*t$F5fynwZlTGj|IjZtVfGa7l&tK} zW>I<69w(cZLu)QIVG|M2xzW@S+70NinQzk&Y0+3WT*cC)rx~04O-^<{JohU_&HL5XdUKW!uFy|i$FB|EMu0eUyW;gsf`XfIc!Z0V zeK&*hPL}f_cX=@iv>K%S5kL;cl_$v?n(Q9f_cChk8Lq$glT|=e+T*8O4H2n<=NGmn z+2*h+v;kBvF>}&0RDS>)B{1!_*XuE8A$Y=G8w^qGMtfudDBsD5>T5SB;Qo}fSkkiV ze^K^M(UthkwrD!&*tTsu>Dacdj_q`~V%r_twr$(Ct&_dKeeXE?fA&4&yASJWJ*}~- zel=@W)tusynfC_YqH4ll>4Eg`Xjs5F7Tj>tTLz<0N3)X<1px_d2yUY>X~y>>93*$) z5PuNMQLf9Bu?AAGO~a_|J2akO1M*@VYN^VxvP0F$2>;Zb9;d5Yfd8P%oFCCoZE$ z4#N$^J8rxYjUE_6{T%Y>MmWfHgScpuGv59#4u6fpTF%~KB^Ae`t1TD_^Ud#DhL+Dm zbY^VAM#MrAmFj{3-BpVSWph2b_Y6gCnCAombVa|1S@DU)2r9W<> zT5L8BB^er3zxKt1v(y&OYk!^aoQisqU zH(g@_o)D~BufUXcPt!Ydom)e|aW{XiMnes2z&rE?og>7|G+tp7&^;q?Qz5S5^yd$i z8lWr4g5nctBHtigX%0%XzIAB8U|T6&JsC4&^hZBw^*aIcuNO47de?|pGXJ4t}BB`L^d8tD`H`i zqrP8?#J@8T#;{^B!KO6J=@OWKhAerih(phML`(Rg7N1XWf1TN>=Z3Do{l_!d~DND&)O)D>ta20}@Lt77qSnVsA7>)uZAaT9bsB>u&aUQl+7GiY2|dAEg@%Al3i316y;&IhQL^8fw_nwS>f60M_-m+!5)S_6EPM7Y)(Nq^8gL7(3 zOiot`6Wy6%vw~a_H?1hLVzIT^i1;HedHgW9-P#)}Y6vF%C=P70X0Tk^z9Te@kPILI z_(gk!k+0%CG)%!WnBjjw*kAKs_lf#=5HXC00s-}oM-Q1aXYLj)(1d!_a7 z*Gg4Fe6F$*ujVjI|79Z5+Pr`us%zW@ln++2l+0hsngv<{mJ%?OfSo_3HJXOCys{Ug z00*YR-(fv<=&%Q!j%b-_ppA$JsTm^_L4x`$k{VpfLI(FMCap%LFAyq;#ns5bR7V+x zO!o;c5y~DyBPqdVQX)8G^G&jWkBy2|oWTw>)?5u}SAsI$RjT#)lTV&Rf8;>u*qXnb z8F%Xb=7#$m)83z%`E;49)t3fHInhtc#kx4wSLLms!*~Z$V?bTyUGiS&m>1P(952(H zuHdv=;o*{;5#X-uAyon`hP}d#U{uDlV?W?_5UjJvf%11hKwe&(&9_~{W)*y1nR5f_ z!N(R74nNK`y8>B!0Bt_Vr!;nc3W>~RiKtGSBkNlsR#-t^&;$W#)f9tTlZz>n*+Fjz z3zXZ;jf(sTM(oDzJt4FJS*8c&;PLTW(IQDFs_5QPy+7yhi1syPCarvqrHFcf&yTy)^O<1EBx;Ir`5W{TIM>{8w&PB>ro4;YD<5LF^TjTb0!zAP|QijA+1Vg>{Afv^% zmrkc4o6rvBI;Q8rj4*=AZacy*n8B{&G3VJc)so4$XUoie0)vr;qzPZVbb<#Fc=j+8CGBWe$n|3K& z_@%?{l|TzKSlUEO{U{{%Fz_pVDxs7i9H#bnbCw7@4DR=}r_qV!Zo~CvD4ZI*+j3kO zW6_=|S`)(*gM0Z;;}nj`73OigF4p6_NPZQ-Od~e$c_);;4-7sR>+2u$6m$Gf%T{aq zle>e3(*Rt(TPD}03n5)!Ca8Pu!V}m6v0o1;5<1h$*|7z|^(3$Y&;KHKTT}hV056wuF0Xo@mK-52~r=6^SI1NC%c~CC?n>yX6wPTgiWYVz!Sx^atLby9YNn1Rk{g?|pJaxD4|9cUf|V1_I*w zzxK)hRh9%zOl=*$?XUjly5z8?jPMy%vEN)f%T*|WO|bp5NWv@B(K3D6LMl!-6dQg0 zXNE&O>Oyf%K@`ngCvbGPR>HRg5!1IV$_}m@3dWB7x3t&KFyOJn9pxRXCAzFr&%37wXG;z^xaO$ekR=LJG ztIHpY8F5xBP{mtQidqNRoz= z@){+N3(VO5bD+VrmS^YjG@+JO{EOIW)9=F4v_$Ed8rZtHvjpiEp{r^c4F6Ic#ChlC zJX^DtSK+v(YdCW)^EFcs=XP7S>Y!4=xgmv>{S$~@h=xW-G4FF9?I@zYN$e5oF9g$# zb!eVU#J+NjLyX;yb)%SY)xJdvGhsnE*JEkuOVo^k5PyS=o#vq!KD46UTW_%R=Y&0G zFj6bV{`Y6)YoKgqnir2&+sl+i6foAn-**Zd1{_;Zb7Ki=u394C5J{l^H@XN`_6XTKY%X1AgQM6KycJ+= zYO=&t#5oSKB^pYhNdzPgH~aEGW2=ec1O#s-KG z71}LOg@4UEFtp3GY1PBemXpNs6UK-ax*)#$J^pC_me;Z$Je(OqLoh|ZrW*mAMBFn< zHttjwC&fkVfMnQeen8`Rvy^$pNRFVaiEN4Pih*Y3@jo!T0nsClN)pdrr9AYLcZxZ| zJ5Wlj+4q~($hbtuY zVQ7hl>4-+@6g1i`1a)rvtp-;b0>^`Dloy(#{z~ytgv=j4q^Kl}wD>K_Y!l~ zp(_&7sh`vfO(1*MO!B%<6E_bx1)&s+Ae`O)a|X=J9y~XDa@UB`m)`tSG4AUhoM=5& znWoHlA-(z@3n0=l{E)R-p8sB9XkV zZ#D8wietfHL?J5X0%&fGg@MH~(rNS2`GHS4xTo7L$>TPme+Is~!|79=^}QbPF>m%J zFMkGzSndiPO|E~hrhCeo@&Ea{M(ieIgRWMf)E}qeTxT8Q#g-!Lu*x$v8W^M^>?-g= zwMJ$dThI|~M06rG$Sv@C@tWR>_YgaG&!BAbkGggVQa#KdtDB)lMLNVLN|51C@F^y8 zCRvMB^{GO@j=cHfmy}_pCGbP%xb{pNN>? z?7tBz$1^zVaP|uaatYaIN+#xEN4jBzwZ|YI_)p(4CUAz1ZEbDk>J~Y|63SZaak~#0 zoYKruYsWHoOlC1(MhTnsdUOwQfz5p6-D0}4;DO$B;7#M{3lSE^jnTT;ns`>!G%i*F?@pR1JO{QTuD0U+~SlZxcc8~>IB{)@8p`P&+nDxNj`*gh|u?yrv$phpQcW)Us)bi`kT%qLj(fi{dWRZ%Es2!=3mI~UxiW0$-v3vUl?#g{p6eF zMEUAqo5-L0Ar(s{VlR9g=j7+lt!gP!UN2ICMokAZ5(Agd>})#gkA2w|5+<%-CuEP# zqgcM}u@3(QIC^Gx<2dbLj?cFSws_f3e%f4jeR?4M^M3cx1f+Qr6ydQ>n)kz1s##2w zk}UyQc+Z5G-d-1}{WzjkLXgS-2P7auWSJ%pSnD|Uivj5u!xk0 z_^-N9r9o;(rFDt~q1PvE#iJZ_f>J3gcP$)SOqhE~pD2|$=GvpL^d!r z6u=sp-CrMoF7;)}Zd7XO4XihC4ji?>V&(t^?@3Q&t9Mx=qex6C9d%{FE6dvU6%d94 zIE;hJ1J)cCqjv?F``7I*6bc#X)JW2b4f$L^>j{*$R`%5VHFi*+Q$2;nyieduE}qdS{L8y8F08yLs?w}{>8>$3236T-VMh@B zq-nujsb_1aUv_7g#)*rf9h%sFj*^mIcImRV*k~Vmw;%;YH(&ylYpy!&UjUVqqtfG` zox3esju?`unJJA_zKXRJP)rA3nXc$m^{S&-p|v|-0x9LHJm;XIww7C#R$?00l&Yyj z=e}gKUOpsImwW?N)+E(awoF@HyP^EhL+GlNB#k?R<2>95hz!h9sF@U20DHSB3~WMa zk90+858r@-+vWwkawJ)8ougd(i#1m3GLN{iSTylYz$brAsP%=&m$mQQrH$g%3-^VR zE%B`Vi&m8f3T~&myTEK28BDWCVzfWir1I?03;pX))|kY5ClO^+bae z*7E?g=3g7EiisYOrE+lA)2?Ln6q2*HLNpZEWMB|O-JI_oaHZB%CvYB(%=tU= zE*OY%QY58fW#RG5=gm0NR#iMB=EuNF@)%oZJ}nmm=tsJ?eGjia{e{yuU0l3{d^D@)kVDt=1PE)&tf_hHC%0MB znL|CRCPC}SeuVTdf>-QV70`0(EHizc21s^sU>y%hW0t!0&y<7}Wi-wGy>m%(-jsDj zP?mF|>p_K>liZ6ZP(w5(|9Ga%>tLgb$|doDDfkdW>Z z`)>V2XC?NJT26mL^@ zf+IKr27TfM!UbZ@?zRddC7#6ss1sw%CXJ4FWC+t3lHZupzM77m^=9 z&(a?-LxIq}*nvv)y?27lZ{j zifdl9hyJudyP2LpU$-kXctshbJDKS{WfulP5Dk~xU4Le4c#h^(YjJit4#R8_khheS z|8(>2ibaHES4+J|DBM7I#QF5u-*EdN{n=Kt@4Zt?@Tv{JZA{`4 zU#kYOv{#A&gGPwT+$Ud}AXlK3K7hYzo$(fBSFjrP{QQ zeaKg--L&jh$9N}`pu{Bs>?eDFPaWY4|9|foN%}i;3%;@4{dc+iw>m}{3rELqH21G! z`8@;w-zsJ1H(N3%|1B@#ioLOjib)j`EiJqPQVSbPSPVHCj6t5J&(NcWzBrzCiDt{4 zdlPAUKldz%6x5II1H_+jv)(xVL+a;P+-1hv_pM>gMRr%04@k;DTokASSKKhU1Qms| zrWh3a!b(J3n0>-tipg{a?UaKsP7?+|@A+1WPDiQIW1Sf@qDU~M_P65_s}7(gjTn0X zucyEm)o;f8UyshMy&>^SC3I|C6jR*R_GFwGranWZe*I>K+0k}pBuET&M~ z;Odo*ZcT?ZpduHyrf8E%IBFtv;JQ!N_m>!sV6ly$_1D{(&nO~w)G~Y`7sD3#hQk%^ zp}ucDF_$!6DAz*PM8yE(&~;%|=+h(Rn-=1Wykas_-@d&z#=S}rDf`4w(rVlcF&lF! z=1)M3YVz7orwk^BXhslJ8jR);sh^knJW(Qmm(QdSgIAIdlN4Te5KJisifjr?eB{FjAX1a0AB>d?qY4Wx>BZ8&}5K0fA+d{l8 z?^s&l8#j7pR&ijD?0b%;lL9l$P_mi2^*_OL+b}4kuLR$GAf85sOo02?Y#90}CCDiS zZ%rbCw>=H~CBO=C_JVV=xgDe%b4FaEFtuS7Q1##y686r%F6I)s-~2(}PWK|Z8M+Gu zl$y~5@#0Ka%$M<&Cv%L`a8X^@tY&T7<0|(6dNT=EsRe0%kp1Qyq!^43VAKYnr*A5~ zsI%lK1ewqO;0TpLrT9v}!@vJK{QoVa_+N4FYT#h?Y8rS1S&-G+m$FNMP?(8N`MZP zels(*?kK{{^g9DOzkuZXJ2;SrOQsp9T$hwRB1(phw1c7`!Q!by?Q#YsSM#I12RhU{$Q+{xj83axHcftEc$mNJ8_T7A-BQc*k(sZ+~NsO~xAA zxnbb%dam_fZlHvW7fKXrB~F&jS<4FD2FqY?VG?ix*r~MDXCE^WQ|W|WM;gsIA4lQP zJ2hAK@CF*3*VqPr2eeg6GzWFlICi8S>nO>5HvWzyZTE)hlkdC_>pBej*>o0EOHR|) z$?};&I4+_?wvL*g#PJ9)!bc#9BJu1(*RdNEn>#Oxta(VWeM40ola<0aOe2kSS~{^P zDJBd}0L-P#O-CzX*%+$#v;(x%<*SPgAje=F{Zh-@ucd2DA(yC|N_|ocs*|-!H%wEw z@Q!>siv2W;C^^j^59OAX03&}&D*W4EjCvfi(ygcL#~t8XGa#|NPO+*M@Y-)ctFA@I z-p7npT1#5zOLo>7q?aZpCZ=iecn3QYklP;gF0bq@>oyBq94f6C=;Csw3PkZ|5q=(c zfs`aw?II0e(h=|7o&T+hq&m$; zBrE09Twxd9BJ2P+QPN}*OdZ-JZV7%av@OM7v!!NL8R;%WFq*?{9T3{ct@2EKgc8h) zMxoM$SaF#p<`65BwIDfmXG6+OiK0e)`I=!A3E`+K@61f}0e z!2a*FOaDrOe>U`q%K!QN`&=&0C~)CaL3R4VY(NDt{Xz(Xpqru5=r#uQN1L$Je1*dkdqQ*=lofQaN%lO!<5z9ZlHgxt|`THd>2 zsWfU$9=p;yLyJyM^t zS2w9w?Bpto`@H^xJpZDKR1@~^30Il6oFGfk5%g6w*C+VM)+%R@gfIwNprOV5{F^M2 zO?n3DEzpT+EoSV-%OdvZvNF+pDd-ZVZ&d8 zKeIyrrfPN=EcFRCPEDCVflX#3-)Ik_HCkL(ejmY8vzcf-MTA{oHk!R2*36`O68$7J zf}zJC+bbQk--9Xm!u#lgLvx8TXx2J258E5^*IZ(FXMpq$2LUUvhWQPs((z1+2{Op% z?J}9k5^N=z;7ja~zi8a_-exIqWUBJwohe#4QJ`|FF*$C{lM18z^#hX6!5B8KAkLUX ziP=oti-gpV(BsLD{0(3*dw}4JxK23Y7M{BeFPucw!sHpY&l%Ws4pSm`+~V7;bZ%Dx zeI)MK=4vC&5#;2MT7fS?^ch9?2;%<8Jlu-IB&N~gg8t;6S-#C@!NU{`p7M8@2iGc& zg|JPg%@gCoCQ&s6JvDU&`X2S<57f(k8nJ1wvBu{8r?;q3_kpZZ${?|( z+^)UvR33sjSd)aT!UPkA;ylO6{aE3MQa{g%Mcf$1KONcjO@&g5zPHWtzM1rYC{_K> zgQNcs<{&X{OA=cEWw5JGqpr0O>x*Tfak2PE9?FuWtz^DDNI}rwAaT0(bdo-<+SJ6A z&}S%boGMWIS0L}=S>|-#kRX;e^sUsotry(MjE|3_9duvfc|nwF#NHuM-w7ZU!5ei8 z6Mkf>2)WunY2eU@C-Uj-A zG(z0Tz2YoBk>zCz_9-)4a>T46$(~kF+Y{#sA9MWH%5z#zNoz)sdXq7ZR_+`RZ%0(q zC7&GyS_|BGHNFl8Xa%@>iWh%Gr?=J5<(!OEjauj5jyrA-QXBjn0OAhJJ9+v=!LK`` z@g(`^*84Q4jcDL`OA&ZV60djgwG`|bcD*i50O}Q{9_noRg|~?dj%VtKOnyRs$Uzqg z191aWoR^rDX#@iSq0n z?9Sg$WSRPqSeI<}&n1T3!6%Wj@5iw5`*`Btni~G=&;J+4`7g#OQTa>u`{4ZZ(c@s$ zK0y;ySOGD-UTjREKbru{QaS>HjN<2)R%Nn-TZiQ(Twe4p@-saNa3~p{?^V9Nixz@a zykPv~<@lu6-Ng9i$Lrk(xi2Tri3q=RW`BJYOPC;S0Yly%77c727Yj-d1vF!Fuk{Xh z)lMbA69y7*5ufET>P*gXQrxsW+ zz)*MbHZv*eJPEXYE<6g6_M7N%#%mR{#awV3i^PafNv(zyI)&bH?F}2s8_rR(6%!V4SOWlup`TKAb@ee>!9JKPM=&8g#BeYRH9FpFybxBXQI2|g}FGJfJ+ zY-*2hB?o{TVL;Wt_ek;AP5PBqfDR4@Z->_182W z{P@Mc27j6jE*9xG{R$>6_;i=y{qf(c`5w9fa*`rEzX6t!KJ(p1H|>J1pC-2zqWENF zmm=Z5B4u{cY2XYl(PfrInB*~WGWik3@1oRhiMOS|D;acnf-Bs(QCm#wR;@Vf!hOPJ zgjhDCfDj$HcyVLJ=AaTbQ{@vIv14LWWF$=i-BDoC11}V;2V8A`S>_x)vIq44-VB-v z*w-d}$G+Ql?En8j!~ZkCpQ$|cA0|+rrY>tiCeWxkRGPoarxlGU2?7%k#F693RHT24 z-?JsiXlT2PTqZqNb&sSc>$d;O4V@|b6VKSWQb~bUaWn1Cf0+K%`Q&Wc<>mQ>*iEGB zbZ;aYOotBZ{vH3y<0A*L0QVM|#rf*LIsGx(O*-7)r@yyBIzJnBFSKBUSl1e|8lxU* zzFL+YDVVkIuzFWeJ8AbgN&w(4-7zbiaMn{5!JQXu)SELk*CNL+Fro|2v|YO)1l15t zs(0^&EB6DPMyaqvY>=KL>)tEpsn;N5Q#yJj<9}ImL((SqErWN3Q=;tBO~ExTCs9hB z2E$7eN#5wX4<3m^5pdjm#5o>s#eS_Q^P)tm$@SawTqF*1dj_i#)3};JslbLKHXl_N z)Fxzf>FN)EK&Rz&*|6&%Hs-^f{V|+_vL1S;-1K-l$5xiC@}%uDuwHYhmsV?YcOUlk zOYkG5v2+`+UWqpn0aaaqrD3lYdh0*!L`3FAsNKu=Q!vJu?Yc8n|CoYyDo_`r0mPoo z8>XCo$W4>l(==h?2~PoRR*kEe)&IH{1sM41mO#-36`02m#nTX{r*r`Q5rZ2-sE|nA zhnn5T#s#v`52T5|?GNS`%HgS2;R(*|^egNPDzzH_z^W)-Q98~$#YAe)cEZ%vge965AS_am#DK#pjPRr-!^za8>`kksCAUj(Xr*1NW5~e zpypt_eJpD&4_bl_y?G%>^L}=>xAaV>KR6;^aBytqpiHe%!j;&MzI_>Sx7O%F%D*8s zSN}cS^<{iiK)=Ji`FpO#^zY!_|D)qeRNAtgmH)m;qC|mq^j(|hL`7uBz+ULUj37gj zksdbnU+LSVo35riSX_4z{UX=%n&}7s0{WuZYoSfwAP`8aKN9P@%e=~1`~1ASL-z%# zw>DO&ixr}c9%4InGc*_y42bdEk)ZdG7-mTu0bD@_vGAr*NcFoMW;@r?@LUhRI zCUJgHb`O?M3!w)|CPu~ej%fddw20lod?Ufp8Dmt0PbnA0J%KE^2~AIcnKP()025V> zG>noSM3$5Btmc$GZoyP^v1@Poz0FD(6YSTH@aD0}BXva?LphAiSz9f&Y(aDAzBnUh z?d2m``~{z;{}kZJ>a^wYI?ry(V9hIoh;|EFc0*-#*`$T0DRQ1;WsqInG;YPS+I4{g zJGpKk%%Sdc5xBa$Q^_I~(F97eqDO7AN3EN0u)PNBAb+n+ zWBTxQx^;O9o0`=g+Zrt_{lP!sgWZHW?8bLYS$;1a@&7w9rD9|Ge;Gb?sEjFoF9-6v z#!2)t{DMHZ2@0W*fCx;62d#;jouz`R5Y(t{BT=$N4yr^^o$ON8d{PQ=!O zX17^CrdM~7D-;ZrC!||<+FEOxI_WI3CA<35va%4v>gc zEX-@h8esj=a4szW7x{0g$hwoWRQG$yK{@3mqd-jYiVofJE!Wok1* znV7Gm&Ssq#hFuvj1sRyHg(6PFA5U*Q8Rx>-blOs=lb`qa{zFy&n4xY;sd$fE+<3EI z##W$P9M{B3c3Si9gw^jlPU-JqD~Cye;wr=XkV7BSv#6}DrsXWFJ3eUNrc%7{=^sP> zrp)BWKA9<}^R9g!0q7yWlh;gr_TEOD|#BmGq<@IV;ueg+D2}cjpp+dPf&Q(36sFU&K8}hA85U61faW&{ zlB`9HUl-WWCG|<1XANN3JVAkRYvr5U4q6;!G*MTdSUt*Mi=z_y3B1A9j-@aK{lNvx zK%p23>M&=KTCgR!Ee8c?DAO2_R?B zkaqr6^BSP!8dHXxj%N1l+V$_%vzHjqvu7p@%Nl6;>y*S}M!B=pz=aqUV#`;h%M0rU zHfcog>kv3UZAEB*g7Er@t6CF8kHDmKTjO@rejA^ULqn!`LwrEwOVmHx^;g|5PHm#B zZ+jjWgjJ!043F+&#_;D*mz%Q60=L9Ove|$gU&~As5^uz@2-BfQ!bW)Khn}G+Wyjw- z19qI#oB(RSNydn0t~;tAmK!P-d{b-@@E5|cdgOS#!>%#Rj6ynkMvaW@37E>@hJP^8 z2zk8VXx|>#R^JCcWdBCy{0nPmYFOxN55#^-rlqobe0#L6)bi?E?SPymF*a5oDDeSd zO0gx?#KMoOd&G(2O@*W)HgX6y_aa6iMCl^~`{@UR`nMQE`>n_{_aY5nA}vqU8mt8H z`oa=g0SyiLd~BxAj2~l$zRSDHxvDs;I4>+M$W`HbJ|g&P+$!U7-PHX4RAcR0szJ*( ze-417=bO2q{492SWrqDK+L3#ChUHtz*@MP)e^%@>_&#Yk^1|tv@j4%3T)diEX zATx4K*hcO`sY$jk#jN5WD<=C3nvuVsRh||qDHnc~;Kf59zr0;c7VkVSUPD%NnnJC_ zl3F^#f_rDu8l}l8qcAz0FFa)EAt32IUy_JLIhU_J^l~FRH&6-ivSpG2PRqzDdMWft>Zc(c)#tb%wgmWN%>IOPm zZi-noqS!^Ftb81pRcQi`X#UhWK70hy4tGW1mz|+vI8c*h@ zfFGJtW3r>qV>1Z0r|L>7I3un^gcep$AAWfZHRvB|E*kktY$qQP_$YG60C@X~tTQjB3%@`uz!qxtxF+LE!+=nrS^07hn` zEgAp!h|r03h7B!$#OZW#ACD+M;-5J!W+{h|6I;5cNnE(Y863%1(oH}_FTW})8zYb$7czP zg~Szk1+_NTm6SJ0MS_|oSz%e(S~P-&SFp;!k?uFayytV$8HPwuyELSXOs^27XvK-D zOx-Dl!P|28DK6iX>p#Yb%3`A&CG0X2S43FjN%IB}q(!hC$fG}yl1y9W&W&I@KTg6@ zK^kpH8=yFuP+vI^+59|3%Zqnb5lTDAykf z9S#X`3N(X^SpdMyWQGOQRjhiwlj!0W-yD<3aEj^&X%=?`6lCy~?`&WSWt z?U~EKFcCG_RJ(Qp7j=$I%H8t)Z@6VjA#>1f@EYiS8MRHZphp zMA_5`znM=pzUpBPO)pXGYpQ6gkine{6u_o!P@Q+NKJ}k!_X7u|qfpAyIJb$_#3@wJ z<1SE2Edkfk9C!0t%}8Yio09^F`YGzpaJHGk*-ffsn85@)%4@`;Fv^8q(-Wk7r=Q8p zT&hD`5(f?M{gfzGbbwh8(}G#|#fDuk7v1W)5H9wkorE0ZZjL0Q1=NRGY>zwgfm81DdoaVwNH;or{{eSyybt)m<=zXoA^RALYG-2t zouH|L*BLvmm9cdMmn+KGopyR@4*=&0&4g|FLoreZOhRmh=)R0bg~ zT2(8V_q7~42-zvb)+y959OAv!V$u(O3)%Es0M@CRFmG{5sovIq4%8Ahjk#*5w{+)+ zMWQoJI_r$HxL5km1#6(e@{lK3Udc~n0@g`g$s?VrnQJ$!oPnb?IHh-1qA`Rz$)Ai< z6w$-MJW-gKNvOhL+XMbE7&mFt`x1KY>k4(!KbbpZ`>`K@1J<(#vVbjx@Z@(6Q}MF# zMnbr-f55(cTa^q4+#)=s+ThMaV~E`B8V=|W_fZWDwiso8tNMTNse)RNBGi=gVwgg% zbOg8>mbRN%7^Um-7oj4=6`$|(K7!+t^90a{$18Z>}<#!bm%ZEFQ{X(yBZMc>lCz0f1I2w9Sq zuGh<9<=AO&g6BZte6hn>Qmvv;Rt)*cJfTr2=~EnGD8P$v3R|&1RCl&7)b+`=QGapi zPbLg_pxm`+HZurtFZ;wZ=`Vk*do~$wB zxoW&=j0OTbQ=Q%S8XJ%~qoa3Ea|au5o}_(P;=!y-AjFrERh%8la!z6Fn@lR?^E~H12D?8#ht=1F;7@o4$Q8GDj;sSC%Jfn01xgL&%F2 zwG1|5ikb^qHv&9hT8w83+yv&BQXOQyMVJSBL(Ky~p)gU3#%|blG?IR9rP^zUbs7rOA0X52Ao=GRt@C&zlyjNLv-} z9?*x{y(`509qhCV*B47f2hLrGl^<@SuRGR!KwHei?!CM10Tq*YDIoBNyRuO*>3FU? zHjipIE#B~y3FSfOsMfj~F9PNr*H?0oHyYB^G(YyNh{SxcE(Y-`x5jFMKb~HO*m+R% zrq|ic4fzJ#USpTm;X7K+E%xsT_3VHKe?*uc4-FsILUH;kL>_okY(w`VU*8+l>o>Jm ziU#?2^`>arnsl#)*R&nf_%>A+qwl%o{l(u)M?DK1^mf260_oteV3#E_>6Y4!_hhVD zM8AI6MM2V*^_M^sQ0dmHu11fy^kOqXqzpr?K$`}BKWG`=Es(9&S@K@)ZjA{lj3ea7_MBP zk(|hBFRjHVMN!sNUkrB;(cTP)T97M$0Dtc&UXSec<+q?y>5=)}S~{Z@ua;1xt@=T5 zI7{`Z=z_X*no8s>mY;>BvEXK%b`a6(DTS6t&b!vf_z#HM{Uoy_5fiB(zpkF{})ruka$iX*~pq1ZxD?q68dIo zIZSVls9kFGsTwvr4{T_LidcWtt$u{kJlW7moRaH6+A5hW&;;2O#$oKyEN8kx`LmG)Wfq4ykh+q{I3|RfVpkR&QH_x;t41Uw z`P+tft^E2B$domKT@|nNW`EHwyj>&}K;eDpe z1bNOh=fvIfk`&B61+S8ND<(KC%>y&?>opCnY*r5M+!UrWKxv0_QvTlJc>X#AaI^xo zaRXL}t5Ej_Z$y*|w*$6D+A?Lw-CO-$itm^{2Ct82-<0IW)0KMNvJHgBrdsIR0v~=H z?n6^}l{D``Me90`^o|q!olsF?UX3YSq^6Vu>Ijm>>PaZI8G@<^NGw{Cx&%|PwYrfw zR!gX_%AR=L3BFsf8LxI|K^J}deh0ZdV?$3r--FEX`#INxsOG6_=!v)DI>0q|BxT)z z-G6kzA01M?rba+G_mwNMQD1mbVbNTWmBi*{s_v_Ft9m2Avg!^78(QFu&n6mbRJ2bA zv!b;%yo{g*9l2)>tsZJOOp}U~8VUH`}$ z8p_}t*XIOehezolNa-a2x0BS})Y9}&*TPgua{Ewn-=wVrmJUeU39EKx+%w%=ixQWK zDLpwaNJs65#6o7Ln7~~X+p_o2BR1g~VCfxLzxA{HlWAI6^H;`juI=&r1jQrUv_q0Z z1Ja-tjdktrrP>GOC*#p?*xfQU5MqjMsBe!9lh(u8)w$e@Z|>aUHI5o;MGw*|Myiz3 z-f0;pHg~Q#%*Kx8MxH%AluVXjG2C$)WL-K63@Q`#y9_k_+}eR(x4~dp7oV-ek0H>I zgy8p#i4GN{>#v=pFYUQT(g&b$OeTy-X_#FDgNF8XyfGY6R!>inYn8IR2RDa&O!(6< znXs{W!bkP|s_YI*Yx%4stI`=ZO45IK6rBs`g7sP40ic}GZ58s?Mc$&i`kq_tfci>N zIHrC0H+Qpam1bNa=(`SRKjixBTtm&e`j9porEci!zdlg1RI0Jw#b(_Tb@RQK1Zxr_ z%7SUeH6=TrXt3J@js`4iDD0=IoHhK~I7^W8^Rcp~Yaf>2wVe|Hh1bUpX9ATD#moByY57-f2Ef1TP^lBi&p5_s7WGG9|0T}dlfxOx zXvScJO1Cnq`c`~{Dp;{;l<-KkCDE+pmexJkd}zCgE{eF=)K``-qC~IT6GcRog_)!X z?fK^F8UDz$(zFUrwuR$qro5>qqn>+Z%<5>;_*3pZ8QM|yv9CAtrAx;($>4l^_$_-L z*&?(77!-=zvnCVW&kUcZMb6;2!83si518Y%R*A3JZ8Is|kUCMu`!vxDgaWjs7^0j( ziTaS4HhQ)ldR=r)_7vYFUr%THE}cPF{0H45FJ5MQW^+W>P+eEX2kLp3zzFe*-pFVA zdDZRybv?H|>`9f$AKVjFWJ=wegO7hOOIYCtd?Vj{EYLT*^gl35|HQ`R=ti+ADm{jyQE7K@kdjuqJhWVSks>b^ zxha88-h3s;%3_5b1TqFCPTxVjvuB5U>v=HyZ$?JSk+&I%)M7KE*wOg<)1-Iy)8-K! z^XpIt|0ibmk9RtMmlUd7#Ap3Q!q9N4atQy)TmrhrFhfx1DAN`^vq@Q_SRl|V z#lU<~n67$mT)NvHh`%als+G-)x1`Y%4Bp*6Un5Ri9h=_Db zA-AdP!f>f0m@~>7X#uBM?diI@)Egjuz@jXKvm zJo+==juc9_<;CqeRaU9_Mz@;3e=E4=6TK+c`|uu#pIqhSyNm`G(X)&)B`8q0RBv#> z`gGlw(Q=1Xmf55VHj%C#^1lpc>LY8kfA@|rlC1EA<1#`iuyNO z(=;irt{_&K=i4)^x%;U(Xv<)+o=dczC5H3W~+e|f~{*ucxj@{Yi-cw^MqYr3fN zF5D+~!wd$#al?UfMnz(@K#wn`_5na@rRr8XqN@&M&FGEC@`+OEv}sI1hw>Up0qAWf zL#e4~&oM;TVfjRE+10B_gFlLEP9?Q-dARr3xi6nQqnw>k-S;~b z;!0s2VS4}W8b&pGuK=7im+t(`nz@FnT#VD|!)eQNp-W6)@>aA+j~K*H{$G`y2|QHY z|Hmy+CR@#jWY4~)lr1qBJB_RfHJFfP<}pK5(#ZZGSqcpyS&}01LnTWk5fzmXMGHkJ zTP6L^B+uj;lmB_W<~4=${+v0>z31M!-_O@o-O9GyW)j_mjx}!0@br_LE-7SIuPP84 z;5=O(U*g_um0tyG|61N@d9lEuOeiRd+#NY^{nd5;-CVlw&Ap7J?qwM^?E29wvS}2d zbzar4Fz&RSR(-|s!Z6+za&Z zY#D<5q_JUktIzvL0)yq_kLWG6DO{ri=?c!y!f(Dk%G{8)k`Gym%j#!OgXVDD3;$&v@qy#ISJfp=Vm>pls@9-mapVQChAHHd-x+OGx)(*Yr zC1qDUTZ6mM(b_hi!TuFF2k#8uI2;kD70AQ&di$L*4P*Y-@p`jdm%_c3f)XhYD^6M8&#Y$ZpzQMcR|6nsH>b=*R_Von!$BTRj7yGCXokoAQ z&ANvx0-Epw`QIEPgI(^cS2f(Y85yV@ygI{ewyv5Frng)e}KCZF7JbR(&W618_dcEh(#+^zZFY;o<815<5sOHQdeax9_!PyM&;{P zkBa5xymca0#)c#tke@3KNEM8a_mT&1gm;p&&JlMGH(cL(b)BckgMQ^9&vRwj!~3@l zY?L5}=Jzr080OGKb|y`ee(+`flQg|!lo6>=H)X4`$Gz~hLmu2a%kYW_Uu8x09Pa0J zKZ`E$BKJ=2GPj_3l*TEcZ*uYRr<*J^#5pILTT;k_cgto1ZL-%slyc16J~OH-(RgDA z%;EjEnoUkZ&acS{Q8`{i6T5^nywgqQI5bDIymoa7CSZG|WWVk>GM9)zy*bNih|QIm z%0+(Nnc*a_xo;$=!HQYaapLms>J1ToyjtFByY`C2H1wT#178#4+|{H0BBqtCdd$L% z_3Hc60j@{t9~MjM@LBalR&6@>B;9?r<7J~F+WXyYu*y3?px*=8MAK@EA+jRX8{CG?GI-< z54?Dc9CAh>QTAvyOEm0^+x;r2BWX|{3$Y7)L5l*qVE*y0`7J>l2wCmW zL1?|a`pJ-l{fb_N;R(Z9UMiSj6pQjOvQ^%DvhIJF!+Th7jO2~1f1N+(-TyCFYQZYw z4)>7caf^Ki_KJ^Zx2JUb z&$3zJy!*+rCV4%jqwyuNY3j1ZEiltS0xTzd+=itTb;IPYpaf?8Y+RSdVdpacB(bVQ zC(JupLfFp8y43%PMj2}T|VS@%LVp>hv4Y!RPMF?pp8U_$xCJ)S zQx!69>bphNTIb9yn*_yfj{N%bY)t{L1cs8<8|!f$;UQ*}IN=2<6lA;x^(`8t?;+ST zh)z4qeYYgZkIy{$4x28O-pugO&gauRh3;lti9)9Pvw+^)0!h~%m&8Q!AKX%urEMnl z?yEz?g#ODn$UM`+Q#$Q!6|zsq_`dLO5YK-6bJM6ya>}H+vnW^h?o$z;V&wvuM$dR& zeEq;uUUh$XR`TWeC$$c&Jjau2it3#%J-y}Qm>nW*s?En?R&6w@sDXMEr#8~$=b(gk zwDC3)NtAP;M2BW_lL^5ShpK$D%@|BnD{=!Tq)o(5@z3i7Z){} zGr}Exom_qDO{kAVkZ*MbLNHE666Kina#D{&>Jy%~w7yX$oj;cYCd^p9zy z8*+wgSEcj$4{WxKmCF(5o7U4jqwEvO&dm1H#7z}%VXAbW&W24v-tS6N3}qrm1OnE)fUkoE8yMMn9S$?IswS88tQWm4#Oid#ckgr6 zRtHm!mfNl-`d>O*1~d7%;~n+{Rph6BBy^95zqI{K((E!iFQ+h*C3EsbxNo_aRm5gj zKYug($r*Q#W9`p%Bf{bi6;IY0v`pB^^qu)gbg9QHQ7 zWBj(a1YSu)~2RK8Pi#C>{DMlrqFb9e_RehEHyI{n?e3vL_}L>kYJC z_ly$$)zFi*SFyNrnOt(B*7E$??s67EO%DgoZL2XNk8iVx~X_)o++4oaK1M|ou73vA0K^503j@uuVmLcHH4ya-kOIDfM%5%(E z+Xpt~#7y2!KB&)PoyCA+$~DXqxPxxALy!g-O?<9+9KTk4Pgq4AIdUkl`1<1#j^cJg zgU3`0hkHj_jxV>`Y~%LAZl^3o0}`Sm@iw7kwff{M%VwtN)|~!p{AsfA6vB5UolF~d zHWS%*uBDt<9y!9v2Xe|au&1j&iR1HXCdyCjxSgG*L{wmTD4(NQ=mFjpa~xooc6kju z`~+d{j7$h-;HAB04H!Zscu^hZffL#9!p$)9>sRI|Yovm)g@F>ZnosF2EgkU3ln0bR zTA}|+E(tt)!SG)-bEJi_0m{l+(cAz^pi}`9=~n?y&;2eG;d9{M6nj>BHGn(KA2n|O zt}$=FPq!j`p&kQ8>cirSzkU0c08%8{^Qyqi-w2LoO8)^E7;;I1;HQ6B$u0nNaX2CY zSmfi)F`m94zL8>#zu;8|{aBui@RzRKBlP1&mfFxEC@%cjl?NBs`cr^nm){>;$g?rhKr$AO&6qV_Wbn^}5tfFBry^e1`%du2~o zs$~dN;S_#%iwwA_QvmMjh%Qo?0?rR~6liyN5Xmej8(*V9ym*T`xAhHih-v$7U}8=dfXi2i*aAB!xM(Xekg*ix@r|ymDw*{*s0?dlVys2e)z62u1 z+k3esbJE=-P5S$&KdFp+2H7_2e=}OKDrf( z9-207?6$@f4m4B+9E*e((Y89!q?zH|mz_vM>kp*HGXldO0Hg#!EtFhRuOm$u8e~a9 z5(roy7m$Kh+zjW6@zw{&20u?1f2uP&boD}$#Zy)4o&T;vyBoqFiF2t;*g=|1=)PxB z8eM3Mp=l_obbc?I^xyLz?4Y1YDWPa+nm;O<$Cn;@ane616`J9OO2r=rZr{I_Kizyc zP#^^WCdIEp*()rRT+*YZK>V@^Zs=ht32x>Kwe zab)@ZEffz;VM4{XA6e421^h~`ji5r%)B{wZu#hD}f3$y@L0JV9f3g{-RK!A?vBUA}${YF(vO4)@`6f1 z-A|}e#LN{)(eXloDnX4Vs7eH|<@{r#LodP@Nz--$Dg_Par%DCpu2>2jUnqy~|J?eZ zBG4FVsz_A+ibdwv>mLp>P!(t}E>$JGaK$R~;fb{O3($y1ssQQo|5M;^JqC?7qe|hg zu0ZOqeFcp?qVn&Qu7FQJ4hcFi&|nR!*j)MF#b}QO^lN%5)4p*D^H+B){n8%VPUzi! zDihoGcP71a6!ab`l^hK&*dYrVYzJ0)#}xVrp!e;lI!+x+bfCN0KXwUAPU9@#l7@0& QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 51018 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -82,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -90,75 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/src/AndroidClient/gradlew.bat b/src/AndroidClient/gradlew.bat index 8a0b282..107acd3 100644 --- a/src/AndroidClient/gradlew.bat +++ b/src/AndroidClient/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -8,20 +24,23 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,34 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/AndroidClient/kotlin/build.gradle b/src/AndroidClient/kotlin/build.gradle index 8162c4c..9558a1f 100644 --- a/src/AndroidClient/kotlin/build.gradle +++ b/src/AndroidClient/kotlin/build.gradle @@ -7,8 +7,6 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 29 - versionCode 1 - versionName "1.0" } buildTypes { release { @@ -19,19 +17,18 @@ android { sourceSets { main.java.srcDirs += 'src/main/kotlin' } - buildToolsVersion = '28.0.3' } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - androidTestImplementation 'junit:junit:4.12' - testImplementation 'junit:junit:4.12' + androidTestImplementation 'junit:junit:4.13.1' + testImplementation 'junit:junit:4.13.1' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation project(':android') - androidTestImplementation 'com.google.code.gson:gson:2.8.6' + androidTestImplementation 'com.google.code.gson:gson:2.8.9' } buildscript { - ext.kotlin_version = '1.4.31' + ext.kotlin_version = '1.6.21' repositories { mavenCentral() } diff --git a/src/AndroidClient/techstacks/build.gradle b/src/AndroidClient/techstacks/build.gradle index 8caa932..6a64fd7 100644 --- a/src/AndroidClient/techstacks/build.gradle +++ b/src/AndroidClient/techstacks/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation 'com.android.support:appcompat-v7:28.0.0' implementation project(':android') implementation 'com.squareup.picasso:picasso:2.5.2' - implementation 'com.google.code.gson:gson:2.8.2' + implementation 'com.google.code.gson:gson:2.8.9' } repositories { mavenCentral() diff --git a/src/AndroidClient/techstackskotlin/build.gradle b/src/AndroidClient/techstackskotlin/build.gradle index 84cec2e..10f7bd7 100644 --- a/src/AndroidClient/techstackskotlin/build.gradle +++ b/src/AndroidClient/techstackskotlin/build.gradle @@ -30,10 +30,10 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation project(':android') implementation 'com.squareup.picasso:picasso:2.5.2' - implementation 'com.google.code.gson:gson:2.8.5' + implementation 'com.google.code.gson:gson:2.8.9' } buildscript { - ext.kotlin_version = '1.3.10' + ext.kotlin_version = '1.6.21' repositories { mavenCentral() } From 792fd55732f44aa3d362f192c9a44fef0a41cbe3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 5 Feb 2024 10:55:26 +0800 Subject: [PATCH 41/68] bump to v1.1.0 --- src/AndroidClient/android/build.gradle | 2 +- src/AndroidClient/client/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index f422176..1eff844 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.0.50" +version = "1.1.0" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 63eb666..93216bf 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.0.50" +version = "1.1.0" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { From f562293e4e1a8f7a78b5060a7e5c8f3e96b4a77b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 5 Feb 2024 10:58:12 +0800 Subject: [PATCH 42/68] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 3827ace..e73e900 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,15 @@ for updates, or [StackOverflow](http://stackoverflow.com/questions/ask) or the [ This repository contains the source for ServiceStack plugins for the leading Android Studio, IntelliJ and Eclipse Java IDE's providing Java developers a highly productive development experience for consuming Typed ServiceStack Services by leveraging [Add ServiceStack Reference](https://github.com/ServiceStack/ServiceStack/wiki/Add-ServiceStack-Reference) directly within their IDE! +### v1.1.0 Changes + +Switched to use `/api` pre-defined route by default, revert to legacy `/json/reply` pre-defined route with: + +```java +const client = new JsonServiceClient(baseUrl); +client.setBasePath(); +``` + ## Install ### [Install ServiceStack IDEA Plugin on Android Studio and IntelliJ](https://github.com/ServiceStack/ServiceStack/wiki/Java-Add-ServiceStack-Reference#servicestack-idea-android-studio-plugin) From 9a5c86846b1917681f29c1a1b680ab0efc340762 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 5 Feb 2024 15:10:30 +0800 Subject: [PATCH 43/68] Move all non library projects to /legacy --- src/AndroidClient/.idea/compiler.xml | 2 - src/AndroidClient/.idea/gradle.xml | 5 -- src/AndroidClient/.idea/modules.xml | 10 ---- .../modules/android/AndroidClient.android.iml | 8 +-- .../androidchat/AndroidClient.androidchat.iml | 20 ------- .../.idea/modules/app/AndroidClient.app.iml | 54 ----------------- .../modules/client/AndroidClient.client.iml | 2 +- .../modules/kotlin/AndroidClient.kotlin.iml | 55 ------------------ .../techstacks/AndroidClient.techstacks.iml | 54 ----------------- .../AndroidClient.techstackskotlin.iml | 54 ----------------- src/AndroidClient/android/build.gradle | 7 ++- src/AndroidClient/build.gradle | 17 +++++- src/AndroidClient/client/build.gradle | 11 ++-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- src/AndroidClient/settings.gradle | 2 +- src/{AndroidClient => legacy}/app/.gitignore | 0 .../app/build.gradle | 17 ++++-- .../app/proguard-rules.pro | 0 .../net/androidclient/ApplicationTest.java | 0 .../app/src/main/AndroidManifest.xml | 2 +- .../androidclient/CollectionDemoActivity.java | 0 .../net/androidclient/MainActivity.java | 0 .../net/androidclient/techstacksdtos.java | 0 .../net/androidclient/validationdtos.java | 0 .../main/res/drawable-hdpi/ic_launcher.png | Bin .../main/res/drawable-ldpi/ic_launcher.png | Bin .../main/res/drawable-mdpi/ic_launcher.png | Bin .../main/res/drawable-xhdpi/ic_launcher.png | Bin .../res/layout/activity_collection_demo.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../res/layout/fragment_collection_object.xml | 0 .../res/layout/fragment_section_dummy.xml | 0 .../res/layout/fragment_top_technologies.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../kotlin/.gitignore | 0 .../kotlin/build.gradle | 8 +-- .../kotlin/kotlin.iml | 0 .../kotlin/proguard-rules.pro | 0 .../net/kotlin/ApplicationTest.kt | 0 .../net/kotlin/checkweb/GsonTests.kt | 0 .../servicestack/net/kotlin/checkweb/dtos.kt | 0 .../techstacks/TechStacksServiceTests.kt | 0 .../techstacks/TechStacksServiceTestsAsync.kt | 0 .../net/kotlin/techstacks/dtos.kt | 0 .../net/kotlin/test/JsonServiceClientTests.kt | 0 .../net/kotlin/test/TestAuthTests.kt | 0 .../kotlin/test/TestInterfaceMarkerTests.kt | 0 .../test/TestInterfaceMarkerTestsAsync.kt | 0 .../net/kotlin/test/TestServiceTests.kt | 0 .../net/kotlin/test/TestServiceTestsAsync.kt | 0 .../test/servicestack/net/kotlin/test/dtos.kt | 0 .../kotlin/src/main/AndroidManifest.xml | 4 +- .../kotlin/src/main/assets/overview.json | 0 .../kotlin/src/main/res/values/strings.xml | 0 .../net/kotlin/ExampleUnitTest.java | 0 .../techstacks/build.gradle | 8 +-- .../techstacks/img/screenshot-01.png | Bin .../techstacks/img/screenshot-02.png | Bin .../techstacks/img/screenshot-03.png | Bin .../techstacks/img/screenshot-04.png | Bin .../techstacks/img/screenshot-05.png | Bin .../techstacks/img/screenshot-06.png | Bin .../techstacks/img/screenshot-10.png | Bin .../techstacks/img/screenshot-11.png | Bin .../techstacks/img/screenshot-12.png | Bin .../techstacks/img/screenshot-13.png | Bin .../techstacks/img/screenshot-14.png | Bin .../techstacks/img/screenshot-15.png | Bin .../techstacks/proguard-rules.pro | 0 .../net/techstacks/ApplicationTest.java | 0 .../techstacks/src/main/AndroidManifest.xml | 8 ++- .../java/servicestack/net/techstacks/App.java | 0 .../net/techstacks/MainActivity.java | 0 .../net/techstacks/TechStackActivity.java | 0 .../net/techstacks/TechStacksApplication.java | 0 .../net/techstacks/TechnologyActivity.java | 0 .../java/servicestack/net/techstacks/dto.java | 0 .../main/res/drawable-hdpi/ic_actionbar.png | Bin .../main/res/drawable-mdpi/ic_actionbar.png | Bin .../main/res/drawable-xhdpi/ic_actionbar.png | Bin .../main/res/drawable-xxhdpi/ic_actionbar.png | Bin .../main/res/drawable/tab_bar_background.xml | 0 .../drawable/tab_bar_background_selected.xml | 0 .../src/main/res/layout/activity_main.xml | 0 .../main/res/layout/activity_technology.xml | 0 .../main/res/layout/activity_techstack.xml | 0 .../main/res/layout/fragment_tech_stacks.xml | 0 .../main/res/layout/fragment_technologies.xml | 0 .../main/res/layout/fragment_top_rated.xml | 0 .../src/main/res/menu/menu_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../main/res/mipmap-hdpi/logo_transparent.png | Bin .../src/main/res/mipmap-hdpi/logo_white.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../main/res/mipmap-mdpi/logo_transparent.png | Bin .../src/main/res/mipmap-mdpi/logo_white.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/logo_transparent.png | Bin .../src/main/res/mipmap-xhdpi/logo_white.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xxhdpi/logo_blue.png | Bin .../res/mipmap-xxhdpi/logo_transparent.png | Bin .../src/main/res/mipmap-xxhdpi/logo_white.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../techstacks/src/main/res/values/colors.xml | 0 .../techstacks/src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../techstacks/src/main/res/values/styles.xml | 0 .../techstacks/techstacks.iml | 0 .../techstackskotlin/.gitignore | 0 .../techstackskotlin/build.gradle | 10 ++-- .../techstackskotlin/proguard-rules.pro | 0 .../net/techstackskotlin/ApplicationTest.kt | 0 .../src/main/AndroidManifest.xml | 0 .../servicestack/net/techstackskotlin/App.kt | 0 .../net/techstackskotlin/MainActivity.kt | 0 .../net/techstackskotlin/TechStackActivity.kt | 0 .../techstackskotlin/TechnologyActivity.kt | 0 .../servicestack/net/techstackskotlin/dtos.kt | 0 .../main/res/drawable-hdpi/ic_actionbar.png | Bin .../main/res/drawable-mdpi/ic_actionbar.png | Bin .../main/res/drawable-xhdpi/ic_actionbar.png | Bin .../main/res/drawable-xxhdpi/ic_actionbar.png | Bin .../main/res/drawable/tab_bar_background.xml | 0 .../drawable/tab_bar_background_selected.xml | 0 .../src/main/res/layout/activity_main.xml | 0 .../main/res/layout/activity_technology.xml | 0 .../main/res/layout/activity_techstack.xml | 0 .../main/res/layout/fragment_tech_stacks.xml | 0 .../main/res/layout/fragment_technologies.xml | 0 .../main/res/layout/fragment_top_rated.xml | 0 .../src/main/res/menu/menu_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../main/res/mipmap-hdpi/logo_transparent.png | Bin .../src/main/res/mipmap-hdpi/logo_white.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../main/res/mipmap-mdpi/logo_transparent.png | Bin .../src/main/res/mipmap-mdpi/logo_white.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/logo_transparent.png | Bin .../src/main/res/mipmap-xhdpi/logo_white.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xxhdpi/logo_blue.png | Bin .../res/mipmap-xxhdpi/logo_transparent.png | Bin .../src/main/res/mipmap-xxhdpi/logo_white.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/colors.xml | 0 .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../net/techstackskotlin/ExampleUnitTest.java | 0 .../techstackskotlin/techstackskotlin.iml | 0 152 files changed, 64 insertions(+), 296 deletions(-) delete mode 100644 src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml delete mode 100644 src/AndroidClient/.idea/modules/app/AndroidClient.app.iml delete mode 100644 src/AndroidClient/.idea/modules/kotlin/AndroidClient.kotlin.iml delete mode 100644 src/AndroidClient/.idea/modules/techstacks/AndroidClient.techstacks.iml delete mode 100644 src/AndroidClient/.idea/modules/techstackskotlin/AndroidClient.techstackskotlin.iml rename src/{AndroidClient => legacy}/app/.gitignore (100%) rename src/{AndroidClient => legacy}/app/build.gradle (70%) rename src/{AndroidClient => legacy}/app/proguard-rules.pro (100%) rename src/{AndroidClient => legacy}/app/src/androidTest/java/servicestack/net/androidclient/ApplicationTest.java (100%) rename src/{AndroidClient => legacy}/app/src/main/AndroidManifest.xml (92%) rename src/{AndroidClient => legacy}/app/src/main/java/servicestack/net/androidclient/CollectionDemoActivity.java (100%) rename src/{AndroidClient => legacy}/app/src/main/java/servicestack/net/androidclient/MainActivity.java (100%) rename src/{AndroidClient => legacy}/app/src/main/java/servicestack/net/androidclient/techstacksdtos.java (100%) rename src/{AndroidClient => legacy}/app/src/main/java/servicestack/net/androidclient/validationdtos.java (100%) rename src/{AndroidClient => legacy}/app/src/main/res/drawable-hdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/app/src/main/res/drawable-ldpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/app/src/main/res/drawable-mdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/app/src/main/res/drawable-xhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/app/src/main/res/layout/activity_collection_demo.xml (100%) rename src/{AndroidClient => legacy}/app/src/main/res/layout/activity_main.xml (100%) rename src/{AndroidClient => legacy}/app/src/main/res/layout/fragment_collection_object.xml (100%) rename src/{AndroidClient => legacy}/app/src/main/res/layout/fragment_section_dummy.xml (100%) rename src/{AndroidClient => legacy}/app/src/main/res/layout/fragment_top_technologies.xml (100%) rename src/{AndroidClient => legacy}/app/src/main/res/values/strings.xml (100%) rename src/{AndroidClient => legacy}/kotlin/.gitignore (100%) rename src/{AndroidClient => legacy}/kotlin/build.gradle (85%) rename src/{AndroidClient => legacy}/kotlin/kotlin.iml (100%) rename src/{AndroidClient => legacy}/kotlin/proguard-rules.pro (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/ApplicationTest.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/checkweb/GsonTests.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/checkweb/dtos.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTests.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/TechStacksServiceTestsAsync.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/techstacks/dtos.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/JsonServiceClientTests.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestAuthTests.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTests.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestInterfaceMarkerTestsAsync.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTests.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/TestServiceTestsAsync.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/androidTest/java/test/servicestack/net/kotlin/test/dtos.kt (100%) rename src/{AndroidClient => legacy}/kotlin/src/main/AndroidManifest.xml (81%) rename src/{AndroidClient => legacy}/kotlin/src/main/assets/overview.json (100%) rename src/{AndroidClient => legacy}/kotlin/src/main/res/values/strings.xml (100%) rename src/{AndroidClient => legacy}/kotlin/src/test/java/test/servicestack/net/kotlin/ExampleUnitTest.java (100%) rename src/{AndroidClient => legacy}/techstacks/build.gradle (81%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-01.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-02.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-03.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-04.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-05.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-06.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-10.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-11.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-12.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-13.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-14.png (100%) rename src/{AndroidClient => legacy}/techstacks/img/screenshot-15.png (100%) rename src/{AndroidClient => legacy}/techstacks/proguard-rules.pro (100%) rename src/{AndroidClient => legacy}/techstacks/src/androidTest/java/servicestack/net/techstacks/ApplicationTest.java (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/AndroidManifest.xml (87%) rename src/{AndroidClient => legacy}/techstacks/src/main/java/servicestack/net/techstacks/App.java (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/java/servicestack/net/techstacks/MainActivity.java (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/java/servicestack/net/techstacks/TechStackActivity.java (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/java/servicestack/net/techstacks/TechStacksApplication.java (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/java/servicestack/net/techstacks/TechnologyActivity.java (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/java/servicestack/net/techstacks/dto.java (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/drawable-hdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/drawable-mdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/drawable-xhdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/drawable-xxhdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/drawable/tab_bar_background.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/drawable/tab_bar_background_selected.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/layout/activity_main.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/layout/activity_technology.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/layout/activity_techstack.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/layout/fragment_tech_stacks.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/layout/fragment_technologies.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/layout/fragment_top_rated.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/menu/menu_main.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-hdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-hdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-mdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-mdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-xhdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-xhdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-xxhdpi/logo_blue.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-xxhdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/mipmap-xxhdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/values-w820dp/dimens.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/values/colors.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/values/dimens.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/values/strings.xml (100%) rename src/{AndroidClient => legacy}/techstacks/src/main/res/values/styles.xml (100%) rename src/{AndroidClient => legacy}/techstacks/techstacks.iml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/.gitignore (100%) rename src/{AndroidClient => legacy}/techstackskotlin/build.gradle (80%) rename src/{AndroidClient => legacy}/techstackskotlin/proguard-rules.pro (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/androidTest/java/servicestack/net/techstackskotlin/ApplicationTest.kt (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/AndroidManifest.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/App.kt (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/MainActivity.kt (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/TechStackActivity.kt (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/TechnologyActivity.kt (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/java/servicestack/net/techstackskotlin/dtos.kt (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/drawable-hdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/drawable-mdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/drawable-xhdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/drawable-xxhdpi/ic_actionbar.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/drawable/tab_bar_background.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/drawable/tab_bar_background_selected.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/layout/activity_main.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/layout/activity_technology.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/layout/activity_techstack.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/layout/fragment_tech_stacks.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/layout/fragment_technologies.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/layout/fragment_top_rated.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/menu/menu_main.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-hdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-hdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-mdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-mdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-xhdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-xhdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-xxhdpi/logo_blue.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-xxhdpi/logo_transparent.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/mipmap-xxhdpi/logo_white.png (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/values-w820dp/dimens.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/values/colors.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/values/dimens.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/values/strings.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/main/res/values/styles.xml (100%) rename src/{AndroidClient => legacy}/techstackskotlin/src/test/java/servicestack/net/techstackskotlin/ExampleUnitTest.java (100%) rename src/{AndroidClient => legacy}/techstackskotlin/techstackskotlin.iml (100%) diff --git a/src/AndroidClient/.idea/compiler.xml b/src/AndroidClient/.idea/compiler.xml index e0e4ac7..421ee8b 100644 --- a/src/AndroidClient/.idea/compiler.xml +++ b/src/AndroidClient/.idea/compiler.xml @@ -3,10 +3,8 @@ - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/gradle.xml b/src/AndroidClient/.idea/gradle.xml index 5f817b7..cf3a342 100644 --- a/src/AndroidClient/.idea/gradle.xml +++ b/src/AndroidClient/.idea/gradle.xml @@ -11,12 +11,7 @@

    NnX)EH+Nua)3Y(c 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties b/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties index 15de902..a441313 100644 --- a/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties +++ b/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/AndroidClient/gradlew b/src/AndroidClient/gradlew old mode 100644 new mode 100755 index c53aefa..b740cf1 --- a/src/AndroidClient/gradlew +++ b/src/AndroidClient/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright � 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions �$var�, �${var}�, �${var:-default}�, �${var+SET}�, -# �${var#prefix}�, �${var%suffix}�, and �$( cmd )�; -# * compound commands having a testable exit status, especially �case�; -# * various built-in commands including �command�, �set�, and �ulimit�. +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +214,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/src/AndroidClient/gradlew.bat b/src/AndroidClient/gradlew.bat index 107acd3..25da30d 100644 --- a/src/AndroidClient/gradlew.bat +++ b/src/AndroidClient/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From 8c30afd65c6b94dd85f908902417641e8f7735a5 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 23 Oct 2024 15:36:54 +1100 Subject: [PATCH 57/68] Update java client with postFilesWithRequest. Cleanup .idea folder items. --- src/AndroidClient/.idea/.gitignore | 3 - .../.idea/caches/build_file_checksums.ser | Bin 845 -> 0 bytes .../.idea/codeStyles/Project.xml | 123 ------------------ .../.idea/codeStyles/codeStyleConfig.xml | 6 - src/AndroidClient/.idea/encodings.xml | 4 - src/AndroidClient/.idea/jarRepositories.xml | 40 ------ .../modules/android/AndroidClient.android.iml | 32 ----- .../modules/client/AndroidClient.client.iml | 21 --- 8 files changed, 229 deletions(-) delete mode 100644 src/AndroidClient/.idea/.gitignore delete mode 100644 src/AndroidClient/.idea/caches/build_file_checksums.ser delete mode 100644 src/AndroidClient/.idea/codeStyles/Project.xml delete mode 100644 src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml delete mode 100644 src/AndroidClient/.idea/encodings.xml delete mode 100644 src/AndroidClient/.idea/jarRepositories.xml delete mode 100644 src/AndroidClient/.idea/modules/android/AndroidClient.android.iml delete mode 100644 src/AndroidClient/.idea/modules/client/AndroidClient.client.iml diff --git a/src/AndroidClient/.idea/.gitignore b/src/AndroidClient/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/src/AndroidClient/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/src/AndroidClient/.idea/caches/build_file_checksums.ser b/src/AndroidClient/.idea/caches/build_file_checksums.ser deleted file mode 100644 index 09fb1ebcbdc59b669349db5851b34520b641e3a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmZ4UmVvdnh`~NNKUXg?FQq6yGexf?KR>5fFEb@IQ7^qHF(oHeub?PDD>b=9F91S2 zm1gFoxMk*~I%lLNXBU^|7ANeSz$x2!FNKML$%{cUx6&uExWpZ-H@Gq{IV3YTwYVfP zx4?&iKerM^V+jMlPgY`CqJC*fW{$pZVu5u<0RsbLg?#p+y+C&fg5>l-a(W(##Th_( zR`y#54~r#SWM*J;W8likPfT%3OfJbU@?_vF$tX%K&dAS6sVJ~_U;qK0atYFvymqCT9TS1sH|d`6W4- zc{r@siT?4GTii_SMf`Lg28%vM!#E diff --git a/src/AndroidClient/.idea/codeStyles/Project.xml b/src/AndroidClient/.idea/codeStyles/Project.xml deleted file mode 100644 index 7643783..0000000 --- a/src/AndroidClient/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml b/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 6e6eec1..0000000 --- a/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/encodings.xml b/src/AndroidClient/.idea/encodings.xml deleted file mode 100644 index 15a15b2..0000000 --- a/src/AndroidClient/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/jarRepositories.xml b/src/AndroidClient/.idea/jarRepositories.xml deleted file mode 100644 index 28af8c3..0000000 --- a/src/AndroidClient/.idea/jarRepositories.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml b/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml deleted file mode 100644 index cfc56bd..0000000 --- a/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml b/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml deleted file mode 100644 index 4ac9e15..0000000 --- a/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file From aeb2a4fb42dc7b0fba30dc769a5c44d852af07ef Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Wed, 23 Oct 2024 17:42:21 +1100 Subject: [PATCH 58/68] Update dtos --- .../java/net/servicestack/openai/dtos.java | 1874 ++++++++--------- 1 file changed, 937 insertions(+), 937 deletions(-) diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/openai/dtos.java b/src/AndroidClient/client/src/test/java/net/servicestack/openai/dtos.java index 9b569d5..9150309 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/openai/dtos.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/openai/dtos.java @@ -1,5 +1,5 @@ /* Options: -Date: 2024-10-21 06:25:17 +Date: 2024-10-23 04:54:03 Version: 8.41 Tip: To override a DTO option, remove "//" prefix before updating BaseUrl: https://openai.servicestack.net @@ -11,10 +11,10 @@ //AddServiceStackTypes: True //AddResponseStatus: False //AddDescriptionAsComments: True -//AddImplicitVersion: -//IncludeTypes: -//ExcludeTypes: -//TreatTypesAsStrings: +//AddImplicitVersion: +//IncludeTypes: +//ExcludeTypes: +//TreatTypesAsStrings: DefaultImports: java.math.*,java.util.*,net.servicestack.client.*,com.google.gson.annotations.*,com.google.gson.reflect.*,java.io.InputStream */ @@ -32,19 +32,19 @@ public class dtos public static class AdminData implements IReturn, IGet { - + private static Object responseType = AdminDataResponse.class; public Object getResponseType() { return responseType; } } /** - * Convert an audio file to a different format - */ + * Convert an audio file to a different format + */ public static class ConvertAudio implements IReturn, IMediaTransform { /** - * The desired output format for the converted audio - */ + * The desired output format for the converted audio + */ @ApiMember(Description="The desired output format for the converted audio") @Required() public AudioFormat outputFormat = null; @@ -53,17 +53,17 @@ public static class ConvertAudio implements IReturn, IMe public InputStream audio = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public AudioFormat getOutputFormat() { return outputFormat; } public ConvertAudio setOutputFormat(AudioFormat value) { this.outputFormat = value; return this; } public InputStream getAudio() { return audio; } @@ -77,13 +77,13 @@ public static class ConvertAudio implements IReturn, IMe } /** - * Convert an audio file to a different format - */ + * Convert an audio file to a different format + */ public static class QueueConvertAudio implements IReturn, IQueueMediaTransform { /** - * The desired output format for the converted audio - */ + * The desired output format for the converted audio + */ @ApiMember(Description="The desired output format for the converted audio") @Required() public AudioFormat outputFormat = null; @@ -92,23 +92,23 @@ public static class QueueConvertAudio implements IReturn, { public Date from = null; public Date to = null; - + public Date getFrom() { return from; } public GetSummaryStats setFrom(Date value) { this.from = value; return this; } public Date getTo() { return to; } @@ -138,7 +138,7 @@ public static class GetSummaryStats implements IReturn, public static class PopulateChatSummary implements IReturn, IGet { - + private static Object responseType = StringsResponse.class; public Object getResponseType() { return responseType; } } @@ -147,7 +147,7 @@ public static class GetComfyModels implements IReturn { public String apiBaseUrl = null; public String apiKey = null; - + public String getApiBaseUrl() { return apiBaseUrl; } public GetComfyModels setApiBaseUrl(String value) { this.apiBaseUrl = value; return this; } public String getApiKey() { return apiKey; } @@ -158,29 +158,29 @@ public static class GetComfyModels implements IReturn public static class GetComfyModelMappings implements IReturn { - + private static Object responseType = GetComfyModelMappingsResponse.class; public Object getResponseType() { return responseType; } } /** - * Get job status - */ + * Get job status + */ @Api(Description="Get job status") public static class GetJobStatus implements IReturn, IGet { /** - * Unique identifier of the background job - */ + * Unique identifier of the background job + */ @ApiMember(Description="Unique identifier of the background job") public Long jobId = null; /** - * Client-provided identifier for the request - */ + * Client-provided identifier for the request + */ @ApiMember(Description="Client-provided identifier for the request") public String refId = null; - + public Long getJobId() { return jobId; } public GetJobStatus setJobId(Long value) { this.jobId = value; return this; } public String getRefId() { return refId; } @@ -190,76 +190,76 @@ public static class GetJobStatus implements IReturn, IGet } /** - * Active Media Worker Models available in AI Server - */ + * Active Media Worker Models available in AI Server + */ public static class ActiveMediaModels implements IReturn, IGet { - + private static Object responseType = StringsResponse.class; public Object getResponseType() { return responseType; } } /** - * Generate image from text description - */ + * Generate image from text description + */ @Api(Description="Generate image from text description") public static class TextToImage implements IReturn, IGeneration { /** - * The main prompt describing the desired image - */ + * The main prompt describing the desired image + */ @ApiMember(Description="The main prompt describing the desired image") @Validate(Validator="NotEmpty") public String positivePrompt = null; /** - * Optional prompt specifying what should not be in the image - */ + * Optional prompt specifying what should not be in the image + */ @ApiMember(Description="Optional prompt specifying what should not be in the image") public String negativePrompt = null; /** - * Desired width of the generated image - */ + * Desired width of the generated image + */ @ApiMember(Description="Desired width of the generated image") public Integer width = null; /** - * Desired height of the generated image - */ + * Desired height of the generated image + */ @ApiMember(Description="Desired height of the generated image") public Integer height = null; /** - * Number of images to generate in a single batch - */ + * Number of images to generate in a single batch + */ @ApiMember(Description="Number of images to generate in a single batch") public Integer batchSize = null; /** - * The AI model to use for image generation - */ + * The AI model to use for image generation + */ @ApiMember(Description="The AI model to use for image generation") public String model = null; /** - * Optional seed for reproducible results - */ + * Optional seed for reproducible results + */ @ApiMember(Description="Optional seed for reproducible results") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public String getPositivePrompt() { return positivePrompt; } public TextToImage setPositivePrompt(String value) { this.positivePrompt = value; return this; } public String getNegativePrompt() { return negativePrompt; } @@ -283,67 +283,67 @@ public static class TextToImage implements IReturn, IGenerat } /** - * Generate image from another image - */ + * Generate image from another image + */ @Api(Description="Generate image from another image") public static class ImageToImage implements IReturn, IGeneration { /** - * The image to use as input - */ + * The image to use as input + */ @ApiMember(Description="The image to use as input") @Required() public InputStream image = null; /** - * Prompt describing the desired output - */ + * Prompt describing the desired output + */ @ApiMember(Description="Prompt describing the desired output") @Validate(Validator="NotEmpty") public String positivePrompt = null; /** - * Negative prompt describing what should not be in the image - */ + * Negative prompt describing what should not be in the image + */ @ApiMember(Description="Negative prompt describing what should not be in the image") public String negativePrompt = null; /** - * The AI model to use for image generation - */ + * The AI model to use for image generation + */ @ApiMember(Description="The AI model to use for image generation") public String model = null; /** - * Optional specific amount of denoise to apply - */ + * Optional specific amount of denoise to apply + */ @ApiMember(Description="Optional specific amount of denoise to apply") public Float denoise = null; /** - * Number of images to generate in a single batch - */ + * Number of images to generate in a single batch + */ @ApiMember(Description="Number of images to generate in a single batch") public Integer batchSize = null; /** - * Optional seed for reproducible results in image generation - */ + * Optional seed for reproducible results in image generation + */ @ApiMember(Description="Optional seed for reproducible results in image generation") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public ImageToImage setImage(InputStream value) { this.image = value; return this; } public String getPositivePrompt() { return positivePrompt; } @@ -367,36 +367,36 @@ public static class ImageToImage implements IReturn, IGenera } /** - * Upscale an image - */ + * Upscale an image + */ @Api(Description="Upscale an image") public static class ImageUpscale implements IReturn, IGeneration { /** - * The image to upscale - */ + * The image to upscale + */ @ApiMember(Description="The image to upscale") @Required() public InputStream image = null; /** - * Optional seed for reproducible results in image generation - */ + * Optional seed for reproducible results in image generation + */ @ApiMember(Description="Optional seed for reproducible results in image generation") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public ImageUpscale setImage(InputStream value) { this.image = value; return this; } public Integer getSeed() { return seed; } @@ -410,62 +410,62 @@ public static class ImageUpscale implements IReturn, IGenera } /** - * Generate image with masked area - */ + * Generate image with masked area + */ @Api(Description="Generate image with masked area") public static class ImageWithMask implements IReturn, IGeneration { /** - * Prompt describing the desired output in the masked area - */ + * Prompt describing the desired output in the masked area + */ @ApiMember(Description="Prompt describing the desired output in the masked area") @Validate(Validator="NotEmpty") public String positivePrompt = null; /** - * Negative prompt describing what should not be in the masked area - */ + * Negative prompt describing what should not be in the masked area + */ @ApiMember(Description="Negative prompt describing what should not be in the masked area") public String negativePrompt = null; /** - * The image to use as input - */ + * The image to use as input + */ @ApiMember(Description="The image to use as input") @Required() public InputStream image = null; /** - * The mask to use as input - */ + * The mask to use as input + */ @ApiMember(Description="The mask to use as input") @Required() public InputStream mask = null; /** - * Optional specific amount of denoise to apply - */ + * Optional specific amount of denoise to apply + */ @ApiMember(Description="Optional specific amount of denoise to apply") public Float denoise = null; /** - * Optional seed for reproducible results in image generation - */ + * Optional seed for reproducible results in image generation + */ @ApiMember(Description="Optional seed for reproducible results in image generation") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public String getPositivePrompt() { return positivePrompt; } public ImageWithMask setPositivePrompt(String value) { this.positivePrompt = value; return this; } public String getNegativePrompt() { return negativePrompt; } @@ -487,30 +487,30 @@ public static class ImageWithMask implements IReturn, IGener } /** - * Convert image to text - */ + * Convert image to text + */ @Api(Description="Convert image to text") public static class ImageToText implements IReturn, IGeneration { /** - * The image to convert to text - */ + * The image to convert to text + */ @ApiMember(Description="The image to convert to text") @Required() public InputStream image = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public ImageToText setImage(InputStream value) { this.image = value; return this; } public String getRefId() { return refId; } @@ -522,78 +522,78 @@ public static class ImageToText implements IReturn, IGenerat } /** - * Generate image from text description - */ + * Generate image from text description + */ @Api(Description="Generate image from text description") public static class QueueTextToImage implements IReturn, IQueueGeneration { /** - * The main prompt describing the desired image - */ + * The main prompt describing the desired image + */ @ApiMember(Description="The main prompt describing the desired image") @Validate(Validator="NotEmpty") public String positivePrompt = null; /** - * Optional prompt specifying what should not be in the image - */ + * Optional prompt specifying what should not be in the image + */ @ApiMember(Description="Optional prompt specifying what should not be in the image") public String negativePrompt = null; /** - * Desired width of the generated image - */ + * Desired width of the generated image + */ @ApiMember(Description="Desired width of the generated image") public Integer width = null; /** - * Desired height of the generated image - */ + * Desired height of the generated image + */ @ApiMember(Description="Desired height of the generated image") public Integer height = null; /** - * Number of images to generate in a single batch - */ + * Number of images to generate in a single batch + */ @ApiMember(Description="Number of images to generate in a single batch") public Integer batchSize = null; /** - * The AI model to use for image generation - */ + * The AI model to use for image generation + */ @ApiMember(Description="The AI model to use for image generation") public String model = null; /** - * Optional seed for reproducible results - */ + * Optional seed for reproducible results + */ @ApiMember(Description="Optional seed for reproducible results") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; /** - * Optional state to associate with the request - */ + * Optional state to associate with the request + */ @ApiMember(Description="Optional state to associate with the request") public String state = null; - + public String getPositivePrompt() { return positivePrompt; } public QueueTextToImage setPositivePrompt(String value) { this.positivePrompt = value; return this; } public String getNegativePrompt() { return negativePrompt; } @@ -621,48 +621,48 @@ public static class QueueTextToImage implements IReturn } /** - * Upscale an image - */ + * Upscale an image + */ @Api(Description="Upscale an image") public static class QueueImageUpscale implements IReturn, IQueueGeneration { /** - * The image to upscale - */ + * The image to upscale + */ @ApiMember(Description="The image to upscale") @Required() public InputStream image = null; /** - * Optional seed for reproducible results in image generation - */ + * Optional seed for reproducible results in image generation + */ @ApiMember(Description="Optional seed for reproducible results in image generation") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; /** - * Optional state to associate with the request - */ + * Optional state to associate with the request + */ @ApiMember(Description="Optional state to associate with the request") public String state = null; - + public InputStream getImage() { return image; } public QueueImageUpscale setImage(InputStream value) { this.image = value; return this; } public Integer getSeed() { return seed; } @@ -680,79 +680,79 @@ public static class QueueImageUpscale implements IReturn, IQueueGeneration { /** - * The image to use as input - */ + * The image to use as input + */ @ApiMember(Description="The image to use as input") @Required() public InputStream image = null; /** - * Prompt describing the desired output - */ + * Prompt describing the desired output + */ @ApiMember(Description="Prompt describing the desired output") @Validate(Validator="NotEmpty") public String positivePrompt = null; /** - * Negative prompt describing what should not be in the image - */ + * Negative prompt describing what should not be in the image + */ @ApiMember(Description="Negative prompt describing what should not be in the image") public String negativePrompt = null; /** - * The AI model to use for image generation - */ + * The AI model to use for image generation + */ @ApiMember(Description="The AI model to use for image generation") public String model = null; /** - * Optional specific amount of denoise to apply - */ + * Optional specific amount of denoise to apply + */ @ApiMember(Description="Optional specific amount of denoise to apply") public Float denoise = null; /** - * Number of images to generate in a single batch - */ + * Number of images to generate in a single batch + */ @ApiMember(Description="Number of images to generate in a single batch") public Integer batchSize = null; /** - * Optional seed for reproducible results in image generation - */ + * Optional seed for reproducible results in image generation + */ @ApiMember(Description="Optional seed for reproducible results in image generation") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Optional state to associate with the request - */ + * Optional state to associate with the request + */ @ApiMember(Description="Optional state to associate with the request") public String state = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public QueueImageToImage setImage(InputStream value) { this.image = value; return this; } public String getPositivePrompt() { return positivePrompt; } @@ -780,74 +780,74 @@ public static class QueueImageToImage implements IReturn, IQueueGeneration { /** - * Prompt describing the desired output in the masked area - */ + * Prompt describing the desired output in the masked area + */ @ApiMember(Description="Prompt describing the desired output in the masked area") @Validate(Validator="NotEmpty") public String positivePrompt = null; /** - * Negative prompt describing what should not be in the masked area - */ + * Negative prompt describing what should not be in the masked area + */ @ApiMember(Description="Negative prompt describing what should not be in the masked area") public String negativePrompt = null; /** - * The image to use as input - */ + * The image to use as input + */ @ApiMember(Description="The image to use as input") @Required() public InputStream image = null; /** - * The mask to use as input - */ + * The mask to use as input + */ @ApiMember(Description="The mask to use as input") @Required() public InputStream mask = null; /** - * Optional specific amount of denoise to apply - */ + * Optional specific amount of denoise to apply + */ @ApiMember(Description="Optional specific amount of denoise to apply") public Float denoise = null; /** - * Optional seed for reproducible results in image generation - */ + * Optional seed for reproducible results in image generation + */ @ApiMember(Description="Optional seed for reproducible results in image generation") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; /** - * Optional state to associate with the request - */ + * Optional state to associate with the request + */ @ApiMember(Description="Optional state to associate with the request") public String state = null; - + public String getPositivePrompt() { return positivePrompt; } public QueueImageWithMask setPositivePrompt(String value) { this.positivePrompt = value; return this; } public String getNegativePrompt() { return negativePrompt; } @@ -873,42 +873,42 @@ public static class QueueImageWithMask implements IReturn, IQueueGeneration { /** - * The image to convert to text - */ + * The image to convert to text + */ @ApiMember(Description="The image to convert to text") @Required() public InputStream image = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; /** - * Optional state to associate with the request - */ + * Optional state to associate with the request + */ @ApiMember(Description="Optional state to associate with the request") public String state = null; - + public InputStream getImage() { return image; } public QueueImageToText setImage(InputStream value) { this.image = value; return this; } public String getRefId() { return refId; } @@ -924,36 +924,36 @@ public static class QueueImageToText implements IReturn } /** - * Convert an image to a different format - */ + * Convert an image to a different format + */ public static class ConvertImage implements IReturn, IMediaTransform, IPost { /** - * The image file to be converted - */ + * The image file to be converted + */ @ApiMember(Description="The image file to be converted") @Required() public InputStream image = null; /** - * The desired output format for the converted image - */ + * The desired output format for the converted image + */ @ApiMember(Description="The desired output format for the converted image") @Required() public ImageOutputFormat outputFormat = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public ConvertImage setImage(InputStream value) { this.image = value; return this; } public ImageOutputFormat getOutputFormat() { return outputFormat; } @@ -967,53 +967,53 @@ public static class ConvertImage implements IReturn, IMe } /** - * Crop an image to a specified area - */ + * Crop an image to a specified area + */ public static class CropImage implements IReturn, IMediaTransform, IPost { /** - * The X-coordinate of the top-left corner of the crop area - */ + * The X-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The X-coordinate of the top-left corner of the crop area") public Integer x = null; /** - * The Y-coordinate of the top-left corner of the crop area - */ + * The Y-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The Y-coordinate of the top-left corner of the crop area") public Integer y = null; /** - * The width of the crop area - */ + * The width of the crop area + */ @ApiMember(Description="The width of the crop area") public Integer width = null; /** - * The height of the crop area - */ + * The height of the crop area + */ @ApiMember(Description="The height of the crop area") public Integer height = null; /** - * The image file to be cropped - */ + * The image file to be cropped + */ @ApiMember(Description="The image file to be cropped") @Required() public InputStream image = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public Integer getX() { return x; } public CropImage setX(Integer value) { this.x = value; return this; } public Integer getY() { return y; } @@ -1033,47 +1033,47 @@ public static class CropImage implements IReturn, IMedia } /** - * Add a watermark to an image - */ + * Add a watermark to an image + */ public static class WatermarkImage implements IReturn, IMediaTransform, IPost { /** - * The image file to be watermarked - */ + * The image file to be watermarked + */ @ApiMember(Description="The image file to be watermarked") @Required() public InputStream image = null; /** - * The position of the watermark on the image - */ + * The position of the watermark on the image + */ @ApiMember(Description="The position of the watermark on the image") public WatermarkPosition position = null; /** - * Scale of the watermark relative - */ + * Scale of the watermark relative + */ @ApiMember(Description="Scale of the watermark relative") public Float watermarkScale = null; /** - * The opacity of the watermark (0.0 to 1.0) - */ + * The opacity of the watermark (0.0 to 1.0) + */ @ApiMember(Description="The opacity of the watermark (0.0 to 1.0)") public Float opacity = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public WatermarkImage setImage(InputStream value) { this.image = value; return this; } public WatermarkPosition getPosition() { return position; } @@ -1091,41 +1091,41 @@ public static class WatermarkImage implements IReturn, I } /** - * Scale an image to a specified size - */ + * Scale an image to a specified size + */ public static class ScaleImage implements IReturn, IMediaTransform, IPost { /** - * The image file to be scaled - */ + * The image file to be scaled + */ @ApiMember(Description="The image file to be scaled") @Required() public InputStream image = null; /** - * Desired width of the scaled image - */ + * Desired width of the scaled image + */ @ApiMember(Description="Desired width of the scaled image") public Integer width = null; /** - * Desired height of the scaled image - */ + * Desired height of the scaled image + */ @ApiMember(Description="Desired height of the scaled image") public Integer height = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public ScaleImage setImage(InputStream value) { this.image = value; return this; } public Integer getWidth() { return width; } @@ -1141,59 +1141,59 @@ public static class ScaleImage implements IReturn, IMedi } /** - * Crop an image to a specified area - */ + * Crop an image to a specified area + */ public static class QueueCropImage implements IReturn, IQueueMediaTransform, IPost { /** - * The X-coordinate of the top-left corner of the crop area - */ + * The X-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The X-coordinate of the top-left corner of the crop area") public Integer x = null; /** - * The Y-coordinate of the top-left corner of the crop area - */ + * The Y-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The Y-coordinate of the top-left corner of the crop area") public Integer y = null; /** - * The width of the crop area - */ + * The width of the crop area + */ @ApiMember(Description="The width of the crop area") public Integer width = null; /** - * The height of the crop area - */ + * The height of the crop area + */ @ApiMember(Description="The height of the crop area") public Integer height = null; /** - * The image file to be cropped - */ + * The image file to be cropped + */ @ApiMember(Description="The image file to be cropped") @Required() public InputStream image = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public Integer getX() { return x; } public QueueCropImage setX(Integer value) { this.x = value; return this; } public Integer getY() { return y; } @@ -1215,47 +1215,47 @@ public static class QueueCropImage implements IReturn, IQueueMediaTransform, IPost { /** - * The image file to be scaled - */ + * The image file to be scaled + */ @ApiMember(Description="The image file to be scaled") @Required() public InputStream image = null; /** - * Desired width of the scaled image - */ + * Desired width of the scaled image + */ @ApiMember(Description="Desired width of the scaled image") public Integer width = null; /** - * Desired height of the scaled image - */ + * Desired height of the scaled image + */ @ApiMember(Description="Desired height of the scaled image") public Integer height = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public QueueScaleImage setImage(InputStream value) { this.image = value; return this; } public Integer getWidth() { return width; } @@ -1273,53 +1273,53 @@ public static class QueueScaleImage implements IReturn, } /** - * Add a watermark to an image - */ + * Add a watermark to an image + */ public static class QueueWatermarkImage implements IReturn, IQueueMediaTransform, IPost { /** - * The image file to be watermarked - */ + * The image file to be watermarked + */ @ApiMember(Description="The image file to be watermarked") @Required() public InputStream image = null; /** - * The position of the watermark on the image - */ + * The position of the watermark on the image + */ @ApiMember(Description="The position of the watermark on the image") public WatermarkPosition position = null; /** - * The opacity of the watermark (0.0 to 1.0) - */ + * The opacity of the watermark (0.0 to 1.0) + */ @ApiMember(Description="The opacity of the watermark (0.0 to 1.0)") public Float opacity = null; /** - * Scale of the watermark relative - */ + * Scale of the watermark relative + */ @ApiMember(Description="Scale of the watermark relative") public Float watermarkScale = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public QueueWatermarkImage setImage(InputStream value) { this.image = value; return this; } public WatermarkPosition getPosition() { return position; } @@ -1339,42 +1339,42 @@ public static class QueueWatermarkImage implements IReturn, IQueueMediaTransform, IPost { /** - * The image file to be converted - */ + * The image file to be converted + */ @ApiMember(Description="The image file to be converted") @Required() public InputStream image = null; /** - * The desired output format for the converted image - */ + * The desired output format for the converted image + */ @ApiMember(Description="The desired output format for the converted image") @Required() public ImageOutputFormat outputFormat = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getImage() { return image; } public QueueConvertImage setImage(InputStream value) { this.image = value; return this; } public ImageOutputFormat getOutputFormat() { return outputFormat; } @@ -1391,19 +1391,19 @@ public static class QueueConvertImage implements IReturn implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } /** - * Media Providers - */ + * Media Providers + */ public static class QueryMediaProviders extends QueryDb implements IReturn> { public Integer id = null; public String name = null; - + public Integer getId() { return id; } public QueryMediaProviders setId(Integer value) { this.id = value; return this; } public String getName() { return name; } @@ -1413,11 +1413,11 @@ public static class QueryMediaProviders extends QueryDb implement } /** - * Text to Speech Voice models - */ + * Text to Speech Voice models + */ public static class QueryTextToSpeechVoices extends QueryDb implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } @@ -1432,7 +1432,7 @@ public static class CreateGeneration implements IReturn implements IReturn> { public String id = null; - + public String getId() { return id; } public QueryMediaModels setId(String value) { this.id = value; return this; } private static Object responseType = new TypeToken>(){}.getType(); @@ -1466,7 +1466,7 @@ public static class GetGeneration implements IReturn { public Integer id = null; public String refId = null; - + public Integer getId() { return id; } public GetGeneration setId(Integer value) { this.id = value; return this; } public String getRefId() { return refId; } @@ -1476,44 +1476,44 @@ public static class GetGeneration implements IReturn } /** - * Update a Generation API Provider - */ + * Update a Generation API Provider + */ public static class UpdateMediaProvider implements IReturn, IPatchDb { public Integer id = null; /** - * The API Key to use for this Provider - */ + * The API Key to use for this Provider + */ public String apiKey = null; /** - * Send the API Key in the Header instead of Authorization Bearer - */ + * Send the API Key in the Header instead of Authorization Bearer + */ public String apiKeyHeader = null; /** - * Override Base URL for the Generation Provider - */ + * Override Base URL for the Generation Provider + */ public String apiBaseUrl = null; /** - * Url to check if the API is online - */ + * Url to check if the API is online + */ public String heartbeatUrl = null; /** - * How many requests should be made concurrently - */ + * How many requests should be made concurrently + */ public Integer concurrency = null; /** - * What priority to give this Provider to use for processing models - */ + * What priority to give this Provider to use for processing models + */ public Integer priority = null; /** - * Whether the Provider is enabled - */ + * Whether the Provider is enabled + */ public Boolean enabled = null; /** - * The models this API Provider should process - */ + * The models this API Provider should process + */ public ArrayList models = null; - + public Integer getId() { return id; } public UpdateMediaProvider setId(Integer value) { this.id = value; return this; } public String getApiKey() { return apiKey; } @@ -1537,52 +1537,52 @@ public static class UpdateMediaProvider implements IReturn, IPatchDb } /** - * Add an API Provider to Generation API Providers - */ + * Add an API Provider to Generation API Providers + */ public static class CreateMediaProvider implements IReturn, ICreateDb { /** - * The name of the API Provider - */ + * The name of the API Provider + */ public String name = null; /** - * The API Key to use for this Provider - */ + * The API Key to use for this Provider + */ public String apiKey = null; /** - * Send the API Key in the Header instead of Authorization Bearer - */ + * Send the API Key in the Header instead of Authorization Bearer + */ public String apiKeyHeader = null; /** - * Base URL for the Generation Provider - */ + * Base URL for the Generation Provider + */ public String apiBaseUrl = null; /** - * Url to check if the API is online - */ + * Url to check if the API is online + */ public String heartbeatUrl = null; /** - * How many requests should be made concurrently - */ + * How many requests should be made concurrently + */ public Integer concurrency = null; /** - * What priority to give this Provider to use for processing models - */ + * What priority to give this Provider to use for processing models + */ public Integer priority = null; /** - * Whether the Provider is enabled - */ + * Whether the Provider is enabled + */ public Boolean enabled = null; /** - * The date the Provider was last online - */ + * The date the Provider was last online + */ public Date offlineDate = null; /** - * Models this API Provider should process - */ + * Models this API Provider should process + */ public ArrayList models = null; public String mediaTypeId = null; - + public String getName() { return name; } public CreateMediaProvider setName(String value) { this.name = value; return this; } public String getApiKey() { return apiKey; } @@ -1618,7 +1618,7 @@ public static class CreateMediaTransform implements IReturn, IGet { public String name = null; - + public String getName() { return name; } public Hello setName(String value) { this.name = value; return this; } private static Object responseType = HelloResponse.class; @@ -1648,7 +1648,7 @@ public static class GetOllamaModels implements IReturn, { @Validate(Validator="NotEmpty") public String apiBaseUrl = null; - + public String getApiBaseUrl() { return apiBaseUrl; } public GetOllamaModels setApiBaseUrl(String value) { this.apiBaseUrl = value; return this; } private static Object responseType = GetOllamaModelsResponse.class; @@ -1656,42 +1656,42 @@ public static class GetOllamaModels implements IReturn, } /** - * Different Models available in AI Server - */ + * Different Models available in AI Server + */ public static class QueryAiModels extends QueryDb implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } /** - * The Type and behavior of different API Providers - */ + * The Type and behavior of different API Providers + */ public static class QueryAiTypes extends QueryDb implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } /** - * Active AI Worker Models available in AI Server - */ + * Active AI Worker Models available in AI Server + */ public static class ActiveAiModels implements IReturn, IGet { - + private static Object responseType = StringsResponse.class; public Object getResponseType() { return responseType; } } /** - * AI Providers - */ + * AI Providers + */ public static class QueryAiProviders extends QueryDb implements IReturn> { public String name = null; - + public String getName() { return name; } public QueryAiProviders setName(String value) { this.name = value; return this; } private static Object responseType = new TypeToken>(){}.getType(); @@ -1700,7 +1700,7 @@ public static class QueryAiProviders extends QueryDb implements IRet public static class GetWorkerStats implements IReturn, IGet { - + private static Object responseType = GetWorkerStatsResponse.class; public Object getResponseType() { return responseType; } } @@ -1709,7 +1709,7 @@ public static class CancelWorker implements IReturn { @Validate(Validator="NotEmpty") public String worker = null; - + public String getWorker() { return worker; } public CancelWorker setWorker(String value) { this.worker = value; return this; } private static Object responseType = EmptyResponse.class; @@ -1720,7 +1720,7 @@ public static class CancelWorker implements IReturn public static class GetModelImage implements IReturn, IGet { public String model = null; - + public String getModel() { return model; } public GetModelImage setModel(String value) { this.model = value; return this; } private static Object responseType = byte[].class; @@ -1728,24 +1728,24 @@ public static class GetModelImage implements IReturn, IGet } /** - * Given a list of messages comprising a conversation, the model will return a response. - */ + * Given a list of messages comprising a conversation, the model will return a response. + */ @Route(Path="/v1/chat/completions", Verbs="POST") public static class OpenAiChatCompletion extends OpenAiChat implements IReturn, IPost { /** - * Provide a unique identifier to track requests - */ + * Provide a unique identifier to track requests + */ public String refId = null; /** - * Specify which AI Provider to use - */ + * Specify which AI Provider to use + */ public String provider = null; /** - * Categorize like requests under a common group - */ + * Categorize like requests under a common group + */ public String tag = null; - + public String getRefId() { return refId; } public OpenAiChatCompletion setRefId(String value) { this.refId = value; return this; } public String getProvider() { return provider; } @@ -1763,7 +1763,7 @@ public static class QueueOpenAiChatCompletion implements IReturn, { public Integer id = null; public String refId = null; - + public Integer getId() { return id; } public WaitForOpenAiChat setId(Integer value) { this.id = value; return this; } public String getRefId() { return refId; } @@ -1795,7 +1795,7 @@ public static class GetOpenAiChat implements IReturn, IGe { public Integer id = null; public String refId = null; - + public Integer getId() { return id; } public GetOpenAiChat setId(Integer value) { this.id = value; return this; } public String getRefId() { return refId; } @@ -1808,7 +1808,7 @@ public static class GetOpenAiChatStatus implements IReturn, IGet { - + private static Object responseType = GetActiveProvidersResponse.class; public Object getResponseType() { return responseType; } } @@ -1830,7 +1830,7 @@ public static class ChatAiProvider implements IReturn, IPost public String model = null; public OpenAiChat request = null; public String prompt = null; - + public String getProvider() { return provider; } public ChatAiProvider setProvider(String value) { this.provider = value; return this; } public String getModel() { return model; } @@ -1854,7 +1854,7 @@ public static class CreateApiKey implements IReturn, IPost public Integer refId = null; public String refIdStr = null; public HashMap meta = null; - + public String getKey() { return key; } public CreateApiKey setKey(String value) { this.key = value; return this; } public String getName() { return name; } @@ -1878,67 +1878,67 @@ public static class CreateApiKey implements IReturn, IPost } /** - * Add an AI Provider to process AI Requests - */ + * Add an AI Provider to process AI Requests + */ public static class CreateAiProvider implements IReturn, ICreateDb { /** - * The Type of this API Provider - */ + * The Type of this API Provider + */ @Validate(Validator="GreaterThan(0)") public String aiTypeId = null; /** - * The Base URL for the API Provider - */ + * The Base URL for the API Provider + */ public String apiBaseUrl = null; /** - * The unique name for this API Provider - */ + * The unique name for this API Provider + */ @Validate(Validator="NotEmpty") public String name = null; /** - * The API Key to use for this Provider - */ + * The API Key to use for this Provider + */ public String apiKeyVar = null; /** - * The API Key to use for this Provider - */ + * The API Key to use for this Provider + */ public String apiKey = null; /** - * Send the API Key in the Header instead of Authorization Bearer - */ + * Send the API Key in the Header instead of Authorization Bearer + */ public String apiKeyHeader = null; /** - * The URL to check if the API Provider is still online - */ + * The URL to check if the API Provider is still online + */ public String heartbeatUrl = null; /** - * Override API Paths for different AI Requests - */ + * Override API Paths for different AI Requests + */ public HashMap taskPaths = null; /** - * How many requests should be made concurrently - */ + * How many requests should be made concurrently + */ public Integer concurrency = null; /** - * What priority to give this Provider to use for processing models - */ + * What priority to give this Provider to use for processing models + */ public Integer priority = null; /** - * Whether the Provider is enabled - */ + * Whether the Provider is enabled + */ public Boolean enabled = null; /** - * The models this API Provider should process - */ + * The models this API Provider should process + */ public ArrayList models = null; /** - * The selected models this API Provider should process - */ + * The selected models this API Provider should process + */ public ArrayList selectedModels = null; - + public String getAiTypeId() { return aiTypeId; } public CreateAiProvider setAiTypeId(String value) { this.aiTypeId = value; return this; } public String getApiBaseUrl() { return apiBaseUrl; } @@ -1973,58 +1973,58 @@ public static class UpdateAiProvider implements IReturn, IPatchDb taskPaths = null; /** - * How many requests should be made concurrently - */ + * How many requests should be made concurrently + */ public Integer concurrency = null; /** - * What priority to give this Provider to use for processing models - */ + * What priority to give this Provider to use for processing models + */ public Integer priority = null; /** - * Whether the Provider is enabled - */ + * Whether the Provider is enabled + */ public Boolean enabled = null; /** - * The models this API Provider should process - */ + * The models this API Provider should process + */ public ArrayList models = null; /** - * The selected models this API Provider should process - */ + * The selected models this API Provider should process + */ public ArrayList selectedModels = null; - + public Integer getId() { return id; } public UpdateAiProvider setId(Integer value) { this.id = value; return this; } public String getAiTypeId() { return aiTypeId; } @@ -2058,26 +2058,26 @@ public static class UpdateAiProvider implements IReturn, IPatchDb { public Integer id = null; - + public Integer getId() { return id; } public DeleteAiProvider setId(Integer value) { this.id = value; return this; } } public static class QueryPrompts extends QueryData implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } public static class Reload implements IReturn, IPost { - + private static Object responseType = EmptyResponse.class; public Object getResponseType() { return responseType; } } @@ -2086,7 +2086,7 @@ public static class ChangeAiProviderStatus implements IReturn, I { public String provider = null; public Boolean online = null; - + public String getProvider() { return provider; } public ChangeAiProviderStatus setProvider(String value) { this.provider = value; return this; } public Boolean isOnline() { return online; } @@ -2096,54 +2096,54 @@ public static class ChangeAiProviderStatus implements IReturn, I } /** - * Convert text to speech - */ + * Convert text to speech + */ @Api(Description="Convert text to speech") public static class QueueTextToSpeech implements IReturn, IQueueGeneration { /** - * The text to be converted to speech - */ + * The text to be converted to speech + */ @ApiMember(Description="The text to be converted to speech") @Required() public String text = null; /** - * Optional seed for reproducible results in speech generation - */ + * Optional seed for reproducible results in speech generation + */ @ApiMember(Description="Optional seed for reproducible results in speech generation") public Integer seed = null; /** - * The AI model to use for speech generation - */ + * The AI model to use for speech generation + */ @ApiMember(Description="The AI model to use for speech generation") public String model = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; /** - * Optional state to associate with the request - */ + * Optional state to associate with the request + */ @ApiMember(Description="Optional state to associate with the request") public String state = null; - + public String getText() { return text; } public QueueTextToSpeech setText(String value) { this.text = value; return this; } public Integer getSeed() { return seed; } @@ -2163,42 +2163,42 @@ public static class QueueTextToSpeech implements IReturn, IQueueGeneration { /** - * The audio stream containing the speech to be transcribed - */ + * The audio stream containing the speech to be transcribed + */ @ApiMember(Description="The audio stream containing the speech to be transcribed") @Required() public InputStream audio = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; /** - * Optional state to associate with the request - */ + * Optional state to associate with the request + */ @ApiMember(Description="Optional state to associate with the request") public String state = null; - + public InputStream getAudio() { return audio; } public QueueSpeechToText setAudio(InputStream value) { this.audio = value; return this; } public String getRefId() { return refId; } @@ -2214,42 +2214,42 @@ public static class QueueSpeechToText implements IReturn, IGeneration { /** - * The text to be converted to speech - */ + * The text to be converted to speech + */ @ApiMember(Description="The text to be converted to speech") @Validate(Validator="NotEmpty") public String input = null; /** - * Optional specific model and voice to use for speech generation - */ + * Optional specific model and voice to use for speech generation + */ @ApiMember(Description="Optional specific model and voice to use for speech generation") public String model = null; /** - * Optional seed for reproducible results in speech generation - */ + * Optional seed for reproducible results in speech generation + */ @ApiMember(Description="Optional seed for reproducible results in speech generation") public Integer seed = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public String getInput() { return input; } public TextToSpeech setInput(String value) { this.input = value; return this; } public String getModel() { return model; } @@ -2265,30 +2265,30 @@ public static class TextToSpeech implements IReturn, IGenera } /** - * Convert speech to text - */ + * Convert speech to text + */ @Api(Description="Convert speech to text") public static class SpeechToText implements IReturn, IGeneration { /** - * The audio stream containing the speech to be transcribed - */ + * The audio stream containing the speech to be transcribed + */ @ApiMember(Description="The audio stream containing the speech to be transcribed") @Required() public InputStream audio = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getAudio() { return audio; } public SpeechToText setAudio(InputStream value) { this.audio = value; return this; } public String getRefId() { return refId; } @@ -2300,42 +2300,42 @@ public static class SpeechToText implements IReturn, IGenera } /** - * Scale video - */ + * Scale video + */ @Api(Description="Scale video") public static class ScaleVideo implements IReturn, IMediaTransform { /** - * The video file to be scaled - */ + * The video file to be scaled + */ @ApiMember(Description="The video file to be scaled") @Required() public InputStream video = null; /** - * Desired width of the scaled video - */ + * Desired width of the scaled video + */ @ApiMember(Description="Desired width of the scaled video") public Integer width = null; /** - * Desired height of the scaled video - */ + * Desired height of the scaled video + */ @ApiMember(Description="Desired height of the scaled video") public Integer height = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getVideo() { return video; } public ScaleVideo setVideo(InputStream value) { this.video = value; return this; } public Integer getWidth() { return width; } @@ -2351,43 +2351,43 @@ public static class ScaleVideo implements IReturn, IMedi } /** - * Watermark video - */ + * Watermark video + */ @Api(Description="Watermark video") public static class WatermarkVideo implements IReturn, IMediaTransform { /** - * The video file to be watermarked - */ + * The video file to be watermarked + */ @ApiMember(Description="The video file to be watermarked") @Required() public InputStream video = null; /** - * The image file to use as a watermark - */ + * The image file to use as a watermark + */ @ApiMember(Description="The image file to use as a watermark") @Required() public InputStream watermark = null; /** - * Position of the watermark - */ + * Position of the watermark + */ @ApiMember(Description="Position of the watermark") public WatermarkPosition position = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getVideo() { return video; } public WatermarkVideo setVideo(InputStream value) { this.video = value; return this; } public InputStream getWatermark() { return watermark; } @@ -2403,13 +2403,13 @@ public static class WatermarkVideo implements IReturn, I } /** - * Convert a video to a different format - */ + * Convert a video to a different format + */ public static class ConvertVideo implements IReturn, IMediaTransform { /** - * The desired output format for the converted video - */ + * The desired output format for the converted video + */ @ApiMember(Description="The desired output format for the converted video") @Required() public ConvertVideoOutputFormat outputFormat = null; @@ -2418,17 +2418,17 @@ public static class ConvertVideo implements IReturn, IMe public InputStream video = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public ConvertVideoOutputFormat getOutputFormat() { return outputFormat; } public ConvertVideo setOutputFormat(ConvertVideoOutputFormat value) { this.outputFormat = value; return this; } public InputStream getVideo() { return video; } @@ -2442,37 +2442,37 @@ public static class ConvertVideo implements IReturn, IMe } /** - * Crop a video to a specified area - */ + * Crop a video to a specified area + */ public static class CropVideo implements IReturn, IMediaTransform { /** - * The X-coordinate of the top-left corner of the crop area - */ + * The X-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The X-coordinate of the top-left corner of the crop area") @Validate(Validator="GreaterThan(0)") @Required() public Integer x = null; /** - * The Y-coordinate of the top-left corner of the crop area - */ + * The Y-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The Y-coordinate of the top-left corner of the crop area") @Validate(Validator="GreaterThan(0)") @Required() public Integer y = null; /** - * The width of the crop area - */ + * The width of the crop area + */ @ApiMember(Description="The width of the crop area") @Validate(Validator="GreaterThan(0)") @Required() public Integer width = null; /** - * The height of the crop area - */ + * The height of the crop area + */ @ApiMember(Description="The height of the crop area") @Validate(Validator="GreaterThan(0)") @Required() @@ -2482,17 +2482,17 @@ public static class CropVideo implements IReturn, IMedia public InputStream video = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public Integer getX() { return x; } public CropVideo setX(Integer value) { this.x = value; return this; } public Integer getY() { return y; } @@ -2512,20 +2512,20 @@ public static class CropVideo implements IReturn, IMedia } /** - * Trim a video to a specified duration via start and end times - */ + * Trim a video to a specified duration via start and end times + */ public static class TrimVideo implements IReturn, IMediaTransform { /** - * The start time of the trimmed video (format: MM:SS) - */ + * The start time of the trimmed video (format: MM:SS) + */ @ApiMember(Description="The start time of the trimmed video (format: MM:SS)") @Required() public String startTime = null; /** - * The end time of the trimmed video (format: MM:SS) - */ + * The end time of the trimmed video (format: MM:SS) + */ @ApiMember(Description="The end time of the trimmed video (format: MM:SS)") public String endTime = null; @@ -2533,17 +2533,17 @@ public static class TrimVideo implements IReturn, IMedia public InputStream video = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public String getStartTime() { return startTime; } public TrimVideo setStartTime(String value) { this.startTime = value; return this; } public String getEndTime() { return endTime; } @@ -2559,48 +2559,48 @@ public static class TrimVideo implements IReturn, IMedia } /** - * Scale video - */ + * Scale video + */ @Api(Description="Scale video") public static class QueueScaleVideo implements IReturn, IQueueMediaTransform { /** - * The video file to be scaled - */ + * The video file to be scaled + */ @ApiMember(Description="The video file to be scaled") @Required() public InputStream video = null; /** - * Desired width of the scaled video - */ + * Desired width of the scaled video + */ @ApiMember(Description="Desired width of the scaled video") public Integer width = null; /** - * Desired height of the scaled video - */ + * Desired height of the scaled video + */ @ApiMember(Description="Desired height of the scaled video") public Integer height = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getVideo() { return video; } public QueueScaleVideo setVideo(InputStream value) { this.video = value; return this; } public Integer getWidth() { return width; } @@ -2618,49 +2618,49 @@ public static class QueueScaleVideo implements IReturn, IQueueMediaTransform { /** - * The video file to be watermarked - */ + * The video file to be watermarked + */ @ApiMember(Description="The video file to be watermarked") @Required() public InputStream video = null; /** - * The image file to use as a watermark - */ + * The image file to use as a watermark + */ @ApiMember(Description="The image file to use as a watermark") @Required() public InputStream watermark = null; /** - * Position of the watermark - */ + * Position of the watermark + */ @ApiMember(Description="Position of the watermark") public WatermarkPosition position = null; /** - * Optional client-provided identifier for the request - */ + * Optional client-provided identifier for the request + */ @ApiMember(Description="Optional client-provided identifier for the request") public String refId = null; /** - * Optional queue or topic to reply to - */ + * Optional queue or topic to reply to + */ @ApiMember(Description="Optional queue or topic to reply to") public String replyTo = null; /** - * Tag to identify the request - */ + * Tag to identify the request + */ @ApiMember(Description="Tag to identify the request") public String tag = null; - + public InputStream getVideo() { return video; } public QueueWatermarkVideo setVideo(InputStream value) { this.video = value; return this; } public InputStream getWatermark() { return watermark; } @@ -2678,13 +2678,13 @@ public static class QueueWatermarkVideo implements IReturn, IQueueMediaTransform { /** - * The desired output format for the converted video - */ + * The desired output format for the converted video + */ @ApiMember(Description="The desired output format for the converted video") @Required() public ConvertVideoOutputFormat outputFormat = null; @@ -2693,23 +2693,23 @@ public static class QueueConvertVideo implements IReturn, IQueueMediaTransform { /** - * The X-coordinate of the top-left corner of the crop area - */ + * The X-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The X-coordinate of the top-left corner of the crop area") @Validate(Validator="GreaterThan(0)") @Required() public Integer x = null; /** - * The Y-coordinate of the top-left corner of the crop area - */ + * The Y-coordinate of the top-left corner of the crop area + */ @ApiMember(Description="The Y-coordinate of the top-left corner of the crop area") @Validate(Validator="GreaterThan(0)") @Required() public Integer y = null; /** - * The width of the crop area - */ + * The width of the crop area + */ @ApiMember(Description="The width of the crop area") @Validate(Validator="GreaterThan(0)") @Required() public Integer width = null; /** - * The height of the crop area - */ + * The height of the crop area + */ @ApiMember(Description="The height of the crop area") @Validate(Validator="GreaterThan(0)") @Required() @@ -2765,23 +2765,23 @@ public static class QueueCropVideo implements IReturn, IQueueMediaTransform { /** - * The start time of the trimmed video (format: HH:MM:SS) - */ + * The start time of the trimmed video (format: HH:MM:SS) + */ @ApiMember(Description="The start time of the trimmed video (format: HH:MM:SS)") @Required() public String startTime = null; /** - * The end time of the trimmed video (format: HH:MM:SS) - */ + * The end time of the trimmed video (format: HH:MM:SS) + */ @ApiMember(Description="The end time of the trimmed video (format: HH:MM:SS)") public String endTime = null; @@ -2824,23 +2824,23 @@ public static class QueueTrimVideo implements IReturn, IGet public String path = null; public Boolean download = null; - + public String getPath() { return path; } public GetArtifact setPath(String value) { this.path = value; return this; } public Boolean isDownload() { return download; } @@ -2878,7 +2878,7 @@ public static class DeleteFile implements IReturn, IDelete { @Validate(Validator="NotEmpty") public String path = null; - + public String getPath() { return path; } public DeleteFile setPath(String value) { this.path = value; return this; } private static Object responseType = EmptyResponse.class; @@ -2888,7 +2888,7 @@ public static class DeleteFile implements IReturn, IDelete public static class DeleteFiles implements IReturn, IPost { public ArrayList paths = null; - + public ArrayList getPaths() { return paths; } public DeleteFiles setPaths(ArrayList value) { this.paths = value; return this; } private static Object responseType = DeleteFilesResponse.class; @@ -2903,7 +2903,7 @@ public static class GetVariant implements IReturn, IGet @Validate(Validator="NotEmpty") public String path = null; - + public String getVariant() { return variant; } public GetVariant setVariant(String value) { this.variant = value; return this; } public String getPath() { return path; } @@ -2916,7 +2916,7 @@ public static class MigrateArtifact implements IReturn, { public String path = null; public Date date = null; - + public String getPath() { return path; } public MigrateArtifact setPath(String value) { this.path = value; return this; } public Date getDate() { return date; } @@ -2926,8 +2926,8 @@ public static class MigrateArtifact implements IReturn, } /** - * Sign In - */ + * Sign In + */ @Route(Path="/auth", Verbs="GET,POST") // @Route(Path="/auth/{provider}", Verbs="GET,POST") @Api(Description="Sign In") @@ -2935,8 +2935,8 @@ public static class MigrateArtifact implements IReturn, public static class Authenticate implements IReturn, IPost { /** - * AuthProvider, e.g. credentials - */ + * AuthProvider, e.g. credentials + */ @DataMember(Order=1) public String provider = null; @@ -2963,7 +2963,7 @@ public static class Authenticate implements IReturn, IPost @DataMember(Order=9) public HashMap meta = null; - + public String getProvider() { return provider; } public Authenticate setProvider(String value) { this.provider = value; return this; } public String getUserName() { return userName; } @@ -2988,40 +2988,40 @@ public static class Authenticate implements IReturn, IPost public static class QueryMediaTypesData extends QueryData implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } public static class QueryTextToSpeechVoicesData extends QueryData implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } public static class QueryAiModelsData extends QueryData implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } public static class QueryAiTypesData extends QueryData implements IReturn> { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } /** - * Delete a Generation API Provider - */ + * Delete a Generation API Provider + */ public static class DeleteMediaProvider implements IReturn, IDeleteDb { public Integer id = null; public String name = null; - + public Integer getId() { return id; } public DeleteMediaProvider setId(Integer value) { this.id = value; return this; } public String getName() { return name; } @@ -3033,34 +3033,34 @@ public static class DeleteMediaProvider implements IReturn, IDeleteD public static class AdminDataResponse { public ArrayList pageStats = null; - + public ArrayList getPageStats() { return pageStats; } public AdminDataResponse setPageStats(ArrayList value) { this.pageStats = value; return this; } } /** - * Response object for transform requests - */ + * Response object for transform requests + */ public static class MediaTransformResponse { /** - * List of generated outputs - */ + * List of generated outputs + */ @ApiMember(Description="List of generated outputs") public ArrayList outputs = null; /** - * List of generated text outputs - */ + * List of generated text outputs + */ @ApiMember(Description="List of generated text outputs") public ArrayList textOutputs = null; /** - * Detailed response status information - */ + * Detailed response status information + */ @ApiMember(Description="Detailed response status information") public ResponseStatus responseStatus = null; - + public ArrayList getOutputs() { return outputs; } public MediaTransformResponse setOutputs(ArrayList value) { this.outputs = value; return this; } public ArrayList getTextOutputs() { return textOutputs; } @@ -3070,46 +3070,46 @@ public static class MediaTransformResponse } /** - * Base class for queueable transformation requests - */ + * Base class for queueable transformation requests + */ public static class QueueMediaTransformResponse { /** - * Unique identifier of the background job - */ + * Unique identifier of the background job + */ @ApiMember(Description="Unique identifier of the background job") public Long jobId = null; /** - * Client-provided identifier for the request - */ + * Client-provided identifier for the request + */ @ApiMember(Description="Client-provided identifier for the request") public String refId = null; /** - * Current state of the background job - */ + * Current state of the background job + */ @ApiMember(Description="Current state of the background job") public BackgroundJobState jobState = null; /** - * Current status of the transformation request - */ + * Current status of the transformation request + */ @ApiMember(Description="Current status of the transformation request") public String status = null; /** - * Detailed response status information - */ + * Detailed response status information + */ @ApiMember(Description="Detailed response status information") public ResponseStatus responseStatus = null; /** - * URL to check the status of the request - */ + * URL to check the status of the request + */ @ApiMember(Description="URL to check the status of the request") public String statusUrl = null; - + public Long getJobId() { return jobId; } public QueueMediaTransformResponse setJobId(Long value) { this.jobId = value; return this; } public String getRefId() { return refId; } @@ -3129,7 +3129,7 @@ public static class GetSummaryStatsResponse public ArrayList providerStats = null; public ArrayList modelStats = null; public ArrayList monthStats = null; - + public ArrayList getProviderStats() { return providerStats; } public GetSummaryStatsResponse setProviderStats(ArrayList value) { this.providerStats = value; return this; } public ArrayList getModelStats() { return modelStats; } @@ -3149,7 +3149,7 @@ public static class StringsResponse @DataMember(Order=3) public ResponseStatus responseStatus = null; - + public ArrayList getResults() { return results; } public StringsResponse setResults(ArrayList value) { this.results = value; return this; } public HashMap getMeta() { return meta; } @@ -3162,7 +3162,7 @@ public static class GetComfyModelsResponse { public ArrayList results = null; public ResponseStatus responseStatus = null; - + public ArrayList getResults() { return results; } public GetComfyModelsResponse setResults(ArrayList value) { this.results = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -3172,7 +3172,7 @@ public static class GetComfyModelsResponse public static class GetComfyModelMappingsResponse { public HashMap models = null; - + public HashMap getModels() { return models; } public GetComfyModelMappingsResponse setModels(HashMap value) { this.models = value; return this; } } @@ -3180,47 +3180,47 @@ public static class GetComfyModelMappingsResponse public static class GetJobStatusResponse { /** - * Unique identifier of the background job - */ + * Unique identifier of the background job + */ @ApiMember(Description="Unique identifier of the background job") public Long jobId = null; /** - * Client-provided identifier for the request - */ + * Client-provided identifier for the request + */ @ApiMember(Description="Client-provided identifier for the request") public String refId = null; /** - * Current state of the background job - */ + * Current state of the background job + */ @ApiMember(Description="Current state of the background job") public BackgroundJobState jobState = null; /** - * Current status of the generation request - */ + * Current status of the generation request + */ @ApiMember(Description="Current status of the generation request") public String status = null; /** - * List of generated outputs - */ + * List of generated outputs + */ @ApiMember(Description="List of generated outputs") public ArrayList outputs = null; /** - * List of generated text outputs - */ + * List of generated text outputs + */ @ApiMember(Description="List of generated text outputs") public ArrayList textOutputs = null; /** - * Detailed response status information - */ + * Detailed response status information + */ @ApiMember(Description="Detailed response status information") public ResponseStatus responseStatus = null; - + public Long getJobId() { return jobId; } public GetJobStatusResponse setJobId(Long value) { this.jobId = value; return this; } public String getRefId() { return refId; } @@ -3238,28 +3238,28 @@ public static class GetJobStatusResponse } /** - * Response object for generation requests - */ + * Response object for generation requests + */ public static class GenerationResponse { /** - * List of generated outputs - */ + * List of generated outputs + */ @ApiMember(Description="List of generated outputs") public ArrayList outputs = null; /** - * List of generated text outputs - */ + * List of generated text outputs + */ @ApiMember(Description="List of generated text outputs") public ArrayList textOutputs = null; /** - * Detailed response status information - */ + * Detailed response status information + */ @ApiMember(Description="Detailed response status information") public ResponseStatus responseStatus = null; - + public ArrayList getOutputs() { return outputs; } public GenerationResponse setOutputs(ArrayList value) { this.outputs = value; return this; } public ArrayList getTextOutputs() { return textOutputs; } @@ -3271,41 +3271,41 @@ public static class GenerationResponse public static class QueueGenerationResponse { /** - * Unique identifier of the background job - */ + * Unique identifier of the background job + */ @ApiMember(Description="Unique identifier of the background job") public Long jobId = null; /** - * Client-provided identifier for the request - */ + * Client-provided identifier for the request + */ @ApiMember(Description="Client-provided identifier for the request") public String refId = null; /** - * Current state of the background job - */ + * Current state of the background job + */ @ApiMember(Description="Current state of the background job") public BackgroundJobState jobState = null; /** - * Current status of the generation request - */ + * Current status of the generation request + */ @ApiMember(Description="Current status of the generation request") public String status = null; /** - * Detailed response status information - */ + * Detailed response status information + */ @ApiMember(Description="Detailed response status information") public ResponseStatus responseStatus = null; /** - * URL to check the status of the generation request - */ + * URL to check the status of the generation request + */ @ApiMember(Description="URL to check the status of the generation request") public String statusUrl = null; - + public Long getJobId() { return jobId; } public QueueGenerationResponse setJobId(Long value) { this.jobId = value; return this; } public String getRefId() { return refId; } @@ -3321,7 +3321,7 @@ public static class QueueGenerationResponse } @DataContract - public static class QueryResponse + public static class QueryResponse { @DataMember(Order=1) public Integer offset = null; @@ -3337,24 +3337,24 @@ public static class QueryResponse @DataMember(Order=5) public ResponseStatus responseStatus = null; - + public Integer getOffset() { return offset; } - public QueryResponse setOffset(Integer value) { this.offset = value; return this; } + public QueryResponse setOffset(Integer value) { this.offset = value; return this; } public Integer getTotal() { return total; } - public QueryResponse setTotal(Integer value) { this.total = value; return this; } + public QueryResponse setTotal(Integer value) { this.total = value; return this; } public ArrayList getResults() { return results; } - public QueryResponse setResults(ArrayList value) { this.results = value; return this; } + public QueryResponse setResults(ArrayList value) { this.results = value; return this; } public HashMap getMeta() { return meta; } - public QueryResponse setMeta(HashMap value) { this.meta = value; return this; } + public QueryResponse setMeta(HashMap value) { this.meta = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } - public QueryResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + public QueryResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } public static class CreateGenerationResponse { public Long id = null; public String refId = null; - + public Long getId() { return id; } public CreateGenerationResponse setId(Long value) { this.id = value; return this; } public String getRefId() { return refId; } @@ -3367,7 +3367,7 @@ public static class GetGenerationResponse public GenerationResult result = null; public ArrayList outputs = null; public ArrayList textOutputs = null; - + public GenerationArgs getRequest() { return request; } public GetGenerationResponse setRequest(GenerationArgs value) { this.request = value; return this; } public GenerationResult getResult() { return result; } @@ -3386,7 +3386,7 @@ public static class IdResponse @DataMember(Order=2) public ResponseStatus responseStatus = null; - + public String getId() { return id; } public IdResponse setId(String value) { this.id = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -3397,7 +3397,7 @@ public static class CreateTransformResponse { public Long id = null; public String refId = null; - + public Long getId() { return id; } public CreateTransformResponse setId(Long value) { this.id = value; return this; } public String getRefId() { return refId; } @@ -3407,7 +3407,7 @@ public static class CreateTransformResponse public static class HelloResponse { public String result = null; - + public String getResult() { return result; } public HelloResponse setResult(String value) { this.result = value; return this; } } @@ -3416,7 +3416,7 @@ public static class GetOllamaModelsResponse { public ArrayList results = null; public ResponseStatus responseStatus = null; - + public ArrayList getResults() { return results; } public GetOllamaModelsResponse setResults(ArrayList value) { this.results = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -3428,7 +3428,7 @@ public static class GetWorkerStatsResponse public ArrayList results = null; public HashMap queueCounts = null; public ResponseStatus responseStatus = null; - + public ArrayList getResults() { return results; } public GetWorkerStatsResponse setResults(ArrayList value) { this.results = value; return this; } public HashMap getQueueCounts() { return queueCounts; } @@ -3442,7 +3442,7 @@ public static class EmptyResponse { @DataMember(Order=1) public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public EmptyResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -3451,50 +3451,50 @@ public static class EmptyResponse public static class OpenAiChatResponse { /** - * A unique identifier for the chat completion. - */ + * A unique identifier for the chat completion. + */ @DataMember(Name="id") @SerializedName("id") public String id = null; /** - * A list of chat completion choices. Can be more than one if n is greater than 1. - */ + * A list of chat completion choices. Can be more than one if n is greater than 1. + */ @DataMember(Name="choices") @SerializedName("choices") public ArrayList choices = null; /** - * The Unix timestamp (in seconds) of when the chat completion was created. - */ + * The Unix timestamp (in seconds) of when the chat completion was created. + */ @DataMember(Name="created") @SerializedName("created") public Long created = null; /** - * The model used for the chat completion. - */ + * The model used for the chat completion. + */ @DataMember(Name="model") @SerializedName("model") public String model = null; /** - * This fingerprint represents the backend configuration that the model runs with. - */ + * This fingerprint represents the backend configuration that the model runs with. + */ @DataMember(Name="system_fingerprint") @SerializedName("system_fingerprint") public String systemFingerprint = null; /** - * The object type, which is always chat.completion. - */ + * The object type, which is always chat.completion. + */ @DataMember(Name="object") @SerializedName("object") public String object = null; /** - * Usage statistics for the completion request. - */ + * Usage statistics for the completion request. + */ @DataMember(Name="usage") @SerializedName("usage") public OpenAiUsage usage = null; @@ -3502,7 +3502,7 @@ public static class OpenAiChatResponse @DataMember(Name="responseStatus") @SerializedName("responseStatus") public ResponseStatus responseStatus = null; - + public String getId() { return id; } public OpenAiChatResponse setId(String value) { this.id = value; return this; } public ArrayList getChoices() { return choices; } @@ -3527,7 +3527,7 @@ public static class QueueOpenAiChatResponse public String refId = null; public String statusUrl = null; public ResponseStatus responseStatus = null; - + public Long getId() { return id; } public QueueOpenAiChatResponse setId(Long value) { this.id = value; return this; } public String getRefId() { return refId; } @@ -3542,7 +3542,7 @@ public static class GetOpenAiChatResponse { public BackgroundJobBase result = null; public ResponseStatus responseStatus = null; - + public BackgroundJobBase getResult() { return result; } public GetOpenAiChatResponse setResult(BackgroundJobBase value) { this.result = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -3552,41 +3552,41 @@ public static class GetOpenAiChatResponse public static class GetOpenAiChatStatusResponse { /** - * Unique identifier of the background job - */ + * Unique identifier of the background job + */ @ApiMember(Description="Unique identifier of the background job") public Long jobId = null; /** - * Client-provided identifier for the request - */ + * Client-provided identifier for the request + */ @ApiMember(Description="Client-provided identifier for the request") public String refId = null; /** - * Current state of the background job - */ + * Current state of the background job + */ @ApiMember(Description="Current state of the background job") public BackgroundJobState jobState = null; /** - * Current status of the generation request - */ + * Current status of the generation request + */ @ApiMember(Description="Current status of the generation request") public String status = null; /** - * Detailed response status information - */ + * Detailed response status information + */ @ApiMember(Description="Detailed response status information") public ResponseStatus responseStatus = null; /** - * Chat response - */ + * Chat response + */ @ApiMember(Description="Chat response") public OpenAiChatResponse chatResponse = null; - + public Long getJobId() { return jobId; } public GetOpenAiChatStatusResponse setJobId(Long value) { this.jobId = value; return this; } public String getRefId() { return refId; } @@ -3605,7 +3605,7 @@ public static class GetActiveProvidersResponse { public ArrayList results = null; public ResponseStatus responseStatus = null; - + public ArrayList getResults() { return results; } public GetActiveProvidersResponse setResults(ArrayList value) { this.results = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -3624,7 +3624,7 @@ public static class CreateApiKeyResponse public Date expiryDate = null; public Date cancelledDate = null; public String notes = null; - + public Integer getId() { return id; } public CreateApiKeyResponse setId(Integer value) { this.id = value; return this; } public String getKey() { return key; } @@ -3658,7 +3658,7 @@ public static class StringResponse @DataMember(Order=3) public ResponseStatus responseStatus = null; - + public String getResult() { return result; } public StringResponse setResult(String value) { this.result = value; return this; } public HashMap getMeta() { return meta; } @@ -3673,7 +3673,7 @@ public static class DeleteFilesResponse public ArrayList missing = null; public ArrayList failed = null; public ResponseStatus responseStatus = null; - + public ArrayList getDeleted() { return deleted; } public DeleteFilesResponse setDeleted(ArrayList value) { this.deleted = value; return this; } public ArrayList getMissing() { return missing; } @@ -3688,7 +3688,7 @@ public static class MigrateArtifactResponse { public String filePath = null; public ResponseStatus responseStatus = null; - + public String getFilePath() { return filePath; } public MigrateArtifactResponse setFilePath(String value) { this.filePath = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -3739,7 +3739,7 @@ public static class AuthenticateResponse implements IHasSessionId, IHasBearerTok @DataMember(Order=14) public HashMap meta = null; - + public String getUserId() { return userId; } public AuthenticateResponse setUserId(String value) { this.userId = value; return this; } public String getSessionId() { return sessionId; } @@ -3799,8 +3799,8 @@ public static interface IGeneration } /** - * Base class for queue generation requests - */ + * Base class for queue generation requests + */ public static interface IQueueGeneration { public String refId = null; @@ -3831,7 +3831,7 @@ public static enum WatermarkPosition public static class QueryDb extends QueryBase { - + } public static class MediaType @@ -3843,7 +3843,7 @@ public static class MediaType public String icon = null; public HashMap apiModels = null; public AiServiceProvider provider = null; - + public String getId() { return id; } public MediaType setId(String value) { this.id = value; return this; } public String getApiBaseUrl() { return apiBaseUrl; } @@ -3880,7 +3880,7 @@ public static class MediaProvider public MediaType mediaType = null; public ArrayList models = null; - + public Integer getId() { return id; } public MediaProvider setId(Integer value) { this.id = value; return this; } public String getName() { return name; } @@ -3919,7 +3919,7 @@ public static class TextToSpeechVoice { public String id = null; public String model = null; - + public String getId() { return id; } public TextToSpeechVoice setId(String value) { this.id = value; return this; } public String getModel() { return model; } @@ -3952,7 +3952,7 @@ public static class GenerationArgs public Double quality = null; public String voice = null; public String language = null; - + public String getModel() { return model; } public GenerationArgs setModel(String value) { this.model = value; return this; } public Integer getSteps() { return steps; } @@ -4018,7 +4018,7 @@ public static class MediaModel public Integer steps = null; public String negativePrompt = null; public ModelType modelType = null; - + public String getId() { return id; } public MediaModel setId(String value) { this.id = value; return this; } public HashMap getApiModels() { return apiModels; } @@ -4075,7 +4075,7 @@ public static class MediaTransformArgs public String videoCodec = null; public String audioBitrate = null; public Integer audioSampleRate = null; - + public MediaTransformTaskType getTaskType() { return taskType; } public MediaTransformArgs setTaskType(MediaTransformTaskType value) { this.taskType = value; return this; } public InputStream getVideoInput() { return videoInput; } @@ -4138,7 +4138,7 @@ public static class AiModel public String website = null; public String description = null; public String icon = null; - + public String getId() { return id; } public AiModel setId(String value) { this.id = value; return this; } public ArrayList getTags() { return tags; } @@ -4162,7 +4162,7 @@ public static class AiType public String heartbeatUrl = null; public String icon = null; public HashMap apiModels = null; - + public String getId() { return id; } public AiType setId(String value) { this.id = value; return this; } public AiProviderType getProvider() { return provider; } @@ -4200,7 +4200,7 @@ public static class AiProvider @Ignore() public ArrayList selectedModels = null; - + public Integer getId() { return id; } public AiProvider setId(Integer value) { this.id = value; return this; } public String getName() { return name; } @@ -4236,46 +4236,46 @@ public static class AiProvider } /** - * A list of messages comprising the conversation so far. - */ + * A list of messages comprising the conversation so far. + */ @DataContract public static class OpenAiMessage { /** - * The contents of the message. - */ + * The contents of the message. + */ @DataMember(Name="content") @SerializedName("content") public String content = null; /** - * The role of the author of this message. Valid values are `system`, `user`, `assistant` and `tool`. - */ + * The role of the author of this message. Valid values are `system`, `user`, `assistant` and `tool`. + */ @DataMember(Name="role") @SerializedName("role") public String role = null; /** - * An optional name for the participant. Provides the model information to differentiate between participants of the same role. - */ + * An optional name for the participant. Provides the model information to differentiate between participants of the same role. + */ @DataMember(Name="name") @SerializedName("name") public String name = null; /** - * The tool calls generated by the model, such as function calls. - */ + * The tool calls generated by the model, such as function calls. + */ @DataMember(Name="tool_calls") @SerializedName("tool_calls") public ArrayList toolCalls = null; /** - * Tool call that this message is responding to. - */ + * Tool call that this message is responding to. + */ @DataMember(Name="tool_call_id") @SerializedName("tool_call_id") public String toolCallId = null; - + public String getContent() { return content; } public OpenAiMessage setContent(String value) { this.content = value; return this; } public String getRole() { return role; } @@ -4292,12 +4292,12 @@ public static class OpenAiMessage public static class OpenAiResponseFormat { /** - * An object specifying the format that the model must output. Compatible with GPT-4 Turbo and all GPT-3.5 Turbo models newer than gpt-3.5-turbo-1106. - */ + * An object specifying the format that the model must output. Compatible with GPT-4 Turbo and all GPT-3.5 Turbo models newer than gpt-3.5-turbo-1106. + */ @DataMember(Name="response_format") @SerializedName("response_format") public ResponseFormat type = null; - + public ResponseFormat getType() { return type; } public OpenAiResponseFormat setType(ResponseFormat value) { this.type = value; return this; } } @@ -4306,141 +4306,141 @@ public static class OpenAiResponseFormat public static class OpenAiTools { /** - * The type of the tool. Currently, only function is supported. - */ + * The type of the tool. Currently, only function is supported. + */ @DataMember(Name="type") @SerializedName("type") public OpenAiToolType type = null; - + public OpenAiToolType getType() { return type; } public OpenAiTools setType(OpenAiToolType value) { this.type = value; return this; } } /** - * Given a list of messages comprising a conversation, the model will return a response. - */ + * Given a list of messages comprising a conversation, the model will return a response. + */ @DataContract public static class OpenAiChat { /** - * A list of messages comprising the conversation so far. - */ + * A list of messages comprising the conversation so far. + */ @DataMember(Name="messages") @SerializedName("messages") public ArrayList messages = null; /** - * ID of the model to use. See the model endpoint compatibility table for details on which models work with the Chat API - */ + * ID of the model to use. See the model endpoint compatibility table for details on which models work with the Chat API + */ @DataMember(Name="model") @SerializedName("model") public String model = null; /** - * Number between `-2.0` and `2.0`. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. - */ + * Number between `-2.0` and `2.0`. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + */ @DataMember(Name="frequency_penalty") @SerializedName("frequency_penalty") public Double frequencyPenalty = null; /** - * Modify the likelihood of specified tokens appearing in the completion. - */ + * Modify the likelihood of specified tokens appearing in the completion. + */ @DataMember(Name="logit_bias") @SerializedName("logit_bias") public HashMap logitBias = null; /** - * Whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the content of message. - */ + * Whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the content of message. + */ @DataMember(Name="logprobs") @SerializedName("logprobs") public Boolean logProbs = null; /** - * An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability. logprobs must be set to true if this parameter is used. - */ + * An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability. logprobs must be set to true if this parameter is used. + */ @DataMember(Name="top_logprobs") @SerializedName("top_logprobs") public Integer topLogProbs = null; /** - * The maximum number of tokens that can be generated in the chat completion. - */ + * The maximum number of tokens that can be generated in the chat completion. + */ @DataMember(Name="max_tokens") @SerializedName("max_tokens") public Integer maxTokens = null; /** - * How many chat completion choices to generate for each input message. Note that you will be charged based on the number of generated tokens across all of the choices. Keep `n` as `1` to minimize costs. - */ + * How many chat completion choices to generate for each input message. Note that you will be charged based on the number of generated tokens across all of the choices. Keep `n` as `1` to minimize costs. + */ @DataMember(Name="n") @SerializedName("n") public Integer n = null; /** - * Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. - */ + * Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. + */ @DataMember(Name="presence_penalty") @SerializedName("presence_penalty") public Double presencePenalty = null; /** - * An object specifying the format that the model must output. Compatible with GPT-4 Turbo and all GPT-3.5 Turbo models newer than `gpt-3.5-turbo-1106`. Setting Type to ResponseFormat.JsonObject enables JSON mode, which guarantees the message the model generates is valid JSON. - */ + * An object specifying the format that the model must output. Compatible with GPT-4 Turbo and all GPT-3.5 Turbo models newer than `gpt-3.5-turbo-1106`. Setting Type to ResponseFormat.JsonObject enables JSON mode, which guarantees the message the model generates is valid JSON. + */ @DataMember(Name="response_format") @SerializedName("response_format") public OpenAiResponseFormat responseFormat = null; /** - * This feature is in Beta. If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend. - */ + * This feature is in Beta. If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend. + */ @DataMember(Name="seed") @SerializedName("seed") public Integer seed = null; /** - * Up to 4 sequences where the API will stop generating further tokens. - */ + * Up to 4 sequences where the API will stop generating further tokens. + */ @DataMember(Name="stop") @SerializedName("stop") public ArrayList stop = null; /** - * If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only server-sent events as they become available, with the stream terminated by a `data: [DONE]` message. - */ + * If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only server-sent events as they become available, with the stream terminated by a `data: [DONE]` message. + */ @DataMember(Name="stream") @SerializedName("stream") public Boolean stream = null; /** - * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. - */ + * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + */ @DataMember(Name="temperature") @SerializedName("temperature") public Double temperature = null; /** - * An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. - */ + * An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. + */ @DataMember(Name="top_p") @SerializedName("top_p") public Double topP = null; /** - * A list of tools the model may call. Currently, only functions are supported as a tool. Use this to provide a list of functions the model may generate JSON inputs for. A max of 128 functions are supported. - */ + * A list of tools the model may call. Currently, only functions are supported as a tool. Use this to provide a list of functions the model may generate JSON inputs for. A max of 128 functions are supported. + */ @DataMember(Name="tools") @SerializedName("tools") public ArrayList tools = null; /** - * A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. - */ + * A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. + */ @DataMember(Name="user") @SerializedName("user") public String user = null; - + public ArrayList getMessages() { return messages; } public OpenAiChat setMessages(ArrayList value) { this.messages = value; return this; } public String getModel() { return model; } @@ -4491,7 +4491,7 @@ public static class AiProviderModel { public String model = null; public String apiModel = null; - + public String getModel() { return model; } public AiProviderModel setModel(String value) { this.model = value; return this; } public String getApiModel() { return apiModel; } @@ -4500,7 +4500,7 @@ public static class AiProviderModel public static class QueryData extends QueryBase { - + } public static class Prompt @@ -4508,7 +4508,7 @@ public static class Prompt public String id = null; public String name = null; public String value = null; - + public String getId() { return id; } public Prompt setId(String value) { this.id = value; return this; } public String getName() { return name; } @@ -4529,7 +4529,7 @@ public static class PageStats { public String label = null; public Integer total = null; - + public String getLabel() { return label; } public PageStats setLabel(String value) { this.label = value; return this; } public Integer getTotal() { return total; } @@ -4537,28 +4537,28 @@ public static class PageStats } /** - * Output object for generated artifacts - */ + * Output object for generated artifacts + */ public static class ArtifactOutput { /** - * URL to access the generated image - */ + * URL to access the generated image + */ @ApiMember(Description="URL to access the generated image") public String url = null; /** - * Filename of the generated image - */ + * Filename of the generated image + */ @ApiMember(Description="Filename of the generated image") public String fileName = null; /** - * Provider used for image generation - */ + * Provider used for image generation + */ @ApiMember(Description="Provider used for image generation") public String provider = null; - + public String getUrl() { return url; } public ArtifactOutput setUrl(String value) { this.url = value; return this; } public String getFileName() { return fileName; } @@ -4568,16 +4568,16 @@ public static class ArtifactOutput } /** - * Output object for generated text - */ + * Output object for generated text + */ public static class TextOutput { /** - * The generated text - */ + * The generated text + */ @ApiMember(Description="The generated text") public String text = null; - + public String getText() { return text; } public TextOutput setText(String value) { this.text = value; return this; } } @@ -4600,7 +4600,7 @@ public static class SummaryStats public Integer totalCompletionTokens = null; public Double totalMinutes = null; public Double tokensPerSecond = null; - + public String getName() { return name; } public SummaryStats setName(String value) { this.name = value; return this; } public Integer getTotal() { return total; } @@ -4620,7 +4620,7 @@ public static class GenerationResult public ArrayList textOutputs = null; public ArrayList outputs = null; public String error = null; - + public ArrayList getTextOutputs() { return textOutputs; } public GenerationResult setTextOutputs(ArrayList value) { this.textOutputs = value; return this; } public ArrayList getOutputs() { return outputs; } @@ -4633,7 +4633,7 @@ public static class AiProviderFileOutput { public String fileName = null; public String url = null; - + public String getFileName() { return fileName; } public AiProviderFileOutput setFileName(String value) { this.fileName = value; return this; } public String getUrl() { return url; } @@ -4643,7 +4643,7 @@ public static class AiProviderFileOutput public static class AiProviderTextOutput { public String text = null; - + public String getText() { return text; } public AiProviderTextOutput setText(String value) { this.text = value; return this; } } @@ -4674,7 +4674,7 @@ public static class OllamaModel @DataMember(Name="details") @SerializedName("details") public OllamaModelDetails details = null; - + public String getName() { return name; } public OllamaModel setName(String value) { this.name = value; return this; } public String getModel() { return model; } @@ -4699,7 +4699,7 @@ public static class WorkerStats public Long failed = null; public Long runningJob = null; public TimeSpan runningTime = null; - + public String getName() { return name; } public WorkerStats setName(String value) { this.name = value; return this; } public Long getQueued() { return queued; } @@ -4721,26 +4721,26 @@ public static class WorkerStats public static class Choice { /** - * The reason the model stopped generating tokens. This will be stop if the model hit a natural stop point or a provided stop sequence, length if the maximum number of tokens specified in the request was reached, content_filter if content was omitted due to a flag from our content filters, tool_calls if the model called a tool - */ + * The reason the model stopped generating tokens. This will be stop if the model hit a natural stop point or a provided stop sequence, length if the maximum number of tokens specified in the request was reached, content_filter if content was omitted due to a flag from our content filters, tool_calls if the model called a tool + */ @DataMember(Name="finish_reason") @SerializedName("finish_reason") public String finishReason = null; /** - * The index of the choice in the list of choices. - */ + * The index of the choice in the list of choices. + */ @DataMember(Name="index") @SerializedName("index") public Integer index = null; /** - * A chat completion message generated by the model. - */ + * A chat completion message generated by the model. + */ @DataMember(Name="message") @SerializedName("message") public ChoiceMessage message = null; - + public String getFinishReason() { return finishReason; } public Choice setFinishReason(String value) { this.finishReason = value; return this; } public Integer getIndex() { return index; } @@ -4750,32 +4750,32 @@ public static class Choice } /** - * Usage statistics for the completion request. - */ + * Usage statistics for the completion request. + */ @DataContract public static class OpenAiUsage { /** - * Number of tokens in the generated completion. - */ + * Number of tokens in the generated completion. + */ @DataMember(Name="completion_tokens") @SerializedName("completion_tokens") public Integer completionTokens = null; /** - * Number of tokens in the prompt. - */ + * Number of tokens in the prompt. + */ @DataMember(Name="prompt_tokens") @SerializedName("prompt_tokens") public Integer promptTokens = null; /** - * Total number of tokens used in the request (prompt + completion). - */ + * Total number of tokens used in the request (prompt + completion). + */ @DataMember(Name="total_tokens") @SerializedName("total_tokens") public Integer totalTokens = null; - + public Integer getCompletionTokens() { return completionTokens; } public OpenAiUsage setCompletionTokens(Integer value) { this.completionTokens = value; return this; } public Integer getPromptTokens() { return promptTokens; } @@ -4822,7 +4822,7 @@ public static class BackgroundJobBase public ResponseStatus error = null; public HashMap args = null; public HashMap meta = null; - + public Long getId() { return id; } public BackgroundJobBase setId(Long value) { this.id = value; return this; } public Long getParentId() { return parentId; } @@ -4920,7 +4920,7 @@ public static class QueryBase @DataMember(Order=7) public HashMap meta = null; - + public Integer getSkip() { return skip; } public QueryBase setSkip(Integer value) { this.skip = value; return this; } public Integer getTake() { return take; } @@ -5046,32 +5046,32 @@ public static enum AiProviderType } /** - * The tool calls generated by the model, such as function calls. - */ + * The tool calls generated by the model, such as function calls. + */ @DataContract public static class ToolCall { /** - * The ID of the tool call. - */ + * The ID of the tool call. + */ @DataMember(Name="id") @SerializedName("id") public String id = null; /** - * The type of the tool. Currently, only `function` is supported. - */ + * The type of the tool. Currently, only `function` is supported. + */ @DataMember(Name="type") @SerializedName("type") public String type = null; /** - * The function that the model called. - */ + * The function that the model called. + */ @DataMember(Name="function") @SerializedName("function") public String function = null; - + public String getId() { return id; } public ToolCall setId(String value) { this.id = value; return this; } public String getType() { return type; } @@ -5117,7 +5117,7 @@ public static class OllamaModelDetails @DataMember(Name="quantization_level") @SerializedName("quantization_level") public String quantizationLevel = null; - + public String getParentModel() { return parentModel; } public OllamaModelDetails setParentModel(String value) { this.parentModel = value; return this; } public String getFormat() { return format; } @@ -5136,26 +5136,26 @@ public static class OllamaModelDetails public static class ChoiceMessage { /** - * The contents of the message. - */ + * The contents of the message. + */ @DataMember(Name="content") @SerializedName("content") public String content = null; /** - * The tool calls generated by the model, such as function calls. - */ + * The tool calls generated by the model, such as function calls. + */ @DataMember(Name="tool_calls") @SerializedName("tool_calls") public ArrayList toolCalls = null; /** - * The role of the author of this message. - */ + * The role of the author of this message. + */ @DataMember(Name="role") @SerializedName("role") public String role = null; - + public String getContent() { return content; } public ChoiceMessage setContent(String value) { this.content = value; return this; } public ArrayList getToolCalls() { return toolCalls; } From a0b82a703e82e774b5a440e19d1fca1ce3cc70fa Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 24 Oct 2024 14:05:46 +1100 Subject: [PATCH 59/68] Add tests. Get TestDtos from live server and move to match naming for packages. --- src/AndroidClient/build.gradle | 3 +- .../net/servicestack/client/GsonTests.java | 10 +- .../client/JsonServiceClientTests.java | 99 + .../java/net/servicestack/client/dto.java | 1853 ------- .../servicestack/client/tests/TestDtos.java | 4568 +++++++++++++++++ 5 files changed, 4675 insertions(+), 1858 deletions(-) delete mode 100644 src/AndroidClient/client/src/test/java/net/servicestack/client/dto.java create mode 100644 src/AndroidClient/client/src/test/java/net/servicestack/client/tests/TestDtos.java diff --git a/src/AndroidClient/build.gradle b/src/AndroidClient/build.gradle index 04929e5..1667f37 100644 --- a/src/AndroidClient/build.gradle +++ b/src/AndroidClient/build.gradle @@ -39,5 +39,4 @@ allprojects { } } } - // This code is where all the magic happens and fixes the error. -} +} \ No newline at end of file diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/GsonTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/GsonTests.java index e5b13e5..055d9c1 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/GsonTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/GsonTests.java @@ -2,13 +2,15 @@ package net.servicestack.client; +import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; +import com.google.gson.GsonBuilder; import junit.framework.TestCase; -import net.servicestack.client.dto.*; +import net.servicestack.client.tests.TestDtos; public class GsonTests extends TestCase { @@ -117,9 +119,11 @@ public void test_Can_serialize_nested_classes() { public void test_Can_deserialize_Hello() { String json = "{\"Result\":\"World\"}\n"; - Gson gson = new Gson(); + Gson gson = new GsonBuilder() + .setFieldNamingStrategy(FieldNamingPolicy.UPPER_CAMEL_CASE) + .create(); - HelloResponse response = gson.fromJson(json, HelloResponse.class); + TestDtos.HelloResponse response = gson.fromJson(json, TestDtos.HelloResponse.class); assertEquals("World", response.getResult()); } diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java index 228e7a3..237354f 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java @@ -7,11 +7,15 @@ import net.servicestack.client.JsonServiceClient; import net.servicestack.client.WebServiceException; +import net.servicestack.client.tests.TestDtos; import test.dtos.*; import java.net.HttpURLConnection; +import java.nio.charset.StandardCharsets; import java.util.Calendar; import java.util.Date; +import java.util.List; +import java.util.Optional; public class JsonServiceClientTests extends TestCase { @@ -93,4 +97,99 @@ public void test_can_change_basePath() { client.setBasePath("/api/"); assertEquals("https://test.servicestack.net/api/", client.getReplyUrl()); } + + public void test_Can_Post_file_with_Request() { + try { + TestDtos.SpeechToText request = new TestDtos.SpeechToText(); + request.setTag("ztag"); + request.setRefId("zid"); + + byte[] fileBytes = "Hello World".getBytes(StandardCharsets.UTF_8); + FileUpload[] files = new FileUpload[]{ + new FileUpload( + "audio", // fieldName + "test.txt", // fileName + "text/plain", // contentType + fileBytes // data + ) + }; + + TestDtos.GenerationResponse response = client.postFilesWithRequest( + "/api/SpeechToText", + request, + files, + TestDtos.GenerationResponse.class + ); + + List outputs = response.getTextOutputs(); + + assertNotNull("Response should not be null", response); + assertNotNull("Text outputs should not be null", outputs); + assertEquals("Should match expected output", "audio, Audio 11, test.txt, text/plain", outputs.get(0).getText()); + assertEquals("Should match expected tag", "Tag ztag", outputs.get(1).getText()); + assertEquals("Should match expected refId", "RefId zid", outputs.get(2).getText()); + + } catch (Exception e) { + fail("Error during test: " + e.getMessage()); + } + } + + public void test_Can_Post_Multiple_files_with_Request() { + try { + TestDtos.TestFileUploads request = new TestDtos.TestFileUploads(); + request.setId(1); + request.setRefId("zid"); + + byte[] textFileBytes = "Hello World".getBytes(StandardCharsets.UTF_8); + byte[] markdownFileBytes = "## Heading".getBytes(StandardCharsets.UTF_8); + + FileUpload[] files = new FileUpload[]{ + new FileUpload( + "audio", // fieldName + "test.txt", // fileName + "text/plain", // contentType + textFileBytes // data + ), + new FileUpload( + "content", // fieldName + "test.md", // fileName + "text/markdown", // contentType + markdownFileBytes // data + ) + }; + + TestDtos.TestFileUploadsResponse response = client.postFilesWithRequest( + "/api/TestFileUploads", + request, + files, + TestDtos.TestFileUploadsResponse.class + ); + + assertNotNull("Response should not be null", response); + assertEquals("Id should match", Optional.of(1), response.getId()); + assertEquals("RefId should match", "zid", response.getRefId()); + assertEquals("Should have correct number of files", 2, response.getFiles().size()); + + // Verify first file + TestDtos.UploadInfo file1 = response.getFiles().get(0); + assertEquals("First file name should match", "audio", file1.getName()); + assertEquals("First filename should match", "test.txt", file1.getFileName()); + assertEquals("First file content length should match", Optional.of("Hello World".length()), file1.getContentLength()); + assertEquals("First file content type should match", "text/plain", file1.getContentType()); + + // Verify second file + TestDtos.UploadInfo file2 = response.getFiles().get(1); + assertEquals("Second file name should match", "content", file2.getName()); + assertEquals("Second filename should match", "test.md", file2.getFileName()); + assertEquals("Second file content length should match", Optional.of("## Heading".length()), file2.getContentLength()); + assertEquals("Second file content type should match", "text/markdown", file2.getContentType()); + + } catch (Exception e) { + fail("Error during test: " + e.getMessage()); + } + } + +// Async versions would not be needed in Java as the API is already based on blocking calls +// If async behavior is needed, it would typically be handled by the calling code using +// CompletableFuture or other async patterns external to these tests } diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/dto.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/dto.java deleted file mode 100644 index d70620c..0000000 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/dto.java +++ /dev/null @@ -1,1853 +0,0 @@ -/* Options: -Date: 2015-03-25 04:55:22 -Version: 1 -BaseUrl: http://localhost:2020 - -Package: servicestack.net.client.tests -//GlobalNamespace: dto -//AddPropertyAccessors: True -//SettersReturnThis: True -//AddServiceStackTypes: True -//AddResponseStatus: False -//AddImplicitVersion: -//IncludeTypes: -//ExcludeTypes: -//DefaultImports: java.math.*,java.util.*,net.servicestack.client.* -*/ - -package net.servicestack.client; - -import java.math.*; -import java.util.*; -import net.servicestack.client.*; - -public class dto -{ - - public static class QueryBase_1 extends QueryBase - { - - } - - public static class Rockstar - { - public Integer Id = null; - public String FirstName = null; - public String LastName = null; - public Integer Age = null; - - public Integer getId() { return Id; } - public Rockstar setId(Integer value) { this.Id = value; return this; } - public String getFirstName() { return FirstName; } - public Rockstar setFirstName(String value) { this.FirstName = value; return this; } - public String getLastName() { return LastName; } - public Rockstar setLastName(String value) { this.LastName = value; return this; } - public Integer getAge() { return Age; } - public Rockstar setAge(Integer value) { this.Age = value; return this; } - } - - public static class MetadataTestChild - { - public String Name = null; - public ArrayList Results = null; - - public String getName() { return Name; } - public MetadataTestChild setName(String value) { this.Name = value; return this; } - public ArrayList getResults() { return Results; } - public MetadataTestChild setResults(ArrayList value) { this.Results = value; return this; } - } - - @DataContract - public static class MenuExample - { - @DataMember(Order=1) - @ApiMember() - public MenuItemExample MenuItemExample1 = null; - - public MenuItemExample getMenuItemExample1() { return MenuItemExample1; } - public MenuExample setMenuItemExample1(MenuItemExample value) { this.MenuItemExample1 = value; return this; } - } - - public static class MetadataType - { - public String Name = null; - public String Namespace = null; - public ArrayList GenericArgs = null; - public MetadataTypeName Inherits = null; - public String DisplayType = null; - public String Description = null; - public Boolean ReturnVoidMarker = null; - public Boolean IsNested = null; - public Boolean IsEnum = null; - public Boolean IsInterface = null; - public Boolean IsAbstract = null; - public MetadataTypeName ReturnMarkerTypeName = null; - public ArrayList Routes = null; - public MetadataDataContract DataContract = null; - public ArrayList Properties = null; - public ArrayList Attributes = null; - public ArrayList InnerTypes = null; - public ArrayList EnumNames = null; - public ArrayList EnumValues = null; - - public String getName() { return Name; } - public MetadataType setName(String value) { this.Name = value; return this; } - public String getNamespace() { return Namespace; } - public MetadataType setNamespace(String value) { this.Namespace = value; return this; } - public ArrayList getGenericArgs() { return GenericArgs; } - public MetadataType setGenericArgs(ArrayList value) { this.GenericArgs = value; return this; } - public MetadataTypeName getInherits() { return Inherits; } - public MetadataType setInherits(MetadataTypeName value) { this.Inherits = value; return this; } - public String getDisplayType() { return DisplayType; } - public MetadataType setDisplayType(String value) { this.DisplayType = value; return this; } - public String getDescription() { return Description; } - public MetadataType setDescription(String value) { this.Description = value; return this; } - public Boolean isReturnVoidMarker() { return ReturnVoidMarker; } - public MetadataType setReturnVoidMarker(Boolean value) { this.ReturnVoidMarker = value; return this; } - public Boolean getIsNested() { return IsNested; } - public MetadataType setIsNested(Boolean value) { this.IsNested = value; return this; } - public Boolean getIsEnum() { return IsEnum; } - public MetadataType setIsEnum(Boolean value) { this.IsEnum = value; return this; } - public Boolean getIsInterface() { return IsInterface; } - public MetadataType setIsInterface(Boolean value) { this.IsInterface = value; return this; } - public Boolean getIsAbstract() { return IsAbstract; } - public MetadataType setIsAbstract(Boolean value) { this.IsAbstract = value; return this; } - public MetadataTypeName getReturnMarkerTypeName() { return ReturnMarkerTypeName; } - public MetadataType setReturnMarkerTypeName(MetadataTypeName value) { this.ReturnMarkerTypeName = value; return this; } - public ArrayList getRoutes() { return Routes; } - public MetadataType setRoutes(ArrayList value) { this.Routes = value; return this; } - public MetadataDataContract getDataContract() { return DataContract; } - public MetadataType setDataContract(MetadataDataContract value) { this.DataContract = value; return this; } - public ArrayList getProperties() { return Properties; } - public MetadataType setProperties(ArrayList value) { this.Properties = value; return this; } - public ArrayList getAttributes() { return Attributes; } - public MetadataType setAttributes(ArrayList value) { this.Attributes = value; return this; } - public ArrayList getInnerTypes() { return InnerTypes; } - public MetadataType setInnerTypes(ArrayList value) { this.InnerTypes = value; return this; } - public ArrayList getEnumNames() { return EnumNames; } - public MetadataType setEnumNames(ArrayList value) { this.EnumNames = value; return this; } - public ArrayList getEnumValues() { return EnumValues; } - public MetadataType setEnumValues(ArrayList value) { this.EnumValues = value; return this; } - } - - public static class AutoQueryViewerConfig - { - public String ServiceBaseUrl = null; - public String ServiceName = null; - public String ServiceDescription = null; - public String ServiceIconUrl = null; - public Boolean IsPublic = null; - public Boolean OnlyShowAnnotatedServices = null; - public ArrayList ImplicitConventions = null; - public String DefaultSearchField = null; - public String DefaultSearchType = null; - public String DefaultSearchText = null; - public String BrandUrl = null; - public String BrandImageUrl = null; - public String TextColor = null; - public String LinkColor = null; - public String BackgroundColor = null; - public String BackgroundImageUrl = null; - public String IconUrl = null; - - public String getServiceBaseUrl() { return ServiceBaseUrl; } - public AutoQueryViewerConfig setServiceBaseUrl(String value) { this.ServiceBaseUrl = value; return this; } - public String getServiceName() { return ServiceName; } - public AutoQueryViewerConfig setServiceName(String value) { this.ServiceName = value; return this; } - public String getServiceDescription() { return ServiceDescription; } - public AutoQueryViewerConfig setServiceDescription(String value) { this.ServiceDescription = value; return this; } - public String getServiceIconUrl() { return ServiceIconUrl; } - public AutoQueryViewerConfig setServiceIconUrl(String value) { this.ServiceIconUrl = value; return this; } - public Boolean getIsPublic() { return IsPublic; } - public AutoQueryViewerConfig setIsPublic(Boolean value) { this.IsPublic = value; return this; } - public Boolean isOnlyShowAnnotatedServices() { return OnlyShowAnnotatedServices; } - public AutoQueryViewerConfig setOnlyShowAnnotatedServices(Boolean value) { this.OnlyShowAnnotatedServices = value; return this; } - public ArrayList getImplicitConventions() { return ImplicitConventions; } - public AutoQueryViewerConfig setImplicitConventions(ArrayList value) { this.ImplicitConventions = value; return this; } - public String getDefaultSearchField() { return DefaultSearchField; } - public AutoQueryViewerConfig setDefaultSearchField(String value) { this.DefaultSearchField = value; return this; } - public String getDefaultSearchType() { return DefaultSearchType; } - public AutoQueryViewerConfig setDefaultSearchType(String value) { this.DefaultSearchType = value; return this; } - public String getDefaultSearchText() { return DefaultSearchText; } - public AutoQueryViewerConfig setDefaultSearchText(String value) { this.DefaultSearchText = value; return this; } - public String getBrandUrl() { return BrandUrl; } - public AutoQueryViewerConfig setBrandUrl(String value) { this.BrandUrl = value; return this; } - public String getBrandImageUrl() { return BrandImageUrl; } - public AutoQueryViewerConfig setBrandImageUrl(String value) { this.BrandImageUrl = value; return this; } - public String getTextColor() { return TextColor; } - public AutoQueryViewerConfig setTextColor(String value) { this.TextColor = value; return this; } - public String getLinkColor() { return LinkColor; } - public AutoQueryViewerConfig setLinkColor(String value) { this.LinkColor = value; return this; } - public String getBackgroundColor() { return BackgroundColor; } - public AutoQueryViewerConfig setBackgroundColor(String value) { this.BackgroundColor = value; return this; } - public String getBackgroundImageUrl() { return BackgroundImageUrl; } - public AutoQueryViewerConfig setBackgroundImageUrl(String value) { this.BackgroundImageUrl = value; return this; } - public String getIconUrl() { return IconUrl; } - public AutoQueryViewerConfig setIconUrl(String value) { this.IconUrl = value; return this; } - } - - public static class AutoQueryOperation - { - public String Request = null; - public String From = null; - public String To = null; - - public String getRequest() { return Request; } - public AutoQueryOperation setRequest(String value) { this.Request = value; return this; } - public String getFrom() { return From; } - public AutoQueryOperation setFrom(String value) { this.From = value; return this; } - public String getTo() { return To; } - public AutoQueryOperation setTo(String value) { this.To = value; return this; } - } - - public static class Issue221Base - { - public T Id = null; - - public T getId() { return Id; } - public Issue221Base setId(T value) { this.Id = value; return this; } - } - - public static class NativeTypesTestService - { - - } - - public static class NestedClass - { - public String Value = null; - - public String getValue() { return Value; } - public NestedClass setValue(String value) { this.Value = value; return this; } - } - - public static class ListResult - { - public String Result = null; - - public String getResult() { return Result; } - public ListResult setResult(String value) { this.Result = value; return this; } - } - - public static class ArrayResult - { - public String Result = null; - - public String getResult() { return Result; } - public ArrayResult setResult(String value) { this.Result = value; return this; } - } - - public static enum EnumType - { - Value1, - Value2; - } - - @Flags() - public static enum EnumFlags - { - Value1(1), - Value2(2), - Value3(4); - - private final int value; - EnumFlags(final int intValue) { value = intValue; } - public int getValue() { return value; } - } - - public static class AllTypes - { - public Integer Id = null; - public Integer NullableId = null; - public Short Byte = null; - public Short Short = null; - public Integer Int = null; - public Long Long = null; - public Integer UShort = null; - public Long UInt = null; - public BigInteger ULong = null; - public Float Float = null; - public Double Double = null; - public BigDecimal Decimal = null; - public String String = null; - public Date DateTime = null; - public TimeSpan TimeSpan = null; - public Date DateTimeOffset = null; - public UUID Guid = null; - public String Char = null; - public Date NullableDateTime = null; - public TimeSpan NullableTimeSpan = null; - public ArrayList StringList = null; - public ArrayList StringArray = null; - public HashMap StringMap = null; - public HashMap IntStringMap = null; - public SubType SubType = null; - - public Integer getId() { return Id; } - public AllTypes setId(Integer value) { this.Id = value; return this; } - public Integer getNullableId() { return NullableId; } - public AllTypes setNullableId(Integer value) { this.NullableId = value; return this; } - public Short getByte() { return Byte; } - public AllTypes setByte(Short value) { this.Byte = value; return this; } - public Short getShort() { return Short; } - public AllTypes setShort(Short value) { this.Short = value; return this; } - public Integer getInt() { return Int; } - public AllTypes setInt(Integer value) { this.Int = value; return this; } - public Long getLong() { return Long; } - public AllTypes setLong(Long value) { this.Long = value; return this; } - public Integer getUShort() { return UShort; } - public AllTypes setUShort(Integer value) { this.UShort = value; return this; } - public Long getUInt() { return UInt; } - public AllTypes setUInt(Long value) { this.UInt = value; return this; } - public BigInteger getULong() { return ULong; } - public AllTypes setULong(BigInteger value) { this.ULong = value; return this; } - public Float getFloat() { return Float; } - public AllTypes setFloat(Float value) { this.Float = value; return this; } - public Double getDouble() { return Double; } - public AllTypes setDouble(Double value) { this.Double = value; return this; } - public BigDecimal getDecimal() { return Decimal; } - public AllTypes setDecimal(BigDecimal value) { this.Decimal = value; return this; } - public String getString() { return String; } - public AllTypes setString(String value) { this.String = value; return this; } - public Date getDateTime() { return DateTime; } - public AllTypes setDateTime(Date value) { this.DateTime = value; return this; } - public TimeSpan getTimeSpan() { return TimeSpan; } - public AllTypes setTimeSpan(TimeSpan value) { this.TimeSpan = value; return this; } - public Date getDateTimeOffset() { return DateTimeOffset; } - public AllTypes setDateTimeOffset(Date value) { this.DateTimeOffset = value; return this; } - public UUID getGuid() { return Guid; } - public AllTypes setGuid(UUID value) { this.Guid = value; return this; } - public String getChar() { return Char; } - public AllTypes setChar(String value) { this.Char = value; return this; } - public Date getNullableDateTime() { return NullableDateTime; } - public AllTypes setNullableDateTime(Date value) { this.NullableDateTime = value; return this; } - public TimeSpan getNullableTimeSpan() { return NullableTimeSpan; } - public AllTypes setNullableTimeSpan(TimeSpan value) { this.NullableTimeSpan = value; return this; } - public ArrayList getStringList() { return StringList; } - public AllTypes setStringList(ArrayList value) { this.StringList = value; return this; } - public ArrayList getStringArray() { return StringArray; } - public AllTypes setStringArray(ArrayList value) { this.StringArray = value; return this; } - public HashMap getStringMap() { return StringMap; } - public AllTypes setStringMap(HashMap value) { this.StringMap = value; return this; } - public HashMap getIntStringMap() { return IntStringMap; } - public AllTypes setIntStringMap(HashMap value) { this.IntStringMap = value; return this; } - public SubType getSubType() { return SubType; } - public AllTypes setSubType(SubType value) { this.SubType = value; return this; } - } - - public static class AllCollectionTypes - { - public ArrayList IntArray = null; - public ArrayList IntList = null; - public ArrayList StringArray = null; - public ArrayList StringList = null; - public ArrayList PocoArray = null; - public ArrayList PocoList = null; - public HashMap> PocoLookup = null; - public HashMap>> PocoLookupMap = null; - - public ArrayList getIntArray() { return IntArray; } - public AllCollectionTypes setIntArray(ArrayList value) { this.IntArray = value; return this; } - public ArrayList getIntList() { return IntList; } - public AllCollectionTypes setIntList(ArrayList value) { this.IntList = value; return this; } - public ArrayList getStringArray() { return StringArray; } - public AllCollectionTypes setStringArray(ArrayList value) { this.StringArray = value; return this; } - public ArrayList getStringList() { return StringList; } - public AllCollectionTypes setStringList(ArrayList value) { this.StringList = value; return this; } - public ArrayList getPocoArray() { return PocoArray; } - public AllCollectionTypes setPocoArray(ArrayList value) { this.PocoArray = value; return this; } - public ArrayList getPocoList() { return PocoList; } - public AllCollectionTypes setPocoList(ArrayList value) { this.PocoList = value; return this; } - public HashMap> getPocoLookup() { return PocoLookup; } - public AllCollectionTypes setPocoLookup(HashMap> value) { this.PocoLookup = value; return this; } - public HashMap>> getPocoLookupMap() { return PocoLookupMap; } - public AllCollectionTypes setPocoLookupMap(HashMap>> value) { this.PocoLookupMap = value; return this; } - } - - public static class HelloBase - { - public Integer Id = null; - - public Integer getId() { return Id; } - public HelloBase setId(Integer value) { this.Id = value; return this; } - } - - public static class HelloResponseBase - { - public Integer RefId = null; - - public Integer getRefId() { return RefId; } - public HelloResponseBase setRefId(Integer value) { this.RefId = value; return this; } - } - - public static class Poco - { - public String Name = null; - - public String getName() { return Name; } - public Poco setName(String value) { this.Name = value; return this; } - } - - public static class HelloBase_1 - { - public ArrayList Items = null; - public ArrayList Counts = null; - - public ArrayList getItems() { return Items; } - public HelloBase_1 setItems(ArrayList value) { this.Items = value; return this; } - public ArrayList getCounts() { return Counts; } - public HelloBase_1 setCounts(ArrayList value) { this.Counts = value; return this; } - } - - public static class Item - { - public String Value = null; - - public String getValue() { return Value; } - public Item setValue(String value) { this.Value = value; return this; } - } - - public static class InheritedItem - { - public String Name = null; - - public String getName() { return Name; } - public InheritedItem setName(String value) { this.Name = value; return this; } - } - - public static class HelloWithReturnResponse - { - public String Result = null; - - public String getResult() { return Result; } - public HelloWithReturnResponse setResult(String value) { this.Result = value; return this; } - } - - public static class HelloType - { - public String Result = null; - - public String getResult() { return Result; } - public HelloType setResult(String value) { this.Result = value; return this; } - } - - @DataContract - public static class AuthUserSession - { - @DataMember(Order=1) - public String ReferrerUrl = null; - - @DataMember(Order=2) - public String Id = null; - - @DataMember(Order=3) - public String UserAuthId = null; - - @DataMember(Order=4) - public String UserAuthName = null; - - @DataMember(Order=5) - public String UserName = null; - - @DataMember(Order=6) - public String TwitterUserId = null; - - @DataMember(Order=7) - public String TwitterScreenName = null; - - @DataMember(Order=8) - public String FacebookUserId = null; - - @DataMember(Order=9) - public String FacebookUserName = null; - - @DataMember(Order=10) - public String FirstName = null; - - @DataMember(Order=11) - public String LastName = null; - - @DataMember(Order=12) - public String DisplayName = null; - - @DataMember(Order=13) - public String Company = null; - - @DataMember(Order=14) - public String Email = null; - - @DataMember(Order=15) - public String PrimaryEmail = null; - - @DataMember(Order=16) - public String PhoneNumber = null; - - @DataMember(Order=17) - public Date BirthDate = null; - - @DataMember(Order=18) - public String BirthDateRaw = null; - - @DataMember(Order=19) - public String Address = null; - - @DataMember(Order=20) - public String Address2 = null; - - @DataMember(Order=21) - public String City = null; - - @DataMember(Order=22) - public String State = null; - - @DataMember(Order=23) - public String Country = null; - - @DataMember(Order=24) - public String Culture = null; - - @DataMember(Order=25) - public String FullName = null; - - @DataMember(Order=26) - public String Gender = null; - - @DataMember(Order=27) - public String Language = null; - - @DataMember(Order=28) - public String MailAddress = null; - - @DataMember(Order=29) - public String Nickname = null; - - @DataMember(Order=30) - public String PostalCode = null; - - @DataMember(Order=31) - public String TimeZone = null; - - @DataMember(Order=32) - public String RequestTokenSecret = null; - - @DataMember(Order=33) - public Date CreatedAt = null; - - @DataMember(Order=34) - public Date LastModified = null; - - @DataMember(Order=35) - public ArrayList Roles = null; - - @DataMember(Order=36) - public ArrayList Permissions = null; - - @DataMember(Order=37) - public Boolean IsAuthenticated = null; - - @DataMember(Order=38) - public String Sequence = null; - - @DataMember(Order=39) - public Long Tag = null; - - @DataMember(Order=40) - public ArrayList ProviderOAuthAccess = null; - - public String getReferrerUrl() { return ReferrerUrl; } - public AuthUserSession setReferrerUrl(String value) { this.ReferrerUrl = value; return this; } - public String getId() { return Id; } - public AuthUserSession setId(String value) { this.Id = value; return this; } - public String getUserAuthId() { return UserAuthId; } - public AuthUserSession setUserAuthId(String value) { this.UserAuthId = value; return this; } - public String getUserAuthName() { return UserAuthName; } - public AuthUserSession setUserAuthName(String value) { this.UserAuthName = value; return this; } - public String getUserName() { return UserName; } - public AuthUserSession setUserName(String value) { this.UserName = value; return this; } - public String getTwitterUserId() { return TwitterUserId; } - public AuthUserSession setTwitterUserId(String value) { this.TwitterUserId = value; return this; } - public String getTwitterScreenName() { return TwitterScreenName; } - public AuthUserSession setTwitterScreenName(String value) { this.TwitterScreenName = value; return this; } - public String getFacebookUserId() { return FacebookUserId; } - public AuthUserSession setFacebookUserId(String value) { this.FacebookUserId = value; return this; } - public String getFacebookUserName() { return FacebookUserName; } - public AuthUserSession setFacebookUserName(String value) { this.FacebookUserName = value; return this; } - public String getFirstName() { return FirstName; } - public AuthUserSession setFirstName(String value) { this.FirstName = value; return this; } - public String getLastName() { return LastName; } - public AuthUserSession setLastName(String value) { this.LastName = value; return this; } - public String getDisplayName() { return DisplayName; } - public AuthUserSession setDisplayName(String value) { this.DisplayName = value; return this; } - public String getCompany() { return Company; } - public AuthUserSession setCompany(String value) { this.Company = value; return this; } - public String getEmail() { return Email; } - public AuthUserSession setEmail(String value) { this.Email = value; return this; } - public String getPrimaryEmail() { return PrimaryEmail; } - public AuthUserSession setPrimaryEmail(String value) { this.PrimaryEmail = value; return this; } - public String getPhoneNumber() { return PhoneNumber; } - public AuthUserSession setPhoneNumber(String value) { this.PhoneNumber = value; return this; } - public Date getBirthDate() { return BirthDate; } - public AuthUserSession setBirthDate(Date value) { this.BirthDate = value; return this; } - public String getBirthDateRaw() { return BirthDateRaw; } - public AuthUserSession setBirthDateRaw(String value) { this.BirthDateRaw = value; return this; } - public String getAddress() { return Address; } - public AuthUserSession setAddress(String value) { this.Address = value; return this; } - public String getAddress2() { return Address2; } - public AuthUserSession setAddress2(String value) { this.Address2 = value; return this; } - public String getCity() { return City; } - public AuthUserSession setCity(String value) { this.City = value; return this; } - public String getState() { return State; } - public AuthUserSession setState(String value) { this.State = value; return this; } - public String getCountry() { return Country; } - public AuthUserSession setCountry(String value) { this.Country = value; return this; } - public String getCulture() { return Culture; } - public AuthUserSession setCulture(String value) { this.Culture = value; return this; } - public String getFullName() { return FullName; } - public AuthUserSession setFullName(String value) { this.FullName = value; return this; } - public String getGender() { return Gender; } - public AuthUserSession setGender(String value) { this.Gender = value; return this; } - public String getLanguage() { return Language; } - public AuthUserSession setLanguage(String value) { this.Language = value; return this; } - public String getMailAddress() { return MailAddress; } - public AuthUserSession setMailAddress(String value) { this.MailAddress = value; return this; } - public String getNickname() { return Nickname; } - public AuthUserSession setNickname(String value) { this.Nickname = value; return this; } - public String getPostalCode() { return PostalCode; } - public AuthUserSession setPostalCode(String value) { this.PostalCode = value; return this; } - public String getTimeZone() { return TimeZone; } - public AuthUserSession setTimeZone(String value) { this.TimeZone = value; return this; } - public String getRequestTokenSecret() { return RequestTokenSecret; } - public AuthUserSession setRequestTokenSecret(String value) { this.RequestTokenSecret = value; return this; } - public Date getCreatedAt() { return CreatedAt; } - public AuthUserSession setCreatedAt(Date value) { this.CreatedAt = value; return this; } - public Date getLastModified() { return LastModified; } - public AuthUserSession setLastModified(Date value) { this.LastModified = value; return this; } - public ArrayList getRoles() { return Roles; } - public AuthUserSession setRoles(ArrayList value) { this.Roles = value; return this; } - public ArrayList getPermissions() { return Permissions; } - public AuthUserSession setPermissions(ArrayList value) { this.Permissions = value; return this; } - public Boolean getIsAuthenticated() { return IsAuthenticated; } - public AuthUserSession setIsAuthenticated(Boolean value) { this.IsAuthenticated = value; return this; } - public String getSequence() { return Sequence; } - public AuthUserSession setSequence(String value) { this.Sequence = value; return this; } - public Long getTag() { return Tag; } - public AuthUserSession setTag(Long value) { this.Tag = value; return this; } - public ArrayList getProviderOAuthAccess() { return ProviderOAuthAccess; } - public AuthUserSession setProviderOAuthAccess(ArrayList value) { this.ProviderOAuthAccess = value; return this; } - } - - public static interface IPoco - { - public String Name = null; - } - - public static interface IEmptyInterface - { - } - - public static class EmptyClass - { - - } - - public static class TypeA - { - public ArrayList Bar = null; - - public ArrayList getBar() { return Bar; } - public TypeA setBar(ArrayList value) { this.Bar = value; return this; } - } - - public static class InnerType - { - public Long Id = null; - public String Name = null; - - public Long getId() { return Id; } - public InnerType setId(Long value) { this.Id = value; return this; } - public String getName() { return Name; } - public InnerType setName(String value) { this.Name = value; return this; } - } - - public static enum InnerEnum - { - Foo, - Bar, - Baz; - } - - public static interface IAuthTokens - { - public String Provider = null; - public String UserId = null; - public String AccessToken = null; - public String AccessTokenSecret = null; - public String RefreshToken = null; - public Date RefreshTokenExpiry = null; - public String RequestToken = null; - public String RequestTokenSecret = null; - public HashMap Items = null; - } - - public static class QueryBase - { - @DataMember(Order=1) - public Integer Skip = null; - - @DataMember(Order=2) - public Integer Take = null; - - @DataMember(Order=3) - public String OrderBy = null; - - @DataMember(Order=4) - public String OrderByDesc = null; - - public Integer getSkip() { return Skip; } - public QueryBase setSkip(Integer value) { this.Skip = value; return this; } - public Integer getTake() { return Take; } - public QueryBase setTake(Integer value) { this.Take = value; return this; } - public String getOrderBy() { return OrderBy; } - public QueryBase setOrderBy(String value) { this.OrderBy = value; return this; } - public String getOrderByDesc() { return OrderByDesc; } - public QueryBase setOrderByDesc(String value) { this.OrderByDesc = value; return this; } - } - - public static class MetadataTestNestedChild - { - public String Name = null; - - public String getName() { return Name; } - public MetadataTestNestedChild setName(String value) { this.Name = value; return this; } - } - - public static class MenuItemExample - { - @DataMember(Order=1) - @ApiMember() - public String Name1 = null; - - public MenuItemExampleItem MenuItemExampleItem = null; - - public String getName1() { return Name1; } - public MenuItemExample setName1(String value) { this.Name1 = value; return this; } - public MenuItemExampleItem getMenuItemExampleItem() { return MenuItemExampleItem; } - public MenuItemExample setMenuItemExampleItem(MenuItemExampleItem value) { this.MenuItemExampleItem = value; return this; } - } - - public static class MetadataTypeName - { - public String Name = null; - public String Namespace = null; - public ArrayList GenericArgs = null; - - public String getName() { return Name; } - public MetadataTypeName setName(String value) { this.Name = value; return this; } - public String getNamespace() { return Namespace; } - public MetadataTypeName setNamespace(String value) { this.Namespace = value; return this; } - public ArrayList getGenericArgs() { return GenericArgs; } - public MetadataTypeName setGenericArgs(ArrayList value) { this.GenericArgs = value; return this; } - } - - public static class MetadataRoute - { - public String Path = null; - public String Verbs = null; - public String Notes = null; - public String Summary = null; - - public String getPath() { return Path; } - public MetadataRoute setPath(String value) { this.Path = value; return this; } - public String getVerbs() { return Verbs; } - public MetadataRoute setVerbs(String value) { this.Verbs = value; return this; } - public String getNotes() { return Notes; } - public MetadataRoute setNotes(String value) { this.Notes = value; return this; } - public String getSummary() { return Summary; } - public MetadataRoute setSummary(String value) { this.Summary = value; return this; } - } - - public static class MetadataDataContract - { - public String Name = null; - public String Namespace = null; - - public String getName() { return Name; } - public MetadataDataContract setName(String value) { this.Name = value; return this; } - public String getNamespace() { return Namespace; } - public MetadataDataContract setNamespace(String value) { this.Namespace = value; return this; } - } - - public static class MetadataPropertyType - { - public String Name = null; - public String Type = null; - public Boolean IsValueType = null; - public String TypeNamespace = null; - public ArrayList GenericArgs = null; - public String Value = null; - public String Description = null; - public MetadataDataMember DataMember = null; - public Boolean ReadOnly = null; - public String ParamType = null; - public String DisplayType = null; - public Boolean IsRequired = null; - public ArrayList AllowableValues = null; - public Integer AllowableMin = null; - public Integer AllowableMax = null; - public ArrayList Attributes = null; - - public String getName() { return Name; } - public MetadataPropertyType setName(String value) { this.Name = value; return this; } - public String getType() { return Type; } - public MetadataPropertyType setType(String value) { this.Type = value; return this; } - public Boolean getIsValueType() { return IsValueType; } - public MetadataPropertyType setIsValueType(Boolean value) { this.IsValueType = value; return this; } - public String getTypeNamespace() { return TypeNamespace; } - public MetadataPropertyType setTypeNamespace(String value) { this.TypeNamespace = value; return this; } - public ArrayList getGenericArgs() { return GenericArgs; } - public MetadataPropertyType setGenericArgs(ArrayList value) { this.GenericArgs = value; return this; } - public String getValue() { return Value; } - public MetadataPropertyType setValue(String value) { this.Value = value; return this; } - public String getDescription() { return Description; } - public MetadataPropertyType setDescription(String value) { this.Description = value; return this; } - public MetadataDataMember getDataMember() { return DataMember; } - public MetadataPropertyType setDataMember(MetadataDataMember value) { this.DataMember = value; return this; } - public Boolean isReadOnly() { return ReadOnly; } - public MetadataPropertyType setReadOnly(Boolean value) { this.ReadOnly = value; return this; } - public String getParamType() { return ParamType; } - public MetadataPropertyType setParamType(String value) { this.ParamType = value; return this; } - public String getDisplayType() { return DisplayType; } - public MetadataPropertyType setDisplayType(String value) { this.DisplayType = value; return this; } - public Boolean getIsRequired() { return IsRequired; } - public MetadataPropertyType setIsRequired(Boolean value) { this.IsRequired = value; return this; } - public ArrayList getAllowableValues() { return AllowableValues; } - public MetadataPropertyType setAllowableValues(ArrayList value) { this.AllowableValues = value; return this; } - public Integer getAllowableMin() { return AllowableMin; } - public MetadataPropertyType setAllowableMin(Integer value) { this.AllowableMin = value; return this; } - public Integer getAllowableMax() { return AllowableMax; } - public MetadataPropertyType setAllowableMax(Integer value) { this.AllowableMax = value; return this; } - public ArrayList getAttributes() { return Attributes; } - public MetadataPropertyType setAttributes(ArrayList value) { this.Attributes = value; return this; } - } - - public static class MetadataAttribute - { - public String Name = null; - public ArrayList ConstructorArgs = null; - public ArrayList Args = null; - - public String getName() { return Name; } - public MetadataAttribute setName(String value) { this.Name = value; return this; } - public ArrayList getConstructorArgs() { return ConstructorArgs; } - public MetadataAttribute setConstructorArgs(ArrayList value) { this.ConstructorArgs = value; return this; } - public ArrayList getArgs() { return Args; } - public MetadataAttribute setArgs(ArrayList value) { this.Args = value; return this; } - } - - @DataContract - public static class Property - { - @DataMember - public String Name = null; - - @DataMember - public String Value = null; - - public String getName() { return Name; } - public Property setName(String value) { this.Name = value; return this; } - public String getValue() { return Value; } - public Property setValue(String value) { this.Value = value; return this; } - } - - public static class SubType - { - public Integer Id = null; - public String Name = null; - - public Integer getId() { return Id; } - public SubType setId(Integer value) { this.Id = value; return this; } - public String getName() { return Name; } - public SubType setName(String value) { this.Name = value; return this; } - } - - public static class TypeB - { - public String Foo = null; - - public String getFoo() { return Foo; } - public TypeB setFoo(String value) { this.Foo = value; return this; } - } - - public static class TypesGroup - { - - } - - public static class MenuItemExampleItem - { - @DataMember(Order=1) - @ApiMember() - public String Name1 = null; - - public String getName1() { return Name1; } - public MenuItemExampleItem setName1(String value) { this.Name1 = value; return this; } - } - - public static class MetadataDataMember - { - public String Name = null; - public Integer Order = null; - public Boolean IsRequired = null; - public Boolean EmitDefaultValue = null; - - public String getName() { return Name; } - public MetadataDataMember setName(String value) { this.Name = value; return this; } - public Integer getOrder() { return Order; } - public MetadataDataMember setOrder(Integer value) { this.Order = value; return this; } - public Boolean getIsRequired() { return IsRequired; } - public MetadataDataMember setIsRequired(Boolean value) { this.IsRequired = value; return this; } - public Boolean isEmitDefaultValue() { return EmitDefaultValue; } - public MetadataDataMember setEmitDefaultValue(Boolean value) { this.EmitDefaultValue = value; return this; } - } - - @DataContract - public static class QueryResponse - { - @DataMember(Order=1) - public Integer Offset = null; - - @DataMember(Order=2) - public Integer Total = null; - - @DataMember(Order=3) - public ArrayList Results = null; - - @DataMember(Order=4) - public HashMap Meta = null; - - @DataMember(Order=5) - public ResponseStatus ResponseStatus = null; - - public Integer getOffset() { return Offset; } - public QueryResponse setOffset(Integer value) { this.Offset = value; return this; } - public Integer getTotal() { return Total; } - public QueryResponse setTotal(Integer value) { this.Total = value; return this; } - public ArrayList getResults() { return Results; } - public QueryResponse setResults(ArrayList value) { this.Results = value; return this; } - public HashMap getMeta() { return Meta; } - public QueryResponse setMeta(HashMap value) { this.Meta = value; return this; } - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public QueryResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - } - - public static class ChangeRequestResponse - { - public String ContentType = null; - public String Header = null; - public String QueryString = null; - public String Form = null; - public ResponseStatus ResponseStatus = null; - - public String getContentType() { return ContentType; } - public ChangeRequestResponse setContentType(String value) { this.ContentType = value; return this; } - public String getHeader() { return Header; } - public ChangeRequestResponse setHeader(String value) { this.Header = value; return this; } - public String getQueryString() { return QueryString; } - public ChangeRequestResponse setQueryString(String value) { this.QueryString = value; return this; } - public String getForm() { return Form; } - public ChangeRequestResponse setForm(String value) { this.Form = value; return this; } - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public ChangeRequestResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - } - - public static class CustomHttpErrorResponse - { - public String Custom = null; - public ResponseStatus ResponseStatus = null; - - public String getCustom() { return Custom; } - public CustomHttpErrorResponse setCustom(String value) { this.Custom = value; return this; } - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public CustomHttpErrorResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - } - - public static class CustomFieldHttpErrorResponse - { - public String Custom = null; - public ResponseStatus ResponseStatus = null; - - public String getCustom() { return Custom; } - public CustomFieldHttpErrorResponse setCustom(String value) { this.Custom = value; return this; } - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public CustomFieldHttpErrorResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - } - - public static class NoRepeatResponse - { - public UUID Id = null; - - public UUID getId() { return Id; } - public NoRepeatResponse setId(UUID value) { this.Id = value; return this; } - } - - public static class BatchThrowsResponse - { - public String Result = null; - public ResponseStatus ResponseStatus = null; - - public String getResult() { return Result; } - public BatchThrowsResponse setResult(String value) { this.Result = value; return this; } - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public BatchThrowsResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - } - - public static class MetadataTestResponse - { - public Integer Id = null; - public ArrayList Results = null; - - public Integer getId() { return Id; } - public MetadataTestResponse setId(Integer value) { this.Id = value; return this; } - public ArrayList getResults() { return Results; } - public MetadataTestResponse setResults(ArrayList value) { this.Results = value; return this; } - } - - @DataContract - public static class GetExampleResponse - { - @DataMember(Order=1) - public ResponseStatus ResponseStatus = null; - - @DataMember(Order=2) - @ApiMember() - public MenuExample MenuExample1 = null; - - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public GetExampleResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - public MenuExample getMenuExample1() { return MenuExample1; } - public GetExampleResponse setMenuExample1(MenuExample value) { this.MenuExample1 = value; return this; } - } - - public static class AutoQueryMetadataResponse - { - public AutoQueryViewerConfig Config = null; - public ArrayList Operations = null; - public ArrayList Types = null; - public ResponseStatus ResponseStatus = null; - - public AutoQueryViewerConfig getConfig() { return Config; } - public AutoQueryMetadataResponse setConfig(AutoQueryViewerConfig value) { this.Config = value; return this; } - public ArrayList getOperations() { return Operations; } - public AutoQueryMetadataResponse setOperations(ArrayList value) { this.Operations = value; return this; } - public ArrayList getTypes() { return Types; } - public AutoQueryMetadataResponse setTypes(ArrayList value) { this.Types = value; return this; } - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public AutoQueryMetadataResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - } - - public static class HelloResponse - { - public String Result = null; - - public String getResult() { return Result; } - public HelloResponse setResult(String value) { this.Result = value; return this; } - } - - /** - * Description on HelloAllResponse type - */ - @DataContract - public static class HelloAnnotatedResponse - { - @DataMember - public String Result = null; - - public String getResult() { return Result; } - public HelloAnnotatedResponse setResult(String value) { this.Result = value; return this; } - } - - public static class HelloExistingResponse - { - public HelloList HelloList = null; - public HelloArray HelloArray = null; - public ArrayList ArrayResults = null; - public ArrayList ListResults = null; - - public HelloList getHelloList() { return HelloList; } - public HelloExistingResponse setHelloList(HelloList value) { this.HelloList = value; return this; } - public HelloArray getHelloArray() { return HelloArray; } - public HelloExistingResponse setHelloArray(HelloArray value) { this.HelloArray = value; return this; } - public ArrayList getArrayResults() { return ArrayResults; } - public HelloExistingResponse setArrayResults(ArrayList value) { this.ArrayResults = value; return this; } - public ArrayList getListResults() { return ListResults; } - public HelloExistingResponse setListResults(ArrayList value) { this.ListResults = value; return this; } - } - - public static class HelloAllTypesResponse - { - public String Result = null; - public AllTypes AllTypes = null; - public AllCollectionTypes AllCollectionTypes = null; - - public String getResult() { return Result; } - public HelloAllTypesResponse setResult(String value) { this.Result = value; return this; } - public AllTypes getAllTypes() { return AllTypes; } - public HelloAllTypesResponse setAllTypes(AllTypes value) { this.AllTypes = value; return this; } - public AllCollectionTypes getAllCollectionTypes() { return AllCollectionTypes; } - public HelloAllTypesResponse setAllCollectionTypes(AllCollectionTypes value) { this.AllCollectionTypes = value; return this; } - } - - @DataContract - public static class HelloWithDataContractResponse - { - @DataMember(Name="result", Order=1, IsRequired=true, EmitDefaultValue=false) - public String Result = null; - - public String getResult() { return Result; } - public HelloWithDataContractResponse setResult(String value) { this.Result = value; return this; } - } - - /** - * Description on HelloWithDescriptionResponse type - */ - public static class HelloWithDescriptionResponse - { - public String Result = null; - - public String getResult() { return Result; } - public HelloWithDescriptionResponse setResult(String value) { this.Result = value; return this; } - } - - public static class HelloWithInheritanceResponse extends HelloResponseBase - { - public String Result = null; - - public String getResult() { return Result; } - public HelloWithInheritanceResponse setResult(String value) { this.Result = value; return this; } - } - - public static class HelloWithAlternateReturnResponse extends HelloWithReturnResponse - { - public String AltResult = null; - - public String getAltResult() { return AltResult; } - public HelloWithAlternateReturnResponse setAltResult(String value) { this.AltResult = value; return this; } - } - - public static class HelloWithRouteResponse - { - public String Result = null; - - public String getResult() { return Result; } - public HelloWithRouteResponse setResult(String value) { this.Result = value; return this; } - } - - public static class HelloWithTypeResponse - { - public HelloType Result = null; - - public HelloType getResult() { return Result; } - public HelloWithTypeResponse setResult(HelloType value) { this.Result = value; return this; } - } - - public static class HelloSessionResponse - { - public AuthUserSession Result = null; - - public AuthUserSession getResult() { return Result; } - public HelloSessionResponse setResult(AuthUserSession value) { this.Result = value; return this; } - } - - public static class Request1Response - { - public TypeA Test = null; - - public TypeA getTest() { return Test; } - public Request1Response setTest(TypeA value) { this.Test = value; return this; } - } - - public static class Request2Response - { - public TypeA Test = null; - - public TypeA getTest() { return Test; } - public Request2Response setTest(TypeA value) { this.Test = value; return this; } - } - - public static class HelloInnerTypesResponse - { - public InnerType InnerType = null; - public InnerEnum InnerEnum = null; - - public InnerType getInnerType() { return InnerType; } - public HelloInnerTypesResponse setInnerType(InnerType value) { this.InnerType = value; return this; } - public InnerEnum getInnerEnum() { return InnerEnum; } - public HelloInnerTypesResponse setInnerEnum(InnerEnum value) { this.InnerEnum = value; return this; } - } - - public static class CustomUserSession extends AuthUserSession - { - @DataMember - public String CustomName = null; - - @DataMember - public String CustomInfo = null; - - public String getCustomName() { return CustomName; } - public CustomUserSession setCustomName(String value) { this.CustomName = value; return this; } - public String getCustomInfo() { return CustomInfo; } - public CustomUserSession setCustomInfo(String value) { this.CustomInfo = value; return this; } - } - - public static class Echo - { - public String Sentence = null; - - public String getSentence() { return Sentence; } - public Echo setSentence(String value) { this.Sentence = value; return this; } - } - - public static class ThrowTypeResponse - { - public ResponseStatus ResponseStatus = null; - - public ResponseStatus getResponseStatus() { return ResponseStatus; } - public ThrowTypeResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; } - } - - public static class acsprofileResponse - { - public String profileId = null; - - public String getProfileId() { return profileId; } - public acsprofileResponse setProfileId(String value) { this.profileId = value; return this; } - } - - public static class AddressResponse - { - public String Address = null; - - public String getAddress() { return Address; } - public AddressResponse setAddress(String value) { this.Address = value; return this; } - } - - @Route("/anontype") - public static class AnonType - { - - } - - @Route("/query/rockstars") - public static class QueryRockstars extends QueryBase_1 implements IReturn> - { - public Integer Age = null; - - public Integer getAge() { return Age; } - public QueryRockstars setAge(Integer value) { this.Age = value; return this; } - private static Class responseType = new QueryResponse().getClass(); - public Class getResponseType() { return responseType; } - } - - @Route("/changerequest/{Id}") - public static class ChangeRequest implements IReturn - { - public String Id = null; - - public String getId() { return Id; } - public ChangeRequest setId(String value) { this.Id = value; return this; } - private static Class responseType = ChangeRequestResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route("/Routing/LeadPost.aspx") - public static class LegacyLeadPost - { - public String LeadType = null; - public Integer MyId = null; - - public String getLeadType() { return LeadType; } - public LegacyLeadPost setLeadType(String value) { this.LeadType = value; return this; } - public Integer getMyId() { return MyId; } - public LegacyLeadPost setMyId(Integer value) { this.MyId = value; return this; } - } - - @Route("/info/{Id}") - public static class Info - { - public String Id = null; - - public String getId() { return Id; } - public Info setId(String value) { this.Id = value; return this; } - } - - public static class CustomHttpError implements IReturn - { - public Integer StatusCode = null; - public String StatusDescription = null; - - public Integer getStatusCode() { return StatusCode; } - public CustomHttpError setStatusCode(Integer value) { this.StatusCode = value; return this; } - public String getStatusDescription() { return StatusDescription; } - public CustomHttpError setStatusDescription(String value) { this.StatusDescription = value; return this; } - private static Class responseType = CustomHttpErrorResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class CustomFieldHttpError implements IReturn - { - - private static Class responseType = CustomFieldHttpErrorResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route("{PathInfo*}") - public static class FallbackRoute - { - public String PathInfo = null; - - public String getPathInfo() { return PathInfo; } - public FallbackRoute setPathInfo(String value) { this.PathInfo = value; return this; } - } - - public static class NoRepeat implements IReturn - { - public UUID Id = null; - - public UUID getId() { return Id; } - public NoRepeat setId(UUID value) { this.Id = value; return this; } - private static Class responseType = NoRepeatResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class BatchThrows implements IReturn - { - public Integer Id = null; - public String Name = null; - - public Integer getId() { return Id; } - public BatchThrows setId(Integer value) { this.Id = value; return this; } - public String getName() { return Name; } - public BatchThrows setName(String value) { this.Name = value; return this; } - private static Class responseType = BatchThrowsResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class BatchThrowsAsync implements IReturn - { - public Integer Id = null; - public String Name = null; - - public Integer getId() { return Id; } - public BatchThrowsAsync setId(Integer value) { this.Id = value; return this; } - public String getName() { return Name; } - public BatchThrowsAsync setName(String value) { this.Name = value; return this; } - private static Class responseType = BatchThrowsResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class MetadataTest implements IReturn - { - public Integer Id = null; - - public Integer getId() { return Id; } - public MetadataTest setId(Integer value) { this.Id = value; return this; } - private static Class responseType = MetadataTestResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route(Path="/example", Verbs="GET") - @DataContract - public static class GetExample implements IReturn - { - - private static Class responseType = GetExampleResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class MetadataRequest implements IReturn - { - public MetadataType MetadataType = null; - - public MetadataType getMetadataType() { return MetadataType; } - public MetadataRequest setMetadataType(MetadataType value) { this.MetadataType = value; return this; } - private static Class responseType = AutoQueryMetadataResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route("/namedconnection") - public static class NamedConnection - { - public String EmailAddresses = null; - - public String getEmailAddresses() { return EmailAddresses; } - public NamedConnection setEmailAddresses(String value) { this.EmailAddresses = value; return this; } - } - - public static class Issue221Long extends Issue221Base - { - - } - - public static class HelloInService implements IReturn - { - public String Name = null; - - public String getName() { return Name; } - public HelloInService setName(String value) { this.Name = value; return this; } - private static Class responseType = HelloResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route("/hello/{Name}") - // @Route("/hello") - public static class Hello implements IReturn - { - @Required() - public String Name = null; - - public String Title = null; - - public String getName() { return Name; } - public Hello setName(String value) { this.Name = value; return this; } - public String getTitle() { return Title; } - public Hello setTitle(String value) { this.Title = value; return this; } - private static Class responseType = HelloResponse.class; - public Class getResponseType() { return responseType; } - } - - /** - * Description on HelloAll type - */ - @DataContract - public static class HelloAnnotated implements IReturn - { - @DataMember - public String Name = null; - - public String getName() { return Name; } - public HelloAnnotated setName(String value) { this.Name = value; return this; } - private static Class responseType = HelloAnnotatedResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloWithNestedClass implements IReturn - { - public String Name = null; - public NestedClass NestedClassProp = null; - - public String getName() { return Name; } - public HelloWithNestedClass setName(String value) { this.Name = value; return this; } - public NestedClass getNestedClassProp() { return NestedClassProp; } - public HelloWithNestedClass setNestedClassProp(NestedClass value) { this.NestedClassProp = value; return this; } - private static Class responseType = HelloResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloList implements IReturn> - { - public ArrayList Names = null; - - public ArrayList getNames() { return Names; } - public HelloList setNames(ArrayList value) { this.Names = value; return this; } - private static Class responseType = new ArrayList().getClass(); - public Class getResponseType() { return responseType; } - } - - public static class HelloArray implements IReturn> - { - public ArrayList Names = null; - - public ArrayList getNames() { return Names; } - public HelloArray setNames(ArrayList value) { this.Names = value; return this; } - private static Class responseType = new ArrayList().getClass(); - public Class getResponseType() { return responseType; } - } - - public static class HelloExisting implements IReturn - { - public ArrayList Names = null; - - public ArrayList getNames() { return Names; } - public HelloExisting setNames(ArrayList value) { this.Names = value; return this; } - private static Class responseType = HelloExistingResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloWithEnum - { - public EnumType EnumProp = null; - public EnumType NullableEnumProp = null; - public EnumFlags EnumFlags = null; - - public EnumType getEnumProp() { return EnumProp; } - public HelloWithEnum setEnumProp(EnumType value) { this.EnumProp = value; return this; } - public EnumType getNullableEnumProp() { return NullableEnumProp; } - public HelloWithEnum setNullableEnumProp(EnumType value) { this.NullableEnumProp = value; return this; } - public EnumFlags getEnumFlags() { return EnumFlags; } - public HelloWithEnum setEnumFlags(EnumFlags value) { this.EnumFlags = value; return this; } - } - - public static class RestrictedAttributes - { - public Integer Id = null; - public String Name = null; - public Hello Hello = null; - - public Integer getId() { return Id; } - public RestrictedAttributes setId(Integer value) { this.Id = value; return this; } - public String getName() { return Name; } - public RestrictedAttributes setName(String value) { this.Name = value; return this; } - public Hello getHello() { return Hello; } - public RestrictedAttributes setHello(Hello value) { this.Hello = value; return this; } - } - - /** - * AllowedAttributes Description - */ - @Route(Path="/allowed-attributes", Verbs="GET") - @Api("AllowedAttributes Description") - // @ApiResponse(400, "Your request was not understood") - @DataContract - public static class AllowedAttributes - { - @DataMember(Name="Aliased") - @ApiMember(Description="Range Description", ParameterType="path", DataType="double", IsRequired=true) - public Double Range = null; - - public Double getRange() { return Range; } - public AllowedAttributes setRange(Double value) { this.Range = value; return this; } - } - - public static class HelloAllTypes implements IReturn - { - public String Name = null; - public AllTypes AllTypes = null; - public AllCollectionTypes AllCollectionTypes = null; - - public String getName() { return Name; } - public HelloAllTypes setName(String value) { this.Name = value; return this; } - public AllTypes getAllTypes() { return AllTypes; } - public HelloAllTypes setAllTypes(AllTypes value) { this.AllTypes = value; return this; } - public AllCollectionTypes getAllCollectionTypes() { return AllCollectionTypes; } - public HelloAllTypes setAllCollectionTypes(AllCollectionTypes value) { this.AllCollectionTypes = value; return this; } - private static Class responseType = HelloAllTypesResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloString - { - public String Name = null; - - public String getName() { return Name; } - public HelloString setName(String value) { this.Name = value; return this; } - } - - public static class HelloVoid implements IReturnVoid - { - public String Name = null; - - public String getName() { return Name; } - public HelloVoid setName(String value) { this.Name = value; return this; } - } - - @DataContract - public static class HelloWithDataContract implements IReturn - { - @DataMember(Name="name", Order=1, IsRequired=true, EmitDefaultValue=false) - public String Name = null; - - @DataMember(Name="id", Order=2, EmitDefaultValue=false) - public Integer Id = null; - - public String getName() { return Name; } - public HelloWithDataContract setName(String value) { this.Name = value; return this; } - public Integer getId() { return Id; } - public HelloWithDataContract setId(Integer value) { this.Id = value; return this; } - private static Class responseType = HelloWithDataContractResponse.class; - public Class getResponseType() { return responseType; } - } - - /** - * Description on HelloWithDescription type - */ - public static class HelloWithDescription implements IReturn - { - public String Name = null; - - public String getName() { return Name; } - public HelloWithDescription setName(String value) { this.Name = value; return this; } - private static Class responseType = HelloWithDescriptionResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloWithInheritance extends HelloBase implements IReturn - { - public String Name = null; - - public String getName() { return Name; } - public HelloWithInheritance setName(String value) { this.Name = value; return this; } - private static Class responseType = HelloWithInheritanceResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloWithGenericInheritance extends HelloBase_1 - { - public String Result = null; - - public String getResult() { return Result; } - public HelloWithGenericInheritance setResult(String value) { this.Result = value; return this; } - } - - public static class HelloWithGenericInheritance2 extends HelloBase_1 - { - public String Result = null; - - public String getResult() { return Result; } - public HelloWithGenericInheritance2 setResult(String value) { this.Result = value; return this; } - } - - public static class HelloWithNestedInheritance extends HelloBase_1 - { - - } - - public static class HelloWithListInheritance extends ArrayList - { - - } - - public static class HelloWithReturn implements IReturn - { - public String Name = null; - - public String getName() { return Name; } - public HelloWithReturn setName(String value) { this.Name = value; return this; } - private static Class responseType = HelloWithAlternateReturnResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route("/helloroute") - public static class HelloWithRoute implements IReturn - { - public String Name = null; - - public String getName() { return Name; } - public HelloWithRoute setName(String value) { this.Name = value; return this; } - private static Class responseType = HelloWithRouteResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloWithType implements IReturn - { - public String Name = null; - - public String getName() { return Name; } - public HelloWithType setName(String value) { this.Name = value; return this; } - private static Class responseType = HelloWithTypeResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloSession implements IReturn - { - - private static Class responseType = HelloSessionResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloInterface - { - public IPoco Poco = null; - public IEmptyInterface EmptyInterface = null; - public EmptyClass EmptyClass = null; - public String Value = null; - - public IPoco getPoco() { return Poco; } - public HelloInterface setPoco(IPoco value) { this.Poco = value; return this; } - public IEmptyInterface getEmptyInterface() { return EmptyInterface; } - public HelloInterface setEmptyInterface(IEmptyInterface value) { this.EmptyInterface = value; return this; } - public EmptyClass getEmptyClass() { return EmptyClass; } - public HelloInterface setEmptyClass(EmptyClass value) { this.EmptyClass = value; return this; } - public String getValue() { return Value; } - public HelloInterface setValue(String value) { this.Value = value; return this; } - } - - public static class Request1 implements IReturn - { - public TypeA Test = null; - - public TypeA getTest() { return Test; } - public Request1 setTest(TypeA value) { this.Test = value; return this; } - private static Class responseType = Request1Response.class; - public Class getResponseType() { return responseType; } - } - - public static class Request2 implements IReturn - { - public TypeA Test = null; - - public TypeA getTest() { return Test; } - public Request2 setTest(TypeA value) { this.Test = value; return this; } - private static Class responseType = Request2Response.class; - public Class getResponseType() { return responseType; } - } - - public static class HelloInnerTypes implements IReturn - { - - private static Class responseType = HelloInnerTypesResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class GetUserSession implements IReturn - { - - private static Class responseType = CustomUserSession.class; - public Class getResponseType() { return responseType; } - } - - /** - * Echoes a sentence - */ - @Route(Path="/echoes", Verbs="POST") - @Api("Echoes a sentence") - public static class Echoes implements IReturn - { - @ApiMember(Description="The sentence to echo.", ParameterType="form", DataType="string", IsRequired=true, Name="Sentence") - public String Sentence = null; - - public String getSentence() { return Sentence; } - public Echoes setSentence(String value) { this.Sentence = value; return this; } - private static Class responseType = Echo.class; - public Class getResponseType() { return responseType; } - } - - public static class CachedEcho - { - public Boolean Reload = null; - public String Sentence = null; - - public Boolean isReload() { return Reload; } - public CachedEcho setReload(Boolean value) { this.Reload = value; return this; } - public String getSentence() { return Sentence; } - public CachedEcho setSentence(String value) { this.Sentence = value; return this; } - } - - public static class AsyncTest implements IReturn - { - - private static Class responseType = Echo.class; - public Class getResponseType() { return responseType; } - } - - @Route("/throwhttperror/{Status}") - public static class ThrowHttpError - { - public Integer Status = null; - public String Message = null; - - public Integer getStatus() { return Status; } - public ThrowHttpError setStatus(Integer value) { this.Status = value; return this; } - public String getMessage() { return Message; } - public ThrowHttpError setMessage(String value) { this.Message = value; return this; } - } - - @Route("/throw404") - // @Route("/throw404/{Message}") - public static class Throw404 - { - public String Message = null; - - public String getMessage() { return Message; } - public Throw404 setMessage(String value) { this.Message = value; return this; } - } - - @Route("/throw/{Type}") - public static class ThrowType implements IReturn - { - public String Type = null; - public String Message = null; - - public String getType() { return Type; } - public ThrowType setType(String value) { this.Type = value; return this; } - public String getMessage() { return Message; } - public ThrowType setMessage(String value) { this.Message = value; return this; } - private static Class responseType = ThrowTypeResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route("/api/acsprofiles/{profileId}") - // @Route(Path="/api/acsprofiles", Verbs="POST,PUT,PATCH,DELETE") - public static class ACSProfile implements IReturn - { - public String profileId = null; - @Required() - @StringLength(20) - public String shortName = null; - - @StringLength(60) - public String longName = null; - - @StringLength(20) - public String regionId = null; - - @StringLength(20) - public String groupId = null; - - @StringLength(12) - public String deviceID = null; - - public Date lastUpdated = null; - public Boolean enabled = null; - - public String getProfileId() { return profileId; } - public ACSProfile setProfileId(String value) { this.profileId = value; return this; } - public String getShortName() { return shortName; } - public ACSProfile setShortName(String value) { this.shortName = value; return this; } - public String getLongName() { return longName; } - public ACSProfile setLongName(String value) { this.longName = value; return this; } - public String getRegionId() { return regionId; } - public ACSProfile setRegionId(String value) { this.regionId = value; return this; } - public String getGroupId() { return groupId; } - public ACSProfile setGroupId(String value) { this.groupId = value; return this; } - public String getDeviceID() { return deviceID; } - public ACSProfile setDeviceID(String value) { this.deviceID = value; return this; } - public Date getLastUpdated() { return lastUpdated; } - public ACSProfile setLastUpdated(Date value) { this.lastUpdated = value; return this; } - public Boolean isEnabled() { return enabled; } - public ACSProfile setEnabled(Boolean value) { this.enabled = value; return this; } - private static Class responseType = acsprofileResponse.class; - public Class getResponseType() { return responseType; } - } - - public static class TestMiniverView - { - - } - - @Route("/user/{UserId}/Address") - public static class UpdateAddress implements IReturn - { - public Integer UserId = null; - public String Address = null; - - public Integer getUserId() { return UserId; } - public UpdateAddress setUserId(Integer value) { this.UserId = value; return this; } - public String getAddress() { return Address; } - public UpdateAddress setAddress(String value) { this.Address = value; return this; } - private static Class responseType = AddressResponse.class; - public Class getResponseType() { return responseType; } - } - - @Route("/user/{UserId}/AddressVoid") - public static class UpdateAddressVoid implements IReturnVoid - { - public Integer UserId = null; - public String Address = null; - - public Integer getUserId() { return UserId; } - public UpdateAddressVoid setUserId(Integer value) { this.UserId = value; return this; } - public String getAddress() { return Address; } - public UpdateAddressVoid setAddress(String value) { this.Address = value; return this; } - } - -} \ No newline at end of file diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/tests/TestDtos.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/tests/TestDtos.java new file mode 100644 index 0000000..6a1a365 --- /dev/null +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/tests/TestDtos.java @@ -0,0 +1,4568 @@ +/* Options: +Date: 2024-10-24 02:46:25 +Version: 8.41 +Tip: To override a DTO option, remove "//" prefix before updating +BaseUrl: https://test.servicestack.net + +Package: net.servicestack.client.tests +GlobalNamespace: TestDtos +//AddPropertyAccessors: True +//SettersReturnThis: True +//AddServiceStackTypes: True +//AddResponseStatus: False +//AddDescriptionAsComments: True +//AddImplicitVersion: +//IncludeTypes: +//ExcludeTypes: +//TreatTypesAsStrings: +//DefaultImports: java.math.*,java.util.*,java.io.InputStream,net.servicestack.client.*,com.google.gson.annotations.*,com.google.gson.reflect.*,java.io.* +*/ + +package net.servicestack.client.tests; + +import java.math.*; +import java.util.*; +import java.io.InputStream; +import net.servicestack.client.*; +import com.google.gson.annotations.*; +import com.google.gson.reflect.*; + +public class TestDtos +{ + + public static class QueryItems extends QueryDb_2 implements IReturn> + { + + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route(Path="/channels/{Channel}/raw") + public static class PostRawToChannel implements IReturnVoid + { + public String from = null; + public String toUserId = null; + public String channel = null; + public String message = null; + public String selector = null; + + public String getFrom() { return from; } + public PostRawToChannel setFrom(String value) { this.from = value; return this; } + public String getToUserId() { return toUserId; } + public PostRawToChannel setToUserId(String value) { this.toUserId = value; return this; } + public String getChannel() { return channel; } + public PostRawToChannel setChannel(String value) { this.channel = value; return this; } + public String getMessage() { return message; } + public PostRawToChannel setMessage(String value) { this.message = value; return this; } + public String getSelector() { return selector; } + public PostRawToChannel setSelector(String value) { this.selector = value; return this; } + } + + @Route(Path="/channels/{Channel}/chat") + public static class PostChatToChannel implements IReturn + { + public String from = null; + public String toUserId = null; + public String channel = null; + public String message = null; + public String selector = null; + + public String getFrom() { return from; } + public PostChatToChannel setFrom(String value) { this.from = value; return this; } + public String getToUserId() { return toUserId; } + public PostChatToChannel setToUserId(String value) { this.toUserId = value; return this; } + public String getChannel() { return channel; } + public PostChatToChannel setChannel(String value) { this.channel = value; return this; } + public String getMessage() { return message; } + public PostChatToChannel setMessage(String value) { this.message = value; return this; } + public String getSelector() { return selector; } + public PostChatToChannel setSelector(String value) { this.selector = value; return this; } + private static Object responseType = ChatMessage.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/chathistory") + public static class GetChatHistory implements IReturn + { + public ArrayList channels = null; + public Long afterId = null; + public Integer take = null; + + public ArrayList getChannels() { return channels; } + public GetChatHistory setChannels(ArrayList value) { this.channels = value; return this; } + public Long getAfterId() { return afterId; } + public GetChatHistory setAfterId(Long value) { this.afterId = value; return this; } + public Integer getTake() { return take; } + public GetChatHistory setTake(Integer value) { this.take = value; return this; } + private static Object responseType = GetChatHistoryResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/reset") + public static class ClearChatHistory implements IReturnVoid + { + + } + + @Route(Path="/reset-serverevents") + public static class ResetServerEvents implements IReturnVoid + { + + } + + @Route(Path="/channels/{Channel}/object") + public static class PostObjectToChannel implements IReturnVoid + { + public String toUserId = null; + public String channel = null; + public String selector = null; + public CustomType customType = null; + public SetterType setterType = null; + + public String getToUserId() { return toUserId; } + public PostObjectToChannel setToUserId(String value) { this.toUserId = value; return this; } + public String getChannel() { return channel; } + public PostObjectToChannel setChannel(String value) { this.channel = value; return this; } + public String getSelector() { return selector; } + public PostObjectToChannel setSelector(String value) { this.selector = value; return this; } + public CustomType getCustomType() { return customType; } + public PostObjectToChannel setCustomType(CustomType value) { this.customType = value; return this; } + public SetterType getSetterType() { return setterType; } + public PostObjectToChannel setSetterType(SetterType value) { this.setterType = value; return this; } + } + + @Route(Path="/account") + public static class GetUserDetails implements IReturn + { + + private static Object responseType = GetUserDetailsResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class CustomHttpError implements IReturn + { + public Integer statusCode = null; + public String statusDescription = null; + + public Integer getStatusCode() { return statusCode; } + public CustomHttpError setStatusCode(Integer value) { this.statusCode = value; return this; } + public String getStatusDescription() { return statusDescription; } + public CustomHttpError setStatusDescription(String value) { this.statusDescription = value; return this; } + private static Object responseType = CustomHttpErrorResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class AltQueryItems implements IReturn> + { + public String name = null; + + public String getName() { return name; } + public AltQueryItems setName(String value) { this.name = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class GetItems implements IReturn + { + + private static Object responseType = Items.class; + public Object getResponseType() { return responseType; } + } + + public static class GetNakedItems implements IReturn> + { + + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @ValidateRequest(Validator="IsAuthenticated") + public static class DeclarativeValidationAuth + { + public String name = null; + + public String getName() { return name; } + public DeclarativeValidationAuth setName(String value) { this.name = value; return this; } + } + + public static class DeclarativeCollectiveValidationTest implements IReturn + { + @Validate(Validator="NotEmpty") + // @Validate(Validator="MaximumLength(20)") + public String site = null; + + public ArrayList declarativeValidations = null; + public ArrayList fluentValidations = null; + + public String getSite() { return site; } + public DeclarativeCollectiveValidationTest setSite(String value) { this.site = value; return this; } + public ArrayList getDeclarativeValidations() { return declarativeValidations; } + public DeclarativeCollectiveValidationTest setDeclarativeValidations(ArrayList value) { this.declarativeValidations = value; return this; } + public ArrayList getFluentValidations() { return fluentValidations; } + public DeclarativeCollectiveValidationTest setFluentValidations(ArrayList value) { this.fluentValidations = value; return this; } + private static Object responseType = EmptyResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class DeclarativeSingleValidationTest implements IReturn + { + @Validate(Validator="NotEmpty") + // @Validate(Validator="MaximumLength(20)") + public String site = null; + + public DeclarativeSingleValidation declarativeSingleValidation = null; + public FluentSingleValidation fluentSingleValidation = null; + + public String getSite() { return site; } + public DeclarativeSingleValidationTest setSite(String value) { this.site = value; return this; } + public DeclarativeSingleValidation getDeclarativeSingleValidation() { return declarativeSingleValidation; } + public DeclarativeSingleValidationTest setDeclarativeSingleValidation(DeclarativeSingleValidation value) { this.declarativeSingleValidation = value; return this; } + public FluentSingleValidation getFluentSingleValidation() { return fluentSingleValidation; } + public DeclarativeSingleValidationTest setFluentSingleValidation(FluentSingleValidation value) { this.fluentSingleValidation = value; return this; } + private static Object responseType = EmptyResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class DummyTypes + { + public ArrayList helloResponses = null; + public ArrayList listResult = null; + public ArrayList arrayResult = null; + public CancelRequest cancelRequest = null; + public CancelRequestResponse cancelRequestResponse = null; + public UpdateEventSubscriber updateEventSubscriber = null; + public UpdateEventSubscriberResponse updateEventSubscriberResponse = null; + public GetApiKeys getApiKeys = null; + public GetApiKeysResponse getApiKeysResponse = null; + public RegenerateApiKeys regenerateApiKeys = null; + public RegenerateApiKeysResponse regenerateApiKeysResponse = null; + public UserApiKey userApiKey = null; + public ConvertSessionToToken convertSessionToToken = null; + public ConvertSessionToTokenResponse convertSessionToTokenResponse = null; + public GetAccessToken getAccessToken = null; + public GetAccessTokenResponse getAccessTokenResponse = null; + public NavItem navItem = null; + public GetNavItems getNavItems = null; + public GetNavItemsResponse getNavItemsResponse = null; + public EmptyResponse emptyResponse = null; + public IdResponse idResponse = null; + public StringResponse stringResponse = null; + public StringsResponse stringsResponse = null; + public AuditBase auditBase = null; + + public ArrayList getHelloResponses() { return helloResponses; } + public DummyTypes setHelloResponses(ArrayList value) { this.helloResponses = value; return this; } + public ArrayList getListResult() { return listResult; } + public DummyTypes setListResult(ArrayList value) { this.listResult = value; return this; } + public ArrayList getArrayResult() { return arrayResult; } + public DummyTypes setArrayResult(ArrayList value) { this.arrayResult = value; return this; } + public CancelRequest getCancelRequest() { return cancelRequest; } + public DummyTypes setCancelRequest(CancelRequest value) { this.cancelRequest = value; return this; } + public CancelRequestResponse getCancelRequestResponse() { return cancelRequestResponse; } + public DummyTypes setCancelRequestResponse(CancelRequestResponse value) { this.cancelRequestResponse = value; return this; } + public UpdateEventSubscriber getUpdateEventSubscriber() { return updateEventSubscriber; } + public DummyTypes setUpdateEventSubscriber(UpdateEventSubscriber value) { this.updateEventSubscriber = value; return this; } + public UpdateEventSubscriberResponse getUpdateEventSubscriberResponse() { return updateEventSubscriberResponse; } + public DummyTypes setUpdateEventSubscriberResponse(UpdateEventSubscriberResponse value) { this.updateEventSubscriberResponse = value; return this; } + public GetApiKeys getGetApiKeys() { return getApiKeys; } + public DummyTypes setGetApiKeys(GetApiKeys value) { this.getApiKeys = value; return this; } + public GetApiKeysResponse getGetApiKeysResponse() { return getApiKeysResponse; } + public DummyTypes setGetApiKeysResponse(GetApiKeysResponse value) { this.getApiKeysResponse = value; return this; } + public RegenerateApiKeys getRegenerateApiKeys() { return regenerateApiKeys; } + public DummyTypes setRegenerateApiKeys(RegenerateApiKeys value) { this.regenerateApiKeys = value; return this; } + public RegenerateApiKeysResponse getRegenerateApiKeysResponse() { return regenerateApiKeysResponse; } + public DummyTypes setRegenerateApiKeysResponse(RegenerateApiKeysResponse value) { this.regenerateApiKeysResponse = value; return this; } + public UserApiKey getUserApiKey() { return userApiKey; } + public DummyTypes setUserApiKey(UserApiKey value) { this.userApiKey = value; return this; } + public ConvertSessionToToken getConvertSessionToToken() { return convertSessionToToken; } + public DummyTypes setConvertSessionToToken(ConvertSessionToToken value) { this.convertSessionToToken = value; return this; } + public ConvertSessionToTokenResponse getConvertSessionToTokenResponse() { return convertSessionToTokenResponse; } + public DummyTypes setConvertSessionToTokenResponse(ConvertSessionToTokenResponse value) { this.convertSessionToTokenResponse = value; return this; } + public GetAccessToken getGetAccessToken() { return getAccessToken; } + public DummyTypes setGetAccessToken(GetAccessToken value) { this.getAccessToken = value; return this; } + public GetAccessTokenResponse getGetAccessTokenResponse() { return getAccessTokenResponse; } + public DummyTypes setGetAccessTokenResponse(GetAccessTokenResponse value) { this.getAccessTokenResponse = value; return this; } + public NavItem getNavItem() { return navItem; } + public DummyTypes setNavItem(NavItem value) { this.navItem = value; return this; } + public GetNavItems getGetNavItems() { return getNavItems; } + public DummyTypes setGetNavItems(GetNavItems value) { this.getNavItems = value; return this; } + public GetNavItemsResponse getGetNavItemsResponse() { return getNavItemsResponse; } + public DummyTypes setGetNavItemsResponse(GetNavItemsResponse value) { this.getNavItemsResponse = value; return this; } + public EmptyResponse getEmptyResponse() { return emptyResponse; } + public DummyTypes setEmptyResponse(EmptyResponse value) { this.emptyResponse = value; return this; } + public IdResponse getIdResponse() { return idResponse; } + public DummyTypes setIdResponse(IdResponse value) { this.idResponse = value; return this; } + public StringResponse getStringResponse() { return stringResponse; } + public DummyTypes setStringResponse(StringResponse value) { this.stringResponse = value; return this; } + public StringsResponse getStringsResponse() { return stringsResponse; } + public DummyTypes setStringsResponse(StringsResponse value) { this.stringsResponse = value; return this; } + public AuditBase getAuditBase() { return auditBase; } + public DummyTypes setAuditBase(AuditBase value) { this.auditBase = value; return this; } + } + + @Route(Path="/throwhttperror/{Status}") + public static class ThrowHttpError + { + public Integer status = null; + public String message = null; + + public Integer getStatus() { return status; } + public ThrowHttpError setStatus(Integer value) { this.status = value; return this; } + public String getMessage() { return message; } + public ThrowHttpError setMessage(String value) { this.message = value; return this; } + } + + @Route(Path="/throw404") + // @Route(Path="/throw404/{Message}") + public static class Throw404 + { + public String message = null; + + public String getMessage() { return message; } + public Throw404 setMessage(String value) { this.message = value; return this; } + } + + @Route(Path="/throwcustom400") + // @Route(Path="/throwcustom400/{Message}") + public static class ThrowCustom400 + { + public String message = null; + + public String getMessage() { return message; } + public ThrowCustom400 setMessage(String value) { this.message = value; return this; } + } + + @Route(Path="/returncustom400") + // @Route(Path="/returncustom400/{Message}") + public static class ReturnCustom400 implements IReturn + { + public String message = null; + + public String getMessage() { return message; } + public ReturnCustom400 setMessage(String value) { this.message = value; return this; } + private static Object responseType = ReturnCustom400Response.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/throw/{Type}") + public static class ThrowType implements IReturn + { + public String type = null; + public String message = null; + + public String getType() { return type; } + public ThrowType setType(String value) { this.type = value; return this; } + public String getMessage() { return message; } + public ThrowType setMessage(String value) { this.message = value; return this; } + private static Object responseType = ThrowTypeResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/throwvalidation") + public static class ThrowValidation implements IReturn + { + public Integer age = null; + public String required = null; + public String email = null; + + public Integer getAge() { return age; } + public ThrowValidation setAge(Integer value) { this.age = value; return this; } + public String getRequired() { return required; } + public ThrowValidation setRequired(String value) { this.required = value; return this; } + public String getEmail() { return email; } + public ThrowValidation setEmail(String value) { this.email = value; return this; } + private static Object responseType = ThrowValidationResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/throwbusinesserror") + public static class ThrowBusinessError implements IReturn + { + + private static Object responseType = ThrowBusinessErrorResponse.class; + public Object getResponseType() { return responseType; } + } + + /** + * Convert speech to text + */ + @Api(Description="Convert speech to text") + public static class SpeechToText implements IReturn, IGeneration + { + /** + * The audio stream containing the speech to be transcribed + */ + @ApiMember(Description="The audio stream containing the speech to be transcribed") + @Required() + public InputStream audio = null; + + /** + * Optional client-provided identifier for the request + */ + @ApiMember(Description="Optional client-provided identifier for the request") + public String refId = null; + + /** + * Tag to identify the request + */ + @ApiMember(Description="Tag to identify the request") + public String tag = null; + + public InputStream getAudio() { return audio; } + public SpeechToText setAudio(InputStream value) { this.audio = value; return this; } + public String getRefId() { return refId; } + public SpeechToText setRefId(String value) { this.refId = value; return this; } + public String getTag() { return tag; } + public SpeechToText setTag(String value) { this.tag = value; return this; } + private static Object responseType = GenerationResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class TestFileUploads implements IReturn + { + public Integer id = null; + public String refId = null; + + public Integer getId() { return id; } + public TestFileUploads setId(Integer value) { this.id = value; return this; } + public String getRefId() { return refId; } + public TestFileUploads setRefId(String value) { this.refId = value; return this; } + private static Object responseType = TestFileUploadsResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class RootPathRoutes + { + public String path = null; + + public String getPath() { return path; } + public RootPathRoutes setPath(String value) { this.path = value; return this; } + } + + public static class GetAccount implements IReturn + { + public String account = null; + + public String getAccount() { return account; } + public GetAccount setAccount(String value) { this.account = value; return this; } + private static Object responseType = Account.class; + public Object getResponseType() { return responseType; } + } + + public static class GetProject implements IReturn + { + public String account = null; + public String project = null; + + public String getAccount() { return account; } + public GetProject setAccount(String value) { this.account = value; return this; } + public String getProject() { return project; } + public GetProject setProject(String value) { this.project = value; return this; } + private static Object responseType = Project.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/image-stream") + public static class ImageAsStream implements IReturn + { + public String format = null; + + public String getFormat() { return format; } + public ImageAsStream setFormat(String value) { this.format = value; return this; } + private static Object responseType = InputStream.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/image-bytes") + public static class ImageAsBytes implements IReturn + { + public String format = null; + + public String getFormat() { return format; } + public ImageAsBytes setFormat(String value) { this.format = value; return this; } + private static Object responseType = byte[].class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/image-custom") + public static class ImageAsCustomResult implements IReturn + { + public String format = null; + + public String getFormat() { return format; } + public ImageAsCustomResult setFormat(String value) { this.format = value; return this; } + private static Object responseType = byte[].class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/image-response") + public static class ImageWriteToResponse implements IReturn + { + public String format = null; + + public String getFormat() { return format; } + public ImageWriteToResponse setFormat(String value) { this.format = value; return this; } + private static Object responseType = byte[].class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/image-file") + public static class ImageAsFile implements IReturn + { + public String format = null; + + public String getFormat() { return format; } + public ImageAsFile setFormat(String value) { this.format = value; return this; } + private static Object responseType = byte[].class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/image-redirect") + public static class ImageAsRedirect + { + public String format = null; + + public String getFormat() { return format; } + public ImageAsRedirect setFormat(String value) { this.format = value; return this; } + } + + @Route(Path="/hello-image/{Name}") + public static class HelloImage implements IReturn + { + public String name = null; + public String format = null; + public Integer width = null; + public Integer height = null; + public Integer fontSize = null; + public String fontFamily = null; + public String foreground = null; + public String background = null; + + public String getName() { return name; } + public HelloImage setName(String value) { this.name = value; return this; } + public String getFormat() { return format; } + public HelloImage setFormat(String value) { this.format = value; return this; } + public Integer getWidth() { return width; } + public HelloImage setWidth(Integer value) { this.width = value; return this; } + public Integer getHeight() { return height; } + public HelloImage setHeight(Integer value) { this.height = value; return this; } + public Integer getFontSize() { return fontSize; } + public HelloImage setFontSize(Integer value) { this.fontSize = value; return this; } + public String getFontFamily() { return fontFamily; } + public HelloImage setFontFamily(String value) { this.fontFamily = value; return this; } + public String getForeground() { return foreground; } + public HelloImage setForeground(String value) { this.foreground = value; return this; } + public String getBackground() { return background; } + public HelloImage setBackground(String value) { this.background = value; return this; } + private static Object responseType = byte[].class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/secured") + @ValidateRequest(Validator="IsAuthenticated") + public static class Secured implements IReturn + { + public String name = null; + + public String getName() { return name; } + public Secured setName(String value) { this.name = value; return this; } + private static Object responseType = SecuredResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/jwt") + public static class CreateJwt extends AuthUserSession implements IReturn + { + public Date jwtExpiry = null; + + public Date getJwtExpiry() { return jwtExpiry; } + public CreateJwt setJwtExpiry(Date value) { this.jwtExpiry = value; return this; } + private static Object responseType = CreateJwtResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/jwt-refresh") + public static class CreateRefreshJwt implements IReturn + { + public String userAuthId = null; + public Date jwtExpiry = null; + + public String getUserAuthId() { return userAuthId; } + public CreateRefreshJwt setUserAuthId(String value) { this.userAuthId = value; return this; } + public Date getJwtExpiry() { return jwtExpiry; } + public CreateRefreshJwt setJwtExpiry(Date value) { this.jwtExpiry = value; return this; } + private static Object responseType = CreateRefreshJwtResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/jwt-invalidate") + public static class InvalidateLastAccessToken implements IReturn + { + + private static Object responseType = EmptyResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/logs") + public static class ViewLogs implements IReturn + { + public Boolean clear = null; + + public Boolean isClear() { return clear; } + public ViewLogs setClear(Boolean value) { this.clear = value; return this; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/metadatatest") + public static class MetadataTest implements IReturn + { + public Integer id = null; + + public Integer getId() { return id; } + public MetadataTest setId(Integer value) { this.id = value; return this; } + private static Object responseType = MetadataTestResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/metadatatest-array") + public static class MetadataTestArray implements IReturn> + { + public Integer id = null; + + public Integer getId() { return id; } + public MetadataTestArray setId(Integer value) { this.id = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route(Path="/example", Verbs="GET") + @DataContract + public static class GetExample implements IReturn + { + + private static Object responseType = GetExampleResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/messages/{Id}", Verbs="GET") + public static class RequestMessage implements IReturn + { + public Integer id = null; + + public Integer getId() { return id; } + public RequestMessage setId(Integer value) { this.id = value; return this; } + private static Object responseType = Message.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/messages/{Id}", Verbs="PUT") + public static class Message implements IReturn + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public Message setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public Message setName(String value) { this.name = value; return this; } + private static Object responseType = Message.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/randomids") + public static class GetRandomIds implements IReturn + { + public Integer take = null; + + public Integer getTake() { return take; } + public GetRandomIds setTake(Integer value) { this.take = value; return this; } + private static Object responseType = GetRandomIdsResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/textfile-test") + public static class TextFileTest + { + public Boolean asAttachment = null; + + public Boolean isAsAttachment() { return asAttachment; } + public TextFileTest setAsAttachment(Boolean value) { this.asAttachment = value; return this; } + } + + @Route(Path="/return/text") + public static class ReturnText + { + public String text = null; + + public String getText() { return text; } + public ReturnText setText(String value) { this.text = value; return this; } + } + + @Route(Path="/return/html") + public static class ReturnHtml + { + public String text = null; + + public String getText() { return text; } + public ReturnHtml setText(String value) { this.text = value; return this; } + } + + @Route(Path="/hello") + // @Route(Path="/hello/{Name}") + public static class Hello implements IReturn + { + @Required() + public String name = null; + + public String title = null; + + public String getName() { return name; } + public Hello setName(String value) { this.name = value; return this; } + public String getTitle() { return title; } + public Hello setTitle(String value) { this.title = value; return this; } + private static Object responseType = HelloResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/hello-secure/{Name}") + @ValidateRequest(Validator="IsAuthenticated") + public static class HelloSecure implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloSecure setName(String value) { this.name = value; return this; } + private static Object responseType = HelloResponse.class; + public Object getResponseType() { return responseType; } + } + + /** + * Description on HelloAll type + */ + @DataContract + public static class HelloAnnotated implements IReturn + { + @DataMember + public String name = null; + + public String getName() { return name; } + public HelloAnnotated setName(String value) { this.name = value; return this; } + private static Object responseType = HelloAnnotatedResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloWithNestedClass implements IReturn + { + public String name = null; + public NestedClass nestedClassProp = null; + + public String getName() { return name; } + public HelloWithNestedClass setName(String value) { this.name = value; return this; } + public NestedClass getNestedClassProp() { return nestedClassProp; } + public HelloWithNestedClass setNestedClassProp(NestedClass value) { this.nestedClassProp = value; return this; } + private static Object responseType = HelloResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloList implements IReturn> + { + public ArrayList names = null; + + public ArrayList getNames() { return names; } + public HelloList setNames(ArrayList value) { this.names = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class HelloArray implements IReturn> + { + public ArrayList names = null; + + public ArrayList getNames() { return names; } + public HelloArray setNames(ArrayList value) { this.names = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class HelloMap implements IReturn> + { + public ArrayList names = null; + + public ArrayList getNames() { return names; } + public HelloMap setNames(ArrayList value) { this.names = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class HelloQueryResponse implements IReturn> + { + public ArrayList names = null; + + public ArrayList getNames() { return names; } + public HelloQueryResponse setNames(ArrayList value) { this.names = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class HelloWithEnum + { + public EnumType enumProp = null; + public EnumTypeFlags enumTypeFlags = null; + public EnumWithValues enumWithValues = null; + public EnumType nullableEnumProp = null; + public EnumFlags enumFlags = null; + public EnumAsInt enumAsInt = null; + public EnumStyle enumStyle = null; + public EnumStyleMembers enumStyleMembers = null; + + public EnumType getEnumProp() { return enumProp; } + public HelloWithEnum setEnumProp(EnumType value) { this.enumProp = value; return this; } + public EnumTypeFlags getEnumTypeFlags() { return enumTypeFlags; } + public HelloWithEnum setEnumTypeFlags(EnumTypeFlags value) { this.enumTypeFlags = value; return this; } + public EnumWithValues getEnumWithValues() { return enumWithValues; } + public HelloWithEnum setEnumWithValues(EnumWithValues value) { this.enumWithValues = value; return this; } + public EnumType getNullableEnumProp() { return nullableEnumProp; } + public HelloWithEnum setNullableEnumProp(EnumType value) { this.nullableEnumProp = value; return this; } + public EnumFlags getEnumFlags() { return enumFlags; } + public HelloWithEnum setEnumFlags(EnumFlags value) { this.enumFlags = value; return this; } + public EnumAsInt getEnumAsInt() { return enumAsInt; } + public HelloWithEnum setEnumAsInt(EnumAsInt value) { this.enumAsInt = value; return this; } + public EnumStyle getEnumStyle() { return enumStyle; } + public HelloWithEnum setEnumStyle(EnumStyle value) { this.enumStyle = value; return this; } + public EnumStyleMembers getEnumStyleMembers() { return enumStyleMembers; } + public HelloWithEnum setEnumStyleMembers(EnumStyleMembers value) { this.enumStyleMembers = value; return this; } + } + + public static class HelloWithEnumList + { + public ArrayList enumProp = null; + public ArrayList enumWithValues = null; + public ArrayList nullableEnumProp = null; + public ArrayList enumFlags = null; + public ArrayList enumStyle = null; + + public ArrayList getEnumProp() { return enumProp; } + public HelloWithEnumList setEnumProp(ArrayList value) { this.enumProp = value; return this; } + public ArrayList getEnumWithValues() { return enumWithValues; } + public HelloWithEnumList setEnumWithValues(ArrayList value) { this.enumWithValues = value; return this; } + public ArrayList getNullableEnumProp() { return nullableEnumProp; } + public HelloWithEnumList setNullableEnumProp(ArrayList value) { this.nullableEnumProp = value; return this; } + public ArrayList getEnumFlags() { return enumFlags; } + public HelloWithEnumList setEnumFlags(ArrayList value) { this.enumFlags = value; return this; } + public ArrayList getEnumStyle() { return enumStyle; } + public HelloWithEnumList setEnumStyle(ArrayList value) { this.enumStyle = value; return this; } + } + + public static class HelloWithEnumMap + { + public HashMap enumProp = null; + public HashMap enumWithValues = null; + public HashMap nullableEnumProp = null; + public HashMap enumFlags = null; + public HashMap enumStyle = null; + + public HashMap getEnumProp() { return enumProp; } + public HelloWithEnumMap setEnumProp(HashMap value) { this.enumProp = value; return this; } + public HashMap getEnumWithValues() { return enumWithValues; } + public HelloWithEnumMap setEnumWithValues(HashMap value) { this.enumWithValues = value; return this; } + public HashMap getNullableEnumProp() { return nullableEnumProp; } + public HelloWithEnumMap setNullableEnumProp(HashMap value) { this.nullableEnumProp = value; return this; } + public HashMap getEnumFlags() { return enumFlags; } + public HelloWithEnumMap setEnumFlags(HashMap value) { this.enumFlags = value; return this; } + public HashMap getEnumStyle() { return enumStyle; } + public HelloWithEnumMap setEnumStyle(HashMap value) { this.enumStyle = value; return this; } + } + + public static class RestrictedAttributes + { + public Integer id = null; + public String name = null; + public Hello hello = null; + + public Integer getId() { return id; } + public RestrictedAttributes setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public RestrictedAttributes setName(String value) { this.name = value; return this; } + public Hello getHello() { return hello; } + public RestrictedAttributes setHello(Hello value) { this.hello = value; return this; } + } + + /** + * AllowedAttributes Description + */ + @Route(Path="/allowed-attributes", Verbs="GET") + @Api(Description="AllowedAttributes Description") + @ApiResponse(Description="Your request was not understood", StatusCode=400) + @DataContract + public static class AllowedAttributes + { + /** + * Range Description + */ + @DataMember(Name="Aliased") + @SerializedName("Aliased") + @ApiMember(DataType="double", Description="Range Description", IsRequired=true, ParameterType="path") + public Double range = null; + + public Double getRange() { return range; } + public AllowedAttributes setRange(Double value) { this.range = value; return this; } + } + + @Route(Path="/all-types") + public static class HelloAllTypes implements IReturn + { + public String name = null; + public AllTypes allTypes = null; + public AllCollectionTypes allCollectionTypes = null; + + public String getName() { return name; } + public HelloAllTypes setName(String value) { this.name = value; return this; } + public AllTypes getAllTypes() { return allTypes; } + public HelloAllTypes setAllTypes(AllTypes value) { this.allTypes = value; return this; } + public AllCollectionTypes getAllCollectionTypes() { return allCollectionTypes; } + public HelloAllTypes setAllCollectionTypes(AllCollectionTypes value) { this.allCollectionTypes = value; return this; } + private static Object responseType = HelloAllTypesResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloSubAllTypes extends AllTypesBase implements IReturn + { + public Integer hierarchy = null; + + public Integer getHierarchy() { return hierarchy; } + public HelloSubAllTypes setHierarchy(Integer value) { this.hierarchy = value; return this; } + private static Object responseType = SubAllTypes.class; + public Object getResponseType() { return responseType; } + } + + public static class AllTypes implements IReturn + { + public Integer id = null; + public Integer nullableId = null; + @SerializedName("byte") public Short Byte = null; + @SerializedName("short") public Short Short = null; + @SerializedName("int") public Integer Int = null; + @SerializedName("long") public Long Long = null; + public Integer uShort = null; + public Long uInt = null; + public BigInteger uLong = null; + @SerializedName("float") public Float Float = null; + @SerializedName("double") public Double Double = null; + public BigDecimal decimal = null; + public String string = null; + public Date dateTime = null; + public TimeSpan timeSpan = null; + public Date dateTimeOffset = null; + public UUID guid = null; + @SerializedName("char") public String Char = null; + public KeyValuePair keyValuePair = null; + public Date nullableDateTime = null; + public TimeSpan nullableTimeSpan = null; + public ArrayList stringList = null; + public ArrayList stringArray = null; + public HashMap stringMap = null; + public HashMap intStringMap = null; + public SubType subType = null; + + public Integer getId() { return id; } + public AllTypes setId(Integer value) { this.id = value; return this; } + public Integer getNullableId() { return nullableId; } + public AllTypes setNullableId(Integer value) { this.nullableId = value; return this; } + public Short getByte() { return Byte; } + public AllTypes setByte(Short value) { this.Byte = value; return this; } + public Short getShort() { return Short; } + public AllTypes setShort(Short value) { this.Short = value; return this; } + public Integer getInt() { return Int; } + public AllTypes setInt(Integer value) { this.Int = value; return this; } + public Long getLong() { return Long; } + public AllTypes setLong(Long value) { this.Long = value; return this; } + public Integer getUShort() { return uShort; } + public AllTypes setUShort(Integer value) { this.uShort = value; return this; } + public Long getUInt() { return uInt; } + public AllTypes setUInt(Long value) { this.uInt = value; return this; } + public BigInteger getULong() { return uLong; } + public AllTypes setULong(BigInteger value) { this.uLong = value; return this; } + public Float getFloat() { return Float; } + public AllTypes setFloat(Float value) { this.Float = value; return this; } + public Double getDouble() { return Double; } + public AllTypes setDouble(Double value) { this.Double = value; return this; } + public BigDecimal getDecimal() { return decimal; } + public AllTypes setDecimal(BigDecimal value) { this.decimal = value; return this; } + public String getString() { return string; } + public AllTypes setString(String value) { this.string = value; return this; } + public Date getDateTime() { return dateTime; } + public AllTypes setDateTime(Date value) { this.dateTime = value; return this; } + public TimeSpan getTimeSpan() { return timeSpan; } + public AllTypes setTimeSpan(TimeSpan value) { this.timeSpan = value; return this; } + public Date getDateTimeOffset() { return dateTimeOffset; } + public AllTypes setDateTimeOffset(Date value) { this.dateTimeOffset = value; return this; } + public UUID getGuid() { return guid; } + public AllTypes setGuid(UUID value) { this.guid = value; return this; } + public String getChar() { return Char; } + public AllTypes setChar(String value) { this.Char = value; return this; } + public KeyValuePair getKeyValuePair() { return keyValuePair; } + public AllTypes setKeyValuePair(KeyValuePair value) { this.keyValuePair = value; return this; } + public Date getNullableDateTime() { return nullableDateTime; } + public AllTypes setNullableDateTime(Date value) { this.nullableDateTime = value; return this; } + public TimeSpan getNullableTimeSpan() { return nullableTimeSpan; } + public AllTypes setNullableTimeSpan(TimeSpan value) { this.nullableTimeSpan = value; return this; } + public ArrayList getStringList() { return stringList; } + public AllTypes setStringList(ArrayList value) { this.stringList = value; return this; } + public ArrayList getStringArray() { return stringArray; } + public AllTypes setStringArray(ArrayList value) { this.stringArray = value; return this; } + public HashMap getStringMap() { return stringMap; } + public AllTypes setStringMap(HashMap value) { this.stringMap = value; return this; } + public HashMap getIntStringMap() { return intStringMap; } + public AllTypes setIntStringMap(HashMap value) { this.intStringMap = value; return this; } + public SubType getSubType() { return subType; } + public AllTypes setSubType(SubType value) { this.subType = value; return this; } + private static Object responseType = AllTypes.class; + public Object getResponseType() { return responseType; } + } + + public static class AllCollectionTypes implements IReturn + { + public ArrayList intArray = null; + public ArrayList intList = null; + public ArrayList stringArray = null; + public ArrayList stringList = null; + public ArrayList floatArray = null; + public ArrayList doubleList = null; + public byte[] byteArray = null; + public ArrayList charArray = null; + public ArrayList decimalList = null; + public ArrayList pocoArray = null; + public ArrayList pocoList = null; + public HashMap> pocoLookup = null; + public HashMap>> pocoLookupMap = null; + + public ArrayList getIntArray() { return intArray; } + public AllCollectionTypes setIntArray(ArrayList value) { this.intArray = value; return this; } + public ArrayList getIntList() { return intList; } + public AllCollectionTypes setIntList(ArrayList value) { this.intList = value; return this; } + public ArrayList getStringArray() { return stringArray; } + public AllCollectionTypes setStringArray(ArrayList value) { this.stringArray = value; return this; } + public ArrayList getStringList() { return stringList; } + public AllCollectionTypes setStringList(ArrayList value) { this.stringList = value; return this; } + public ArrayList getFloatArray() { return floatArray; } + public AllCollectionTypes setFloatArray(ArrayList value) { this.floatArray = value; return this; } + public ArrayList getDoubleList() { return doubleList; } + public AllCollectionTypes setDoubleList(ArrayList value) { this.doubleList = value; return this; } + public byte[] getByteArray() { return byteArray; } + public AllCollectionTypes setByteArray(byte[] value) { this.byteArray = value; return this; } + public ArrayList getCharArray() { return charArray; } + public AllCollectionTypes setCharArray(ArrayList value) { this.charArray = value; return this; } + public ArrayList getDecimalList() { return decimalList; } + public AllCollectionTypes setDecimalList(ArrayList value) { this.decimalList = value; return this; } + public ArrayList getPocoArray() { return pocoArray; } + public AllCollectionTypes setPocoArray(ArrayList value) { this.pocoArray = value; return this; } + public ArrayList getPocoList() { return pocoList; } + public AllCollectionTypes setPocoList(ArrayList value) { this.pocoList = value; return this; } + public HashMap> getPocoLookup() { return pocoLookup; } + public AllCollectionTypes setPocoLookup(HashMap> value) { this.pocoLookup = value; return this; } + public HashMap>> getPocoLookupMap() { return pocoLookupMap; } + public AllCollectionTypes setPocoLookupMap(HashMap>> value) { this.pocoLookupMap = value; return this; } + private static Object responseType = AllCollectionTypes.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloString implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloString setName(String value) { this.name = value; return this; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloDateTime implements IReturn + { + public Date dateTime = null; + + public Date getDateTime() { return dateTime; } + public HelloDateTime setDateTime(Date value) { this.dateTime = value; return this; } + private static Object responseType = HelloDateTime.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloVoid + { + public String name = null; + + public String getName() { return name; } + public HelloVoid setName(String value) { this.name = value; return this; } + } + + @DataContract + public static class HelloWithDataContract implements IReturn + { + @DataMember(Name="name", Order=1, IsRequired=true, EmitDefaultValue=false) + @SerializedName("name") + public String name = null; + + @DataMember(Name="id", Order=2, EmitDefaultValue=false) + @SerializedName("id") + public Integer id = null; + + public String getName() { return name; } + public HelloWithDataContract setName(String value) { this.name = value; return this; } + public Integer getId() { return id; } + public HelloWithDataContract setId(Integer value) { this.id = value; return this; } + private static Object responseType = HelloWithDataContractResponse.class; + public Object getResponseType() { return responseType; } + } + + /** + * Description on HelloWithDescription type + */ + public static class HelloWithDescription implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloWithDescription setName(String value) { this.name = value; return this; } + private static Object responseType = HelloWithDescriptionResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloWithInheritance extends HelloBase implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloWithInheritance setName(String value) { this.name = value; return this; } + private static Object responseType = HelloWithInheritanceResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloWithGenericInheritance extends HelloBase_1 + { + public String result = null; + + public String getResult() { return result; } + public HelloWithGenericInheritance setResult(String value) { this.result = value; return this; } + } + + public static class HelloWithGenericInheritance2 extends HelloBase_1 + { + public String result = null; + + public String getResult() { return result; } + public HelloWithGenericInheritance2 setResult(String value) { this.result = value; return this; } + } + + public static class HelloWithReturn implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloWithReturn setName(String value) { this.name = value; return this; } + private static Object responseType = HelloWithAlternateReturnResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/helloroute") + public static class HelloWithRoute implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloWithRoute setName(String value) { this.name = value; return this; } + private static Object responseType = HelloWithRouteResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloWithType implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloWithType setName(String value) { this.name = value; return this; } + private static Object responseType = HelloWithTypeResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloInterface + { + public IPoco poco = null; + public IEmptyInterface emptyInterface = null; + public EmptyClass emptyClass = null; + + public IPoco getPoco() { return poco; } + public HelloInterface setPoco(IPoco value) { this.poco = value; return this; } + public IEmptyInterface getEmptyInterface() { return emptyInterface; } + public HelloInterface setEmptyInterface(IEmptyInterface value) { this.emptyInterface = value; return this; } + public EmptyClass getEmptyClass() { return emptyClass; } + public HelloInterface setEmptyClass(EmptyClass value) { this.emptyClass = value; return this; } + } + + public static class HelloInnerTypes implements IReturn + { + + private static Object responseType = HelloInnerTypesResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloBuiltin + { + public DayOfWeek dayOfWeek = null; + + public DayOfWeek getDayOfWeek() { return dayOfWeek; } + public HelloBuiltin setDayOfWeek(DayOfWeek value) { this.dayOfWeek = value; return this; } + } + + public static class HelloGet implements IReturn, IGet + { + public Integer id = null; + + public Integer getId() { return id; } + public HelloGet setId(Integer value) { this.id = value; return this; } + private static Object responseType = HelloVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloPost extends HelloBase implements IReturn, IPost + { + + private static Object responseType = HelloVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloPut implements IReturn, IPut + { + public Integer id = null; + + public Integer getId() { return id; } + public HelloPut setId(Integer value) { this.id = value; return this; } + private static Object responseType = HelloVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloDelete implements IReturn, IDelete + { + public Integer id = null; + + public Integer getId() { return id; } + public HelloDelete setId(Integer value) { this.id = value; return this; } + private static Object responseType = HelloVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloPatch implements IReturn, IPatch + { + public Integer id = null; + + public Integer getId() { return id; } + public HelloPatch setId(Integer value) { this.id = value; return this; } + private static Object responseType = HelloVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloReturnVoid implements IReturnVoid + { + public Integer id = null; + + public Integer getId() { return id; } + public HelloReturnVoid setId(Integer value) { this.id = value; return this; } + } + + public static class EnumRequest implements IReturn, IPut + { + public ScopeType operator = null; + + public ScopeType getOperator() { return operator; } + public EnumRequest setOperator(ScopeType value) { this.operator = value; return this; } + private static Object responseType = EnumResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/hellotypes/{Name}") + public static class HelloTypes implements IReturn + { + public String string = null; + public Boolean bool = null; + @SerializedName("int") public Integer Int = null; + + public String getString() { return string; } + public HelloTypes setString(String value) { this.string = value; return this; } + public Boolean isBool() { return bool; } + public HelloTypes setBool(Boolean value) { this.bool = value; return this; } + public Integer getInt() { return Int; } + public HelloTypes setInt(Integer value) { this.Int = value; return this; } + private static Object responseType = HelloTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/hellozip") + @DataContract + public static class HelloZip implements IReturn + { + @DataMember + public String name = null; + + @DataMember + public ArrayList test = null; + + public String getName() { return name; } + public HelloZip setName(String value) { this.name = value; return this; } + public ArrayList getTest() { return test; } + public HelloZip setTest(ArrayList value) { this.test = value; return this; } + private static Object responseType = HelloZipResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/ping") + public static class Ping implements IReturn + { + + private static Object responseType = PingResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/reset-connections") + public static class ResetConnections + { + + } + + @Route(Path="/requires-role") + public static class RequiresRole implements IReturn + { + + private static Object responseType = RequiresRoleResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/return/string") + public static class ReturnString implements IReturn + { + public String data = null; + + public String getData() { return data; } + public ReturnString setData(String value) { this.data = value; return this; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/return/bytes") + public static class ReturnBytes implements IReturn + { + public byte[] data = null; + + public byte[] getData() { return data; } + public ReturnBytes setData(byte[] value) { this.data = value; return this; } + private static Object responseType = byte[].class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/return/stream") + public static class ReturnStream implements IReturn + { + public byte[] data = null; + + public byte[] getData() { return data; } + public ReturnStream setData(byte[] value) { this.data = value; return this; } + private static Object responseType = InputStream.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/return/json") + public static class ReturnJson + { + + } + + @Route(Path="/return/json/header") + public static class ReturnJsonHeader + { + + } + + @Route(Path="/write/json") + public static class WriteJson + { + + } + + @Route(Path="/Request1", Verbs="GET") + public static class GetRequest1 implements IReturn>, IGet + { + + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route(Path="/Request2", Verbs="GET") + public static class GetRequest2 implements IReturn>, IGet + { + + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route(Path="/sendjson") + public static class SendJson implements IReturn + { + public Integer id = null; + public String name = null; + public InputStream requestStream = null; + + public Integer getId() { return id; } + public SendJson setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public SendJson setName(String value) { this.name = value; return this; } + public InputStream getRequestStream() { return requestStream; } + public SendJson setRequestStream(InputStream value) { this.requestStream = value; return this; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/sendtext") + public static class SendText implements IReturn + { + public Integer id = null; + public String name = null; + public String contentType = null; + public InputStream requestStream = null; + + public Integer getId() { return id; } + public SendText setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public SendText setName(String value) { this.name = value; return this; } + public String getContentType() { return contentType; } + public SendText setContentType(String value) { this.contentType = value; return this; } + public InputStream getRequestStream() { return requestStream; } + public SendText setRequestStream(InputStream value) { this.requestStream = value; return this; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/sendraw") + public static class SendRaw implements IReturn + { + public Integer id = null; + public String name = null; + public String contentType = null; + public InputStream requestStream = null; + + public Integer getId() { return id; } + public SendRaw setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public SendRaw setName(String value) { this.name = value; return this; } + public String getContentType() { return contentType; } + public SendRaw setContentType(String value) { this.contentType = value; return this; } + public InputStream getRequestStream() { return requestStream; } + public SendRaw setRequestStream(InputStream value) { this.requestStream = value; return this; } + private static Object responseType = byte[].class; + public Object getResponseType() { return responseType; } + } + + public static class SendDefault implements IReturn + { + public Integer id = null; + + public Integer getId() { return id; } + public SendDefault setId(Integer value) { this.id = value; return this; } + private static Object responseType = SendVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/sendrestget/{Id}", Verbs="GET") + public static class SendRestGet implements IReturn, IGet + { + public Integer id = null; + + public Integer getId() { return id; } + public SendRestGet setId(Integer value) { this.id = value; return this; } + private static Object responseType = SendVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class SendGet implements IReturn, IGet + { + public Integer id = null; + + public Integer getId() { return id; } + public SendGet setId(Integer value) { this.id = value; return this; } + private static Object responseType = SendVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class SendPost implements IReturn, IPost + { + public Integer id = null; + + public Integer getId() { return id; } + public SendPost setId(Integer value) { this.id = value; return this; } + private static Object responseType = SendVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class SendPut implements IReturn, IPut + { + public Integer id = null; + + public Integer getId() { return id; } + public SendPut setId(Integer value) { this.id = value; return this; } + private static Object responseType = SendVerbResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class SendReturnVoid implements IReturnVoid + { + public Integer id = null; + + public Integer getId() { return id; } + public SendReturnVoid setId(Integer value) { this.id = value; return this; } + } + + @Route(Path="/session") + public static class GetSession implements IReturn + { + + private static Object responseType = GetSessionResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/session/edit/{CustomName}") + public static class UpdateSession implements IReturn + { + public String customName = null; + + public String getCustomName() { return customName; } + public UpdateSession setCustomName(String value) { this.customName = value; return this; } + private static Object responseType = GetSessionResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/Stuff") + @DataContract(Namespace="http://schemas.servicestack.net/types") + public static class GetStuff implements IReturn + { + @DataMember + @ApiMember(DataType="DateTime", Name="Summary Date") + public Date summaryDate = null; + + @DataMember + @ApiMember(DataType="DateTime", Name="Summary End Date") + public Date summaryEndDate = null; + + @DataMember + @ApiMember(DataType="string", Name="Symbol") + public String symbol = null; + + @DataMember + @ApiMember(DataType="string", Name="Email") + public String email = null; + + @DataMember + @ApiMember(DataType="bool", Name="Is Enabled") + public Boolean isEnabled = null; + + public Date getSummaryDate() { return summaryDate; } + public GetStuff setSummaryDate(Date value) { this.summaryDate = value; return this; } + public Date getSummaryEndDate() { return summaryEndDate; } + public GetStuff setSummaryEndDate(Date value) { this.summaryEndDate = value; return this; } + public String getSymbol() { return symbol; } + public GetStuff setSymbol(String value) { this.symbol = value; return this; } + public String getEmail() { return email; } + public GetStuff setEmail(String value) { this.email = value; return this; } + public Boolean getIsEnabled() { return isEnabled; } + public GetStuff setIsEnabled(Boolean value) { this.isEnabled = value; return this; } + private static Object responseType = GetStuffResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class StoreLogs implements IReturn + { + public ArrayList loggers = null; + + public ArrayList getLoggers() { return loggers; } + public StoreLogs setLoggers(ArrayList value) { this.loggers = value; return this; } + private static Object responseType = StoreLogsResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class HelloAuth implements IReturn + { + public String name = null; + + public String getName() { return name; } + public HelloAuth setName(String value) { this.name = value; return this; } + private static Object responseType = HelloResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/testauth") + public static class TestAuth implements IReturn + { + + private static Object responseType = TestAuthResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class RequiresAdmin implements IReturn + { + public Integer id = null; + + public Integer getId() { return id; } + public RequiresAdmin setId(Integer value) { this.id = value; return this; } + private static Object responseType = RequiresAdmin.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/testdata/AllTypes") + public static class TestDataAllTypes implements IReturn + { + + private static Object responseType = AllTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/testdata/AllCollectionTypes") + public static class TestDataAllCollectionTypes implements IReturn + { + + private static Object responseType = AllCollectionTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/custom") + // @Route(Path="/custom/{Data}") + public static class CustomRoute implements IReturn + { + public String data = null; + + public String getData() { return data; } + public CustomRoute setData(String value) { this.data = value; return this; } + private static Object responseType = CustomRoute.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/void-response") + public static class TestVoidResponse + { + + } + + @Route(Path="/null-response") + public static class TestNullResponse + { + + } + + @Route(Path="/wait/{ForMs}") + public static class Wait implements IReturn + { + public Integer forMs = null; + + public Integer getForMs() { return forMs; } + public Wait setForMs(Integer value) { this.forMs = value; return this; } + private static Object responseType = Wait.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/echo/types") + public static class EchoTypes implements IReturn + { + @SerializedName("byte") public Short Byte = null; + @SerializedName("short") public Short Short = null; + @SerializedName("int") public Integer Int = null; + @SerializedName("long") public Long Long = null; + public Integer uShort = null; + public Long uInt = null; + public BigInteger uLong = null; + @SerializedName("float") public Float Float = null; + @SerializedName("double") public Double Double = null; + public BigDecimal decimal = null; + public String string = null; + public Date dateTime = null; + public TimeSpan timeSpan = null; + public Date dateTimeOffset = null; + public UUID guid = null; + @SerializedName("char") public String Char = null; + + public Short getByte() { return Byte; } + public EchoTypes setByte(Short value) { this.Byte = value; return this; } + public Short getShort() { return Short; } + public EchoTypes setShort(Short value) { this.Short = value; return this; } + public Integer getInt() { return Int; } + public EchoTypes setInt(Integer value) { this.Int = value; return this; } + public Long getLong() { return Long; } + public EchoTypes setLong(Long value) { this.Long = value; return this; } + public Integer getUShort() { return uShort; } + public EchoTypes setUShort(Integer value) { this.uShort = value; return this; } + public Long getUInt() { return uInt; } + public EchoTypes setUInt(Long value) { this.uInt = value; return this; } + public BigInteger getULong() { return uLong; } + public EchoTypes setULong(BigInteger value) { this.uLong = value; return this; } + public Float getFloat() { return Float; } + public EchoTypes setFloat(Float value) { this.Float = value; return this; } + public Double getDouble() { return Double; } + public EchoTypes setDouble(Double value) { this.Double = value; return this; } + public BigDecimal getDecimal() { return decimal; } + public EchoTypes setDecimal(BigDecimal value) { this.decimal = value; return this; } + public String getString() { return string; } + public EchoTypes setString(String value) { this.string = value; return this; } + public Date getDateTime() { return dateTime; } + public EchoTypes setDateTime(Date value) { this.dateTime = value; return this; } + public TimeSpan getTimeSpan() { return timeSpan; } + public EchoTypes setTimeSpan(TimeSpan value) { this.timeSpan = value; return this; } + public Date getDateTimeOffset() { return dateTimeOffset; } + public EchoTypes setDateTimeOffset(Date value) { this.dateTimeOffset = value; return this; } + public UUID getGuid() { return guid; } + public EchoTypes setGuid(UUID value) { this.guid = value; return this; } + public String getChar() { return Char; } + public EchoTypes setChar(String value) { this.Char = value; return this; } + private static Object responseType = EchoTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/echo/collections") + public static class EchoCollections implements IReturn + { + public ArrayList stringList = null; + public ArrayList stringArray = null; + public HashMap stringMap = null; + public HashMap intStringMap = null; + + public ArrayList getStringList() { return stringList; } + public EchoCollections setStringList(ArrayList value) { this.stringList = value; return this; } + public ArrayList getStringArray() { return stringArray; } + public EchoCollections setStringArray(ArrayList value) { this.stringArray = value; return this; } + public HashMap getStringMap() { return stringMap; } + public EchoCollections setStringMap(HashMap value) { this.stringMap = value; return this; } + public HashMap getIntStringMap() { return intStringMap; } + public EchoCollections setIntStringMap(HashMap value) { this.intStringMap = value; return this; } + private static Object responseType = EchoCollections.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/echo/complex") + public static class EchoComplexTypes implements IReturn + { + public SubType subType = null; + public ArrayList subTypes = null; + public HashMap subTypeMap = null; + public HashMap stringMap = null; + public HashMap intStringMap = null; + + public SubType getSubType() { return subType; } + public EchoComplexTypes setSubType(SubType value) { this.subType = value; return this; } + public ArrayList getSubTypes() { return subTypes; } + public EchoComplexTypes setSubTypes(ArrayList value) { this.subTypes = value; return this; } + public HashMap getSubTypeMap() { return subTypeMap; } + public EchoComplexTypes setSubTypeMap(HashMap value) { this.subTypeMap = value; return this; } + public HashMap getStringMap() { return stringMap; } + public EchoComplexTypes setStringMap(HashMap value) { this.stringMap = value; return this; } + public HashMap getIntStringMap() { return intStringMap; } + public EchoComplexTypes setIntStringMap(HashMap value) { this.intStringMap = value; return this; } + private static Object responseType = EchoComplexTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/rockstars", Verbs="POST") + public static class StoreRockstars extends ArrayList implements IReturn + { + + private static Object responseType = StoreRockstars.class; + public Object getResponseType() { return responseType; } + } + + /** + * Sign Up + */ + @Route(Path="/register", Verbs="PUT,POST") + @Api(Description="Sign Up") + @DataContract + public static class Register implements IReturn, IPost + { + @DataMember(Order=1) + public String userName = null; + + @DataMember(Order=2) + public String firstName = null; + + @DataMember(Order=3) + public String lastName = null; + + @DataMember(Order=4) + public String displayName = null; + + @DataMember(Order=5) + public String email = null; + + @DataMember(Order=6) + public String password = null; + + @DataMember(Order=7) + public String confirmPassword = null; + + @DataMember(Order=8) + public Boolean autoLogin = null; + + @DataMember(Order=10) + public String errorView = null; + + @DataMember(Order=11) + public HashMap meta = null; + + public String getUserName() { return userName; } + public Register setUserName(String value) { this.userName = value; return this; } + public String getFirstName() { return firstName; } + public Register setFirstName(String value) { this.firstName = value; return this; } + public String getLastName() { return lastName; } + public Register setLastName(String value) { this.lastName = value; return this; } + public String getDisplayName() { return displayName; } + public Register setDisplayName(String value) { this.displayName = value; return this; } + public String getEmail() { return email; } + public Register setEmail(String value) { this.email = value; return this; } + public String getPassword() { return password; } + public Register setPassword(String value) { this.password = value; return this; } + public String getConfirmPassword() { return confirmPassword; } + public Register setConfirmPassword(String value) { this.confirmPassword = value; return this; } + public Boolean isAutoLogin() { return autoLogin; } + public Register setAutoLogin(Boolean value) { this.autoLogin = value; return this; } + public String getErrorView() { return errorView; } + public Register setErrorView(String value) { this.errorView = value; return this; } + public HashMap getMeta() { return meta; } + public Register setMeta(HashMap value) { this.meta = value; return this; } + private static Object responseType = RegisterResponse.class; + public Object getResponseType() { return responseType; } + } + + /** + * Sign In + */ + @Route(Path="/auth", Verbs="GET,POST") + // @Route(Path="/auth/{provider}", Verbs="GET,POST") + @Api(Description="Sign In") + @DataContract + public static class Authenticate implements IReturn, IPost + { + /** + * AuthProvider, e.g. credentials + */ + @DataMember(Order=1) + public String provider = null; + + @DataMember(Order=2) + public String userName = null; + + @DataMember(Order=3) + public String password = null; + + @DataMember(Order=4) + public Boolean rememberMe = null; + + @DataMember(Order=5) + public String accessToken = null; + + @DataMember(Order=6) + public String accessTokenSecret = null; + + @DataMember(Order=7) + public String returnUrl = null; + + @DataMember(Order=8) + public String errorView = null; + + @DataMember(Order=9) + public HashMap meta = null; + + public String getProvider() { return provider; } + public Authenticate setProvider(String value) { this.provider = value; return this; } + public String getUserName() { return userName; } + public Authenticate setUserName(String value) { this.userName = value; return this; } + public String getPassword() { return password; } + public Authenticate setPassword(String value) { this.password = value; return this; } + public Boolean isRememberMe() { return rememberMe; } + public Authenticate setRememberMe(Boolean value) { this.rememberMe = value; return this; } + public String getAccessToken() { return accessToken; } + public Authenticate setAccessToken(String value) { this.accessToken = value; return this; } + public String getAccessTokenSecret() { return accessTokenSecret; } + public Authenticate setAccessTokenSecret(String value) { this.accessTokenSecret = value; return this; } + public String getReturnUrl() { return returnUrl; } + public Authenticate setReturnUrl(String value) { this.returnUrl = value; return this; } + public String getErrorView() { return errorView; } + public Authenticate setErrorView(String value) { this.errorView = value; return this; } + public HashMap getMeta() { return meta; } + public Authenticate setMeta(HashMap value) { this.meta = value; return this; } + private static Object responseType = AuthenticateResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/assignroles", Verbs="POST") + @DataContract + public static class AssignRoles implements IReturn, IPost + { + @DataMember(Order=1) + public String userName = null; + + @DataMember(Order=2) + public ArrayList permissions = null; + + @DataMember(Order=3) + public ArrayList roles = null; + + @DataMember(Order=4) + public HashMap meta = null; + + public String getUserName() { return userName; } + public AssignRoles setUserName(String value) { this.userName = value; return this; } + public ArrayList getPermissions() { return permissions; } + public AssignRoles setPermissions(ArrayList value) { this.permissions = value; return this; } + public ArrayList getRoles() { return roles; } + public AssignRoles setRoles(ArrayList value) { this.roles = value; return this; } + public HashMap getMeta() { return meta; } + public AssignRoles setMeta(HashMap value) { this.meta = value; return this; } + private static Object responseType = AssignRolesResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/unassignroles", Verbs="POST") + @DataContract + public static class UnAssignRoles implements IReturn, IPost + { + @DataMember(Order=1) + public String userName = null; + + @DataMember(Order=2) + public ArrayList permissions = null; + + @DataMember(Order=3) + public ArrayList roles = null; + + @DataMember(Order=4) + public HashMap meta = null; + + public String getUserName() { return userName; } + public UnAssignRoles setUserName(String value) { this.userName = value; return this; } + public ArrayList getPermissions() { return permissions; } + public UnAssignRoles setPermissions(ArrayList value) { this.permissions = value; return this; } + public ArrayList getRoles() { return roles; } + public UnAssignRoles setRoles(ArrayList value) { this.roles = value; return this; } + public HashMap getMeta() { return meta; } + public UnAssignRoles setMeta(HashMap value) { this.meta = value; return this; } + private static Object responseType = UnAssignRolesResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class QueryRockstarAudit extends QueryDbTenant_2 implements IReturn> + { + public Integer id = null; + + public Integer getId() { return id; } + public QueryRockstarAudit setId(Integer value) { this.id = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class QueryRockstarAuditSubOr extends QueryDb_2 implements IReturn> + { + public String firstNameStartsWith = null; + public Integer ageOlderThan = null; + + public String getFirstNameStartsWith() { return firstNameStartsWith; } + public QueryRockstarAuditSubOr setFirstNameStartsWith(String value) { this.firstNameStartsWith = value; return this; } + public Integer getAgeOlderThan() { return ageOlderThan; } + public QueryRockstarAuditSubOr setAgeOlderThan(Integer value) { this.ageOlderThan = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class QueryPocoBase extends QueryDb_1 implements IReturn> + { + public Integer id = null; + + public Integer getId() { return id; } + public QueryPocoBase setId(Integer value) { this.id = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class QueryPocoIntoBase extends QueryDb_2 implements IReturn> + { + public Integer id = null; + + public Integer getId() { return id; } + public QueryPocoIntoBase setId(Integer value) { this.id = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route(Path="/message/query/{Id}", Verbs="GET") + public static class MessageQuery extends QueryDb_1 implements IReturn> + { + public Integer id = null; + + public Integer getId() { return id; } + public MessageQuery setId(Integer value) { this.id = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route(Path="/rockstars", Verbs="GET") + public static class QueryRockstars extends QueryDb_1 implements IReturn> + { + + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + public static class CreateRockstarAudit extends RockstarBase implements IReturn, ICreateDb + { + + private static Object responseType = RockstarWithIdResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class CreateRockstarAuditTenant extends CreateAuditTenantBase implements IReturn, IHasSessionId + { + public String sessionId = null; + public String firstName = null; + public String lastName = null; + public Integer age = null; + public Date dateOfBirth = null; + public Date dateDied = null; + public LivingStatus livingStatus = null; + + public String getSessionId() { return sessionId; } + public CreateRockstarAuditTenant setSessionId(String value) { this.sessionId = value; return this; } + public String getFirstName() { return firstName; } + public CreateRockstarAuditTenant setFirstName(String value) { this.firstName = value; return this; } + public String getLastName() { return lastName; } + public CreateRockstarAuditTenant setLastName(String value) { this.lastName = value; return this; } + public Integer getAge() { return age; } + public CreateRockstarAuditTenant setAge(Integer value) { this.age = value; return this; } + public Date getDateOfBirth() { return dateOfBirth; } + public CreateRockstarAuditTenant setDateOfBirth(Date value) { this.dateOfBirth = value; return this; } + public Date getDateDied() { return dateDied; } + public CreateRockstarAuditTenant setDateDied(Date value) { this.dateDied = value; return this; } + public LivingStatus getLivingStatus() { return livingStatus; } + public CreateRockstarAuditTenant setLivingStatus(LivingStatus value) { this.livingStatus = value; return this; } + private static Object responseType = RockstarWithIdAndResultResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class UpdateRockstarAuditTenant extends UpdateAuditTenantBase implements IReturn, IHasSessionId + { + public String sessionId = null; + public Integer id = null; + public String firstName = null; + public LivingStatus livingStatus = null; + + public String getSessionId() { return sessionId; } + public UpdateRockstarAuditTenant setSessionId(String value) { this.sessionId = value; return this; } + public Integer getId() { return id; } + public UpdateRockstarAuditTenant setId(Integer value) { this.id = value; return this; } + public String getFirstName() { return firstName; } + public UpdateRockstarAuditTenant setFirstName(String value) { this.firstName = value; return this; } + public LivingStatus getLivingStatus() { return livingStatus; } + public UpdateRockstarAuditTenant setLivingStatus(LivingStatus value) { this.livingStatus = value; return this; } + private static Object responseType = RockstarWithIdAndResultResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class PatchRockstarAuditTenant extends PatchAuditTenantBase implements IReturn, IHasSessionId + { + public String sessionId = null; + public Integer id = null; + public String firstName = null; + public LivingStatus livingStatus = null; + + public String getSessionId() { return sessionId; } + public PatchRockstarAuditTenant setSessionId(String value) { this.sessionId = value; return this; } + public Integer getId() { return id; } + public PatchRockstarAuditTenant setId(Integer value) { this.id = value; return this; } + public String getFirstName() { return firstName; } + public PatchRockstarAuditTenant setFirstName(String value) { this.firstName = value; return this; } + public LivingStatus getLivingStatus() { return livingStatus; } + public PatchRockstarAuditTenant setLivingStatus(LivingStatus value) { this.livingStatus = value; return this; } + private static Object responseType = RockstarWithIdAndResultResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class SoftDeleteAuditTenant extends SoftDeleteAuditTenantBase implements IReturn + { + public Integer id = null; + + public Integer getId() { return id; } + public SoftDeleteAuditTenant setId(Integer value) { this.id = value; return this; } + private static Object responseType = RockstarWithIdAndResultResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class CreateRockstarAuditMqToken extends RockstarBase implements IReturn, ICreateDb, IHasBearerToken + { + public String bearerToken = null; + + public String getBearerToken() { return bearerToken; } + public CreateRockstarAuditMqToken setBearerToken(String value) { this.bearerToken = value; return this; } + private static Object responseType = RockstarWithIdResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class RealDeleteAuditTenant implements IReturn, IDeleteDb, IHasSessionId + { + public String sessionId = null; + public Integer id = null; + public Integer age = null; + + public String getSessionId() { return sessionId; } + public RealDeleteAuditTenant setSessionId(String value) { this.sessionId = value; return this; } + public Integer getId() { return id; } + public RealDeleteAuditTenant setId(Integer value) { this.id = value; return this; } + public Integer getAge() { return age; } + public RealDeleteAuditTenant setAge(Integer value) { this.age = value; return this; } + private static Object responseType = RockstarWithIdAndCountResponse.class; + public Object getResponseType() { return responseType; } + } + + public static class CreateRockstarVersion extends RockstarBase implements IReturn, ICreateDb + { + + private static Object responseType = RockstarWithIdAndRowVersionResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route(Path="/messages/crud/{Id}", Verbs="PUT") + public static class MessageCrud implements IReturnVoid, ISaveDb + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public MessageCrud setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public MessageCrud setName(String value) { this.name = value; return this; } + } + + @Route(Path="/access-token") + @DataContract + public static class GetAccessToken implements IReturn, IPost + { + @DataMember(Order=1) + public String refreshToken = null; + + @DataMember(Order=2) + public HashMap meta = null; + + public String getRefreshToken() { return refreshToken; } + public GetAccessToken setRefreshToken(String value) { this.refreshToken = value; return this; } + public HashMap getMeta() { return meta; } + public GetAccessToken setMeta(HashMap value) { this.meta = value; return this; } + private static Object responseType = GetAccessTokenResponse.class; + public Object getResponseType() { return responseType; } + } + + @DataContract + public static class QueryResponse + { + @DataMember(Order=1) + public Integer offset = null; + + @DataMember(Order=2) + public Integer total = null; + + @DataMember(Order=3) + public ArrayList results = null; + + @DataMember(Order=4) + public HashMap meta = null; + + @DataMember(Order=5) + public ResponseStatus responseStatus = null; + + public Integer getOffset() { return offset; } + public QueryResponse setOffset(Integer value) { this.offset = value; return this; } + public Integer getTotal() { return total; } + public QueryResponse setTotal(Integer value) { this.total = value; return this; } + public ArrayList getResults() { return results; } + public QueryResponse setResults(ArrayList value) { this.results = value; return this; } + public HashMap getMeta() { return meta; } + public QueryResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public QueryResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class ChatMessage + { + public Long id = null; + public String channel = null; + public String fromUserId = null; + public String fromName = null; + public String displayName = null; + public String message = null; + public String userAuthId = null; + @SerializedName("private") public Boolean Private = null; + + public Long getId() { return id; } + public ChatMessage setId(Long value) { this.id = value; return this; } + public String getChannel() { return channel; } + public ChatMessage setChannel(String value) { this.channel = value; return this; } + public String getFromUserId() { return fromUserId; } + public ChatMessage setFromUserId(String value) { this.fromUserId = value; return this; } + public String getFromName() { return fromName; } + public ChatMessage setFromName(String value) { this.fromName = value; return this; } + public String getDisplayName() { return displayName; } + public ChatMessage setDisplayName(String value) { this.displayName = value; return this; } + public String getMessage() { return message; } + public ChatMessage setMessage(String value) { this.message = value; return this; } + public String getUserAuthId() { return userAuthId; } + public ChatMessage setUserAuthId(String value) { this.userAuthId = value; return this; } + public Boolean isPrivate() { return Private; } + public ChatMessage setPrivate(Boolean value) { this.Private = value; return this; } + } + + public static class GetChatHistoryResponse + { + public ArrayList results = null; + public ResponseStatus responseStatus = null; + + public ArrayList getResults() { return results; } + public GetChatHistoryResponse setResults(ArrayList value) { this.results = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public GetChatHistoryResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class GetUserDetailsResponse + { + public String provider = null; + public String userId = null; + public String userName = null; + public String fullName = null; + public String displayName = null; + public String firstName = null; + public String lastName = null; + public String company = null; + public String email = null; + public String phoneNumber = null; + public Date birthDate = null; + public String birthDateRaw = null; + public String address = null; + public String address2 = null; + public String city = null; + public String state = null; + public String country = null; + public String culture = null; + public String gender = null; + public String language = null; + public String mailAddress = null; + public String nickname = null; + public String postalCode = null; + public String timeZone = null; + + public String getProvider() { return provider; } + public GetUserDetailsResponse setProvider(String value) { this.provider = value; return this; } + public String getUserId() { return userId; } + public GetUserDetailsResponse setUserId(String value) { this.userId = value; return this; } + public String getUserName() { return userName; } + public GetUserDetailsResponse setUserName(String value) { this.userName = value; return this; } + public String getFullName() { return fullName; } + public GetUserDetailsResponse setFullName(String value) { this.fullName = value; return this; } + public String getDisplayName() { return displayName; } + public GetUserDetailsResponse setDisplayName(String value) { this.displayName = value; return this; } + public String getFirstName() { return firstName; } + public GetUserDetailsResponse setFirstName(String value) { this.firstName = value; return this; } + public String getLastName() { return lastName; } + public GetUserDetailsResponse setLastName(String value) { this.lastName = value; return this; } + public String getCompany() { return company; } + public GetUserDetailsResponse setCompany(String value) { this.company = value; return this; } + public String getEmail() { return email; } + public GetUserDetailsResponse setEmail(String value) { this.email = value; return this; } + public String getPhoneNumber() { return phoneNumber; } + public GetUserDetailsResponse setPhoneNumber(String value) { this.phoneNumber = value; return this; } + public Date getBirthDate() { return birthDate; } + public GetUserDetailsResponse setBirthDate(Date value) { this.birthDate = value; return this; } + public String getBirthDateRaw() { return birthDateRaw; } + public GetUserDetailsResponse setBirthDateRaw(String value) { this.birthDateRaw = value; return this; } + public String getAddress() { return address; } + public GetUserDetailsResponse setAddress(String value) { this.address = value; return this; } + public String getAddress2() { return address2; } + public GetUserDetailsResponse setAddress2(String value) { this.address2 = value; return this; } + public String getCity() { return city; } + public GetUserDetailsResponse setCity(String value) { this.city = value; return this; } + public String getState() { return state; } + public GetUserDetailsResponse setState(String value) { this.state = value; return this; } + public String getCountry() { return country; } + public GetUserDetailsResponse setCountry(String value) { this.country = value; return this; } + public String getCulture() { return culture; } + public GetUserDetailsResponse setCulture(String value) { this.culture = value; return this; } + public String getGender() { return gender; } + public GetUserDetailsResponse setGender(String value) { this.gender = value; return this; } + public String getLanguage() { return language; } + public GetUserDetailsResponse setLanguage(String value) { this.language = value; return this; } + public String getMailAddress() { return mailAddress; } + public GetUserDetailsResponse setMailAddress(String value) { this.mailAddress = value; return this; } + public String getNickname() { return nickname; } + public GetUserDetailsResponse setNickname(String value) { this.nickname = value; return this; } + public String getPostalCode() { return postalCode; } + public GetUserDetailsResponse setPostalCode(String value) { this.postalCode = value; return this; } + public String getTimeZone() { return timeZone; } + public GetUserDetailsResponse setTimeZone(String value) { this.timeZone = value; return this; } + } + + public static class CustomHttpErrorResponse + { + public String custom = null; + public ResponseStatus responseStatus = null; + + public String getCustom() { return custom; } + public CustomHttpErrorResponse setCustom(String value) { this.custom = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public CustomHttpErrorResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class QueryResponseAlt + { + public Integer offset = null; + public Integer total = null; + public ArrayList results = null; + public HashMap meta = null; + public ResponseStatus responseStatus = null; + + public Integer getOffset() { return offset; } + public QueryResponseAlt setOffset(Integer value) { this.offset = value; return this; } + public Integer getTotal() { return total; } + public QueryResponseAlt setTotal(Integer value) { this.total = value; return this; } + public ArrayList getResults() { return results; } + public QueryResponseAlt setResults(ArrayList value) { this.results = value; return this; } + public HashMap getMeta() { return meta; } + public QueryResponseAlt setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public QueryResponseAlt setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class Items + { + public ArrayList results = null; + + public ArrayList getResults() { return results; } + public Items setResults(ArrayList value) { this.results = value; return this; } + } + + @DataContract + public static class EmptyResponse + { + @DataMember(Order=1) + public ResponseStatus responseStatus = null; + + public ResponseStatus getResponseStatus() { return responseStatus; } + public EmptyResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class ReturnCustom400Response + { + public ResponseStatus responseStatus = null; + + public ResponseStatus getResponseStatus() { return responseStatus; } + public ReturnCustom400Response setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class ThrowTypeResponse + { + public ResponseStatus responseStatus = null; + + public ResponseStatus getResponseStatus() { return responseStatus; } + public ThrowTypeResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class ThrowValidationResponse + { + public Integer age = null; + public String required = null; + public String email = null; + public ResponseStatus responseStatus = null; + + public Integer getAge() { return age; } + public ThrowValidationResponse setAge(Integer value) { this.age = value; return this; } + public String getRequired() { return required; } + public ThrowValidationResponse setRequired(String value) { this.required = value; return this; } + public String getEmail() { return email; } + public ThrowValidationResponse setEmail(String value) { this.email = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public ThrowValidationResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class ThrowBusinessErrorResponse + { + public ResponseStatus responseStatus = null; + + public ResponseStatus getResponseStatus() { return responseStatus; } + public ThrowBusinessErrorResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + /** + * Response object for generation requests + */ + public static class GenerationResponse + { + /** + * List of generated outputs + */ + @ApiMember(Description="List of generated outputs") + public ArrayList outputs = null; + + /** + * List of generated text outputs + */ + @ApiMember(Description="List of generated text outputs") + public ArrayList textOutputs = null; + + /** + * Detailed response status information + */ + @ApiMember(Description="Detailed response status information") + public ResponseStatus responseStatus = null; + + public ArrayList getOutputs() { return outputs; } + public GenerationResponse setOutputs(ArrayList value) { this.outputs = value; return this; } + public ArrayList getTextOutputs() { return textOutputs; } + public GenerationResponse setTextOutputs(ArrayList value) { this.textOutputs = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public GenerationResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class TestFileUploadsResponse + { + public Integer id = null; + public String refId = null; + public ArrayList files = null; + public ResponseStatus responseStatus = null; + + public Integer getId() { return id; } + public TestFileUploadsResponse setId(Integer value) { this.id = value; return this; } + public String getRefId() { return refId; } + public TestFileUploadsResponse setRefId(String value) { this.refId = value; return this; } + public ArrayList getFiles() { return files; } + public TestFileUploadsResponse setFiles(ArrayList value) { this.files = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public TestFileUploadsResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class Account + { + public String name = null; + + public String getName() { return name; } + public Account setName(String value) { this.name = value; return this; } + } + + public static class Project + { + public String account = null; + public String name = null; + + public String getAccount() { return account; } + public Project setAccount(String value) { this.account = value; return this; } + public String getName() { return name; } + public Project setName(String value) { this.name = value; return this; } + } + + public static class SecuredResponse + { + public String result = null; + public ResponseStatus responseStatus = null; + + public String getResult() { return result; } + public SecuredResponse setResult(String value) { this.result = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public SecuredResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class CreateJwtResponse + { + public String token = null; + public ResponseStatus responseStatus = null; + + public String getToken() { return token; } + public CreateJwtResponse setToken(String value) { this.token = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public CreateJwtResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class CreateRefreshJwtResponse + { + public String token = null; + public ResponseStatus responseStatus = null; + + public String getToken() { return token; } + public CreateRefreshJwtResponse setToken(String value) { this.token = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public CreateRefreshJwtResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class MetadataTestResponse + { + public Integer id = null; + public ArrayList results = null; + + public Integer getId() { return id; } + public MetadataTestResponse setId(Integer value) { this.id = value; return this; } + public ArrayList getResults() { return results; } + public MetadataTestResponse setResults(ArrayList value) { this.results = value; return this; } + } + + @DataContract + public static class GetExampleResponse + { + @DataMember(Order=1) + public ResponseStatus responseStatus = null; + + @DataMember(Order=2) + @ApiMember() + public MenuExample menuExample1 = null; + + public ResponseStatus getResponseStatus() { return responseStatus; } + public GetExampleResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + public MenuExample getMenuExample1() { return menuExample1; } + public GetExampleResponse setMenuExample1(MenuExample value) { this.menuExample1 = value; return this; } + } + + public static class GetRandomIdsResponse + { + public ArrayList results = null; + + public ArrayList getResults() { return results; } + public GetRandomIdsResponse setResults(ArrayList value) { this.results = value; return this; } + } + + public static class HelloResponse + { + public String result = null; + + public String getResult() { return result; } + public HelloResponse setResult(String value) { this.result = value; return this; } + } + + /** + * Description on HelloAllResponse type + */ + @DataContract + public static class HelloAnnotatedResponse + { + @DataMember + public String result = null; + + public String getResult() { return result; } + public HelloAnnotatedResponse setResult(String value) { this.result = value; return this; } + } + + public static class HelloAllTypesResponse + { + public String result = null; + public AllTypes allTypes = null; + public AllCollectionTypes allCollectionTypes = null; + + public String getResult() { return result; } + public HelloAllTypesResponse setResult(String value) { this.result = value; return this; } + public AllTypes getAllTypes() { return allTypes; } + public HelloAllTypesResponse setAllTypes(AllTypes value) { this.allTypes = value; return this; } + public AllCollectionTypes getAllCollectionTypes() { return allCollectionTypes; } + public HelloAllTypesResponse setAllCollectionTypes(AllCollectionTypes value) { this.allCollectionTypes = value; return this; } + } + + public static class SubAllTypes extends AllTypesBase + { + public Integer hierarchy = null; + + public Integer getHierarchy() { return hierarchy; } + public SubAllTypes setHierarchy(Integer value) { this.hierarchy = value; return this; } + } + + @DataContract + public static class HelloWithDataContractResponse + { + @DataMember(Name="result", Order=1, IsRequired=true, EmitDefaultValue=false) + @SerializedName("result") + public String result = null; + + public String getResult() { return result; } + public HelloWithDataContractResponse setResult(String value) { this.result = value; return this; } + } + + /** + * Description on HelloWithDescriptionResponse type + */ + public static class HelloWithDescriptionResponse + { + public String result = null; + + public String getResult() { return result; } + public HelloWithDescriptionResponse setResult(String value) { this.result = value; return this; } + } + + public static class HelloWithInheritanceResponse extends HelloResponseBase + { + public String result = null; + + public String getResult() { return result; } + public HelloWithInheritanceResponse setResult(String value) { this.result = value; return this; } + } + + public static class HelloWithAlternateReturnResponse extends HelloWithReturnResponse + { + public String altResult = null; + + public String getAltResult() { return altResult; } + public HelloWithAlternateReturnResponse setAltResult(String value) { this.altResult = value; return this; } + } + + public static class HelloWithRouteResponse + { + public String result = null; + + public String getResult() { return result; } + public HelloWithRouteResponse setResult(String value) { this.result = value; return this; } + } + + public static class HelloWithTypeResponse + { + public HelloType result = null; + + public HelloType getResult() { return result; } + public HelloWithTypeResponse setResult(HelloType value) { this.result = value; return this; } + } + + public static class HelloInnerTypesResponse + { + public InnerType innerType = null; + public InnerEnum innerEnum = null; + + public InnerType getInnerType() { return innerType; } + public HelloInnerTypesResponse setInnerType(InnerType value) { this.innerType = value; return this; } + public InnerEnum getInnerEnum() { return innerEnum; } + public HelloInnerTypesResponse setInnerEnum(InnerEnum value) { this.innerEnum = value; return this; } + } + + public static class HelloVerbResponse + { + public String result = null; + + public String getResult() { return result; } + public HelloVerbResponse setResult(String value) { this.result = value; return this; } + } + + public static class EnumResponse + { + public ScopeType operator = null; + + public ScopeType getOperator() { return operator; } + public EnumResponse setOperator(ScopeType value) { this.operator = value; return this; } + } + + @DataContract + public static class HelloZipResponse + { + @DataMember + public String result = null; + + public String getResult() { return result; } + public HelloZipResponse setResult(String value) { this.result = value; return this; } + } + + public static class PingResponse + { + public HashMap responses = null; + public ResponseStatus responseStatus = null; + + public HashMap getResponses() { return responses; } + public PingResponse setResponses(HashMap value) { this.responses = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public PingResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class RequiresRoleResponse + { + public String result = null; + public ResponseStatus responseStatus = null; + + public String getResult() { return result; } + public RequiresRoleResponse setResult(String value) { this.result = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public RequiresRoleResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class SendVerbResponse + { + public Integer id = null; + public String pathInfo = null; + public String requestMethod = null; + + public Integer getId() { return id; } + public SendVerbResponse setId(Integer value) { this.id = value; return this; } + public String getPathInfo() { return pathInfo; } + public SendVerbResponse setPathInfo(String value) { this.pathInfo = value; return this; } + public String getRequestMethod() { return requestMethod; } + public SendVerbResponse setRequestMethod(String value) { this.requestMethod = value; return this; } + } + + public static class GetSessionResponse + { + public CustomUserSession result = null; + public UnAuthInfo unAuthInfo = null; + public ResponseStatus responseStatus = null; + + public CustomUserSession getResult() { return result; } + public GetSessionResponse setResult(CustomUserSession value) { this.result = value; return this; } + public UnAuthInfo getUnAuthInfo() { return unAuthInfo; } + public GetSessionResponse setUnAuthInfo(UnAuthInfo value) { this.unAuthInfo = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public GetSessionResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract(Namespace="http://schemas.servicestack.net/types") + public static class GetStuffResponse + { + @DataMember + public Date summaryDate = null; + + @DataMember + public Date summaryEndDate = null; + + @DataMember + public String symbol = null; + + @DataMember + public String email = null; + + @DataMember + public Boolean isEnabled = null; + + public Date getSummaryDate() { return summaryDate; } + public GetStuffResponse setSummaryDate(Date value) { this.summaryDate = value; return this; } + public Date getSummaryEndDate() { return summaryEndDate; } + public GetStuffResponse setSummaryEndDate(Date value) { this.summaryEndDate = value; return this; } + public String getSymbol() { return symbol; } + public GetStuffResponse setSymbol(String value) { this.symbol = value; return this; } + public String getEmail() { return email; } + public GetStuffResponse setEmail(String value) { this.email = value; return this; } + public Boolean getIsEnabled() { return isEnabled; } + public GetStuffResponse setIsEnabled(Boolean value) { this.isEnabled = value; return this; } + } + + public static class StoreLogsResponse + { + public ArrayList existingLogs = null; + public ResponseStatus responseStatus = null; + + public ArrayList getExistingLogs() { return existingLogs; } + public StoreLogsResponse setExistingLogs(ArrayList value) { this.existingLogs = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public StoreLogsResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class TestAuthResponse + { + public String userId = null; + public String sessionId = null; + public String userName = null; + public String displayName = null; + public ResponseStatus responseStatus = null; + + public String getUserId() { return userId; } + public TestAuthResponse setUserId(String value) { this.userId = value; return this; } + public String getSessionId() { return sessionId; } + public TestAuthResponse setSessionId(String value) { this.sessionId = value; return this; } + public String getUserName() { return userName; } + public TestAuthResponse setUserName(String value) { this.userName = value; return this; } + public String getDisplayName() { return displayName; } + public TestAuthResponse setDisplayName(String value) { this.displayName = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public TestAuthResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class RegisterResponse implements IHasSessionId, IHasBearerToken + { + @DataMember(Order=1) + public String userId = null; + + @DataMember(Order=2) + public String sessionId = null; + + @DataMember(Order=3) + public String userName = null; + + @DataMember(Order=4) + public String referrerUrl = null; + + @DataMember(Order=5) + public String bearerToken = null; + + @DataMember(Order=6) + public String refreshToken = null; + + @DataMember(Order=7) + public Date refreshTokenExpiry = null; + + @DataMember(Order=8) + public ArrayList roles = null; + + @DataMember(Order=9) + public ArrayList permissions = null; + + @DataMember(Order=10) + public String redirectUrl = null; + + @DataMember(Order=11) + public ResponseStatus responseStatus = null; + + @DataMember(Order=12) + public HashMap meta = null; + + public String getUserId() { return userId; } + public RegisterResponse setUserId(String value) { this.userId = value; return this; } + public String getSessionId() { return sessionId; } + public RegisterResponse setSessionId(String value) { this.sessionId = value; return this; } + public String getUserName() { return userName; } + public RegisterResponse setUserName(String value) { this.userName = value; return this; } + public String getReferrerUrl() { return referrerUrl; } + public RegisterResponse setReferrerUrl(String value) { this.referrerUrl = value; return this; } + public String getBearerToken() { return bearerToken; } + public RegisterResponse setBearerToken(String value) { this.bearerToken = value; return this; } + public String getRefreshToken() { return refreshToken; } + public RegisterResponse setRefreshToken(String value) { this.refreshToken = value; return this; } + public Date getRefreshTokenExpiry() { return refreshTokenExpiry; } + public RegisterResponse setRefreshTokenExpiry(Date value) { this.refreshTokenExpiry = value; return this; } + public ArrayList getRoles() { return roles; } + public RegisterResponse setRoles(ArrayList value) { this.roles = value; return this; } + public ArrayList getPermissions() { return permissions; } + public RegisterResponse setPermissions(ArrayList value) { this.permissions = value; return this; } + public String getRedirectUrl() { return redirectUrl; } + public RegisterResponse setRedirectUrl(String value) { this.redirectUrl = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public RegisterResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + public HashMap getMeta() { return meta; } + public RegisterResponse setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class AuthenticateResponse implements IHasSessionId, IHasBearerToken + { + @DataMember(Order=1) + public String userId = null; + + @DataMember(Order=2) + public String sessionId = null; + + @DataMember(Order=3) + public String userName = null; + + @DataMember(Order=4) + public String displayName = null; + + @DataMember(Order=5) + public String referrerUrl = null; + + @DataMember(Order=6) + public String bearerToken = null; + + @DataMember(Order=7) + public String refreshToken = null; + + @DataMember(Order=8) + public Date refreshTokenExpiry = null; + + @DataMember(Order=9) + public String profileUrl = null; + + @DataMember(Order=10) + public ArrayList roles = null; + + @DataMember(Order=11) + public ArrayList permissions = null; + + @DataMember(Order=12) + public String authProvider = null; + + @DataMember(Order=13) + public ResponseStatus responseStatus = null; + + @DataMember(Order=14) + public HashMap meta = null; + + public String getUserId() { return userId; } + public AuthenticateResponse setUserId(String value) { this.userId = value; return this; } + public String getSessionId() { return sessionId; } + public AuthenticateResponse setSessionId(String value) { this.sessionId = value; return this; } + public String getUserName() { return userName; } + public AuthenticateResponse setUserName(String value) { this.userName = value; return this; } + public String getDisplayName() { return displayName; } + public AuthenticateResponse setDisplayName(String value) { this.displayName = value; return this; } + public String getReferrerUrl() { return referrerUrl; } + public AuthenticateResponse setReferrerUrl(String value) { this.referrerUrl = value; return this; } + public String getBearerToken() { return bearerToken; } + public AuthenticateResponse setBearerToken(String value) { this.bearerToken = value; return this; } + public String getRefreshToken() { return refreshToken; } + public AuthenticateResponse setRefreshToken(String value) { this.refreshToken = value; return this; } + public Date getRefreshTokenExpiry() { return refreshTokenExpiry; } + public AuthenticateResponse setRefreshTokenExpiry(Date value) { this.refreshTokenExpiry = value; return this; } + public String getProfileUrl() { return profileUrl; } + public AuthenticateResponse setProfileUrl(String value) { this.profileUrl = value; return this; } + public ArrayList getRoles() { return roles; } + public AuthenticateResponse setRoles(ArrayList value) { this.roles = value; return this; } + public ArrayList getPermissions() { return permissions; } + public AuthenticateResponse setPermissions(ArrayList value) { this.permissions = value; return this; } + public String getAuthProvider() { return authProvider; } + public AuthenticateResponse setAuthProvider(String value) { this.authProvider = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public AuthenticateResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + public HashMap getMeta() { return meta; } + public AuthenticateResponse setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class AssignRolesResponse + { + @DataMember(Order=1) + public ArrayList allRoles = null; + + @DataMember(Order=2) + public ArrayList allPermissions = null; + + @DataMember(Order=3) + public HashMap meta = null; + + @DataMember(Order=4) + public ResponseStatus responseStatus = null; + + public ArrayList getAllRoles() { return allRoles; } + public AssignRolesResponse setAllRoles(ArrayList value) { this.allRoles = value; return this; } + public ArrayList getAllPermissions() { return allPermissions; } + public AssignRolesResponse setAllPermissions(ArrayList value) { this.allPermissions = value; return this; } + public HashMap getMeta() { return meta; } + public AssignRolesResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public AssignRolesResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class UnAssignRolesResponse + { + @DataMember(Order=1) + public ArrayList allRoles = null; + + @DataMember(Order=2) + public ArrayList allPermissions = null; + + @DataMember(Order=3) + public HashMap meta = null; + + @DataMember(Order=4) + public ResponseStatus responseStatus = null; + + public ArrayList getAllRoles() { return allRoles; } + public UnAssignRolesResponse setAllRoles(ArrayList value) { this.allRoles = value; return this; } + public ArrayList getAllPermissions() { return allPermissions; } + public UnAssignRolesResponse setAllPermissions(ArrayList value) { this.allPermissions = value; return this; } + public HashMap getMeta() { return meta; } + public UnAssignRolesResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public UnAssignRolesResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class RockstarWithIdResponse + { + public Integer id = null; + public ResponseStatus responseStatus = null; + + public Integer getId() { return id; } + public RockstarWithIdResponse setId(Integer value) { this.id = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public RockstarWithIdResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class RockstarWithIdAndResultResponse + { + public Integer id = null; + public RockstarAuto result = null; + public ResponseStatus responseStatus = null; + + public Integer getId() { return id; } + public RockstarWithIdAndResultResponse setId(Integer value) { this.id = value; return this; } + public RockstarAuto getResult() { return result; } + public RockstarWithIdAndResultResponse setResult(RockstarAuto value) { this.result = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public RockstarWithIdAndResultResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class RockstarWithIdAndCountResponse + { + public Integer id = null; + public Integer count = null; + public ResponseStatus responseStatus = null; + + public Integer getId() { return id; } + public RockstarWithIdAndCountResponse setId(Integer value) { this.id = value; return this; } + public Integer getCount() { return count; } + public RockstarWithIdAndCountResponse setCount(Integer value) { this.count = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public RockstarWithIdAndCountResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class RockstarWithIdAndRowVersionResponse + { + public Integer id = null; + public Long rowVersion = null; + public ResponseStatus responseStatus = null; + + public Integer getId() { return id; } + public RockstarWithIdAndRowVersionResponse setId(Integer value) { this.id = value; return this; } + public Long getRowVersion() { return rowVersion; } + public RockstarWithIdAndRowVersionResponse setRowVersion(Long value) { this.rowVersion = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public RockstarWithIdAndRowVersionResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class GetAccessTokenResponse + { + @DataMember(Order=1) + public String accessToken = null; + + @DataMember(Order=2) + public HashMap meta = null; + + @DataMember(Order=3) + public ResponseStatus responseStatus = null; + + public String getAccessToken() { return accessToken; } + public GetAccessTokenResponse setAccessToken(String value) { this.accessToken = value; return this; } + public HashMap getMeta() { return meta; } + public GetAccessTokenResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public GetAccessTokenResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class QueryDb_2 extends QueryBase + { + + } + + public static class Item + { + public String name = null; + public String description = null; + + public String getName() { return name; } + public Item setName(String value) { this.name = value; return this; } + public String getDescription() { return description; } + public Item setDescription(String value) { this.description = value; return this; } + } + + public static class Poco + { + public String name = null; + + public String getName() { return name; } + public Poco setName(String value) { this.name = value; return this; } + } + + public static class CustomType + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public CustomType setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public CustomType setName(String value) { this.name = value; return this; } + } + + public static class SetterType + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public SetterType setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public SetterType setName(String value) { this.name = value; return this; } + } + + public static class DeclarativeChildValidation + { + public String name = null; + @Validate(Validator="MaximumLength(20)") + public String value = null; + + public String getName() { return name; } + public DeclarativeChildValidation setName(String value) { this.name = value; return this; } + public String getValue() { return value; } + public DeclarativeChildValidation setValue(String value) { this.value = value; return this; } + } + + public static class FluentChildValidation + { + public String name = null; + public String value = null; + + public String getName() { return name; } + public FluentChildValidation setName(String value) { this.name = value; return this; } + public String getValue() { return value; } + public FluentChildValidation setValue(String value) { this.value = value; return this; } + } + + public static class DeclarativeSingleValidation + { + public String name = null; + @Validate(Validator="MaximumLength(20)") + public String value = null; + + public String getName() { return name; } + public DeclarativeSingleValidation setName(String value) { this.name = value; return this; } + public String getValue() { return value; } + public DeclarativeSingleValidation setValue(String value) { this.value = value; return this; } + } + + public static class FluentSingleValidation + { + public String name = null; + public String value = null; + + public String getName() { return name; } + public FluentSingleValidation setName(String value) { this.name = value; return this; } + public String getValue() { return value; } + public FluentSingleValidation setValue(String value) { this.value = value; return this; } + } + + @DataContract + public static class CancelRequest implements IPost + { + @DataMember(Order=1) + public String tag = null; + + @DataMember(Order=2) + public HashMap meta = null; + + public String getTag() { return tag; } + public CancelRequest setTag(String value) { this.tag = value; return this; } + public HashMap getMeta() { return meta; } + public CancelRequest setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class CancelRequestResponse + { + @DataMember(Order=1) + public String tag = null; + + @DataMember(Order=2) + public TimeSpan elapsed = null; + + @DataMember(Order=3) + public HashMap meta = null; + + @DataMember(Order=4) + public ResponseStatus responseStatus = null; + + public String getTag() { return tag; } + public CancelRequestResponse setTag(String value) { this.tag = value; return this; } + public TimeSpan getElapsed() { return elapsed; } + public CancelRequestResponse setElapsed(TimeSpan value) { this.elapsed = value; return this; } + public HashMap getMeta() { return meta; } + public CancelRequestResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public CancelRequestResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class UpdateEventSubscriber implements IPost + { + @DataMember(Order=1) + public String id = null; + + @DataMember(Order=2) + public ArrayList subscribeChannels = null; + + @DataMember(Order=3) + public ArrayList unsubscribeChannels = null; + + public String getId() { return id; } + public UpdateEventSubscriber setId(String value) { this.id = value; return this; } + public ArrayList getSubscribeChannels() { return subscribeChannels; } + public UpdateEventSubscriber setSubscribeChannels(ArrayList value) { this.subscribeChannels = value; return this; } + public ArrayList getUnsubscribeChannels() { return unsubscribeChannels; } + public UpdateEventSubscriber setUnsubscribeChannels(ArrayList value) { this.unsubscribeChannels = value; return this; } + } + + @DataContract + public static class UpdateEventSubscriberResponse + { + @DataMember(Order=1) + public ResponseStatus responseStatus = null; + + public ResponseStatus getResponseStatus() { return responseStatus; } + public UpdateEventSubscriberResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class GetApiKeys implements IGet + { + @DataMember(Order=1) + public String environment = null; + + @DataMember(Order=2) + public HashMap meta = null; + + public String getEnvironment() { return environment; } + public GetApiKeys setEnvironment(String value) { this.environment = value; return this; } + public HashMap getMeta() { return meta; } + public GetApiKeys setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class GetApiKeysResponse + { + @DataMember(Order=1) + public ArrayList results = null; + + @DataMember(Order=2) + public HashMap meta = null; + + @DataMember(Order=3) + public ResponseStatus responseStatus = null; + + public ArrayList getResults() { return results; } + public GetApiKeysResponse setResults(ArrayList value) { this.results = value; return this; } + public HashMap getMeta() { return meta; } + public GetApiKeysResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public GetApiKeysResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class RegenerateApiKeys implements IPost + { + @DataMember(Order=1) + public String environment = null; + + @DataMember(Order=2) + public HashMap meta = null; + + public String getEnvironment() { return environment; } + public RegenerateApiKeys setEnvironment(String value) { this.environment = value; return this; } + public HashMap getMeta() { return meta; } + public RegenerateApiKeys setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class RegenerateApiKeysResponse + { + @DataMember(Order=1) + public ArrayList results = null; + + @DataMember(Order=2) + public HashMap meta = null; + + @DataMember(Order=3) + public ResponseStatus responseStatus = null; + + public ArrayList getResults() { return results; } + public RegenerateApiKeysResponse setResults(ArrayList value) { this.results = value; return this; } + public HashMap getMeta() { return meta; } + public RegenerateApiKeysResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public RegenerateApiKeysResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class UserApiKey + { + @DataMember(Order=1) + public String key = null; + + @DataMember(Order=2) + public String keyType = null; + + @DataMember(Order=3) + public Date expiryDate = null; + + @DataMember(Order=4) + public HashMap meta = null; + + public String getKey() { return key; } + public UserApiKey setKey(String value) { this.key = value; return this; } + public String getKeyType() { return keyType; } + public UserApiKey setKeyType(String value) { this.keyType = value; return this; } + public Date getExpiryDate() { return expiryDate; } + public UserApiKey setExpiryDate(Date value) { this.expiryDate = value; return this; } + public HashMap getMeta() { return meta; } + public UserApiKey setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class ConvertSessionToToken implements IPost + { + @DataMember(Order=1) + public Boolean preserveSession = null; + + @DataMember(Order=2) + public HashMap meta = null; + + public Boolean isPreserveSession() { return preserveSession; } + public ConvertSessionToToken setPreserveSession(Boolean value) { this.preserveSession = value; return this; } + public HashMap getMeta() { return meta; } + public ConvertSessionToToken setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class ConvertSessionToTokenResponse + { + @DataMember(Order=1) + public HashMap meta = null; + + @DataMember(Order=2) + public String accessToken = null; + + @DataMember(Order=3) + public String refreshToken = null; + + @DataMember(Order=4) + public ResponseStatus responseStatus = null; + + public HashMap getMeta() { return meta; } + public ConvertSessionToTokenResponse setMeta(HashMap value) { this.meta = value; return this; } + public String getAccessToken() { return accessToken; } + public ConvertSessionToTokenResponse setAccessToken(String value) { this.accessToken = value; return this; } + public String getRefreshToken() { return refreshToken; } + public ConvertSessionToTokenResponse setRefreshToken(String value) { this.refreshToken = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public ConvertSessionToTokenResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + public static class NavItem + { + public String label = null; + public String href = null; + public Boolean exact = null; + public String id = null; + public String className = null; + public String iconClass = null; + public String iconSrc = null; + public String show = null; + public String hide = null; + public ArrayList children = null; + public HashMap meta = null; + + public String getLabel() { return label; } + public NavItem setLabel(String value) { this.label = value; return this; } + public String getHref() { return href; } + public NavItem setHref(String value) { this.href = value; return this; } + public Boolean isExact() { return exact; } + public NavItem setExact(Boolean value) { this.exact = value; return this; } + public String getId() { return id; } + public NavItem setId(String value) { this.id = value; return this; } + public String getClassName() { return className; } + public NavItem setClassName(String value) { this.className = value; return this; } + public String getIconClass() { return iconClass; } + public NavItem setIconClass(String value) { this.iconClass = value; return this; } + public String getIconSrc() { return iconSrc; } + public NavItem setIconSrc(String value) { this.iconSrc = value; return this; } + public String getShow() { return show; } + public NavItem setShow(String value) { this.show = value; return this; } + public String getHide() { return hide; } + public NavItem setHide(String value) { this.hide = value; return this; } + public ArrayList getChildren() { return children; } + public NavItem setChildren(ArrayList value) { this.children = value; return this; } + public HashMap getMeta() { return meta; } + public NavItem setMeta(HashMap value) { this.meta = value; return this; } + } + + @DataContract + public static class GetNavItems + { + @DataMember(Order=1) + public String name = null; + + public String getName() { return name; } + public GetNavItems setName(String value) { this.name = value; return this; } + } + + @DataContract + public static class GetNavItemsResponse + { + @DataMember(Order=1) + public String baseUrl = null; + + @DataMember(Order=2) + public ArrayList results = null; + + @DataMember(Order=3) + public HashMap> navItemsMap = null; + + @DataMember(Order=4) + public HashMap meta = null; + + @DataMember(Order=5) + public ResponseStatus responseStatus = null; + + public String getBaseUrl() { return baseUrl; } + public GetNavItemsResponse setBaseUrl(String value) { this.baseUrl = value; return this; } + public ArrayList getResults() { return results; } + public GetNavItemsResponse setResults(ArrayList value) { this.results = value; return this; } + public HashMap> getNavItemsMap() { return navItemsMap; } + public GetNavItemsResponse setNavItemsMap(HashMap> value) { this.navItemsMap = value; return this; } + public HashMap getMeta() { return meta; } + public GetNavItemsResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public GetNavItemsResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class IdResponse + { + @DataMember(Order=1) + public String id = null; + + @DataMember(Order=2) + public ResponseStatus responseStatus = null; + + public String getId() { return id; } + public IdResponse setId(String value) { this.id = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public IdResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class StringResponse + { + @DataMember(Order=1) + public String result = null; + + @DataMember(Order=2) + public HashMap meta = null; + + @DataMember(Order=3) + public ResponseStatus responseStatus = null; + + public String getResult() { return result; } + public StringResponse setResult(String value) { this.result = value; return this; } + public HashMap getMeta() { return meta; } + public StringResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public StringResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class StringsResponse + { + @DataMember(Order=1) + public ArrayList results = null; + + @DataMember(Order=2) + public HashMap meta = null; + + @DataMember(Order=3) + public ResponseStatus responseStatus = null; + + public ArrayList getResults() { return results; } + public StringsResponse setResults(ArrayList value) { this.results = value; return this; } + public HashMap getMeta() { return meta; } + public StringsResponse setMeta(HashMap value) { this.meta = value; return this; } + public ResponseStatus getResponseStatus() { return responseStatus; } + public StringsResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } + } + + @DataContract + public static class AuditBase + { + @DataMember(Order=1) + public Date createdDate = null; + + @DataMember(Order=2) + @Required() + public String createdBy = null; + + @DataMember(Order=3) + public Date modifiedDate = null; + + @DataMember(Order=4) + @Required() + public String modifiedBy = null; + + @DataMember(Order=5) + public Date deletedDate = null; + + @DataMember(Order=6) + public String deletedBy = null; + + public Date getCreatedDate() { return createdDate; } + public AuditBase setCreatedDate(Date value) { this.createdDate = value; return this; } + public String getCreatedBy() { return createdBy; } + public AuditBase setCreatedBy(String value) { this.createdBy = value; return this; } + public Date getModifiedDate() { return modifiedDate; } + public AuditBase setModifiedDate(Date value) { this.modifiedDate = value; return this; } + public String getModifiedBy() { return modifiedBy; } + public AuditBase setModifiedBy(String value) { this.modifiedBy = value; return this; } + public Date getDeletedDate() { return deletedDate; } + public AuditBase setDeletedDate(Date value) { this.deletedDate = value; return this; } + public String getDeletedBy() { return deletedBy; } + public AuditBase setDeletedBy(String value) { this.deletedBy = value; return this; } + } + + public static interface IGeneration + { + public String refId = null; + public String tag = null; + } + + public static interface IAuthTokens + { + public String provider = null; + public String userId = null; + public String accessToken = null; + public String accessTokenSecret = null; + public String refreshToken = null; + public Date refreshTokenExpiry = null; + public String requestToken = null; + public String requestTokenSecret = null; + public HashMap items = null; + } + + @DataContract + public static class AuthUserSession + { + @DataMember(Order=1) + public String referrerUrl = null; + + @DataMember(Order=2) + public String id = null; + + @DataMember(Order=3) + public String userAuthId = null; + + @DataMember(Order=4) + public String userAuthName = null; + + @DataMember(Order=5) + public String userName = null; + + @DataMember(Order=6) + public String twitterUserId = null; + + @DataMember(Order=7) + public String twitterScreenName = null; + + @DataMember(Order=8) + public String facebookUserId = null; + + @DataMember(Order=9) + public String facebookUserName = null; + + @DataMember(Order=10) + public String firstName = null; + + @DataMember(Order=11) + public String lastName = null; + + @DataMember(Order=12) + public String displayName = null; + + @DataMember(Order=13) + public String company = null; + + @DataMember(Order=14) + public String email = null; + + @DataMember(Order=15) + public String primaryEmail = null; + + @DataMember(Order=16) + public String phoneNumber = null; + + @DataMember(Order=17) + public Date birthDate = null; + + @DataMember(Order=18) + public String birthDateRaw = null; + + @DataMember(Order=19) + public String address = null; + + @DataMember(Order=20) + public String address2 = null; + + @DataMember(Order=21) + public String city = null; + + @DataMember(Order=22) + public String state = null; + + @DataMember(Order=23) + public String country = null; + + @DataMember(Order=24) + public String culture = null; + + @DataMember(Order=25) + public String fullName = null; + + @DataMember(Order=26) + public String gender = null; + + @DataMember(Order=27) + public String language = null; + + @DataMember(Order=28) + public String mailAddress = null; + + @DataMember(Order=29) + public String nickname = null; + + @DataMember(Order=30) + public String postalCode = null; + + @DataMember(Order=31) + public String timeZone = null; + + @DataMember(Order=32) + public String requestTokenSecret = null; + + @DataMember(Order=33) + public Date createdAt = null; + + @DataMember(Order=34) + public Date lastModified = null; + + @DataMember(Order=35) + public ArrayList roles = null; + + @DataMember(Order=36) + public ArrayList permissions = null; + + @DataMember(Order=37) + public Boolean isAuthenticated = null; + + @DataMember(Order=38) + public Boolean fromToken = null; + + @DataMember(Order=39) + public String profileUrl = null; + + @DataMember(Order=40) + public String sequence = null; + + @DataMember(Order=41) + public Long tag = null; + + @DataMember(Order=42) + public String authProvider = null; + + @DataMember(Order=43) + public ArrayList providerOAuthAccess = null; + + @DataMember(Order=44) + public HashMap meta = null; + + @DataMember(Order=45) + public ArrayList audiences = null; + + @DataMember(Order=46) + public ArrayList scopes = null; + + @DataMember(Order=47) + public String dns = null; + + @DataMember(Order=48) + public String rsa = null; + + @DataMember(Order=49) + public String sid = null; + + @DataMember(Order=50) + public String hash = null; + + @DataMember(Order=51) + public String homePhone = null; + + @DataMember(Order=52) + public String mobilePhone = null; + + @DataMember(Order=53) + public String webpage = null; + + @DataMember(Order=54) + public Boolean emailConfirmed = null; + + @DataMember(Order=55) + public Boolean phoneNumberConfirmed = null; + + @DataMember(Order=56) + public Boolean twoFactorEnabled = null; + + @DataMember(Order=57) + public String securityStamp = null; + + @DataMember(Order=58) + public String type = null; + + @DataMember(Order=59) + public String recoveryToken = null; + + @DataMember(Order=60) + public Integer refId = null; + + @DataMember(Order=61) + public String refIdStr = null; + + public String getReferrerUrl() { return referrerUrl; } + public AuthUserSession setReferrerUrl(String value) { this.referrerUrl = value; return this; } + public String getId() { return id; } + public AuthUserSession setId(String value) { this.id = value; return this; } + public String getUserAuthId() { return userAuthId; } + public AuthUserSession setUserAuthId(String value) { this.userAuthId = value; return this; } + public String getUserAuthName() { return userAuthName; } + public AuthUserSession setUserAuthName(String value) { this.userAuthName = value; return this; } + public String getUserName() { return userName; } + public AuthUserSession setUserName(String value) { this.userName = value; return this; } + public String getTwitterUserId() { return twitterUserId; } + public AuthUserSession setTwitterUserId(String value) { this.twitterUserId = value; return this; } + public String getTwitterScreenName() { return twitterScreenName; } + public AuthUserSession setTwitterScreenName(String value) { this.twitterScreenName = value; return this; } + public String getFacebookUserId() { return facebookUserId; } + public AuthUserSession setFacebookUserId(String value) { this.facebookUserId = value; return this; } + public String getFacebookUserName() { return facebookUserName; } + public AuthUserSession setFacebookUserName(String value) { this.facebookUserName = value; return this; } + public String getFirstName() { return firstName; } + public AuthUserSession setFirstName(String value) { this.firstName = value; return this; } + public String getLastName() { return lastName; } + public AuthUserSession setLastName(String value) { this.lastName = value; return this; } + public String getDisplayName() { return displayName; } + public AuthUserSession setDisplayName(String value) { this.displayName = value; return this; } + public String getCompany() { return company; } + public AuthUserSession setCompany(String value) { this.company = value; return this; } + public String getEmail() { return email; } + public AuthUserSession setEmail(String value) { this.email = value; return this; } + public String getPrimaryEmail() { return primaryEmail; } + public AuthUserSession setPrimaryEmail(String value) { this.primaryEmail = value; return this; } + public String getPhoneNumber() { return phoneNumber; } + public AuthUserSession setPhoneNumber(String value) { this.phoneNumber = value; return this; } + public Date getBirthDate() { return birthDate; } + public AuthUserSession setBirthDate(Date value) { this.birthDate = value; return this; } + public String getBirthDateRaw() { return birthDateRaw; } + public AuthUserSession setBirthDateRaw(String value) { this.birthDateRaw = value; return this; } + public String getAddress() { return address; } + public AuthUserSession setAddress(String value) { this.address = value; return this; } + public String getAddress2() { return address2; } + public AuthUserSession setAddress2(String value) { this.address2 = value; return this; } + public String getCity() { return city; } + public AuthUserSession setCity(String value) { this.city = value; return this; } + public String getState() { return state; } + public AuthUserSession setState(String value) { this.state = value; return this; } + public String getCountry() { return country; } + public AuthUserSession setCountry(String value) { this.country = value; return this; } + public String getCulture() { return culture; } + public AuthUserSession setCulture(String value) { this.culture = value; return this; } + public String getFullName() { return fullName; } + public AuthUserSession setFullName(String value) { this.fullName = value; return this; } + public String getGender() { return gender; } + public AuthUserSession setGender(String value) { this.gender = value; return this; } + public String getLanguage() { return language; } + public AuthUserSession setLanguage(String value) { this.language = value; return this; } + public String getMailAddress() { return mailAddress; } + public AuthUserSession setMailAddress(String value) { this.mailAddress = value; return this; } + public String getNickname() { return nickname; } + public AuthUserSession setNickname(String value) { this.nickname = value; return this; } + public String getPostalCode() { return postalCode; } + public AuthUserSession setPostalCode(String value) { this.postalCode = value; return this; } + public String getTimeZone() { return timeZone; } + public AuthUserSession setTimeZone(String value) { this.timeZone = value; return this; } + public String getRequestTokenSecret() { return requestTokenSecret; } + public AuthUserSession setRequestTokenSecret(String value) { this.requestTokenSecret = value; return this; } + public Date getCreatedAt() { return createdAt; } + public AuthUserSession setCreatedAt(Date value) { this.createdAt = value; return this; } + public Date getLastModified() { return lastModified; } + public AuthUserSession setLastModified(Date value) { this.lastModified = value; return this; } + public ArrayList getRoles() { return roles; } + public AuthUserSession setRoles(ArrayList value) { this.roles = value; return this; } + public ArrayList getPermissions() { return permissions; } + public AuthUserSession setPermissions(ArrayList value) { this.permissions = value; return this; } + public Boolean getIsAuthenticated() { return isAuthenticated; } + public AuthUserSession setIsAuthenticated(Boolean value) { this.isAuthenticated = value; return this; } + public Boolean isFromToken() { return fromToken; } + public AuthUserSession setFromToken(Boolean value) { this.fromToken = value; return this; } + public String getProfileUrl() { return profileUrl; } + public AuthUserSession setProfileUrl(String value) { this.profileUrl = value; return this; } + public String getSequence() { return sequence; } + public AuthUserSession setSequence(String value) { this.sequence = value; return this; } + public Long getTag() { return tag; } + public AuthUserSession setTag(Long value) { this.tag = value; return this; } + public String getAuthProvider() { return authProvider; } + public AuthUserSession setAuthProvider(String value) { this.authProvider = value; return this; } + public ArrayList getProviderOAuthAccess() { return providerOAuthAccess; } + public AuthUserSession setProviderOAuthAccess(ArrayList value) { this.providerOAuthAccess = value; return this; } + public HashMap getMeta() { return meta; } + public AuthUserSession setMeta(HashMap value) { this.meta = value; return this; } + public ArrayList getAudiences() { return audiences; } + public AuthUserSession setAudiences(ArrayList value) { this.audiences = value; return this; } + public ArrayList getScopes() { return scopes; } + public AuthUserSession setScopes(ArrayList value) { this.scopes = value; return this; } + public String getDns() { return dns; } + public AuthUserSession setDns(String value) { this.dns = value; return this; } + public String getRsa() { return rsa; } + public AuthUserSession setRsa(String value) { this.rsa = value; return this; } + public String getSid() { return sid; } + public AuthUserSession setSid(String value) { this.sid = value; return this; } + public String getHash() { return hash; } + public AuthUserSession setHash(String value) { this.hash = value; return this; } + public String getHomePhone() { return homePhone; } + public AuthUserSession setHomePhone(String value) { this.homePhone = value; return this; } + public String getMobilePhone() { return mobilePhone; } + public AuthUserSession setMobilePhone(String value) { this.mobilePhone = value; return this; } + public String getWebpage() { return webpage; } + public AuthUserSession setWebpage(String value) { this.webpage = value; return this; } + public Boolean isEmailConfirmed() { return emailConfirmed; } + public AuthUserSession setEmailConfirmed(Boolean value) { this.emailConfirmed = value; return this; } + public Boolean isPhoneNumberConfirmed() { return phoneNumberConfirmed; } + public AuthUserSession setPhoneNumberConfirmed(Boolean value) { this.phoneNumberConfirmed = value; return this; } + public Boolean isTwoFactorEnabled() { return twoFactorEnabled; } + public AuthUserSession setTwoFactorEnabled(Boolean value) { this.twoFactorEnabled = value; return this; } + public String getSecurityStamp() { return securityStamp; } + public AuthUserSession setSecurityStamp(String value) { this.securityStamp = value; return this; } + public String getType() { return type; } + public AuthUserSession setType(String value) { this.type = value; return this; } + public String getRecoveryToken() { return recoveryToken; } + public AuthUserSession setRecoveryToken(String value) { this.recoveryToken = value; return this; } + public Integer getRefId() { return refId; } + public AuthUserSession setRefId(Integer value) { this.refId = value; return this; } + public String getRefIdStr() { return refIdStr; } + public AuthUserSession setRefIdStr(String value) { this.refIdStr = value; return this; } + } + + public static class NestedClass + { + public String value = null; + + public String getValue() { return value; } + public NestedClass setValue(String value) { this.value = value; return this; } + } + + public static enum EnumType + { + Value1, + Value2, + Value3; + } + + @Flags() + public static enum EnumTypeFlags + { + @SerializedName("0") Value1(0), + @SerializedName("1") Value2(1), + @SerializedName("2") Value3(2); + + private final int value; + EnumTypeFlags(final int intValue) { value = intValue; } + public int getValue() { return value; } + } + + public static enum EnumWithValues + { + None, + Value1, + Value2; + } + + @Flags() + public static enum EnumFlags + { + @SerializedName("0") Value0(0), + @SerializedName("1") Value1(1), + @SerializedName("2") Value2(2), + @SerializedName("4") Value3(4), + @SerializedName("7") Value123(7); + + private final int value; + EnumFlags(final int intValue) { value = intValue; } + public int getValue() { return value; } + } + + public static enum EnumAsInt + { + Value1(1000), + Value2(2000), + Value3(3000); + + private final int value; + EnumAsInt(final int intValue) { value = intValue; } + public int getValue() { return value; } + } + + public static enum EnumStyle + { + Lower, + Upper, + PascalCase, + CamelCase, + CamelUPPER, + PascalUPPER; + } + + public static enum EnumStyleMembers + { + Lower, + Upper, + PascalCase, + CamelCase, + CamelUpper, + PascalUpper; + } + + public static class KeyValuePair + { + public TKey key = null; + public TValue value = null; + + public TKey getKey() { return key; } + public KeyValuePair setKey(TKey value) { this.key = value; return this; } + public TValue getValue() { return value; } + public KeyValuePair setValue(TValue value) { this.value = value; return this; } + } + + public static class SubType + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public SubType setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public SubType setName(String value) { this.name = value; return this; } + } + + public static class AllTypesBase + { + public Integer id = null; + public Integer nullableId = null; + @SerializedName("byte") public Short Byte = null; + @SerializedName("short") public Short Short = null; + @SerializedName("int") public Integer Int = null; + @SerializedName("long") public Long Long = null; + public Integer uShort = null; + public Long uInt = null; + public BigInteger uLong = null; + @SerializedName("float") public Float Float = null; + @SerializedName("double") public Double Double = null; + public BigDecimal decimal = null; + public String string = null; + public Date dateTime = null; + public TimeSpan timeSpan = null; + public Date dateTimeOffset = null; + public UUID guid = null; + @SerializedName("char") public String Char = null; + public KeyValuePair keyValuePair = null; + public Date nullableDateTime = null; + public TimeSpan nullableTimeSpan = null; + public ArrayList stringList = null; + public ArrayList stringArray = null; + public HashMap stringMap = null; + public HashMap intStringMap = null; + public SubType subType = null; + + public Integer getId() { return id; } + public AllTypesBase setId(Integer value) { this.id = value; return this; } + public Integer getNullableId() { return nullableId; } + public AllTypesBase setNullableId(Integer value) { this.nullableId = value; return this; } + public Short getByte() { return Byte; } + public AllTypesBase setByte(Short value) { this.Byte = value; return this; } + public Short getShort() { return Short; } + public AllTypesBase setShort(Short value) { this.Short = value; return this; } + public Integer getInt() { return Int; } + public AllTypesBase setInt(Integer value) { this.Int = value; return this; } + public Long getLong() { return Long; } + public AllTypesBase setLong(Long value) { this.Long = value; return this; } + public Integer getUShort() { return uShort; } + public AllTypesBase setUShort(Integer value) { this.uShort = value; return this; } + public Long getUInt() { return uInt; } + public AllTypesBase setUInt(Long value) { this.uInt = value; return this; } + public BigInteger getULong() { return uLong; } + public AllTypesBase setULong(BigInteger value) { this.uLong = value; return this; } + public Float getFloat() { return Float; } + public AllTypesBase setFloat(Float value) { this.Float = value; return this; } + public Double getDouble() { return Double; } + public AllTypesBase setDouble(Double value) { this.Double = value; return this; } + public BigDecimal getDecimal() { return decimal; } + public AllTypesBase setDecimal(BigDecimal value) { this.decimal = value; return this; } + public String getString() { return string; } + public AllTypesBase setString(String value) { this.string = value; return this; } + public Date getDateTime() { return dateTime; } + public AllTypesBase setDateTime(Date value) { this.dateTime = value; return this; } + public TimeSpan getTimeSpan() { return timeSpan; } + public AllTypesBase setTimeSpan(TimeSpan value) { this.timeSpan = value; return this; } + public Date getDateTimeOffset() { return dateTimeOffset; } + public AllTypesBase setDateTimeOffset(Date value) { this.dateTimeOffset = value; return this; } + public UUID getGuid() { return guid; } + public AllTypesBase setGuid(UUID value) { this.guid = value; return this; } + public String getChar() { return Char; } + public AllTypesBase setChar(String value) { this.Char = value; return this; } + public KeyValuePair getKeyValuePair() { return keyValuePair; } + public AllTypesBase setKeyValuePair(KeyValuePair value) { this.keyValuePair = value; return this; } + public Date getNullableDateTime() { return nullableDateTime; } + public AllTypesBase setNullableDateTime(Date value) { this.nullableDateTime = value; return this; } + public TimeSpan getNullableTimeSpan() { return nullableTimeSpan; } + public AllTypesBase setNullableTimeSpan(TimeSpan value) { this.nullableTimeSpan = value; return this; } + public ArrayList getStringList() { return stringList; } + public AllTypesBase setStringList(ArrayList value) { this.stringList = value; return this; } + public ArrayList getStringArray() { return stringArray; } + public AllTypesBase setStringArray(ArrayList value) { this.stringArray = value; return this; } + public HashMap getStringMap() { return stringMap; } + public AllTypesBase setStringMap(HashMap value) { this.stringMap = value; return this; } + public HashMap getIntStringMap() { return intStringMap; } + public AllTypesBase setIntStringMap(HashMap value) { this.intStringMap = value; return this; } + public SubType getSubType() { return subType; } + public AllTypesBase setSubType(SubType value) { this.subType = value; return this; } + } + + public static class HelloBase + { + public Integer id = null; + + public Integer getId() { return id; } + public HelloBase setId(Integer value) { this.id = value; return this; } + } + + public static class HelloBase_1 + { + public ArrayList items = null; + public ArrayList counts = null; + + public ArrayList getItems() { return items; } + public HelloBase_1 setItems(ArrayList value) { this.items = value; return this; } + public ArrayList getCounts() { return counts; } + public HelloBase_1 setCounts(ArrayList value) { this.counts = value; return this; } + } + + public static interface IPoco + { + public String name = null; + } + + public static interface IEmptyInterface + { + } + + public static class EmptyClass + { + + } + + public static enum DayOfWeek + { + Sunday, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday; + } + + @DataContract + public static enum ScopeType + { + Global(1), + Sale(2); + + private final int value; + ScopeType(final int intValue) { value = intValue; } + public int getValue() { return value; } + } + + public static class Logger + { + public Long id = null; + public ArrayList devices = null; + + public Long getId() { return id; } + public Logger setId(Long value) { this.id = value; return this; } + public ArrayList getDevices() { return devices; } + public Logger setDevices(ArrayList value) { this.devices = value; return this; } + } + + public static class Rockstar + { + public Integer id = null; + public String firstName = null; + public String lastName = null; + public Integer age = null; + + public Integer getId() { return id; } + public Rockstar setId(Integer value) { this.id = value; return this; } + public String getFirstName() { return firstName; } + public Rockstar setFirstName(String value) { this.firstName = value; return this; } + public String getLastName() { return lastName; } + public Rockstar setLastName(String value) { this.lastName = value; return this; } + public Integer getAge() { return age; } + public Rockstar setAge(Integer value) { this.age = value; return this; } + } + + public static class QueryDbTenant_2 extends QueryDb_2 + { + + } + + public static class RockstarAuditTenant extends AuditBase + { + public Integer tenantId = null; + public Integer id = null; + public String firstName = null; + public String lastName = null; + public Integer age = null; + public Date dateOfBirth = null; + public Date dateDied = null; + public LivingStatus livingStatus = null; + + public Integer getTenantId() { return tenantId; } + public RockstarAuditTenant setTenantId(Integer value) { this.tenantId = value; return this; } + public Integer getId() { return id; } + public RockstarAuditTenant setId(Integer value) { this.id = value; return this; } + public String getFirstName() { return firstName; } + public RockstarAuditTenant setFirstName(String value) { this.firstName = value; return this; } + public String getLastName() { return lastName; } + public RockstarAuditTenant setLastName(String value) { this.lastName = value; return this; } + public Integer getAge() { return age; } + public RockstarAuditTenant setAge(Integer value) { this.age = value; return this; } + public Date getDateOfBirth() { return dateOfBirth; } + public RockstarAuditTenant setDateOfBirth(Date value) { this.dateOfBirth = value; return this; } + public Date getDateDied() { return dateDied; } + public RockstarAuditTenant setDateDied(Date value) { this.dateDied = value; return this; } + public LivingStatus getLivingStatus() { return livingStatus; } + public RockstarAuditTenant setLivingStatus(LivingStatus value) { this.livingStatus = value; return this; } + } + + public static class RockstarAuto extends RockstarBase + { + public Integer id = null; + + public Integer getId() { return id; } + public RockstarAuto setId(Integer value) { this.id = value; return this; } + } + + public static class QueryDb_1 extends QueryBase + { + + } + + public static class OnlyDefinedInGenericType + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public OnlyDefinedInGenericType setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public OnlyDefinedInGenericType setName(String value) { this.name = value; return this; } + } + + public static class OnlyDefinedInGenericTypeFrom + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public OnlyDefinedInGenericTypeFrom setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public OnlyDefinedInGenericTypeFrom setName(String value) { this.name = value; return this; } + } + + public static class OnlyDefinedInGenericTypeInto + { + public Integer id = null; + public String name = null; + + public Integer getId() { return id; } + public OnlyDefinedInGenericTypeInto setId(Integer value) { this.id = value; return this; } + public String getName() { return name; } + public OnlyDefinedInGenericTypeInto setName(String value) { this.name = value; return this; } + } + + public static enum LivingStatus + { + Alive, + Dead; + } + + public static class RockstarBase + { + public String firstName = null; + public String lastName = null; + public Integer age = null; + public Date dateOfBirth = null; + public Date dateDied = null; + public LivingStatus livingStatus = null; + + public String getFirstName() { return firstName; } + public RockstarBase setFirstName(String value) { this.firstName = value; return this; } + public String getLastName() { return lastName; } + public RockstarBase setLastName(String value) { this.lastName = value; return this; } + public Integer getAge() { return age; } + public RockstarBase setAge(Integer value) { this.age = value; return this; } + public Date getDateOfBirth() { return dateOfBirth; } + public RockstarBase setDateOfBirth(Date value) { this.dateOfBirth = value; return this; } + public Date getDateDied() { return dateDied; } + public RockstarBase setDateDied(Date value) { this.dateDied = value; return this; } + public LivingStatus getLivingStatus() { return livingStatus; } + public RockstarBase setLivingStatus(LivingStatus value) { this.livingStatus = value; return this; } + } + + public static class RockstarAudit extends RockstarBase + { + public Integer id = null; + public Date createdDate = null; + public String createdBy = null; + public String createdInfo = null; + public Date modifiedDate = null; + public String modifiedBy = null; + public String modifiedInfo = null; + + public Integer getId() { return id; } + public RockstarAudit setId(Integer value) { this.id = value; return this; } + public Date getCreatedDate() { return createdDate; } + public RockstarAudit setCreatedDate(Date value) { this.createdDate = value; return this; } + public String getCreatedBy() { return createdBy; } + public RockstarAudit setCreatedBy(String value) { this.createdBy = value; return this; } + public String getCreatedInfo() { return createdInfo; } + public RockstarAudit setCreatedInfo(String value) { this.createdInfo = value; return this; } + public Date getModifiedDate() { return modifiedDate; } + public RockstarAudit setModifiedDate(Date value) { this.modifiedDate = value; return this; } + public String getModifiedBy() { return modifiedBy; } + public RockstarAudit setModifiedBy(String value) { this.modifiedBy = value; return this; } + public String getModifiedInfo() { return modifiedInfo; } + public RockstarAudit setModifiedInfo(String value) { this.modifiedInfo = value; return this; } + } + + public static class CreateAuditTenantBase extends CreateAuditBase + { + + } + + public static class UpdateAuditTenantBase extends UpdateAuditBase + { + + } + + public static class PatchAuditTenantBase extends PatchAuditBase + { + + } + + public static class SoftDeleteAuditTenantBase extends SoftDeleteAuditBase + { + + } + + public static class RockstarVersion extends RockstarBase + { + public Integer id = null; + public BigInteger rowVersion = null; + + public Integer getId() { return id; } + public RockstarVersion setId(Integer value) { this.id = value; return this; } + public BigInteger getRowVersion() { return rowVersion; } + public RockstarVersion setRowVersion(BigInteger value) { this.rowVersion = value; return this; } + } + + /** + * Output object for generated artifacts + */ + public static class ArtifactOutput + { + /** + * URL to access the generated image + */ + @ApiMember(Description="URL to access the generated image") + public String url = null; + + /** + * Filename of the generated image + */ + @ApiMember(Description="Filename of the generated image") + public String fileName = null; + + /** + * Provider used for image generation + */ + @ApiMember(Description="Provider used for image generation") + public String provider = null; + + public String getUrl() { return url; } + public ArtifactOutput setUrl(String value) { this.url = value; return this; } + public String getFileName() { return fileName; } + public ArtifactOutput setFileName(String value) { this.fileName = value; return this; } + public String getProvider() { return provider; } + public ArtifactOutput setProvider(String value) { this.provider = value; return this; } + } + + /** + * Output object for generated text + */ + public static class TextOutput + { + /** + * The generated text + */ + @ApiMember(Description="The generated text") + public String text = null; + + public String getText() { return text; } + public TextOutput setText(String value) { this.text = value; return this; } + } + + public static class UploadInfo + { + public String name = null; + public String fileName = null; + public Long contentLength = null; + public String contentType = null; + + public String getName() { return name; } + public UploadInfo setName(String value) { this.name = value; return this; } + public String getFileName() { return fileName; } + public UploadInfo setFileName(String value) { this.fileName = value; return this; } + public Long getContentLength() { return contentLength; } + public UploadInfo setContentLength(Long value) { this.contentLength = value; return this; } + public String getContentType() { return contentType; } + public UploadInfo setContentType(String value) { this.contentType = value; return this; } + } + + public static class MetadataTestChild + { + public String name = null; + public ArrayList results = null; + + public String getName() { return name; } + public MetadataTestChild setName(String value) { this.name = value; return this; } + public ArrayList getResults() { return results; } + public MetadataTestChild setResults(ArrayList value) { this.results = value; return this; } + } + + @DataContract + public static class MenuExample + { + @DataMember(Order=1) + @ApiMember() + public MenuItemExample menuItemExample1 = null; + + public MenuItemExample getMenuItemExample1() { return menuItemExample1; } + public MenuExample setMenuItemExample1(MenuItemExample value) { this.menuItemExample1 = value; return this; } + } + + public static class ListResult + { + public String result = null; + + public String getResult() { return result; } + public ListResult setResult(String value) { this.result = value; return this; } + } + + public static class ArrayResult + { + public String result = null; + + public String getResult() { return result; } + public ArrayResult setResult(String value) { this.result = value; return this; } + } + + public static class HelloResponseBase + { + public Integer refId = null; + + public Integer getRefId() { return refId; } + public HelloResponseBase setRefId(Integer value) { this.refId = value; return this; } + } + + public static class HelloWithReturnResponse + { + public String result = null; + + public String getResult() { return result; } + public HelloWithReturnResponse setResult(String value) { this.result = value; return this; } + } + + public static class HelloType + { + public String result = null; + + public String getResult() { return result; } + public HelloType setResult(String value) { this.result = value; return this; } + } + + public static class InnerType + { + public Long id = null; + public String name = null; + + public Long getId() { return id; } + public InnerType setId(Long value) { this.id = value; return this; } + public String getName() { return name; } + public InnerType setName(String value) { this.name = value; return this; } + } + + public static enum InnerEnum + { + Foo, + Bar, + Baz; + } + + public static class ReturnedDto + { + public Integer id = null; + + public Integer getId() { return id; } + public ReturnedDto setId(Integer value) { this.id = value; return this; } + } + + public static class CustomUserSession extends AuthUserSession + { + @DataMember + public String customName = null; + + @DataMember + public String customInfo = null; + + public String getCustomName() { return customName; } + public CustomUserSession setCustomName(String value) { this.customName = value; return this; } + public String getCustomInfo() { return customInfo; } + public CustomUserSession setCustomInfo(String value) { this.customInfo = value; return this; } + } + + public static class UnAuthInfo + { + public String customInfo = null; + + public String getCustomInfo() { return customInfo; } + public UnAuthInfo setCustomInfo(String value) { this.customInfo = value; return this; } + } + + @DataContract + public static class QueryBase + { + @DataMember(Order=1) + public Integer skip = null; + + @DataMember(Order=2) + public Integer take = null; + + @DataMember(Order=3) + public String orderBy = null; + + @DataMember(Order=4) + public String orderByDesc = null; + + @DataMember(Order=5) + public String include = null; + + @DataMember(Order=6) + public String fields = null; + + @DataMember(Order=7) + public HashMap meta = null; + + public Integer getSkip() { return skip; } + public QueryBase setSkip(Integer value) { this.skip = value; return this; } + public Integer getTake() { return take; } + public QueryBase setTake(Integer value) { this.take = value; return this; } + public String getOrderBy() { return orderBy; } + public QueryBase setOrderBy(String value) { this.orderBy = value; return this; } + public String getOrderByDesc() { return orderByDesc; } + public QueryBase setOrderByDesc(String value) { this.orderByDesc = value; return this; } + public String getInclude() { return include; } + public QueryBase setInclude(String value) { this.include = value; return this; } + public String getFields() { return fields; } + public QueryBase setFields(String value) { this.fields = value; return this; } + public HashMap getMeta() { return meta; } + public QueryBase setMeta(HashMap value) { this.meta = value; return this; } + } + + public static class Device + { + public Long id = null; + public String type = null; + public Long timeStamp = null; + public ArrayList channels = null; + + public Long getId() { return id; } + public Device setId(Long value) { this.id = value; return this; } + public String getType() { return type; } + public Device setType(String value) { this.type = value; return this; } + public Long getTimeStamp() { return timeStamp; } + public Device setTimeStamp(Long value) { this.timeStamp = value; return this; } + public ArrayList getChannels() { return channels; } + public Device setChannels(ArrayList value) { this.channels = value; return this; } + } + + public static class CreateAuditBase implements ICreateDb + { + + } + + public static class UpdateAuditBase implements IUpdateDb
    + { + + } + + public static class PatchAuditBase implements IPatchDb
    + { + + } + + public static class SoftDeleteAuditBase implements IUpdateDb
    + { + + } + + public static class MetadataTestNestedChild + { + public String name = null; + + public String getName() { return name; } + public MetadataTestNestedChild setName(String value) { this.name = value; return this; } + } + + public static class MenuItemExample + { + @DataMember(Order=1) + @ApiMember() + public String name1 = null; + + public MenuItemExampleItem menuItemExampleItem = null; + + public String getName1() { return name1; } + public MenuItemExample setName1(String value) { this.name1 = value; return this; } + public MenuItemExampleItem getMenuItemExampleItem() { return menuItemExampleItem; } + public MenuItemExample setMenuItemExampleItem(MenuItemExampleItem value) { this.menuItemExampleItem = value; return this; } + } + + public static class TypesGroup + { + + } + + public static class Channel + { + public String name = null; + public String value = null; + + public String getName() { return name; } + public Channel setName(String value) { this.name = value; return this; } + public String getValue() { return value; } + public Channel setValue(String value) { this.value = value; return this; } + } + + public static class MenuItemExampleItem + { + @DataMember(Order=1) + @ApiMember() + public String name1 = null; + + public String getName1() { return name1; } + public MenuItemExampleItem setName1(String value) { this.name1 = value; return this; } + } + +} From 517c34725557fb6a8d2e966e01d69f3400d6bae0 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 11 Nov 2024 13:40:48 +1100 Subject: [PATCH 60/68] Fix build --- .../net/servicestack/client/JsonServiceClientTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java index 237354f..51ec80d 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java @@ -166,7 +166,7 @@ public void test_Can_Post_Multiple_files_with_Request() { ); assertNotNull("Response should not be null", response); - assertEquals("Id should match", Optional.of(1), response.getId()); + assertEquals("Id should match", 1, (int)response.getId()); assertEquals("RefId should match", "zid", response.getRefId()); assertEquals("Should have correct number of files", 2, response.getFiles().size()); @@ -174,14 +174,14 @@ public void test_Can_Post_Multiple_files_with_Request() { TestDtos.UploadInfo file1 = response.getFiles().get(0); assertEquals("First file name should match", "audio", file1.getName()); assertEquals("First filename should match", "test.txt", file1.getFileName()); - assertEquals("First file content length should match", Optional.of("Hello World".length()), file1.getContentLength()); + assertEquals("First file content length should match", "Hello World".length(), (long)file1.getContentLength()); assertEquals("First file content type should match", "text/plain", file1.getContentType()); // Verify second file TestDtos.UploadInfo file2 = response.getFiles().get(1); assertEquals("Second file name should match", "content", file2.getName()); assertEquals("Second filename should match", "test.md", file2.getFileName()); - assertEquals("Second file content length should match", Optional.of("## Heading".length()), file2.getContentLength()); + assertEquals("Second file content length should match", "## Heading".length(), (long)file2.getContentLength()); assertEquals("Second file content type should match", "text/markdown", file2.getContentType()); } catch (Exception e) { From aa6286ee548fee841d8a02bcc2e30255fd961a34 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 11 Nov 2024 13:49:02 +1100 Subject: [PATCH 61/68] Bump --- src/AndroidClient/android/build.gradle | 2 +- src/AndroidClient/client/build.gradle | 2 +- src/AndroidClient/client/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index cd26f8f..2ef10d7 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.1.2" +version = "1.1.3" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 76e6c66..167d384 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.1.2" +version = "1.1.3" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { diff --git a/src/AndroidClient/client/pom.xml b/src/AndroidClient/client/pom.xml index aa8d087..3a04db7 100644 --- a/src/AndroidClient/client/pom.xml +++ b/src/AndroidClient/client/pom.xml @@ -47,7 +47,7 @@ pl.pragmatists JUnitParams - 1.1.2 + 1.1.3 test From e2824dd3c18732e58c3ac8685f7e0bb44ffd868a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 24 Nov 2024 09:18:56 +0800 Subject: [PATCH 62/68] Add postFilesWithRequest convenience overloads --- .../net/servicestack/client/JsonServiceClient.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java index 101d218..bad6f44 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -681,6 +681,16 @@ public void clearCookies() { // Add these methods to JsonServiceClient class: + public TResponse postFilesWithRequest(IReturn request, FileUpload[] filesresponseType) { + String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); + return postFilesWithRequest(requestUrl, request, files, request.getResponseType()); + } + + public TResponse postFilesWithRequest(Object request, FileUpload[] files, Class responseType) { + String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); + return postFilesWithRequest(requestUrl, request, files, responseType); + } + private static final String BOUNDARY = "---" + UUID.randomUUID().toString() + "---"; public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Class responseType) { From bde61ae574d2c24d690ac496abe24773614549c0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 24 Nov 2024 09:19:44 +0800 Subject: [PATCH 63/68] Add sync client --- .../net/servicestack/client/FileUpload.java | 20 +++++ .../client/JsonServiceClient.java | 78 +++++++++++++++++-- sync-client.sh | 5 ++ 3 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 src/AndroidClient/android/src/main/java/net/servicestack/client/FileUpload.java create mode 100755 sync-client.sh diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/FileUpload.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/FileUpload.java new file mode 100644 index 0000000..fd2bce8 --- /dev/null +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/FileUpload.java @@ -0,0 +1,20 @@ +package net.servicestack.client; + +public class FileUpload { + private String fieldName; + private String fileName; + private String contentType; + private byte[] fileBytes; + + public FileUpload(String fieldName, String fileName, String contentType, byte[] fileBytes) { + this.fieldName = fieldName; + this.fileName = fileName; + this.contentType = contentType != null ? contentType : "application/octet-stream"; + this.fileBytes = fileBytes; + } + + public String getFieldName() { return fieldName != null ? fieldName : "upload"; } + public String getFileName() { return fileName; } + public String getContentType() { return contentType; } + public byte[] getFileBytes() { return fileBytes; } +} diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java index 8b7479c..bad6f44 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -8,12 +8,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Type; import java.net.CookieHandler; @@ -683,4 +678,75 @@ public void clearCookies() { CookieManager cookieManager = (CookieManager) CookieHandler.getDefault(); cookieManager.getCookieStore().removeAll(); } + + // Add these methods to JsonServiceClient class: + + public TResponse postFilesWithRequest(IReturn request, FileUpload[] filesresponseType) { + String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); + return postFilesWithRequest(requestUrl, request, files, request.getResponseType()); + } + + public TResponse postFilesWithRequest(Object request, FileUpload[] files, Class responseType) { + String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); + return postFilesWithRequest(requestUrl, request, files, responseType); + } + + private static final String BOUNDARY = "---" + UUID.randomUUID().toString() + "---"; + + public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Class responseType) { + try { + // Prepare multipart data + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + + // Add request DTO fields + for (Field field : Utils.getSerializableFields(request.getClass())) { + Object value = field.get(request); + if (value != null) { + writeMultipartField(dos, field.getName(), Utils.stripQuotes(getGson().toJson(value))); + } + } + + // Add files + for (FileUpload file : files) { + writeMultipartFile(dos, file); + } + + // End multipart + dos.writeBytes("--" + BOUNDARY + "--\r\n"); + dos.flush(); + dos.close(); + + byte[] requestBody = baos.toByteArray(); + String contentType = "multipart/form-data; boundary=" + BOUNDARY; + + return send(resolveUrl(path), HttpMethods.Post, requestBody, contentType, responseType); + + } catch (IOException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + private void writeMultipartField(DataOutputStream dos, String fieldName, String value) throws IOException { + dos.writeBytes("--" + BOUNDARY + "\r\n"); + dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"\r\n"); + dos.writeBytes("Content-Type: text/plain; charset=" + UTF8.name() + "\r\n"); + dos.writeBytes("\r\n"); + dos.writeBytes(value + "\r\n"); + } + + private void writeMultipartFile(DataOutputStream dos, FileUpload file) throws IOException { + dos.writeBytes("--" + BOUNDARY + "\r\n"); + dos.writeBytes("Content-Disposition: form-data; name=\"" + file.getFieldName() + + "\"; filename=\"" + file.getFileName() + "\"\r\n"); + dos.writeBytes("Content-Type: " + file.getContentType() + "\r\n"); + dos.writeBytes("\r\n"); + dos.write(file.getFileBytes()); + dos.writeBytes("\r\n"); + } + + // Convenience method for single file upload + public TResponse postFileWithRequest(String path, Object request, FileUpload file, Class responseType) { + return postFilesWithRequest(path, request, new FileUpload[]{file}, responseType); + } } diff --git a/sync-client.sh b/sync-client.sh new file mode 100755 index 0000000..ef868d7 --- /dev/null +++ b/sync-client.sh @@ -0,0 +1,5 @@ +rm -rf ./src/AndroidClient/android/src/main/java/net/servicestack/func +cp -rf ./src/AndroidClient/client/src/main/java/net/servicestack/func ./src/AndroidClient/android/src/main/java/net/servicestack/ + +rm -rf ./src/AndroidClient/android/src/main/java/net/servicestack/client +cp -rf ./src/AndroidClient/client/src/main/java/net/servicestack/client ./src/AndroidClient/android/src/main/java/net/servicestack/ From 105151969c0473e0c87d7a0a1d0e3faf4f655f5e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 24 Nov 2024 10:06:52 +0800 Subject: [PATCH 64/68] fix and implement convenience APIs for postFileWithRequest/postFilesWithRequest --- .../android/src/main/AndroidManifest.xml | 3 +- .../android/AndroidServiceClient.java | 45 +++++++++++++++++++ .../client/AsyncServiceClient.java | 8 ++++ .../client/JsonServiceClient.java | 41 ++++++++++------- .../servicestack/client/ServiceClient.java | 8 ++++ .../client/AsyncServiceClient.java | 8 ++++ .../client/JsonServiceClient.java | 41 ++++++++++------- .../servicestack/client/ServiceClient.java | 8 ++++ 8 files changed, 130 insertions(+), 32 deletions(-) diff --git a/src/AndroidClient/android/src/main/AndroidManifest.xml b/src/AndroidClient/android/src/main/AndroidManifest.xml index c4ca74e..6edf95c 100644 --- a/src/AndroidClient/android/src/main/AndroidManifest.xml +++ b/src/AndroidClient/android/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java index 37d129a..a742f63 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java @@ -17,6 +17,7 @@ import net.servicestack.client.JsonServiceClient; import net.servicestack.client.Utils; import net.servicestack.cookies.SerializableCookieStore; +import net.servicestack.client.FileUpload; import java.lang.reflect.Type; import java.net.CookieHandler; @@ -908,4 +909,48 @@ protected void onPostExecute(byte[] bytes) { public void deleteAsync(String path, AsyncSuccess success) { deleteAsync(path, createAsyncResult(success, null)); } + + @Override + public void postFileWithRequestAsync(IReturn request, FileUpload file, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(this.apiUrl(request), request, new FileUpload[]{file}, request.getResponseType(), asyncResult); + } + @Override + public void postFileWithRequestAsync(Object request, FileUpload file, Object responseType, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(this.apiUrl(request), request, new FileUpload[]{file}, responseType, asyncResult); + } + @Override + public void postFileWithRequestAsync(String path, Object request, FileUpload file, Object responseType, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(path, request, new FileUpload[]{file}, responseType, asyncResult); + } + + @Override + public void postFilesWithRequestAsync(IReturn request, FileUpload[] files, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(this.apiUrl(request), request, files, request.getResponseType(), asyncResult); + } + @Override + public void postFilesWithRequestAsync(Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(this.apiUrl(request), request, files, responseType, asyncResult); + } + + @Override + public void postFilesWithRequestAsync(String path, Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult) { + final AndroidServiceClient client = this; + execTask(new AsyncTask() { + @Override + protected T doInBackground(String... params) { + try { + return client.postFilesWithRequest(params[0], request, files, responseType); + } catch (Exception e) { + asyncResult.setError(e); + return null; + } + } + + @Override + protected void onPostExecute(T response) { + asyncResult.completeResult(response); + } + + }, path); + } } diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java index 7a775b2..280da15 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java @@ -78,4 +78,12 @@ public interface AsyncServiceClient { void deleteAsync(String path, final Type responseType, final AsyncSuccess success); void deleteAsync(String path, final AsyncResult asyncResult); void deleteAsync(String path, final AsyncSuccess success); + + void postFileWithRequestAsync(IReturn request, FileUpload file, final AsyncResult asyncResult); + void postFileWithRequestAsync(Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + void postFileWithRequestAsync(String path, Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + + void postFilesWithRequestAsync(IReturn request, FileUpload[] files, final AsyncResult asyncResult); + void postFilesWithRequestAsync(Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); + void postFilesWithRequestAsync(String path, Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); } diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java index bad6f44..671f5e7 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -131,12 +131,16 @@ public Object fromJson(String json, Class c) { public void setGson(Gson gson) { this.gson = gson; } + public String apiUrl(Object requestDto){ + return this.replyUrl + requestDto.getClass().getSimpleName(); + } + public String createUrl(Object requestDto) { return createUrl(requestDto, null); } public String createUrl(Object requestDto, Map query) { - String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); + String requestUrl = this.apiUrl(requestDto); StringBuilder sb = new StringBuilder(); Field lastField = null; @@ -679,21 +683,33 @@ public void clearCookies() { cookieManager.getCookieStore().removeAll(); } - // Add these methods to JsonServiceClient class: - - public TResponse postFilesWithRequest(IReturn request, FileUpload[] filesresponseType) { - String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); - return postFilesWithRequest(requestUrl, request, files, request.getResponseType()); + // Convenience method for single file upload + @Override + public TResponse postFileWithRequest(IReturn request, FileUpload file) { + return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, request.getResponseType()); + } + @Override + public TResponse postFileWithRequest(Object request, FileUpload file, Object responseType) { + return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, responseType); + } + @Override + public TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType) { + return postFilesWithRequest(path, request, new FileUpload[]{file}, responseType); } - public TResponse postFilesWithRequest(Object request, FileUpload[] files, Class responseType) { - String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); - return postFilesWithRequest(requestUrl, request, files, responseType); + @Override + public TResponse postFilesWithRequest(IReturn request, FileUpload[] files) { + return this.postFilesWithRequest(this.apiUrl(request), request, files, request.getResponseType()); + } + @Override + public TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType) { + return this.postFilesWithRequest(this.apiUrl(request), request, files, responseType); } private static final String BOUNDARY = "---" + UUID.randomUUID().toString() + "---"; - public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Class responseType) { + @Override + public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType) { try { // Prepare multipart data ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -744,9 +760,4 @@ private void writeMultipartFile(DataOutputStream dos, FileUpload file) throws IO dos.write(file.getFileBytes()); dos.writeBytes("\r\n"); } - - // Convenience method for single file upload - public TResponse postFileWithRequest(String path, Object request, FileUpload file, Class responseType) { - return postFilesWithRequest(path, request, new FileUpload[]{file}, responseType); - } } diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java index 7e6ef4b..dd8443c 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java @@ -60,4 +60,12 @@ public interface ServiceClient { String getCookieValue(String name); String getTokenCookie(); String getRefreshTokenCookie(); + + TResponse postFileWithRequest(IReturn request, FileUpload file); + TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); + TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); + + TResponse postFilesWithRequest(IReturn request, FileUpload[] files); + TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); + TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); } diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java index 7a775b2..280da15 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java @@ -78,4 +78,12 @@ public interface AsyncServiceClient { void deleteAsync(String path, final Type responseType, final AsyncSuccess success); void deleteAsync(String path, final AsyncResult asyncResult); void deleteAsync(String path, final AsyncSuccess success); + + void postFileWithRequestAsync(IReturn request, FileUpload file, final AsyncResult asyncResult); + void postFileWithRequestAsync(Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + void postFileWithRequestAsync(String path, Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + + void postFilesWithRequestAsync(IReturn request, FileUpload[] files, final AsyncResult asyncResult); + void postFilesWithRequestAsync(Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); + void postFilesWithRequestAsync(String path, Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); } diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java index bad6f44..671f5e7 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -131,12 +131,16 @@ public Object fromJson(String json, Class c) { public void setGson(Gson gson) { this.gson = gson; } + public String apiUrl(Object requestDto){ + return this.replyUrl + requestDto.getClass().getSimpleName(); + } + public String createUrl(Object requestDto) { return createUrl(requestDto, null); } public String createUrl(Object requestDto, Map query) { - String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); + String requestUrl = this.apiUrl(requestDto); StringBuilder sb = new StringBuilder(); Field lastField = null; @@ -679,21 +683,33 @@ public void clearCookies() { cookieManager.getCookieStore().removeAll(); } - // Add these methods to JsonServiceClient class: - - public TResponse postFilesWithRequest(IReturn request, FileUpload[] filesresponseType) { - String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); - return postFilesWithRequest(requestUrl, request, files, request.getResponseType()); + // Convenience method for single file upload + @Override + public TResponse postFileWithRequest(IReturn request, FileUpload file) { + return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, request.getResponseType()); + } + @Override + public TResponse postFileWithRequest(Object request, FileUpload file, Object responseType) { + return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, responseType); + } + @Override + public TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType) { + return postFilesWithRequest(path, request, new FileUpload[]{file}, responseType); } - public TResponse postFilesWithRequest(Object request, FileUpload[] files, Class responseType) { - String requestUrl = this.replyUrl + requestDto.getClass().getSimpleName(); - return postFilesWithRequest(requestUrl, request, files, responseType); + @Override + public TResponse postFilesWithRequest(IReturn request, FileUpload[] files) { + return this.postFilesWithRequest(this.apiUrl(request), request, files, request.getResponseType()); + } + @Override + public TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType) { + return this.postFilesWithRequest(this.apiUrl(request), request, files, responseType); } private static final String BOUNDARY = "---" + UUID.randomUUID().toString() + "---"; - public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Class responseType) { + @Override + public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType) { try { // Prepare multipart data ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -744,9 +760,4 @@ private void writeMultipartFile(DataOutputStream dos, FileUpload file) throws IO dos.write(file.getFileBytes()); dos.writeBytes("\r\n"); } - - // Convenience method for single file upload - public TResponse postFileWithRequest(String path, Object request, FileUpload file, Class responseType) { - return postFilesWithRequest(path, request, new FileUpload[]{file}, responseType); - } } diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java index 7e6ef4b..dd8443c 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java @@ -60,4 +60,12 @@ public interface ServiceClient { String getCookieValue(String name); String getTokenCookie(); String getRefreshTokenCookie(); + + TResponse postFileWithRequest(IReturn request, FileUpload file); + TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); + TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); + + TResponse postFilesWithRequest(IReturn request, FileUpload[] files); + TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); + TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); } From 1bb80fdbc87b8e34a493bf79be41d11d6f6700f6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 24 Nov 2024 10:12:42 +0800 Subject: [PATCH 65/68] bump to v1.1.4 --- README.md | 26 ++++++++++++++++++++++++++ src/AndroidClient/android/build.gradle | 2 +- src/AndroidClient/client/build.gradle | 2 +- src/AndroidClient/client/pom.xml | 2 +- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e73e900..09fdef8 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,32 @@ for updates, or [StackOverflow](http://stackoverflow.com/questions/ask) or the [ This repository contains the source for ServiceStack plugins for the leading Android Studio, IntelliJ and Eclipse Java IDE's providing Java developers a highly productive development experience for consuming Typed ServiceStack Services by leveraging [Add ServiceStack Reference](https://github.com/ServiceStack/ServiceStack/wiki/Add-ServiceStack-Reference) directly within their IDE! +### v1.1.4 Changes + +Added new ServiceClient APIs: + +```java + TResponse postFileWithRequest(IReturn request, FileUpload file); + TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); + TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); + + TResponse postFilesWithRequest(IReturn request, FileUpload[] files); + TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); + TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); +``` + +Added new AsyncServiceClient APIs: + +```java + void postFileWithRequestAsync(IReturn request, FileUpload file, final AsyncResult asyncResult); + void postFileWithRequestAsync(Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + void postFileWithRequestAsync(String path, Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + + void postFilesWithRequestAsync(IReturn request, FileUpload[] files, final AsyncResult asyncResult); + void postFilesWithRequestAsync(Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); + void postFilesWithRequestAsync(String path, Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); +``` + ### v1.1.0 Changes Switched to use `/api` pre-defined route by default, revert to legacy `/json/reply` pre-defined route with: diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 2ef10d7..6966607 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.1.3" +version = "1.1.4" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index 167d384..dbeb8a0 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.1.3" +version = "1.1.4" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { diff --git a/src/AndroidClient/client/pom.xml b/src/AndroidClient/client/pom.xml index 3a04db7..fec0241 100644 --- a/src/AndroidClient/client/pom.xml +++ b/src/AndroidClient/client/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.servicestack client - 1.0.49 + 1.1.4 ServiceStack.Client A client library to call your ServiceStack webservices. https://github.com/ServiceStack/ServiceStack.Java From a8a13b55adb1bcd5c5a3d1b95b5d30c2bcc224e0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 24 Nov 2024 10:39:38 +0800 Subject: [PATCH 66/68] Use T --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 09fdef8..1c79b65 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,13 @@ This repository contains the source for ServiceStack plugins for the leading And Added new ServiceClient APIs: ```java - TResponse postFileWithRequest(IReturn request, FileUpload file); - TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); - TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); + TResponse postFileWithRequest(IReturn request, FileUpload file); + TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); + TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); - TResponse postFilesWithRequest(IReturn request, FileUpload[] files); - TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); - TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); + TResponse postFilesWithRequest(IReturn request, FileUpload[] files); + TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); + TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); ``` Added new AsyncServiceClient APIs: From 1434bc9d7eb483ba32dea557443bbdc54a3f0b81 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 24 Nov 2024 10:40:06 +0800 Subject: [PATCH 67/68] Update response type as well --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1c79b65..43d620f 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,13 @@ This repository contains the source for ServiceStack plugins for the leading And Added new ServiceClient APIs: ```java - TResponse postFileWithRequest(IReturn request, FileUpload file); - TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); - TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); + T postFileWithRequest(IReturn request, FileUpload file); + T postFileWithRequest(Object request, FileUpload file, Object responseType); + T postFileWithRequest(String path, Object request, FileUpload file, Object responseType); - TResponse postFilesWithRequest(IReturn request, FileUpload[] files); - TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); - TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); + T postFilesWithRequest(IReturn request, FileUpload[] files); + T postFilesWithRequest(Object request, FileUpload[] files, Object responseType); + T postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); ``` Added new AsyncServiceClient APIs: From 163fe93a76400a4201727db4bd093df5ff1279fc Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 25 Nov 2024 14:55:31 +1100 Subject: [PATCH 68/68] Rename FileUpload to UploadFile to match other ServiceStack libraries. --- README.md | 4 +++ src/AndroidClient/android/build.gradle | 2 +- .../android/AndroidServiceClient.java | 20 +++++++-------- .../client/AsyncServiceClient.java | 13 +++++----- .../client/JsonServiceClient.java | 25 +++++++++---------- .../servicestack/client/ServiceClient.java | 12 ++++----- .../{FileUpload.java => UploadFile.java} | 10 ++++---- src/AndroidClient/client/build.gradle | 2 +- src/AndroidClient/client/pom.xml | 2 +- .../client/AsyncServiceClient.java | 13 +++++----- .../client/JsonServiceClient.java | 25 +++++++++---------- .../servicestack/client/ServiceClient.java | 12 ++++----- .../{FileUpload.java => UploadFile.java} | 10 ++++---- .../servicestack/client/AiServerTests.java | 6 ++--- .../client/JsonServiceClientTests.java | 14 ++++------- 15 files changed, 82 insertions(+), 88 deletions(-) rename src/AndroidClient/android/src/main/java/net/servicestack/client/{FileUpload.java => UploadFile.java} (66%) rename src/AndroidClient/client/src/main/java/net/servicestack/client/{FileUpload.java => UploadFile.java} (66%) diff --git a/README.md b/README.md index 43d620f..56bd769 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ for updates, or [StackOverflow](http://stackoverflow.com/questions/ask) or the [ This repository contains the source for ServiceStack plugins for the leading Android Studio, IntelliJ and Eclipse Java IDE's providing Java developers a highly productive development experience for consuming Typed ServiceStack Services by leveraging [Add ServiceStack Reference](https://github.com/ServiceStack/ServiceStack/wiki/Add-ServiceStack-Reference) directly within their IDE! +### v1.1.5 Changes + +- Rename FileUpload to `UploadFile` to match other ServiceStack libraries + ### v1.1.4 Changes Added new ServiceClient APIs: diff --git a/src/AndroidClient/android/build.gradle b/src/AndroidClient/android/build.gradle index 6966607..2c37cd8 100644 --- a/src/AndroidClient/android/build.gradle +++ b/src/AndroidClient/android/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.1.4" +version = "1.1.5" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java index a742f63..e12be4e 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/android/AndroidServiceClient.java @@ -17,7 +17,7 @@ import net.servicestack.client.JsonServiceClient; import net.servicestack.client.Utils; import net.servicestack.cookies.SerializableCookieStore; -import net.servicestack.client.FileUpload; +import net.servicestack.client.UploadFile; import java.lang.reflect.Type; import java.net.CookieHandler; @@ -911,29 +911,29 @@ public void deleteAsync(String path, AsyncSuccess success) { } @Override - public void postFileWithRequestAsync(IReturn request, FileUpload file, final AsyncResult asyncResult) { - this.postFilesWithRequestAsync(this.apiUrl(request), request, new FileUpload[]{file}, request.getResponseType(), asyncResult); + public void postFileWithRequestAsync(IReturn request, UploadFile file, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(this.apiUrl(request), request, new UploadFile[]{file}, request.getResponseType(), asyncResult); } @Override - public void postFileWithRequestAsync(Object request, FileUpload file, Object responseType, final AsyncResult asyncResult) { - this.postFilesWithRequestAsync(this.apiUrl(request), request, new FileUpload[]{file}, responseType, asyncResult); + public void postFileWithRequestAsync(Object request, UploadFile file, Object responseType, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(this.apiUrl(request), request, new UploadFile[]{file}, responseType, asyncResult); } @Override - public void postFileWithRequestAsync(String path, Object request, FileUpload file, Object responseType, final AsyncResult asyncResult) { - this.postFilesWithRequestAsync(path, request, new FileUpload[]{file}, responseType, asyncResult); + public void postFileWithRequestAsync(String path, Object request, UploadFile file, Object responseType, final AsyncResult asyncResult) { + this.postFilesWithRequestAsync(path, request, new UploadFile[]{file}, responseType, asyncResult); } @Override - public void postFilesWithRequestAsync(IReturn request, FileUpload[] files, final AsyncResult asyncResult) { + public void postFilesWithRequestAsync(IReturn request, UploadFile[] files, final AsyncResult asyncResult) { this.postFilesWithRequestAsync(this.apiUrl(request), request, files, request.getResponseType(), asyncResult); } @Override - public void postFilesWithRequestAsync(Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult) { + public void postFilesWithRequestAsync(Object request, UploadFile[] files, Object responseType, final AsyncResult asyncResult) { this.postFilesWithRequestAsync(this.apiUrl(request), request, files, responseType, asyncResult); } @Override - public void postFilesWithRequestAsync(String path, Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult) { + public void postFilesWithRequestAsync(String path, Object request, UploadFile[] files, Object responseType, final AsyncResult asyncResult) { final AndroidServiceClient client = this; execTask(new AsyncTask() { @Override diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java index 280da15..1817145 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/AsyncServiceClient.java @@ -4,7 +4,6 @@ package net.servicestack.client; import java.lang.reflect.Type; -import java.net.HttpURLConnection; import java.util.Map; public interface AsyncServiceClient { @@ -79,11 +78,11 @@ public interface AsyncServiceClient { void deleteAsync(String path, final AsyncResult asyncResult); void deleteAsync(String path, final AsyncSuccess success); - void postFileWithRequestAsync(IReturn request, FileUpload file, final AsyncResult asyncResult); - void postFileWithRequestAsync(Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); - void postFileWithRequestAsync(String path, Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + void postFileWithRequestAsync(IReturn request, UploadFile file, final AsyncResult asyncResult); + void postFileWithRequestAsync(Object request, UploadFile file, Object responseType, final AsyncResult asyncResult); + void postFileWithRequestAsync(String path, Object request, UploadFile file, Object responseType, final AsyncResult asyncResult); - void postFilesWithRequestAsync(IReturn request, FileUpload[] files, final AsyncResult asyncResult); - void postFilesWithRequestAsync(Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); - void postFilesWithRequestAsync(String path, Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); + void postFilesWithRequestAsync(IReturn request, UploadFile[] files, final AsyncResult asyncResult); + void postFilesWithRequestAsync(Object request, UploadFile[] files, Object responseType, final AsyncResult asyncResult); + void postFilesWithRequestAsync(String path, Object request, UploadFile[] files, Object responseType, final AsyncResult asyncResult); } diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java index 671f5e7..2f66e74 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -21,7 +21,6 @@ import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.nio.file.Paths; import java.util.Date; import java.util.List; import java.util.Map; @@ -685,31 +684,31 @@ public void clearCookies() { // Convenience method for single file upload @Override - public TResponse postFileWithRequest(IReturn request, FileUpload file) { - return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, request.getResponseType()); + public TResponse postFileWithRequest(IReturn request, UploadFile file) { + return postFilesWithRequest(this.apiUrl(request), request, new UploadFile[]{file}, request.getResponseType()); } @Override - public TResponse postFileWithRequest(Object request, FileUpload file, Object responseType) { - return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, responseType); + public TResponse postFileWithRequest(Object request, UploadFile file, Object responseType) { + return postFilesWithRequest(this.apiUrl(request), request, new UploadFile[]{file}, responseType); } @Override - public TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType) { - return postFilesWithRequest(path, request, new FileUpload[]{file}, responseType); + public TResponse postFileWithRequest(String path, Object request, UploadFile file, Object responseType) { + return postFilesWithRequest(path, request, new UploadFile[]{file}, responseType); } @Override - public TResponse postFilesWithRequest(IReturn request, FileUpload[] files) { + public TResponse postFilesWithRequest(IReturn request, UploadFile[] files) { return this.postFilesWithRequest(this.apiUrl(request), request, files, request.getResponseType()); } @Override - public TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType) { + public TResponse postFilesWithRequest(Object request, UploadFile[] files, Object responseType) { return this.postFilesWithRequest(this.apiUrl(request), request, files, responseType); } private static final String BOUNDARY = "---" + UUID.randomUUID().toString() + "---"; @Override - public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType) { + public TResponse postFilesWithRequest(String path, Object request, UploadFile[] files, Object responseType) { try { // Prepare multipart data ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -724,7 +723,7 @@ public TResponse postFilesWithRequest(String path, Object request, F } // Add files - for (FileUpload file : files) { + for (UploadFile file : files) { writeMultipartFile(dos, file); } @@ -751,13 +750,13 @@ private void writeMultipartField(DataOutputStream dos, String fieldName, String dos.writeBytes(value + "\r\n"); } - private void writeMultipartFile(DataOutputStream dos, FileUpload file) throws IOException { + private void writeMultipartFile(DataOutputStream dos, UploadFile file) throws IOException { dos.writeBytes("--" + BOUNDARY + "\r\n"); dos.writeBytes("Content-Disposition: form-data; name=\"" + file.getFieldName() + "\"; filename=\"" + file.getFileName() + "\"\r\n"); dos.writeBytes("Content-Type: " + file.getContentType() + "\r\n"); dos.writeBytes("\r\n"); - dos.write(file.getFileBytes()); + dos.write(file.getContents()); dos.writeBytes("\r\n"); } } diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java index dd8443c..e815946 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/ServiceClient.java @@ -61,11 +61,11 @@ public interface ServiceClient { String getTokenCookie(); String getRefreshTokenCookie(); - TResponse postFileWithRequest(IReturn request, FileUpload file); - TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); - TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); + TResponse postFileWithRequest(IReturn request, UploadFile file); + TResponse postFileWithRequest(Object request, UploadFile file, Object responseType); + TResponse postFileWithRequest(String path, Object request, UploadFile file, Object responseType); - TResponse postFilesWithRequest(IReturn request, FileUpload[] files); - TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); - TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); + TResponse postFilesWithRequest(IReturn request, UploadFile[] files); + TResponse postFilesWithRequest(Object request, UploadFile[] files, Object responseType); + TResponse postFilesWithRequest(String path, Object request, UploadFile[] files, Object responseType); } diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/FileUpload.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/UploadFile.java similarity index 66% rename from src/AndroidClient/android/src/main/java/net/servicestack/client/FileUpload.java rename to src/AndroidClient/android/src/main/java/net/servicestack/client/UploadFile.java index fd2bce8..c1f4638 100644 --- a/src/AndroidClient/android/src/main/java/net/servicestack/client/FileUpload.java +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/UploadFile.java @@ -1,20 +1,20 @@ package net.servicestack.client; -public class FileUpload { +public class UploadFile { private String fieldName; private String fileName; private String contentType; - private byte[] fileBytes; + private byte[] contents; - public FileUpload(String fieldName, String fileName, String contentType, byte[] fileBytes) { + public UploadFile(String fieldName, String fileName, String contentType, byte[] contents) { this.fieldName = fieldName; this.fileName = fileName; this.contentType = contentType != null ? contentType : "application/octet-stream"; - this.fileBytes = fileBytes; + this.contents = contents; } public String getFieldName() { return fieldName != null ? fieldName : "upload"; } public String getFileName() { return fileName; } public String getContentType() { return contentType; } - public byte[] getFileBytes() { return fileBytes; } + public byte[] getContents() { return contents; } } diff --git a/src/AndroidClient/client/build.gradle b/src/AndroidClient/client/build.gradle index dbeb8a0..dbaeb2b 100644 --- a/src/AndroidClient/client/build.gradle +++ b/src/AndroidClient/client/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'maven-publish' apply plugin: 'signing' // Define the version and group for the Maven package -version = "1.1.4" +version = "1.1.5" group = "net.servicestack" if (project.hasProperty('versionSuffix')) { diff --git a/src/AndroidClient/client/pom.xml b/src/AndroidClient/client/pom.xml index fec0241..b699d99 100644 --- a/src/AndroidClient/client/pom.xml +++ b/src/AndroidClient/client/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.servicestack client - 1.1.4 + 1.1.5 ServiceStack.Client A client library to call your ServiceStack webservices. https://github.com/ServiceStack/ServiceStack.Java diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java index 280da15..1817145 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/AsyncServiceClient.java @@ -4,7 +4,6 @@ package net.servicestack.client; import java.lang.reflect.Type; -import java.net.HttpURLConnection; import java.util.Map; public interface AsyncServiceClient { @@ -79,11 +78,11 @@ public interface AsyncServiceClient { void deleteAsync(String path, final AsyncResult asyncResult); void deleteAsync(String path, final AsyncSuccess success); - void postFileWithRequestAsync(IReturn request, FileUpload file, final AsyncResult asyncResult); - void postFileWithRequestAsync(Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); - void postFileWithRequestAsync(String path, Object request, FileUpload file, Object responseType, final AsyncResult asyncResult); + void postFileWithRequestAsync(IReturn request, UploadFile file, final AsyncResult asyncResult); + void postFileWithRequestAsync(Object request, UploadFile file, Object responseType, final AsyncResult asyncResult); + void postFileWithRequestAsync(String path, Object request, UploadFile file, Object responseType, final AsyncResult asyncResult); - void postFilesWithRequestAsync(IReturn request, FileUpload[] files, final AsyncResult asyncResult); - void postFilesWithRequestAsync(Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); - void postFilesWithRequestAsync(String path, Object request, FileUpload[] files, Object responseType, final AsyncResult asyncResult); + void postFilesWithRequestAsync(IReturn request, UploadFile[] files, final AsyncResult asyncResult); + void postFilesWithRequestAsync(Object request, UploadFile[] files, Object responseType, final AsyncResult asyncResult); + void postFilesWithRequestAsync(String path, Object request, UploadFile[] files, Object responseType, final AsyncResult asyncResult); } diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java index 671f5e7..2f66e74 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java @@ -21,7 +21,6 @@ import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.nio.file.Paths; import java.util.Date; import java.util.List; import java.util.Map; @@ -685,31 +684,31 @@ public void clearCookies() { // Convenience method for single file upload @Override - public TResponse postFileWithRequest(IReturn request, FileUpload file) { - return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, request.getResponseType()); + public TResponse postFileWithRequest(IReturn request, UploadFile file) { + return postFilesWithRequest(this.apiUrl(request), request, new UploadFile[]{file}, request.getResponseType()); } @Override - public TResponse postFileWithRequest(Object request, FileUpload file, Object responseType) { - return postFilesWithRequest(this.apiUrl(request), request, new FileUpload[]{file}, responseType); + public TResponse postFileWithRequest(Object request, UploadFile file, Object responseType) { + return postFilesWithRequest(this.apiUrl(request), request, new UploadFile[]{file}, responseType); } @Override - public TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType) { - return postFilesWithRequest(path, request, new FileUpload[]{file}, responseType); + public TResponse postFileWithRequest(String path, Object request, UploadFile file, Object responseType) { + return postFilesWithRequest(path, request, new UploadFile[]{file}, responseType); } @Override - public TResponse postFilesWithRequest(IReturn request, FileUpload[] files) { + public TResponse postFilesWithRequest(IReturn request, UploadFile[] files) { return this.postFilesWithRequest(this.apiUrl(request), request, files, request.getResponseType()); } @Override - public TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType) { + public TResponse postFilesWithRequest(Object request, UploadFile[] files, Object responseType) { return this.postFilesWithRequest(this.apiUrl(request), request, files, responseType); } private static final String BOUNDARY = "---" + UUID.randomUUID().toString() + "---"; @Override - public TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType) { + public TResponse postFilesWithRequest(String path, Object request, UploadFile[] files, Object responseType) { try { // Prepare multipart data ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -724,7 +723,7 @@ public TResponse postFilesWithRequest(String path, Object request, F } // Add files - for (FileUpload file : files) { + for (UploadFile file : files) { writeMultipartFile(dos, file); } @@ -751,13 +750,13 @@ private void writeMultipartField(DataOutputStream dos, String fieldName, String dos.writeBytes(value + "\r\n"); } - private void writeMultipartFile(DataOutputStream dos, FileUpload file) throws IOException { + private void writeMultipartFile(DataOutputStream dos, UploadFile file) throws IOException { dos.writeBytes("--" + BOUNDARY + "\r\n"); dos.writeBytes("Content-Disposition: form-data; name=\"" + file.getFieldName() + "\"; filename=\"" + file.getFileName() + "\"\r\n"); dos.writeBytes("Content-Type: " + file.getContentType() + "\r\n"); dos.writeBytes("\r\n"); - dos.write(file.getFileBytes()); + dos.write(file.getContents()); dos.writeBytes("\r\n"); } } diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java index dd8443c..e815946 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java @@ -61,11 +61,11 @@ public interface ServiceClient { String getTokenCookie(); String getRefreshTokenCookie(); - TResponse postFileWithRequest(IReturn request, FileUpload file); - TResponse postFileWithRequest(Object request, FileUpload file, Object responseType); - TResponse postFileWithRequest(String path, Object request, FileUpload file, Object responseType); + TResponse postFileWithRequest(IReturn request, UploadFile file); + TResponse postFileWithRequest(Object request, UploadFile file, Object responseType); + TResponse postFileWithRequest(String path, Object request, UploadFile file, Object responseType); - TResponse postFilesWithRequest(IReturn request, FileUpload[] files); - TResponse postFilesWithRequest(Object request, FileUpload[] files, Object responseType); - TResponse postFilesWithRequest(String path, Object request, FileUpload[] files, Object responseType); + TResponse postFilesWithRequest(IReturn request, UploadFile[] files); + TResponse postFilesWithRequest(Object request, UploadFile[] files, Object responseType); + TResponse postFilesWithRequest(String path, Object request, UploadFile[] files, Object responseType); } diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/FileUpload.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/UploadFile.java similarity index 66% rename from src/AndroidClient/client/src/main/java/net/servicestack/client/FileUpload.java rename to src/AndroidClient/client/src/main/java/net/servicestack/client/UploadFile.java index fd2bce8..c1f4638 100644 --- a/src/AndroidClient/client/src/main/java/net/servicestack/client/FileUpload.java +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/UploadFile.java @@ -1,20 +1,20 @@ package net.servicestack.client; -public class FileUpload { +public class UploadFile { private String fieldName; private String fileName; private String contentType; - private byte[] fileBytes; + private byte[] contents; - public FileUpload(String fieldName, String fileName, String contentType, byte[] fileBytes) { + public UploadFile(String fieldName, String fileName, String contentType, byte[] contents) { this.fieldName = fieldName; this.fileName = fileName; this.contentType = contentType != null ? contentType : "application/octet-stream"; - this.fileBytes = fileBytes; + this.contents = contents; } public String getFieldName() { return fieldName != null ? fieldName : "upload"; } public String getFileName() { return fileName; } public String getContentType() { return contentType; } - public byte[] getFileBytes() { return fileBytes; } + public byte[] getContents() { return contents; } } diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/AiServerTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/AiServerTests.java index 52fdf42..eeb2ba9 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/AiServerTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/AiServerTests.java @@ -3,10 +3,8 @@ import junit.framework.TestCase; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; -import java.util.List; import net.servicestack.openai.dtos.*; // You'll need to generate these DTOs @@ -54,7 +52,7 @@ public void test_Can_SpeechToText_with_File() throws IOException { byte[] fileBytes = Files.readAllBytes(audioFile.toPath()); // Create file upload - FileUpload upload = new FileUpload( + UploadFile upload = new UploadFile( "audio", // field name "test_audio.wav", // filename "audio/wav", // content type @@ -65,7 +63,7 @@ public void test_Can_SpeechToText_with_File() throws IOException { GenerationResponse response = client.postFilesWithRequest( "/api/SpeechToText", request, - new FileUpload[]{upload}, + new UploadFile[]{upload}, GenerationResponse.class ); diff --git a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java index 51ec80d..5183e29 100644 --- a/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java +++ b/src/AndroidClient/client/src/test/java/net/servicestack/client/JsonServiceClientTests.java @@ -3,10 +3,7 @@ package net.servicestack.client; import junit.framework.TestCase; -import net.servicestack.client.ConnectionFilter; -import net.servicestack.client.JsonServiceClient; -import net.servicestack.client.WebServiceException; import net.servicestack.client.tests.TestDtos; import test.dtos.*; @@ -15,7 +12,6 @@ import java.util.Calendar; import java.util.Date; import java.util.List; -import java.util.Optional; public class JsonServiceClientTests extends TestCase { @@ -105,8 +101,8 @@ public void test_Can_Post_file_with_Request() { request.setRefId("zid"); byte[] fileBytes = "Hello World".getBytes(StandardCharsets.UTF_8); - FileUpload[] files = new FileUpload[]{ - new FileUpload( + UploadFile[] files = new UploadFile[]{ + new UploadFile( "audio", // fieldName "test.txt", // fileName "text/plain", // contentType @@ -143,14 +139,14 @@ public void test_Can_Post_Multiple_files_with_Request() { byte[] textFileBytes = "Hello World".getBytes(StandardCharsets.UTF_8); byte[] markdownFileBytes = "## Heading".getBytes(StandardCharsets.UTF_8); - FileUpload[] files = new FileUpload[]{ - new FileUpload( + UploadFile[] files = new UploadFile[]{ + new UploadFile( "audio", // fieldName "test.txt", // fileName "text/plain", // contentType textFileBytes // data ), - new FileUpload( + new UploadFile( "content", // fieldName "test.md", // fileName "text/markdown", // contentType