From 9233fe3799d297689209f62821227fac76ad30d0 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Tue, 22 Dec 2020 19:31:43 +1100 Subject: [PATCH 001/101] Initial fix for Android studio, upgade IDEA plugin to require/target at least 2019.3 onwards. --- src/ServiceStackIDEA/ServiceStackIDEA.iml | 5 +++-- src/ServiceStackIDEA/build.gradle | 18 ++++++++++-------- .../idea/PluginSettingsService.java | 5 +++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/ServiceStackIDEA/ServiceStackIDEA.iml b/src/ServiceStackIDEA/ServiceStackIDEA.iml index c5323fb7..9d0ffd93 100644 --- a/src/ServiceStackIDEA/ServiceStackIDEA.iml +++ b/src/ServiceStackIDEA/ServiceStackIDEA.iml @@ -1,6 +1,7 @@ - - + + + diff --git a/src/ServiceStackIDEA/build.gradle b/src/ServiceStackIDEA/build.gradle index 459428bf..4c52c2ee 100644 --- a/src/ServiceStackIDEA/build.gradle +++ b/src/ServiceStackIDEA/build.gradle @@ -1,28 +1,30 @@ plugins { - id "org.jetbrains.intellij" version "0.4.15" + id "org.jetbrains.intellij" version "0.6.5" +} +version = '1.0.41' +repositories { + mavenCentral() } -version = '1.0.40' - apply plugin: 'org.jetbrains.intellij' dependencies { } -Properties properties = System.properties; +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; +String jbToken if (properties.getProperty("jetbrains.plugins.user", null) == null) { properties.load(project.file('./local.properties').newDataInputStream()) } -jbToken = properties.getProperty("jetbrains.plugins.token"); +jbToken = properties.getProperty("jetbrains.plugins.token") intellij { - version 'IC-14.1.4' - plugins 'maven' + version '2019.2' + plugins = ['maven','java'] pluginName 'ServiceStackIDEA' updateSinceUntilBuild false diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java index f9a9d6b2..7e65c08b 100644 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java +++ b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/PluginSettingsService.java @@ -2,12 +2,13 @@ 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(id = "default", file = StoragePathMacros.APP_CONFIG + "/servicestack-settings.xml")) +@State(name = "PluginSettingsService", storages = @Storage("servicestack-settings.xml")) public class PluginSettingsService implements PersistentStateComponent { public Boolean optOutOfStats = false; @@ -18,7 +19,7 @@ public PluginSettingsService getState() { } @Override - public void loadState(PluginSettingsService pluginSettingsService) { + public void loadState(@NotNull PluginSettingsService pluginSettingsService) { XmlSerializerUtil.copyBean(pluginSettingsService, this); } From ce4c7ac7e37706e83ac5dc9c9fb6d7097a487e4a Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 24 Dec 2020 17:22:11 +1100 Subject: [PATCH 002/101] Remove files in .idea from source control --- .idea/misc.xml | 6 - src/ServiceStackIDEA/.idea/compiler.xml | 26 - src/ServiceStackIDEA/.idea/gradle.xml | 20 - src/ServiceStackIDEA/.idea/misc.xml | 6 - src/ServiceStackIDEA/.idea/modules.xml | 10 - src/ServiceStackIDEA/.idea/workspace.xml | 690 ------------------ .../gradle/wrapper/gradle-wrapper.jar | Bin 51010 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - src/ServiceStackIDEA/gradlew | 164 ----- src/ServiceStackIDEA/gradlew.bat | 90 --- .../src/main/resources/META-INF/plugin.xml | 71 -- 11 files changed, 1088 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 src/ServiceStackIDEA/.idea/compiler.xml delete mode 100644 src/ServiceStackIDEA/.idea/gradle.xml delete mode 100644 src/ServiceStackIDEA/.idea/misc.xml delete mode 100644 src/ServiceStackIDEA/.idea/modules.xml delete mode 100644 src/ServiceStackIDEA/.idea/workspace.xml 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/src/main/resources/META-INF/plugin.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 65b0364f..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/compiler.xml b/src/ServiceStackIDEA/.idea/compiler.xml deleted file mode 100644 index 983bb0aa..00000000 --- a/src/ServiceStackIDEA/.idea/compiler.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/gradle.xml b/src/ServiceStackIDEA/.idea/gradle.xml deleted file mode 100644 index 965082d7..00000000 --- a/src/ServiceStackIDEA/.idea/gradle.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/misc.xml b/src/ServiceStackIDEA/.idea/misc.xml deleted file mode 100644 index d5d79e0c..00000000 --- a/src/ServiceStackIDEA/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/modules.xml b/src/ServiceStackIDEA/.idea/modules.xml deleted file mode 100644 index 63bfe941..00000000 --- a/src/ServiceStackIDEA/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/workspace.xml b/src/ServiceStackIDEA/.idea/workspace.xml deleted file mode 100644 index c6fb80f9..00000000 --- a/src/ServiceStackIDEA/.idea/workspace.xml +++ /dev/null @@ -1,690 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1443165621031 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No facets are configured - - - - - - - - ECLIPSE - - - - - - - - 1.6 - - - - - - - - ServiceStackIDEA - - - - - - - - Gradle: com.jetbrains:annotations:14.1.4 - - - - - - - - \ No newline at end of file diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 2322723c7ed5f591adfa4c87b6c51932f591249a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51010 zcmagFbChSz(k5C}UABH@+qP}H%eL+6vTawFZQHiHY}>BeGv~~A=l$l)y}5Som4C!u znHei0^2sM+D@gwUg$4qGgal%8wiE^W+d%%u>u-bl+hs*n1ZgGZ#OQwjDf~llek;Y6 z|F3|`-;Vmf3(5-0Ns5UotI)}c-OEl+$Vk)D&B002QcX|JG$=7FGVdJTP124^PRUMD zOVR*CpM@Bw929C&wxW|39~2sn_BUajV%|F5Is*T<3IERVUn>LsJGOH)`#%=-zstb< zTgJ@Mz}VX4|5Fs@pQ3J#2KM$Qj{nCe<^jg01%E}C{&wR3{E3L2o2|8-fiVdqosqSH zlao)BEOb8uV(_*(t0uK8eE`f#NKPNVJs};BptZ0yl%!;NS0)U?&hJ4~hjX4IUc5=~ zn&*8e0^$B%3_~IBX7YI0~= zk8=?n=@CD_iYOoXtXV9c?oW;m3|7}b`>T&$b0@cXG}z1?-Kl=St3{=F${40 z(C7g;7g}7O|EA?wt%n%2zXo9cSH&X#KYLX6aB?=WQE;^Tt1M>=6Q{o;cMm}qXLA!< zXA2_(XFJD#DWOQ&#tvB!(HD&(bYyO?Ous65ZP`=hFv4z59}8-DFer^|i7W)c6b75a zsf*YvGRdz<&$=L-zZc&m3#=SelJS=BVse^!X0oBdi{IDx6Fx6$glwK7tyY1dHl<${ z<$P7bfH~OYa*L@hc%5v|9@ZMWbs*0B2rOsKB#e9LM~DcmHB?AZJ9^kkSAj6$_Kk2Z zkt?sY8LB_w`4(TOVrL|IOOj4wulFbtK6_XZ= z)n}9X7zf4bA@%319uA{V#Y0$%`Ef!KdT{V1${=4Nig3#E0mEvqsAiQSh_yChrU3ja zW1Ey>^kEO-*R))gVV~UEFr|{7{VwQHNtxp{`S_vuA>`!FTI+^#eO(_(H>}{I9*O|LsKo+3qC&mvjBgszjsv z{<;=y$oJ&w5h_wAwClwdC0_5vSan>B#J)<=)rp9ELvttK@G%&8k>fSN$F~42)q+sK8$sx z&q0EXA3vwgh5I!!lZryfm1@Ut@)1K=vHEX}=-Z_JJS9c8l0&dSC9Uz?6r z){@5(MEw$r*I9m4s-$RYw$uXE`lETNx-d9V91cBDnxEenM5DhvKyh-+J%5KXM>32OQeRh0`z0Jvtd?N6 zEg%l43(-?iOvzlfUm8jpHc{*C=}nMIZ*8pFuIOQ2P;Ms0bs^U|#QtoRgOz2XwnB5- zNw%YXoMAJX+NAz8DrX8^+RHQEz>l#uRoa8oCdM$p95bHRXpZ!wzmbT!_fHLxtuND;3%bUx!%Nw2n>5 zAs$O>$N8fBxPx4Vi=|KN8j=}CH2DW@MohDfW){Pp<{wM9qJykrts_H!!nH_d$^=yr z20?8;k9x_l10+F`PNlji0QjRR9I&74%~f5gdmsStjA)v6lJhRM&`7mm0;#i5;U4L> zSd;PqQ{f(q0DJF-1L1PhBk^{Vmf97ga8LV3mK2^;?vlU*?3*;b>vmc6aHR826Otbl>=!yFo7GaS97{ajVPuvvuL)~Zp zARtWV5Kc%$os(dm{{e%pucsA9F{V$=5d%S@ivNp}hXl8u1+OVlUeox2Wxyx(g#PL? zz%y7Nz7)JWC@?jSOSu09{Ab!qFp&r>ky@B5Y^>xoK}g$qKQbBx*%Rr)SxoA<3gf*dF(0g;!N^R8l-fb%t%^HEk?I&rIitH z6|a!Y5FJp3;hLL|t_lTcW-HGS?WiCSl#(i)&TP+Nv0lPbb{2eSvJ5fBPf@^=CBuFr zaYr#tiD0FiQs{^*2rN%l19wq!r)66m%`S!Bo!D_USmP@GRnmL6Li$B-Qls#%F2BWxiLne@)TEP(k*@ zRFL=QqKZ~7!Hd^2PKcItb7m}ujKARk52TZXMHLY+03LoRO#0r0T8CR>TuMt%wI*X!{Rs-gsLML_nW#|=^dJhl(X`%3 z-%gT!lTIRo1u4 z!=a<^xA9T2@n$)xl)*v8?->s81A93M3TOb!w3#;WGi1dzY3aaz- zXgrkoCDFtRlk$+Ab#Rzs-Nq%92;NCd9l8~thEjD;?2}l8)b7?Kr<&)ZqYtuzh!JKOFA7jM-OpZr zrvi^L|G4hGqD-3UWoLlnkM*Zi2@23IR^Wtd>j>YVRLM@+)1}n)gyN9jL!)kqqK$&_8`ljYS3@q*l@yiLEZxx>=_t&8dUv72s~?{n*~4@agEriW(1W}{n6%H3e8BliPVr4bsjGAruJ*8r)J)q0S%k(rvAN%P;#O+e`S(E4 z4qcVTE_q4X6`RGf-n0!>n8LKQv5r}~UMP-9#Yk}4%JYQ(&r`vu z#=l+vFL*%&|G$D4^?%)-gzaoiEzDdT4V*3PZ2t{j64q@O1Q0{a5;^2>*{6Tg(jE)^ zj?p>;Zv|3RO=80-6i^h>3eOyuj5?=UjlcXgsO&EiGzf;!D@n9S$=yIX%sP z?{Ts1=lccni;G7=z+V$SiZdP^JK9^{G~lQS-yt{d8mM9 z4KC8?#Vc>;N=CI=52o+MY9DvSf*JEi^%8$QNNP@^F&USOFi2A|K1VT%Mpw6uFMMTR zFZ|^G>hRvR9(Sm89U7x>lbcQ96ijlqVkCvLKWN@wY} z7PTerb;LE28KBaKU$+uj4sS2BkS2?#@zY?oDYwHpk~&}2Mu`qEuFwb9Wqx_Zj!hnV zDRzEv*moWReXl^kz`w=%x%e9z3sr?eNjaYkfy%$>`-6q!&=3V8o4Es95b!Mx_N@=4 z)QBlY$(80odpk6knl|&}_ozAgjdPSoz*olYk1$2KXabugX5u)FER(vA=rQy;x?KVR z18`z6I)ihQD7714oM|irS4`e3SUPfHnTH2Crf%V@bB_iZY29o@>Ek`>wAdkTjqLoT z;WtP}bPDK+EfLvd7mbLD1bCM5hHB9GY8Ziep3!o|1MnEcUxglsxU5Z>1P_6;eX4|E zgMrqNg0|s;BzVR!tdE!knjnr^kO_x^c+i4sLj*tZ4v;MIW`HQk2;71Qm=Nk|LEEUo z<2~X^O8;a7D@h3~r-^;T{L@qweQ+%f|6**+zW|2eKLeQmeu0%Ru>DIF{2RSQtDQTc zsG@$`WEu~+P829eNd-fKSiFV(0$4*+%}Ny^kSNduw9DEh1{U^Am0~o#2qi)|6k8bS0ry|!(J+HcsU1nahon|h!zdv5le|^6E9H5ITbr%*!5o5_3 zERA4ieIdP10tXn~G0?f8P?4!-sokc8s6~M~h*d*LPD?q;1;&&SOk25QFU(&E!EE&n zp=tMbBy^I~bCVZcTQM*YODYY}1gYd$2|`-{iX$eVL4=D<+Qk7Z;_W4I0~OUdLae0MAKMO{O%{z+%qsJW zD(gmrOpq**W*q^)Y^o4zfGC;AFzM`?uuL4=Ng|~0%LC|+a?o7z-qwD5)}C>SpW5s6 z%lr({vOh6$e>ANAQ<72(Bd3(KbLJ@~{V1)B+aY+uUbW#gKU(6E8bQs)q`zQo5tJGb zW7e4PV18N~zu=(ywzZL0g6doi>RYVeW~!zF$!*!drN+SAP(S91z#VfLbiB|HZDwth zQhy`mGT;<-7zPjFA*qcErkw~pMZKD)7qV;USIECsWhgj8#5e1Ji(mdCF*4Hndk+OS zH{hpt$czh4FFIBCqJy$ycmE1i_uMUQ_rfi&uY!a0NbHNGpz|d{y8q%+4@eiXG(394 z#wiXRx<=Mob=(hevKsyMh|)V&X*fS7qvIlG%ox$lZV8_T=asr~i4m)Z33?aS&pfMC z4eNA?E+W=^IHJ;>ELrZSPH!3A58N5|K<`pX?#%m}pQJ@0vFyE^DTviUjY`op&{`E3 zj+NB&;-93xt3%ctd-;&0JW7KHo2#lkwu^nf&SoH|Om| zE_8sVUx<_skdv>mhudS{!ZV8(dI1P?^zUi!JufSEO8M0!!)VNVW_K9r#>YCj^{>Ny zL;N#jPCK4Q03d*XY~g``$o_N4R4{Nh7j$wmu`&FwK$)!eYJ{zh^tHSU@JQr{a9V8& zG$fCv`GY2@Od*MKvm{bg^F}4N)@o%%Y)5t7-cd0a;)p`=>;npt^bU@$NjcaE?0XOk z()~wAtC?!y38IVr+G1;xoq0R6<@;;qlN~r~xMzkrIyLM$)AgQ>9oP+K8YxNlfgxpV_SvEPmwPzJoVNZq%-_ zgEv-g{E(SwJMPf2@s~Hw$W1-0Uf5owqBms-{m5K!&ESoy;#UT&9(v|B;%O$MxAc+S z$W1mzH}=T$jZdEgc?kaCjWDMNc|->^e3V9{ro*Vc_PPc|TZjpjf>UwXdZ6f(gR^*F zymaEHF!8`Wv+_XVed>sK=y6Fgxsy>UDv6k_IeU|}A~Vb%N-PGLW55M&qs+*XjGG#D ziZj?d8QDlK4qnz4S5u9?)oVWA{>hVx)lU|0=8$Bceu^^|B##XSxaa(UVU_2~fZ4p{ zlC>|SfyEK237B@?Dq2*RTlyU{*7Z1-T1>}O*!(M;x(lIYx8yDpD{AWY?CjZ%B44p4 z8QIJj_(IoqG`n}0_6}zJ`!dhwoLe(7uT6?1Ygy+Rx1OpM6g$b*18av40GP|vqDv`3 za~|hg8d-SMp~W(KruBp&MsrWZIKDR6Jith_&;6`w$qU_Kxy-xK7@gi~8kzKHHWjaW zzvybWYodMM9L#5w;v}XbZ$RDgVJN|-)#}gOrJpi?XYCO*H+D5Vg#yO@ZyU8xb@az% z0)C_sr@sERw|W<4d|elph1+=?rmhQ$$&du2>45Qf&U4tf%=XOe^vO%)`a-8+I@@@6 z<;-Dq4OcJ+EL{EI&I`AzoM@_dVI>8;ta_=Ze7a2IH+cBRF(?4Kz2cAu58hC$3he#} zRn7n_z{y>6NEu^abj$YVko-+V1Q^Yo)Ji@E1?EtvZN*F3$pDJ4_pJYS051Ql9rcO)z1BsNyq5t_LJFr zo+{N*V(}qas>DX2L3Pqbp?o%9osNMR#m2z4%Em}YM31!CRbIuk~q%Ab_G^u1);Vy~v5lpd5q<(^3sv%g()~+mRyNVkvE5dSP zD{!nmZCN{NjcU$~IWCgAsjlEPcl!=-PoYlRvWh)nhh@7Ru5iN_nBl-3BRCAcu-|5P zXT!+KeQnoz#kz7sU_vGZ@d|Bbkn)W`SG+E6*`fU>-|g(Tg{klUm`Cgpkr7XqmzdjS z2;(V}uQ2Ria+_34irQnUsLlTD?3W1E7{nG)Syqn|MRElUo6faK>6HxqpJiGPt1eKs zTW0^A`?s?f7sj6u-1qGxl(g1Qy8~s~K0SAqpcnIcG!~*I!&{~SH5Zi&8T)4wzR2X( zk*M}7uE0!@`yX3e<8~cljeDQ&u$5HmaHIAmXM(}&24AW2njm0UN3Ojy*A(Zya=kg-Kx%m9(;U^c|;#2!Py#UBCh>HxCp zMW!dRCkJyl2MQxUu&Lwz%ytOZ6EfEmPbK+B1>+wO$MaRY%MxI;=UTgsg#C;|3hj0H z7B~he5Oaa5rs_f+7lB*Qmuz$nvD$soqjhL-JT55mN|pyd6Xn;8WTprn#nS>9E-!{C ziXd5EH^9bP`}~BmVvE9S>!O4KIC#=HP(A(yPSNRQZ3@?myp7c>Nmne=uEWB~Px5xZ zxsC`GcqDIF6`1`U5L5#@&HT4Jc*x1$k!_xDW+@Vv`IZ;7#74klrh>x`c>yGu@<|Tf zKF&XMoWfBm=f)s%4)x2}-6Z2^HrBeGD|T6ElwBa>O=yKzN9aDm5bZTzXm_`dQcbijQi5e=utee3se#GBiH)Y{e7J}$3M$Y z^&k)YW)}QKDiQrqBd96+O?Ll{m-ij_#SeI^A*d>04^)x;rk(nhxc~9)Npc^dzTaPo?l7<4MDVPT{YPc~F`&LqTZ}reGlCkmTBTL0 zSslWHeFfA4y+*B-O~OkwKt~&W2a(S`nuQwBO)0_KskZAPc(&gJtc$+`2MiCdX2Zfb!Au!WwdV3%G{8m`(PlkMoo6~rpR&)b#z(<-`K1#Jg2ulNUh z_tH@x;^8P;aBHaJ(8(>%?vU_;0J(Sv z0b(|C`V_c3ni7$9hRm=S%|w&mTyp_; zAq6e^6xWQ_##F3@3;b>V+|gUCLEeQt(bJo#SW5;w5*K4?J5bo_;m?=`l||OvGd5$F zm!pzAS!iPr8!akVgyKoh5pdl7H7jyRS8Q3!?d4Ecx3z3&dS{oZikT*-ImyGWinmY; zyoCnpdwQbgMXf33U3SjHT1gbi!diaTP<xs2>}8Y)XfK$nS3;eppi1Y>f?0ZRKOqpv-X7L{SXq23l> zu)%6XU(tfhnE(+m9wXdvAaJwZO6%i9*stG2OplmqYAIRe<-`+;Mq=FtLiz%^@kWxt zc4p-n%a`7U5V9!Em)0~S4LElbGMbroDSW(~7MRS{5nH7Of=#MdP?aNG;C1L`YUn}+ zwq!p-ZxXt^VA?JR{s>H}VkQkp7usk}k8vNGUoX*A;Qb}RRXpuvj@hH%F z;>ITyHr(IVcbLrM+gRD<4S zgPcFc?IL{GZuC7%1(VQ>t%~_ z^Kw;AVIDfAdPHW*9~9rxq`yD@BGiGtmX#Q38QE#o^fa-Vl5rjHDmS|?6c29Q)E#<^x^l)c z(bbx+leELG8dsEV#Lsw-rC1ejR}txhE*aqtW8u~cI{qjd6owhc&kecMJ8UE#%BlCV znZ`zLw&KpfQ|yq~yJZ{+6Zg=F>N7xtmcxK#J_KFyTJWwz4USS_4$ic2a!lC)#bc|% zY6Lzx_8#iDqtc<*Pi1$ZLrFYkj`I1`!qG)K-rOP_yagNcWXjClbnQ)8`E)gPjYG;D zwO3ROg2!Bim&WnuTbNdxHzjUwpU!5j2i}7)!WZlTBw2Ha01d_4~-S>(&&eSQQ6JpX7a?na!|||4^j; zK26(IoU=JgL%9ydR5re08ivCnYXP@)M|Ib~%=lbD5$W@-5@tckV=1h7TKc!eAMT<_ zi6@f;-Z0C#6XY*UL5I!O!?#!ti8knfM@uMX10V@oXfkJ z!yGig1Q{ueMMyM{mWKRMLNne>Pex3DGr!?1Zr9J*G!l_OE1-OaY@7g_Bnm1Hfco^xZiUymnw_wMUn!id^W zph+5&-G8eafR%}Xzz#FF;+vj~wRgoL3c);-Vq#7F?#8tcDb|kiJkT&9M5#uI{p1z# zpvzmmc}%4D6HMayEsI#G$Ti^D9i^hli}s1D^~9g4Kavhkjs9;oX^3Nag> z_o?Oh?((*0I|ZcfiNJ`GivSOYV9?zHCR4QZaW!p^U`jO{BD9Sa4!vE`%GA z3bZIrC%Fnoi&5j5k&#w0!x2d_a(_3R1V5Tl2>3p%YaLk(Dcs)|8Y=K@u*p+*begNX zyfXYmyQ5VSE#y3a@z6pqb<8Q(EjgQ^k2gbE6Qe328(oyKDqV^<%a!J*o^j16;vC&6 zfaemw{t@h$<^78fsI7wV6XMk1qzT*)zkgKx7`0kn!;ujvrA&1L6R6AgQ-J)M{2k41K3Cst_@ZI1A?G5P- zbb4jZv|WN9`q4IEK6g+;dp%pVk-N$qXi=mqq0;ke5+&`G5dwoh=G*~K$`Ms z8)W#LKK^-}NL5^u3LDLQ0TF?I{wVAlU>W63l{rkbHGWhVR^yVRIgD1?G=Y6Lt*n(w ze~?-7L~gO~v{)yRUAvSrUUlCH_ugEPS%Q1tc+YgHSEv&&x`rEn*+QqV0&;nJM?bHN z(^@5sbbcA>47QcG7N_LV0TZmCZ=G|+;rM#yCOppLf}mHtM7N>~JF#K#ZNHA)$Qk?m zRn%Fh=0W~Otfs(EJVY;8Mj8Gu>X02dRP;`k_)x)fj|a~wc%EGFg3zLZIJPJ~u(YS=0{|_IFfSFuVIe@yKmx0J z*@6Zo&u%;%=oIRa=>e&mK*G)ywsyBSMe)h0<{-Kr&#*$*eyAnBL)TXzpMABpPk?M~ zl_)?muIkX%#!Wh4B^#UQ-9aQqi0;tf_YSudO;mg30MR)*wbg$(k3sFo>MT@@0 z{F}K;{#$_jf2oiYva@q`a{ilXmNl@jRdzOTbpC(Sc0aY&)ew36>%q#Ad#xEk?Lkm8 zhvbx{u=7};f@?7n^i#MBBWvl!L{ds=P)<_lEZ(u-)>6CK=tF9}Ww+ny-xmGmT&s-( z+3%JR+|tvzou((dj6Ppy?C60z{qap+9Mr|=O-VZG4b;S_kBm14I-~xwh6a)$5R8}; z8oL9Zo;*7Vp^qBLh^Y)D1xQxN%O=+P%KZ?J687w|FSSFVBabf%!{RR*{p61duZ~(` z=n2S5Al}LuzyBfS&V=|_?W>`w)!#+fTn+SM{vuVd`;Wa*LHRG@BG0ZGGDTwf^%S*>7r5}#MEpuD+d~@7S^gXTmD63qu3{kjsIwSYp-BFV;vdxRGh z0-`<;32f$;H}om+SKs$*<4JVZ4{E`Krm06&DraR1ZO=_~vI*)Yh1w|9pTnc|RYWU8 znk~iYxcuX5G|FGK5qMPc95o4l5L6;DRj%#pAW(^Q>?7C%656XTHD!v-+$hrbsv2yagjPP|YutOU?eBKy2PcwUg%N24H zfaY>iFn0{eJu6?Zhouixvmg_TLRh~S`c1|iel+zv-e|EZt3MIZFEs5Y>S%Xr0G;1I zN&J%$i);{O6qqq~1tec@Y=1t8edke+?0h(=1WfjpCxhG@I9CAKub)}wJ!J|VUK74# z1PUe3KD+U{pP||icJpCsRu~_s3x3iAT?&{?FPQN_V4LI}Dd1v2IBGuP9Y;8*HIn6d z7u+Y=eM}w2c2Bk*i#pEL#V+19i-bsWi;Vt3USV{TQS@Q1(>Y>!u(szCMu= zO5r92Qm5d#!#HmVm#je`s9V6OyF>cfUrLl~Mdo0ev?`SESM@%xW;o8)PpOnFk(+>R z*S(Ebgnx#^K2d^k;lD);O=v(s6#tn#{CCZbsJn@g%YT*KCu_LrV=rNTXA_IpJ353} zo9+IB1m>ltDqE>uTf069 zu%5G5{*2z@r;)9ZId4{`|h=z}TP|H=RhqJ@#;z_GIBgtr)?6mz8qN`9l z*i>VV{bzc2p3kO|UfG7No~3@Ph-FglXC%583$=J?NQ7&*d8!C!we9%vqqZ2f8{~1x z)P|gqP+x}cLdHo}ZKI6Z^@foJNj+Cfn^TLhawE$+gOjo4s)Z(td1_9x7i?sK#ig>n zs8tc5k4nC<#H}WWP6WbsnmTPzVH-SilAHC;qCdRDB}4ILzDCv zz&T#F)Ivs;S+fPKHZE}HytP(~lpLpobyet8tfEMD6M|H$f+rbZI=NWoMf9^Te#U7pJgZT7@)!ClWC)h zvqan?o9oKWxkS1HRKI&VOILDJp*1T`HcjTWT$9$zBUrkHmjuIU%(jyW3--KT_#!JV zZX_7Zu$4W_umFu-Y(o?M``i{Xorje|(mY0v>CBg{-KnozeIoP|SXikkXu}99ABgYtF@?|vp)b(^#c@;01cM^4 z`PBi28V%&CA3_wql%Z!$Vtk@$E~$^|jyLBKKT`ME9dEQa%^^?Hf=btEOqto54b`dMjNi^(D`L~JOU=>Gn#?e*DEmr5p zPf7d^j#P6Eaw*!Qf1&R1F#{mm@={289&B%wYk`dvkbZ4mRSrLFS%mESv`W#{38 z5Hl%Jy%~kN4{m9iVxk{pE<(dwaZ(X2N1HiGd2*L-s$25PDWY|tO)cZ0)LNfM!p~lW z@$`<3pBf%{Y%P*c?%reT@iEM3gU5+@o4!vFyvO&j2j zQBrDEuL_9#;aT=QZ6C?sn$8CHXjiVMQrgXi-lE2b8dU!K%rSY-q{IqNWk~^&s2YvX z#FwV31Do{HmH3)T4CX7?YcC$)9XS|IpD`ynv7zi4v7{(N#akvVN|)pn6I+&b`Sd=I zUH-vjOBG+TF)5ko4_wwHOEd^+F)b}GcvomES!1GLKgf2R-??i6_MFzDW;ENN+{fu# zwwaibJYPe3*4C(Npf+^w>!5naMUQ$~=S|uI-rbW03&lYoa9T-epylw93Nw&KR(Hu` znvKK%2V#xU0J{A+K$okrLZ2I08~3HU!V%x>req)FtG9Z<5mrC0g0R{$?!a@kMR)iy zx%=@{JN9LHO1s4STs3UWWa2t)qh)%MdL`Wh#YtBpd#2B6?3Sk*oH19sH{vISQ9~)F z^x)AH0ZZgs9pjALljdzT+Hl2A4{3|kTB}i1NF*YQ(%Ge+ak(>S> znzLcUx!FJs1~&Tmc7!unG(H+n6#ug`##kfl;Kqe1_}sO^;|%XMOTrlf^{V<5oTiO7 zZpJ{*2wjo65}dw0k$0p)WE=6>I0-yKBkbsQ-1qghYhmR*UA!6nF_sjr+&U8`S)*52 zHJN=Cx0*kjTBjG;M_1WbS3}ud%o|;*S6k`RTW7-Ny6BEP{OgaMvOIct8G;i7&$D|C z2gw6-k8Lm|qkcMw{gyQS9_E9uus2{FaOep~L?pE-dguiR=aBcF+JSHfJxR!PeN(Gp z9kpY9ryxZ3%qc=6a^pm3X}yJktDEqy5%;9wO8eeW5%(`s?3m(Ex*^_<%^9tYPbihF zv4(Al1kd>fSWs6C+P^It@olL`XpYR!e?RG#wnm+<9!IWQ&O~Sy-!6^LM^IJ^WjXP% zOSjiJKLH7{qe;sZ>{Fo463>VvIvo^~YoclVj=&uvfVAyY*{vpe03RiBd0Y{4{a^}c<1O=}Q0X{QX zf@e6v)U>S|k0@N7dhGa5pe$pN8nLr@qqHs#!)DkW@n-l3L8*VB?4FZ6osHl$6l$&`QMcJbq zo0g;e*oR-FmTu~pALF;cjAn5|D4I-fO7-*h_OLnNnMNKD(^B_Yf-BpBaT|0}?Q3%P zAK5;=U4iyvy>H?>T0_2v2``V7Oc9f24sYsMtIb=<*<=!W2F3_6& zrOr^;l5!WFF9j|Ch&sL^`;ovBUIzuowY;r#XS&(}$jB~U)jMY$s*6*m-KtVJ+_T|B z&y>c>nh zq3h8FPK<3WSPNj-`9UKgglsKjXboW9+y&GG^7^S7}K~XkyxzmS>m>EWS+rh zvCu(cW5RALG*c*h{oZ~3(0$$beIZp(Lp!p9khV10`MUkN1slu%I!g@H9Pvoyx`PJL zy7A`h6o98!xgi1^I=11^tKA^e>z)l&IX*D~=trngJC#J6Hfn||4(=*cJHcyI?K7cs z8$P%IUG7~X9XjxCDhWGs0JmK@=qt4wG5V|cb33IvEIT#(nh3Iu5<|dN{!SIuvQ$!s zeNRA($E_>i{1zT?J=k$j<2JF&>*!vCUef6<5R8s6&gs8ZviJG&D+1P3b#gb53a`I2 z0D;n7W2neoWXQsMH8OUT8UJz52%3-1&sWHnkBS{XQ6SdyRubxgk{(a}#-eP3*6}3@ zoqg=utm`E!VrCx(y8C1(^0eEmZZYw^f@h(O+fyWO_`)t7>v z9bSo{I15sfD|Av*V+@qL=OiQo9gHZ-us#=`1qs4QBBSsf^MI$djJ(((Psd4JaRH@2 z93e9&AWP~jJ`IT{XVJ_w%Gkbz7uU`7{lPro&SUQby3(3cg{o^xM_vx8X4ynbV2TLg zMAE+qUUU&w7dIMnLx(GorOiS#I!PNzA)(mfQA|>cv4C6|+^>>0i5Vvn+-uTZTVABF zet-?mpK8E#55xb!-)0CxOum?gm@msr6=*h*TMTw6t1jO;7)Cl%zHkR;%t}eLmL;aX&MbnIt^IML8J6iX8g z+x=epL)uxbgNOwUksYn;{9PqWFps6C)F^1(GDjrT05l%XDL!v{?E{L3zvO;2Bi`Y) zH;u7mQFOiaaFp?Qap}Y@g;c5$yg$kbDyc=`q%)JXbBTn}iGx4DEBSjk~ z+-Om;s9L1#x;tYw@83!2OVv(N4}z8A+KXr%G_!L(iz*dIJbI!v2xpvDULU#2*?1@;Az0{0lcu z9{~oni0fVtiw}H0VgvNIK_Pm(D_DE(F(K!Di9LOGfDgHW>sttaRXV{<`U)Kyvf4G1 zh83QiuyoI$(~}FFl^fU%3fkw9q2lpujOD7+E0yuEhE`J2&D?_a<@-Ml@v?C0)PrvRyM1<+cDB;+2Thr%Qs&`iY?R zB>vh`%0bRVLUb;+!Kx^a`GP3Eby7P@hQ=_$1P1CM0+z#&;;|yp5(F6>KYT-p)U5VE zq8d`#7ePF$M`Z3d3}Ftf6Ao7hlXVKh#AI2*fg0qsOT(HnG(xcfb2Q5PX*5f9X&xW? zd*%Vad`Z+hQ#208bDLC?l^m&UPdg0)u!ojwKO-g;&^j$O|5kvM%sUVpWJ@>lR9kn7 z=PRF*D4Y67ZqlfVHRn2ZH09Q?Rd==Qr0Gnrq7}nd)C#j6w2ND?tJSB1`Rg1jp28?- z+_!5+9^DluG`E}Z-Z!BxDE(n#wgI>n8d$c?#xLh|oGJsz_S_v1T+0`KS=F?_Ey%u! zi0Hnetv^hj@{ZW>B=|RA`DmW6q=XS^YPsyvj zY#+Cd8m=ZosAn6d!0KE5t_<=94@3)7kle4<15J1U1H>^@16dD!dWS#uCUNr zOb$AG^hp%AI=sHVj$eW_SsPS|FMEnRj$7AxGFN!X9{2aKr3zAdl3+H;fk#?EF1x!z zi*vv7I8=*+peN zD5K87allYZfFhHY0Bt4KS8W6bIGK(r1(^~P}W>D9PpWfx7tLy@^CxkwP)g1Xtr(pbqN89 zc5FMxAw8~49k|OK3(L5svi?l)yCp=zt--l?a-z>lde>fody3E0B5r{OJ>;dC#kZ53 z{1CpKmdxZ1vDF8#1_Ho%Qzq87ZtdH>dh)XtdW59w_Sna?q1RB>tspfHv)s};i3?B( zs8hN^_U^=z0i|VMYmLN2SY&xam^YPvWue5WQR+Uc717eXboIZ0*33 z&pYuJa@{mJXL!QLq~nJUx-KvrH-Ce*9-rNEMc^PAS>-#l=%fCWF$rw7M^(wJb6c2Z zU8{>@j{8AB-1wo1!;ce$K~4mnD0gmXd{ChxB7!pnkyXt{COzwwgY>dKKKcrxr8;?q zZuH<}Qe$DWW>C^}aAFs5Y?SjDxJogyaM87aalX<_Au>Zp!3twm2 z#H84cUH}X|)d?+IYJkPjpfHzS(p*8g;YwIwUX#&soFjPzKJeh!5&ZAu1J4x446z883`C7!pPMt$SWIy$om^B{m6mT%>_Y08=IU& zv-BKOLgOJqHeA}5S38%z8l8ox5FRqJvi6$2Zw$V|KB26xCWwFW7YxPqX8plmXn+i_?G$`aH3znNUlt-h)m)uyew!m2Pk(<)x`ovF-J(C?@ zD^uX;N?Z}>N*zBJ%Txp1QDD{sYSjlgJ0!ss*ktW6(?LduRLS@zcC+YsWL!c?xy z!j`T%jY@kst9GHMmUduJY<4Tcnp@n`jjpz}0Br>L>v2%7b}Hbm%AW!7W`kN45v*bS zBcE-h2fk1G2FRZ0gQpZdqv#YpL#q`%BW*mNl?U8BkNQASw(ekg@%hQhr7∓LFg$ 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 diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index ee69dd68..00000000 --- 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-5.4.1-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/src/ServiceStackIDEA/gradlew b/src/ServiceStackIDEA/gradlew deleted file mode 100644 index 91a7e269..00000000 --- a/src/ServiceStackIDEA/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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 -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=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" - 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" ] ; 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, 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\"" - fi - i=$((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 - -# 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 "$@" diff --git a/src/ServiceStackIDEA/gradlew.bat b/src/ServiceStackIDEA/gradlew.bat deleted file mode 100644 index 8a0b282a..00000000 --- a/src/ServiceStackIDEA/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 - -@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 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 - -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 init - -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 - -: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% - -: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/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml deleted file mode 100644 index 9e9c502b..00000000 --- a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml +++ /dev/null @@ -1,71 +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.lang - com.intellij.modules.platform - - - - - net.servicestack.idea.UpdateServiceStackReferenceIntention - - - - - - - - - - - - - - - - - - - -
    \ No newline at end of file From 33e478b0c01698cb8ccc83e9a7123b85fa7e7f65 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 24 Dec 2020 18:58:52 +1100 Subject: [PATCH 003/101] Revert plugin.xml delete. Small fixes to gradle to avoid kotlin warnings which is related to a still outstanding bug. --- src/ServiceStackIDEA/build.gradle | 3 + .../src/main/resources/META-INF/plugin.xml | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml diff --git a/src/ServiceStackIDEA/build.gradle b/src/ServiceStackIDEA/build.gradle index 4c52c2ee..de737d54 100644 --- a/src/ServiceStackIDEA/build.gradle +++ b/src/ServiceStackIDEA/build.gradle @@ -5,6 +5,9 @@ version = '1.0.41' repositories { mavenCentral() } +tasks.buildSearchableOptions { + enabled = false +} apply plugin: 'org.jetbrains.intellij' dependencies { diff --git a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml new file mode 100644 index 00000000..2802b419 --- /dev/null +++ b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml @@ -0,0 +1,72 @@ + + 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.lang + com.intellij.modules.platform + + + + + net.servicestack.idea.UpdateServiceStackReferenceIntention + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file From bf57926c776c4b1c0d275a722045d86e5902c29c Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 24 Dec 2020 19:18:31 +1100 Subject: [PATCH 004/101] It looks like newer version of the gradle plugin `org.jetbrains.intellij` has a gradle `wrapper` task already setup. This I think downloads the associated grade? See -> https://github.com/JetBrains/gradle-intellij-plugin/blob/master/build.gradle.kts#L162 So these no longer need to be kept in source control for ease of CI builds (I think). --- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + src/ServiceStackIDEA/gradlew | 185 ++++++++++++++++++ src/ServiceStackIDEA/gradlew.bat | 89 +++++++++ 4 files changed, 279 insertions(+) create mode 100644 src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties create mode 100644 src/ServiceStackIDEA/gradlew create mode 100644 src/ServiceStackIDEA/gradlew.bat diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

    K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..be52383e --- /dev/null +++ b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..4f906e0c --- /dev/null +++ b/src/ServiceStackIDEA/gradlew @@ -0,0 +1,185 @@ +#!/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 new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/src/ServiceStackIDEA/gradlew.bat @@ -0,0 +1,89 @@ +@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 From 4b10eeba4df77898759cef337d24372632179794 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 24 Dec 2020 19:25:31 +1100 Subject: [PATCH 005/101] Update on some local dev notes based on experience updating for 2019.2 and local development using 2020.3. --- src/ServiceStackIDEA/README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/ServiceStackIDEA/README.md b/src/ServiceStackIDEA/README.md index 2ad23e2e..efe61fef 100644 --- a/src/ServiceStackIDEA/README.md +++ b/src/ServiceStackIDEA/README.md @@ -36,4 +36,18 @@ The ServiceStack IDEA is now available to install directly from within a support 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) \ No newline at end of file +![](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. From dfa7c1b3bda024ae6017c559783c51c5e44394f8 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 24 Dec 2020 19:33:17 +1100 Subject: [PATCH 006/101] Update ServiceStack client dependency to be 1.0.43. Delete gradle files as they should be seeded automatically since new gradle jetbrains intellij plugin update. --- .../gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - src/ServiceStackIDEA/gradlew | 185 ------------------ src/ServiceStackIDEA/gradlew.bat | 89 --------- .../java/net/servicestack/idea/DepConfig.java | 2 +- 5 files changed, 1 insertion(+), 280 deletions(-) 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 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@ zw`1S}(D?mUXu_C{wupRS-jiX~w=Uqqhf|Vb3Cm9L=T+w91Cu^ z*&Ty%sN?x*h~mJc4g~k{xD4ZmF%FXZNC;oVDwLZ_WvrnzY|{v8hc1nmx4^}Z;yriXsAf+Lp+OFLbR!&Ox?xABwl zu8w&|5pCxmu#$?Cv2_-Vghl2LZ6m7}VLEfR5o2Ou$x02uA-%QB2$c(c1rH3R9hesc zfpn#oqpbKuVsdfV#cv@5pV4^f_!WS+F>SV6N0JQ9E!T90EX((_{bSSFv9ld%I0&}9 zH&Jd4MEX1e0iqDtq~h?DBrxQX1iI0lIs<|kB$Yrh&cpeK0-^K%=FBsCBT46@h#yi!AyDq1V(#V}^;{{V*@T4WJ&U-NTq43w=|K>z8%pr_nC>%C(Wa_l78Ufib$r8Od)IIN=u>417 z`Hl{9A$mI5A(;+-Q&$F&h-@;NR>Z<2U;Y21>>Z;s@0V@SbkMQQj%_;~+qTuQ?c|AV zcWm3XZQHhP&R%QWarS%mJ!9R^&!_)*s(v+VR@I#QrAT}`17Y+l<`b-nvmDNW`De%y zrwTZ9EJrj1AFA>B`1jYDow}~*dfPs}IZMO3=a{Fy#IOILc8F0;JS4x(k-NSpbN@qM z`@aE_e}5{!$v3+qVs7u?sOV(y@1Os*Fgu`fCW9=G@F_#VQ%xf$hj0~wnnP0$hFI+@ zkQj~v#V>xn)u??YutKsX>pxKCl^p!C-o?+9;!Nug^ z{rP!|+KsP5%uF;ZCa5F;O^9TGac=M|=V z_H(PfkV1rz4jl?gJ(ArXMyWT4y(86d3`$iI4^l9`vLdZkzpznSd5Ikfrs8qcSy&>z zTIZgWZGXw0n9ibQxYWE@gI0(3#KA-dAdPcsL_|hg2@~C!VZDM}5;v_Nykfq!*@*Zf zE_wVgx82GMDryKO{U{D>vSzSc%B~|cjDQrt5BN=Ugpsf8H8f1lR4SGo#hCuXPL;QQ z#~b?C4MoepT3X`qdW2dNn& zo8)K}%Lpu>0tQei+{>*VGErz|qjbK#9 zvtd8rcHplw%YyQCKR{kyo6fgg!)6tHUYT(L>B7er5)41iG`j$qe*kSh$fY!PehLcD zWeKZHn<492B34*JUQh=CY1R~jT9Jt=k=jCU2=SL&&y5QI2uAG2?L8qd2U(^AW#{(x zThSy=C#>k+QMo^7caQcpU?Qn}j-`s?1vXuzG#j8(A+RUAY})F@=r&F(8nI&HspAy4 z4>(M>hI9c7?DCW8rw6|23?qQMSq?*Vx?v30U%luBo)B-k2mkL)Ljk5xUha3pK>EEj z@(;tH|M@xkuN?gsz;*bygizwYR!6=(Xgcg^>WlGtRYCozY<rFX2E>kaZo)O<^J7a`MX8Pf`gBd4vrtD|qKn&B)C&wp0O-x*@-|m*0egT=-t@%dD zgP2D+#WPptnc;_ugD6%zN}Z+X4=c61XNLb7L1gWd8;NHrBXwJ7s0ce#lWnnFUMTR& z1_R9Fin4!d17d4jpKcfh?MKRxxQk$@)*hradH2$3)nyXep5Z;B z?yX+-Bd=TqO2!11?MDtG0n(*T^!CIiF@ZQymqq1wPM_X$Iu9-P=^}v7npvvPBu!d$ z7K?@CsA8H38+zjA@{;{kG)#AHME>Ix<711_iQ@WWMObXyVO)a&^qE1GqpP47Q|_AG zP`(AD&r!V^MXQ^e+*n5~Lp9!B+#y3#f8J^5!iC@3Y@P`;FoUH{G*pj*q7MVV)29+j z>BC`a|1@U_v%%o9VH_HsSnM`jZ-&CDvbiqDg)tQEnV>b%Ptm)T|1?TrpIl)Y$LnG_ zzKi5j2Fx^K^PG1=*?GhK;$(UCF-tM~^=Z*+Wp{FSuy7iHt9#4n(sUuHK??@v+6*|10Csdnyg9hAsC5_OrSL;jVkLlf zHXIPukLqbhs~-*oa^gqgvtpgTk_7GypwH><53riYYL*M=Q@F-yEPLqQ&1Sc zZB%w}T~RO|#jFjMWcKMZccxm-SL)s_ig?OC?y_~gLFj{n8D$J_Kw%{r0oB8?@dWzn zB528d-wUBQzrrSSLq?fR!K%59Zv9J4yCQhhDGwhptpA5O5U?Hjqt>8nOD zi{)0CI|&Gu%zunGI*XFZh(ix)q${jT8wnnzbBMPYVJc4HX*9d^mz|21$=R$J$(y7V zo0dxdbX3N#=F$zjstTf*t8vL)2*{XH!+<2IJ1VVFa67|{?LP&P41h$2i2;?N~RA30LV`BsUcj zfO9#Pg1$t}7zpv#&)8`mis3~o+P(DxOMgz-V*(?wWaxi?R=NhtW}<#^Z?(BhSwyar zG|A#Q7wh4OfK<|DAcl9THc-W4*>J4nTevsD%dkj`U~wSUCh15?_N@uMdF^Kw+{agk zJ`im^wDqj`Ev)W3k3stasP`88-M0ZBs7;B6{-tSm3>I@_e-QfT?7|n0D~0RRqDb^G zyHb=is;IwuQ&ITzL4KsP@Z`b$d%B0Wuhioo1CWttW8yhsER1ZUZzA{F*K=wmi-sb#Ju+j z-l@In^IKnb{bQG}Ps>+Vu_W#grNKNGto+yjA)?>0?~X`4I3T@5G1)RqGUZuP^NJCq&^HykuYtMDD8qq+l8RcZNJsvN(10{ zQ1$XcGt}QH-U^WU!-wRR1d--{B$%vY{JLWIV%P4-KQuxxDeJaF#{eu&&r!3Qu{w}0f--8^H|KwE>)ORrcR+2Qf zb})DRcH>k0zWK8@{RX}NYvTF;E~phK{+F;MkIP$)T$93Ba2R2TvKc>`D??#mv9wg$ zd~|-`Qx5LwwsZ2hb*Rt4S9dsF%Cny5<1fscy~)d;0m2r$f=83<->c~!GNyb!U)PA; zq^!`@@)UaG)Ew(9V?5ZBq#c%dCWZrplmuM`o~TyHjAIMh0*#1{B>K4po-dx$Tk-Cq z=WZDkP5x2W&Os`N8KiYHRH#UY*n|nvd(U>yO=MFI-2BEp?x@=N<~CbLJBf6P)}vLS?xJXYJ2^<3KJUdrwKnJnTp{ zjIi|R=L7rn9b*D#Xxr4*R<3T5AuOS+#U8hNlfo&^9JO{VbH!v9^JbK=TCGR-5EWR@ zN8T-_I|&@A}(hKeL4_*eb!1G8p~&_Im8|wc>Cdir+gg90n1dw?QaXcx6Op_W1r=axRw>4;rM*UOpT#Eb9xU1IiWo@h?|5uP zka>-XW0Ikp@dIe;MN8B01a7+5V@h3WN{J=HJ*pe0uwQ3S&MyWFni47X32Q7SyCTNQ z+sR!_9IZa5!>f&V$`q!%H8ci!a|RMx5}5MA_kr+bhtQy{-^)(hCVa@I!^TV4RBi zAFa!Nsi3y37I5EK;0cqu|9MRj<^r&h1lF}u0KpKQD^5Y+LvFEwM zLU@@v4_Na#Axy6tn3P%sD^5P#<7F;sd$f4a7LBMk zGU^RZHBcxSA%kCx*eH&wgA?Qwazm8>9SCSz_!;MqY-QX<1@p$*T8lc?@`ikEqJ>#w zcG``^CoFMAhdEXT9qt47g0IZkaU)4R7wkGs^Ax}usqJ5HfDYAV$!=6?>J6+Ha1I<5 z|6=9soU4>E))tW$<#>F ziZ$6>KJf0bPfbx_)7-}tMINlc=}|H+$uX)mhC6-Hz+XZxsKd^b?RFB6et}O#+>Wmw9Ec9) z{q}XFWp{3@qmyK*Jvzpyqv57LIR;hPXKsrh{G?&dRjF%Zt5&m20Ll?OyfUYC3WRn{cgQ?^V~UAv+5 z&_m#&nIwffgX1*Z2#5^Kl4DbE#NrD&Hi4|7SPqZ}(>_+JMz=s|k77aEL}<=0Zfb)a z%F(*L3zCA<=xO)2U3B|pcTqDbBoFp>QyAEU(jMu8(jLA61-H!ucI804+B!$E^cQQa z)_ERrW3g!B9iLb3nn3dlkvD7KsY?sRvls3QC0qPi>o<)GHx%4Xb$5a3GBTJ(k@`e@ z$RUa^%S15^1oLEmA=sayrP5;9qtf!Z1*?e$ORVPsXpL{jL<6E)0sj&swP3}NPmR%FM?O>SQgN5XfHE< zo(4#Cv11(%Nnw_{_Ro}r6=gKd{k?NebJ~<~Kv0r(r0qe4n3LFx$5%x(BKvrz$m?LG zjLIc;hbj0FMdb9aH9Lpsof#yG$(0sG2%RL;d(n>;#jb!R_+dad+K;Ccw!|RY?uS(a zj~?=&M!4C(5LnlH6k%aYvz@7?xRa^2gml%vn&eKl$R_lJ+e|xsNfXzr#xuh(>`}9g zLHSyiFwK^-p!;p$yt7$F|3*IfO3Mlu9e>Dpx8O`37?fA`cj`C0B-m9uRhJjs^mRp# zWB;Aj6|G^1V6`jg7#7V9UFvnB4((nIwG?k%c7h`?0tS8J3Bn0t#pb#SA}N-|45$-j z$R>%7cc2ebAClXc(&0UtHX<>pd)akR3Kx_cK+n<}FhzmTx!8e9^u2e4%x{>T6pQ`6 zO182bh$-W5A3^wos0SV_TgPmF4WUP-+D25KjbC{y_6W_9I2_vNKwU(^qSdn&>^=*t z&uvp*@c8#2*paD!ZMCi3;K{Na;I4Q35zw$YrW5U@Kk~)&rw;G?d7Q&c9|x<Hg|CNMsxovmfth*|E*GHezPTWa^Hd^F4!B3sF;)? z(NaPyAhocu1jUe(!5Cy|dh|W2=!@fNmuNOzxi^tE_jAtzNJ0JR-avc_H|ve#KO}#S z#a(8secu|^Tx553d4r@3#6^MHbH)vmiBpn0X^29xEv!Vuh1n(Sr5I0V&`jA2;WS|Y zbf0e}X|)wA-Pf5gBZ>r4YX3Mav1kKY(ulAJ0Q*jB)YhviHK)w!TJsi3^dMa$L@^{` z_De`fF4;M87vM3Ph9SzCoCi$#Fsd38u!^0#*sPful^p5oI(xGU?yeYjn;Hq1!wzFk zG&2w}W3`AX4bxoVm03y>ts{KaDf!}b&7$(P4KAMP=vK5?1In^-YYNtx1f#}+2QK@h zeSeAI@E6Z8a?)>sZ`fbq9_snl6LCu6g>o)rO;ijp3|$vig+4t} zylEo7$SEW<_U+qgVcaVhk+4k+C9THI5V10qV*dOV6pPtAI$)QN{!JRBKh-D zk2^{j@bZ}yqW?<#VVuI_27*cI-V~sJiqQv&m07+10XF+#ZnIJdr8t`9s_EE;T2V;B z4UnQUH9EdX%zwh-5&wflY#ve!IWt0UE-My3?L#^Bh%kcgP1q{&26eXLn zTkjJ*w+(|_>Pq0v8{%nX$QZbf)tbJaLY$03;MO=Ic-uqYUmUCuXD>J>o6BCRF=xa% z3R4SK9#t1!K4I_d>tZgE>&+kZ?Q}1qo4&h%U$GfY058s%*=!kac{0Z+4Hwm!)pFLR zJ+5*OpgWUrm0FPI2ib4NPJ+Sk07j(`diti^i#kh&f}i>P4~|d?RFb#!JN)~D@)beox}bw?4VCf^y*`2{4`-@%SFTry2h z>9VBc9#JxEs1+0i2^LR@B1J`B9Ac=#FW=(?2;5;#U$0E0UNag_!jY$&2diQk_n)bT zl5Me_SUvqUjwCqmVcyb`igygB_4YUB*m$h5oeKv3uIF0sk}~es!{D>4r%PC*F~FN3owq5e0|YeUTSG#Vq%&Gk7uwW z0lDo#_wvflqHeRm*}l?}o;EILszBt|EW*zNPmq#?4A+&i0xx^?9obLyY4xx=Y9&^G;xYXYPxG)DOpPg!i_Ccl#3L}6xAAZzNhPK1XaC_~ z!A|mlo?Be*8Nn=a+FhgpOj@G7yYs(Qk(8&|h@_>w8Y^r&5nCqe0V60rRz?b5%J;GYeBqSAjo|K692GxD4` zRZyM2FdI+-jK2}WAZTZ()w_)V{n5tEb@>+JYluDozCb$fA4H)$bzg(Ux{*hXurjO^ zwAxc+UXu=&JV*E59}h3kzQPG4M)X8E*}#_&}w*KEgtX)cU{vm9b$atHa;s>| z+L6&cn8xUL*OSjx4YGjf6{Eq+Q3{!ZyhrL&^6Vz@jGbI%cAM9GkmFlamTbcQGvOlL zmJ?(FI)c86=JEs|*;?h~o)88>12nXlpMR4@yh%qdwFNpct;vMlc=;{FSo*apJ;p}! zAX~t;3tb~VuP|ZW;z$=IHf->F@Ml)&-&Bnb{iQyE#;GZ@C$PzEf6~q}4D>9jic@mTO5x76ulDz@+XAcm35!VSu zT*Gs>;f0b2TNpjU_BjHZ&S6Sqk6V1370+!eppV2H+FY!q*n=GHQ!9Rn6MjY!Jc77A zG7Y!lFp8?TIHN!LXO?gCnsYM-gQxsm=Ek**VmZu7vnuufD7K~GIxfxbsQ@qv2T zPa`tvHB$fFCyZl>3oYg?_wW)C>^_iDOc^B7klnTOoytQH18WkOk)L2BSD0r%xgRSW zQS9elF^?O=_@|58zKLK;(f77l-Zzu}4{fXed2saq!5k#UZAoDBqYQS{sn@j@Vtp|$ zG%gnZ$U|9@u#w1@11Sjl8ze^Co=)7yS(}=;68a3~g;NDe_X^}yJj;~s8xq9ahQ5_r zxAlTMnep*)w1e(TG%tWsjo3RR;yVGPEO4V{Zp?=a_0R#=V^ioQu4YL=BO4r0$$XTX zZfnw#_$V}sDAIDrezGQ+h?q24St0QNug_?{s-pI(^jg`#JRxM1YBV;a@@JQvH8*>> zIJvku74E0NlXkYe_624>znU0J@L<-c=G#F3k4A_)*;ky!C(^uZfj%WB3-*{*B$?9+ zDm$WFp=0(xnt6`vDQV3Jl5f&R(Mp};;q8d3I%Kn>Kx=^;uSVCw0L=gw53%Bp==8Sw zxtx=cs!^-_+i{2OK`Q;913+AXc_&Z5$@z3<)So0CU3;JAv=H?@Zpi~riQ{z-zLtVL z!oF<}@IgJp)Iyz1zVJ42!SPHSkjYNS4%ulVVIXdRuiZ@5Mx8LJS}J#qD^Zi_xQ@>DKDr-_e#>5h3dtje*NcwH_h;i{Sx7}dkdpuW z(yUCjckQsagv*QGMSi9u1`Z|V^}Wjf7B@q%j2DQXyd0nOyqg%m{CK_lAoKlJ7#8M} z%IvR?Vh$6aDWK2W!=i?*<77q&B8O&3?zP(Cs@kapc)&p7En?J;t-TX9abGT#H?TW? ztO5(lPKRuC7fs}zwcUKbRh=7E8wzTsa#Z{a`WR}?UZ%!HohN}d&xJ=JQhpO1PI#>X zHkb>pW04pU%Bj_mf~U}1F1=wxdBZu1790>3Dm44bQ#F=T4V3&HlOLsGH)+AK$cHk6 zia$=$kog?)07HCL*PI6}DRhpM^*%I*kHM<#1Se+AQ!!xyhcy6j7`iDX7Z-2i73_n# zas*?7LkxS-XSqv;YBa zW_n*32D(HTYQ0$feV_Fru1ZxW0g&iwqixPX3=9t4o)o|kOo79V$?$uh?#8Q8e>4e)V6;_(x&ViUVxma+i25qea;d-oK7ouuDsB^ab{ zu1qjQ%`n56VtxBE#0qAzb7lph`Eb-}TYpXB!H-}3Ykqyp`otprp7{VEuW*^IR2n$Fb99*nAtqT&oOFIf z@w*6>YvOGw@Ja?Pp1=whZqydzx@9X4n^2!n83C5{C?G@|E?&$?p*g68)kNvUTJ)I6 z1Q|(#UuP6pj78GUxq11m-GSszc+)X{C2eo-?8ud9sB=3(D47v?`JAa{V(IF zPZQ_0AY*9M97>Jf<o%#O_%Wq}8>YM=q0|tGY+hlXcpE=Z4Od z`NT7Hu2hnvRoqOw@g1f=bv`+nba{GwA$Ak0INlqI1k<9!x_!sL()h?hEWoWrdU3w` zZ%%)VR+Bc@_v!C#koM1p-3v_^L6)_Ktj4HE>aUh%2XZE@JFMOn)J~c`_7VWNb9c-N z2b|SZMR4Z@E7j&q&9(6H3yjEu6HV7{2!1t0lgizD;mZ9$r(r7W5G$ky@w(T_dFnOD z*p#+z$@pKE+>o@%eT(2-p_C}wbQ5s(%Sn_{$HDN@MB+Ev?t@3dPy`%TZ!z}AThZSu zN<1i$siJhXFdjV zP*y|V<`V8t=h#XTRUR~5`c`Z9^-`*BZf?WAehGdg)E2Je)hqFa!k{V(u+(hTf^Yq& zoruUh2(^3pe)2{bvt4&4Y9CY3js)PUHtd4rVG57}uFJL)D(JfSIo^{P=7liFXG zq5yqgof0V8paQcP!gy+;^pp-DA5pj=gbMN0eW=-eY+N8~y+G>t+x}oa!5r>tW$xhI zPQSv=pi;~653Gvf6~*JcQ%t1xOrH2l3Zy@8AoJ+wz@daW@m7?%LXkr!bw9GY@ns3e zSfuWF_gkWnesv?s3I`@}NgE2xwgs&rj?kH-FEy82=O8`+szN ziHch`vvS`zNfap14!&#i9H@wF7}yIPm=UB%(o(}F{wsZ(wA0nJ2aD^@B41>>o-_U6 zUqD~vdo48S8~FTb^+%#zcbQiiYoDKYcj&$#^;Smmb+Ljp(L=1Kt_J!;0s%1|JK}Wi z;={~oL!foo5n8=}rs6MmUW~R&;SIJO3TL4Ky?kh+b2rT9B1Jl4>#Uh-Bec z`Hsp<==#UEW6pGPhNk8H!!DUQR~#F9jEMI6T*OWfN^Ze&X(4nV$wa8QUJ>oTkruH# zm~O<`J7Wxseo@FqaZMl#Y(mrFW9AHM9Kb|XBMqaZ2a)DvJgYipkDD_VUF_PKd~dT7 z#02}bBfPn9a!X!O#83=lbJSK#E}K&yx-HI#T6ua)6o0{|={*HFusCkHzs|Fn&|C3H zBck1cmfcWVUN&i>X$YU^Sn6k2H;r3zuXbJFz)r5~3$d$tUj(l1?o={MM){kjgqXRO zc5R*#{;V7AQh|G|)jLM@wGAK&rm2~@{Pewv#06pHbKn#wL0P6F1!^qw9g&cW3Z=9} zj)POhOlwsh@eF=>z?#sIs*C-Nl(yU!#DaiaxhEs#iJqQ8w%(?+6lU02MYSeDkr!B- zPjMv+on6OLXgGnAtl(ao>|X2Y8*Hb}GRW5}-IzXnoo-d0!m4Vy$GS!XOLy>3_+UGs z2D|YcQx@M#M|}TDOetGi{9lGo9m-=0-^+nKE^*?$^uHkxZh}I{#UTQd;X!L+W@jm( zDg@N4+lUqI92o_rNk{3P>1gxAL=&O;x)ZT=q1mk0kLlE$WeWuY_$0`0jY-Kkt zP*|m3AF}Ubd=`<>(Xg0har*_@x2YH}bn0Wk*OZz3*e5;Zc;2uBdnl8?&XjupbkOeNZsNh6pvsq_ydmJI+*z**{I{0K)-;p1~k8cpJXL$^t!-`E}=*4G^-E8>H!LjTPxSx zcF+cS`ommfKMhNSbas^@YbTpH1*RFrBuATUR zt{oFWSk^$xU&kbFQ;MCX22RAN5F6eq9UfR$ut`Jw--p2YX)A*J69m^!oYfj2y7NYcH6&r+0~_sH^c^nzeN1AU4Ga7=FlR{S|Mm~MpzY0$Z+p2W(a={b-pR9EO1Rs zB%KY|@wLcAA@)KXi!d2_BxrkhDn`DT1=Dec}V!okd{$+wK z4E{n8R*xKyci1(CnNdhf$Dp2(Jpof0-0%-38X=Dd9PQgT+w%Lshx9+loPS~MOm%ZT zt%2B2iL_KU_ita%N>xjB!#71_3=3c}o zgeW~^U_ZTJQ2!PqXulQd=3b=XOQhwATK$y(9$#1jOQ4}4?~l#&nek)H(04f(Sr=s| zWv7Lu1=%WGk4FSw^;;!8&YPM)pQDCY9DhU`hMty1@sq1=Tj7bFsOOBZOFlpR`W>-J$-(kezWJj;`?x-v>ev{*8V z8p|KXJPV$HyQr1A(9LVrM47u-XpcrIyO`yWvx1pVYc&?154aneRpLqgx)EMvRaa#|9?Wwqs2+W8n5~79G z(}iCiLk;?enn}ew`HzhG+tu+Ru@T+K5juvZN)wY;x6HjvqD!&!)$$;1VAh~7fg0K| zEha#aN=Yv|3^~YFH}cc38ovVb%L|g@9W6fo(JtT6$fa?zf@Ct88e}m?i)b*Jgc{fl zExfdvw-BYDmH6>(4QMt#p0;FUIQqkhD}aH?a7)_%JtA~soqj{ppP_82yi9kaxuK>~ ze_)Zt>1?q=ZH*kF{1iq9sr*tVuy=u>Zev}!gEZx@O6-fjyu9X00gpIl-fS_pzjpqJ z1yqBmf9NF!jaF<+YxgH6oXBdK)sH(>VZ)1siyA$P<#KDt;8NT*l_0{xit~5j1P)FN zI8hhYKhQ)i z37^aP13B~u65?sg+_@2Kr^iWHN=U;EDSZ@2W2!5ALhGNWXnFBY%7W?1 z=HI9JzQ-pLKZDYTv<0-lt|6c-RwhxZ)mU2Os{bsX_i^@*fKUj8*aDO5pks=qn3Dv6 zwggpKLuyRCTVPwmw1r}B#AS}?X7b837UlXwp~E2|PJw2SGVueL7){Y&z!jL!XN=0i zU^Eig`S2`{+gU$68aRdWx?BZ{sU_f=8sn~>s~M?GU~`fH5kCc; z8ICp+INM3(3{#k32RZdv6b9MQYdZXNuk7ed8;G?S2nT+NZBG=Tar^KFl2SvhW$bGW#kdWL-I)s_IqVnCDDM9fm8g;P;8 z7t4yZn3^*NQfx7SwmkzP$=fwdC}bafQSEF@pd&P8@H#`swGy_rz;Z?Ty5mkS%>m#% zp_!m9e<()sfKiY(nF<1zBz&&`ZlJf6QLvLhl`_``%RW&{+O>Xhp;lwSsyRqGf=RWd zpftiR`={2(siiPAS|p}@q=NhVc0ELprt%=fMXO3B)4ryC2LT(o=sLM7hJC!}T1@)E zA3^J$3&1*M6Xq>03FX`R&w*NkrZE?FwU+Muut;>qNhj@bX17ZJxnOlPSZ=Zeiz~T_ zOu#yc3t6ONHB;?|r4w+pI)~KGN;HOGC)txxiUN8#mexj+W(cz%9a4sx|IRG=}ia zuEBuba3AHsV2feqw-3MvuL`I+2|`Ud4~7ZkN=JZ;L20|Oxna5vx1qbIh#k2O4$RQF zo`tL()zxaqibg^GbB+BS5#U{@K;WWQj~GcB1zb}zJkPwH|5hZ9iH2308!>_;%msji zJHSL~s)YHBR=Koa1mLEOHos*`gp=s8KA-C zu0aE+W!#iJ*0xqKm3A`fUGy#O+X+5W36myS>Uh2!R*s$aCU^`K&KKLCCDkejX2p=5 z%o7-fl03x`gaSNyr?3_JLv?2RLS3F*8ub>Jd@^Cc17)v8vYEK4aqo?OS@W9mt%ITJ z9=S2%R8M){CugT@k~~0x`}Vl!svYqX=E)c_oU6o}#Hb^%G1l3BudxA{F*tbjG;W_>=xV73pKY53v%>I)@D36I_@&p$h|Aw zonQS`07z_F#@T-%@-Tb|)7;;anoD_WH>9ewFy(ZcEOM$#Y)8>qi7rCnsH9GO-_7zF zu*C87{Df1P4TEOsnzZ@H%&lvV(3V@;Q!%+OYRp`g05PjY^gL$^$-t0Y>H*CDDs?FZly*oZ&dxvsxaUWF!{em4{A>n@vpXg$dwvt@_rgmHF z-MER`ABa8R-t_H*kv>}CzOpz;!>p^^9ztHMsHL|SRnS<-y5Z*r(_}c4=fXF`l^-i}>e7v!qs_jv zqvWhX^F=2sDNWA9c@P0?lUlr6ecrTKM%pNQ^?*Lq?p-0~?_j50xV%^(+H>sMul#Tw zeciF*1=?a7cI(}352%>LO96pD+?9!fNyl^9v3^v&Y4L)mNGK0FN43&Xf8jUlxW1Bw zyiu2;qW-aGNhs=zbuoxnxiwZ3{PFZM#Kw)9H@(hgX23h(`Wm~m4&TvoZoYp{plb^> z_#?vXcxd>r7K+1HKJvhed>gtK`TAbJUazUWQY6T~t2af%#<+Veyr%7-#*A#@&*;@g58{i|E%6yC_InGXCOd{L0;$)z#?n7M`re zh!kO{6=>7I?*}czyF7_frt#)s1CFJ_XE&VrDA?Dp3XbvF{qsEJgb&OLSNz_5g?HpK z9)8rsr4JN!Af3G9!#Qn(6zaUDqLN(g2g8*M)Djap?WMK9NKlkC)E2|-g|#-rp%!Gz zAHd%`iq|81efi93m3yTBw3g0j#;Yb2X{mhRAI?&KDmbGqou(2xiRNb^sV}%%Wu0?< z?($L>(#BO*)^)rSgyNRni$i`R4v;GhlCZ8$@e^ROX(p=2_v6Y!%^As zu022)fHdv_-~Yu_H6WVPLpHQx!W%^6j)cBhS`O3QBW#x(eX54d&I22op(N59b*&$v zFiSRY6rOc^(dgSV1>a7-5C;(5S5MvKcM2Jm-LD9TGqDpP097%52V+0>Xqq!! zq4e3vj53SE6i8J`XcQB|MZPP8j;PAOnpGnllH6#Ku~vS42xP*Nz@~y%db7Xi8s09P z1)e%8ys6&M8D=Dt6&t`iKG_4X=!kgRQoh%Z`dc&mlOUqXk-k`jKv9@(a^2-Upw>?< zt5*^DV~6Zedbec4NVl($2T{&b)zA@b#dUyd>`2JC0=xa_fIm8{5um zr-!ApXZhC8@=vC2WyxO|!@0Km)h8ep*`^he92$@YwP>VcdoS5OC^s38e#7RPsg4j+ zbVGG}WRSET&ZfrcR(x~k8n1rTP%CnfUNKUonD$P?FtNFF#cn!wEIab-;jU=B1dHK@ z(;(yAQJ`O$sMn>h;pf^8{JISW%d+@v6@CnXh9n5TXGC}?FI9i-D0OMaIg&mAg=0Kn zNJ7oz5*ReJukD55fUsMuaP+H4tDN&V9zfqF@ zr=#ecUk9wu{0;!+gl;3Bw=Vn^)z$ahVhhw)io!na&9}LmWurLb0zubxK=UEnU*{5P z+SP}&*(iBKSO4{alBHaY^)5Q=mZ+2OwIooJ7*Q5XJ+2|q`9#f?6myq!&oz?klihLq z4C)$XP!BNS0G_Z1&TM>?Jk{S~{F3n83ioli=IO6f%wkvCl(RFFw~j0tb{GvXTx>*sB0McY0s&SNvj4+^h`9nJ_wM>F!Uc>X}9PifQekn0sKI2SAJP!a4h z5cyGTuCj3ZBM^&{dRelIlT^9zcfaAuL5Y~bl!ppSf`wZbK$z#6U~rdclk``e+!qhe z6Qspo*%<)eu6?C;Bp<^VuW6JI|Ncvyn+LlSl;Mp22Bl7ARQ0Xc24%29(ZrdsIPw&-=yHQ7_Vle|5h>AST0 zUGX2Zk34vp?U~IHT|;$U86T+UUHl_NE4m|}>E~6q``7hccCaT^#y+?wD##Q%HwPd8 zV3x4L4|qqu`B$4(LXqDJngNy-{&@aFBvVsywt@X^}iH7P%>bR?ciC$I^U-4Foa`YKI^qDyGK7k%E%c_P=yzAi`YnxGA%DeNd++j3*h^ z=rn>oBd0|~lZ<6YvmkKY*ZJlJ;Im0tqgWu&E92eqt;+NYdxx`eS(4Hw_Jb5|yVvBg z*tbdY^!AN;luEyN4VRhS@-_DC{({ziH{&Z}iGElSV~qvT>L-8G%+yEL zX#MFOhj{InyKG=mvW-<1B@c-}x$vA(nU?>S>0*eN#!SLzQ)Ex7fvQ)S4D<8|I#N$3 zT5Ei`Z?cxBODHX8(Xp73v`IsAYC@9b;t}z0wxVuQSY1J^GRwDPN@qbM-ZF48T$GZ< z8WU+;Pqo?{ghI-KZ-i*ydXu`Ep0Xw^McH_KE9J0S7G;x8Fe`DVG?j3Pv=0YzJ}yZR z%2=oqHiUjvuk0~Ca>Kol4CFi0_xQT~;_F?=u+!kIDl-9g`#ZNZ9HCy17Ga1v^Jv9# z{T4Kb1-AzUxq*MutfOWWZgD*HnFfyYg0&e9f(5tZ>krPF6{VikNeHoc{linPPt#Si z&*g>(c54V8rT_AX!J&bNm-!umPvOR}vDai#`CX___J#=zeB*{4<&2WpaDncZsOkp* zsg<%@@rbrMkR_ux9?LsQxzoBa1s%$BBn6vk#{&&zUwcfzeCBJUwFYSF$08qDsB;gWQN*g!p8pxjofWbqNSZOEKOaTx@+* zwdt5*Q47@EOZ~EZL9s?1o?A%9TJT=Ob_13yyugvPg*e&ZU(r6^k4=2+D-@n=Hv5vu zSXG|hM(>h9^zn=eQ=$6`JO&70&2|%V5Lsx>)(%#;pcOfu>*nk_3HB_BNaH$`jM<^S zcSftDU1?nL;jy)+sfonQN}(}gUW?d_ikr*3=^{G)=tjBtEPe>TO|0ddVB zTklrSHiW+!#26frPXQQ(YN8DG$PZo?(po(QUCCf_OJC`pw*uey00%gmH!`WJkrKXj2!#6?`T25mTu9OJp2L8z3! z=arrL$ZqxuE{%yV)14Kd>k}j7pxZ6#$Dz8$@WV5p8kTqN<-7W)Q7Gt2{KoOPK_tZ| zf2WG~O5@{qPI+W<4f_;reuFVdO^5`ADC1!JQE|N`s3cq@(0WB!n0uh@*c{=LAd;~} zyGK@hbF-Oo+!nN)@i*O(`@FA#u?o=~e{`4O#5}z&=UkU*50fOrzi11D^&FOqe>wii z?*k+2|EcUs;Gx{!@KBT~>PAwLrIDT7Th=Utu?~?np@t^gFs?zgX=D${RwOY^WGh-+ z+#4$066ISh8eYW#FXWp~S`<*%O^ZuItL1Tyqt8#tZ zY120E;^VG`!lZn&3sPd$RkdHpU#|w+bYV)pJC|SH9g%|5IkxVTQcBA4CL0}$&}ef@ zW^Vtj%M;;_1xxP9x#ex17&4N*{ksO*_4O}xYu(p*JkL#yr}@7b)t5X?%CY<+s5_MJ zuiqt+N_;A(_)%lumoyRFixWa-M7qK_9s6<1X?JDa9fP!+_6u~~M$5L=ipB=7(j#f< zZ34J%=bs549%~_mA(|={uZNs_0?o7;-LBP(ZRnkd{-^|2|=4vUTmtByHL8 zEph`(LSEzQj68a+`d$V<45J7cyv^#|^|%fD#si1Nx!4NW*`l*{->HEWNh6-|g>-=r zXmQ|-i}Ku$ndUeHQ^&ieT!Lf}vf6GaqW9$DJ2NWrqwPY%%4nip$@vK$nRp*_C-v<| zuKz~ZyN&<%!NS26&x?jhy+@awJipMQ-8(X4#Ae5??U<1QMt1l9R=w9fAnEF}NYu$2 z>6}Vkc zIb*A?G*z8^IvibmBKn_u^5&T_1oey0gZS2~obf(#xk=erZGTEdQnt3DMGM+0oPwss zj5zXD;(oWhB_T@~Ig#9@v)AKtXu3>Inmgf@A|-lD-1U>cNyl3h?ADD9)GG4}zUGPk zZzaXe!~Kf?<~@$G?Uql3t8jy9{2!doq4=J}j9ktTxss{p6!9UdjyDERlA*xZ!=Q)KDs5O)phz>Vq3BNGoM(H|=1*Q4$^2fTZw z(%nq1P|5Rt81}SYJpEEzMPl5VJsV5&4e)ZWKDyoZ>1EwpkHx-AQVQc8%JMz;{H~p{=FXV>jIxvm4X*qv52e?Y-f%DJ zxEA165GikEASQ^fH6K#d!Tpu2HP{sFs%E=e$gYd$aj$+xue6N+Wc(rAz~wUsk2`(b z8Kvmyz%bKQxpP}~baG-rwYcYCvkHOi zlkR<=>ZBTU*8RF_d#Bl@zZsRIhx<%~Z@Z=ik z>adw3!DK(8R|q$vy{FTxw%#xliD~6qXmY^7_9kthVPTF~Xy1CfBqbU~?1QmxmU=+k z(ggxvEuA;0e&+ci-zQR{-f7aO{O(Pz_OsEjLh_K>MbvoZ4nxtk5u{g@nPv)cgW_R} z9}EA4K4@z0?7ue}Z(o~R(X&FjejUI2g~08PH1E4w>9o{)S(?1>Z0XMvTb|;&EuyOE zGvWNpYX)Nv<8|a^;1>bh#&znEcl-r!T#pn= z4$?Yudha6F%4b>*8@=BdtXXY4N+`U4Dmx$}>HeVJk-QdTG@t!tVT#0(LeV0gvqyyw z2sEp^9eY0N`u10Tm4n8No&A=)IeEC|gnmEXoNSzu!1<4R<%-9kY_8~5Ej?zRegMn78wuMs#;i&eUA0Zk_RXQ3b&TT} z;SCI=7-FUB@*&;8|n>(_g^HGf3@QODE3LpmX~ELnymQm{Sx9xrKS zK29p~?v@R$0=v6Dr5aW>-!{+h@?Q58|Kz8{{W`%J+lDAdb&M5VHrX_mDY;1-JLnf)ezmPau$)1;=`-FU=-r-83tX=C`S#}GZufju zQ>sXNT0Ny=k@nc%cFnvA_i4SC)?_ORXHq8B4D%el1uPX`c~uG#S1M7C+*MMqLw78E zhY2dI8@+N^qrMI1+;TUda(vGqGSRyU{Fnm`aqrr7bz42c5xsOO-~oZpkzorD1g}Y<6rk&3>PsSGy}W?MtqFky@A(X# zIuNZK0cK?^=;PUAu>j0#HtjbHCV*6?jzA&OoE$*Jlga*}LF`SF?WLhv1O|zqC<>*> zYB;#lsYKx0&kH@BFpW8n*yDcc6?;_zaJs<-jPSkCsSX-!aV=P5kUgF@Nu<{a%#K*F z134Q{9|YX7X(v$62_cY3^G%t~rD>Q0z@)1|zs)vjJ6Jq9;7#Ki`w+eS**En?7;n&7 zu==V3T&eFboN3ZiMx3D8qYc;VjFUk_H-WWCau(VFXSQf~viH0L$gwD$UfFHqNcgN`x}M+YQ6RnN<+@t>JUp#)9YOkqst-Ga?{FsDpEeX0(5v{0J~SEbWiL zXC2}M4?UH@u&|;%0y`eb33ldo4~z-x8zY!oVmV=c+f$m?RfDC35mdQ2E>Pze7KWP- z>!Bh<&57I+O_^s}9Tg^k)h7{xx@0a0IA~GAOt2yy!X%Q$1rt~LbTB6@Du!_0%HV>N zlf)QI1&gvERKwso23mJ!Ou6ZS#zCS5W`gxE5T>C#E|{i<1D35C222I33?Njaz`On7 zi<+VWFP6D{e-{yiN#M|Jgk<44u1TiMI78S5W`Sdb5f+{zu34s{CfWN7a3Cf^@L%!& zN$?|!!9j2c)j$~+R6n#891w-z8(!oBpL2K=+%a$r2|~8-(vQj5_XT`<0Ksf;oP+tz z9CObS!0m)Tgg`K#xBM8B(|Z)Wb&DYL{WTYv`;A=q6~Nnx2+!lTIXtj8J7dZE!P_{z z#f8w6F}^!?^KE#+ZDv+xd5O&3EmomZzsv?>E-~ygGum45fk!SBN&|eo1rKw^?aZJ4 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 be52383e..00000000 --- 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 4f906e0c..00000000 --- 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 107acd32..00000000 --- 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/src/main/java/net/servicestack/idea/DepConfig.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DepConfig.java index 6229f94d..eeaeda2e 100644 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DepConfig.java +++ b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/DepConfig.java @@ -5,7 +5,7 @@ public class DepConfig { 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.40"; + public static String servicestackVersion = "1.0.43"; public static final String gsonGroupId = "com.google.code.gson"; public static final String gsonPackageId = "gson"; From 7af4f22121c68153fc4bc2b6864dae00294f1e4a Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 24 Dec 2020 22:03:48 +1100 Subject: [PATCH 007/101] Remove runnable as causing write issues, seems that update of IntelliJ requires all writes to be done on UI thread or via "invokeLater" per write. With the current structure, this causes an issue writing maven dependencies (updating the pom.xml) as we need to edit the pom.xml twice. Will need to consolidate writing options based on state to write once before reenabling async runnable. --- .../java/net/servicestack/idea/AddRef.java | 67 +++++++------------ 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java index c89d6722..f63a4318 100644 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java +++ b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java @@ -122,11 +122,10 @@ public void changedUpdate(DocumentEvent e) { } public void warn() { - if (nameTextField.getInputVerifier().verify(nameTextField) && addressUrlTextField.getInputVerifier().verify(addressUrlTextField)) { - buttonOK.setEnabled(true); - } else { - buttonOK.setEnabled(false); - } + buttonOK.setEnabled( + nameTextField.getInputVerifier().verify(nameTextField) && + addressUrlTextField.getInputVerifier().verify(addressUrlTextField) + ); } }); @@ -147,27 +146,18 @@ public void changedUpdate(DocumentEvent e) { } public void warn() { - if (nameTextField.getInputVerifier().verify(nameTextField) && addressUrlTextField.getInputVerifier().verify(addressUrlTextField)) { - buttonOK.setEnabled(true); - } else { - buttonOK.setEnabled(false); - } + buttonOK.setEnabled( + nameTextField.getInputVerifier().verify(nameTextField) && + addressUrlTextField.getInputVerifier().verify(addressUrlTextField) + ); } }); - buttonOK.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - processOK(); - } - }); + buttonOK.addActionListener(e -> processOK()); packageBrowse.addActionListener(new BrowsePackageListener(packageBrowse, module.getProject(), "Browse packages")); - buttonCancel.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - onCancel(); - } - }); + buttonCancel.addActionListener(e -> onCancel()); // call onCancel() when cross is clicked setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); @@ -178,11 +168,7 @@ public void windowClosing(WindowEvent e) { }); // 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); + contentPane.registerKeyboardAction(e -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); } public void setSelectedPackage(@NotNull PsiPackage selectedPackage) { @@ -241,24 +227,18 @@ private void processOK() { } - Runnable r = new Runnable() { - public void run() { - 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); - - } - }; - SwingUtilities.invokeLater(r); + 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) { @@ -375,7 +355,6 @@ private void onOK() { } /** - * @noinspection ALL */ public JComponent $$$getRootComponent$$$() { return contentPane; From ac3e05cffb27c1344e82b58d6c0375277a6a1204 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Sun, 27 Dec 2020 12:01:01 +1100 Subject: [PATCH 008/101] Add back `invokeLater` but via `ApplicationManager`. --- .../java/net/servicestack/idea/AddRef.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java index f63a4318..49e18e03 100644 --- a/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java +++ b/src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java @@ -6,6 +6,7 @@ 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; @@ -226,19 +227,21 @@ private void processOK() { 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); + }); - 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) { From 1a2115e96de2028b32e29c448aec71a1f52b2611 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 4 Jan 2021 07:37:29 +1100 Subject: [PATCH 009/101] CI server doesn't have GRADLE_HOME setup, easier to keep self isolated. Re-adding gradle-wrapper files to fix. --- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + src/ServiceStackIDEA/gradlew | 185 ++++++++++++++++++ src/ServiceStackIDEA/gradlew.bat | 89 +++++++++ 4 files changed, 279 insertions(+) create mode 100644 src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties create mode 100644 src/ServiceStackIDEA/gradlew create mode 100644 src/ServiceStackIDEA/gradlew.bat diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 zcma&O1CT9Y(k9%tZQHhO+qUh#ZQHhO+qmuS+qP|E@9xZO?0h@l{(r>DQ>P;GjjD{w zH}lENr;dU&FbEU?00aa80D$0M0RRB{U*7-#kbjS|qAG&4l5%47zyJ#WrfA#1$1Ctx zf&Z_d{GW=lf^w2#qRJ|CvSJUi(^E3iv~=^Z(zH}F)3Z%V3`@+rNB7gTVU{Bb~90p|f+0(v;nz01EG7yDMX9@S~__vVgv%rS$+?IH+oZ03D5zYrv|^ zC1J)SruYHmCki$jLBlTaE5&dFG9-kq3!^i>^UQL`%gn6)jz54$WDmeYdsBE9;PqZ_ zoGd=P4+|(-u4U1dbAVQrFWoNgNd;0nrghPFbQrJctO>nwDdI`Q^i0XJDUYm|T|RWc zZ3^Qgo_Qk$%Fvjj-G}1NB#ZJqIkh;kX%V{THPqOyiq)d)0+(r9o(qKlSp*hmK#iIY zA^)Vr$-Hz<#SF=0@tL@;dCQsm`V9s1vYNq}K1B)!XSK?=I1)tX+bUV52$YQu*0%fnWEukW>mxkz+%3-S!oguE8u#MGzST8_Dy^#U?fA@S#K$S@9msUiX!gd_ow>08w5)nX{-KxqMOo7d?k2&?Vf z&diGDtZr(0cwPe9z9FAUSD9KC)7(n^lMWuayCfxzy8EZsns%OEblHFSzP=cL6}?J| z0U$H!4S_TVjj<`6dy^2j`V`)mC;cB%* z8{>_%E1^FH!*{>4a7*C1v>~1*@TMcLK{7nEQ!_igZC}ikJ$*<$yHy>7)oy79A~#xE zWavoJOIOC$5b6*q*F_qN1>2#MY)AXVyr$6x4b=$x^*aqF*L?vmj>Mgv+|ITnw_BoW zO?jwHvNy^prH{9$rrik1#fhyU^MpFqF2fYEt(;4`Q&XWOGDH8k6M=%@fics4ajI;st# zCU^r1CK&|jzUhRMv;+W~6N;u<;#DI6cCw-otsc@IsN3MoSD^O`eNflIoR~l4*&-%RBYk@gb^|-JXs&~KuSEmMxB}xSb z@K76cXD=Y|=I&SNC2E+>Zg?R6E%DGCH5J1nU!A|@eX9oS(WPaMm==k2s_ueCqdZw| z&hqHp)47`c{BgwgvY2{xz%OIkY1xDwkw!<0veB#yF4ZKJyabhyyVS`gZepcFIk%e2 zTcrmt2@-8`7i-@5Nz>oQWFuMC_KlroCl(PLSodswHqJ3fn<;gxg9=}~3x_L3P`9Sn zChIf}8vCHvTriz~T2~FamRi?rh?>3bX1j}%bLH+uFX+p&+^aXbOK7clZxdU~6Uxgy z8R=obwO4dL%pmVo*Ktf=lH6hnlz_5k3cG;m8lgaPp~?eD!Yn2kf)tU6PF{kLyn|oI@eQ`F z3IF7~Blqg8-uwUuWZScRKn%c2_}dXB6Dx_&xR*n9M9LXasJhtZdr$vBY!rP{c@=)& z#!?L$2UrkvClwQO>U*fSMs67oSj2mxiJ$t;E|>q%Kh_GzzWWO&3;ufU%2z%ucBU8H z3WIwr$n)cfCXR&>tyB7BcSInK>=ByZA%;cVEJhcg<#6N{aZC4>K41XF>ZgjG`z_u& zGY?;Ad?-sgiOnI`oppF1o1Gurqbi*;#x2>+SSV6|1^G@ooVy@fg?wyf@0Y!UZ4!}nGuLeC^l)6pwkh|oRY`s1Pm$>zZ3u-83T|9 zGaKJIV3_x+u1>cRibsaJpJqhcm%?0-L;2 zitBrdRxNmb0OO2J%Y&Ym(6*`_P3&&5Bw157{o7LFguvxC$4&zTy#U=W*l&(Q2MNO} zfaUwYm{XtILD$3864IA_nn34oVa_g^FRuHL5wdUd)+W-p-iWCKe8m_cMHk+=? zeKX)M?Dt(|{r5t7IenkAXo%&EXIb-i^w+0CX0D=xApC=|Xy(`xy+QG^UyFe z+#J6h_&T5i#sV)hj3D4WN%z;2+jJcZxcI3*CHXGmOF3^)JD5j&wfX)e?-|V0GPuA+ zQFot%aEqGNJJHn$!_}#PaAvQ^{3-Ye7b}rWwrUmX53(|~i0v{}G_sI9uDch_brX&6 zWl5Ndj-AYg(W9CGfQf<6!YmY>Ey)+uYd_JNXH=>|`OH-CDCmcH(0%iD_aLlNHKH z7bcW-^5+QV$jK?R*)wZ>r9t}loM@XN&M-Pw=F#xn(;u3!(3SXXY^@=aoj70;_=QE9 zGghsG3ekq#N||u{4We_25U=y#T*S{4I{++Ku)> zQ!DZW;pVcn>b;&g2;YE#+V`v*Bl&Y-i@X6D*OpNA{G@JAXho&aOk(_j^weW{#3X5Y z%$q_wpb07EYPdmyH(1^09i$ca{O<}7) zRWncXdSPgBE%BM#by!E>tdnc$8RwUJg1*x($6$}ae$e9Knj8gvVZe#bLi!<+&BkFj zg@nOpDneyc+hU9P-;jmOSMN|*H#>^Ez#?;%C3hg_65leSUm;iz)UkW)jX#p)e&S&M z1|a?wDzV5NVnlhRBCd_;F87wp>6c<&nkgvC+!@KGiIqWY4l}=&1w7|r6{oBN8xyzh zG$b#2=RJp_iq6)#t5%yLkKx(0@D=C3w+oiXtSuaQ%I1WIb-eiE$d~!)b@|4XLy!CZ z9p=t=%3ad@Ep+<9003D2KZ5VyP~_n$=;~r&YUg5UZ0KVD&tR1DHy9x)qWtKJp#Kq# zP*8p#W(8JJ_*h_3W}FlvRam?<4Z+-H77^$Lvi+#vmhL9J zJ<1SV45xi;SrO2f=-OB(7#iNA5)x1uNC-yNxUw|!00vcW2PufRm>e~toH;M0Q85MQLWd?3O{i8H+5VkR@l9Dg-ma ze2fZ%>G(u5(k9EHj2L6!;(KZ8%8|*-1V|B#EagbF(rc+5iL_5;Eu)L4Z-V;0HfK4d z*{utLse_rvHZeQ>V5H=f78M3Ntg1BPxFCVD{HbNA6?9*^YIq;B-DJd{Ca2L#)qWP? zvX^NhFmX?CTWw&Ns}lgs;r3i+Bq@y}Ul+U%pzOS0Fcv9~aB(0!>GT0)NO?p=25LjN z2bh>6RhgqD7bQj#k-KOm@JLgMa6>%-ok1WpOe)FS^XOU{c?d5shG(lIn3GiVBxmg`u%-j=)^v&pX1JecJics3&jvPI)mDut52? z3jEA)DM%}BYbxxKrizVYwq?(P&19EXlwD9^-6J+4!}9{ywR9Gk42jjAURAF&EO|~N z)?s>$Da@ikI4|^z0e{r`J8zIs>SpM~Vn^{3fArRu;?+43>lD+^XtUcY1HidJwnR6+ z!;oG2=B6Z_=M%*{z-RaHc(n|1RTKQdNjjV!Pn9lFt^4w|AeN06*j}ZyhqZ^!-=cyGP_ShV1rGxkx8t zB;8`h!S{LD%ot``700d0@Grql(DTt4Awgmi+Yr0@#jbe=2#UkK%rv=OLqF)9D7D1j z!~McAwMYkeaL$~kI~90)5vBhBzWYc3Cj1WI0RS`z000R8-@ET0dA~*r(gSiCJmQMN&4%1D zyVNf0?}sBH8zNbBLn>~(W{d3%@kL_eQ6jEcR{l>C|JK z(R-fA!z|TTRG40|zv}7E@PqCAXP3n`;%|SCQ|ZS%ym$I{`}t3KPL&^l5`3>yah4*6 zifO#{VNz3)?ZL$be;NEaAk9b#{tV?V7 zP|wf5YA*1;s<)9A4~l3BHzG&HH`1xNr#%){4xZ!jq%o=7nN*wMuXlFV{HaiQLJ`5G zBhDi#D(m`Q1pLh@Tq+L;OwuC52RdW7b8}~60WCOK5iYMUad9}7aWBuILb({5=z~YF zt?*Jr5NG+WadM{mDL>GyiByCuR)hd zA=HM?J6l1Xv0Dl+LW@w$OTcEoOda^nFCw*Sy^I@$sSuneMl{4ys)|RY#9&NxW4S)9 zq|%83IpslTLoz~&vTo!Ga@?rj_kw{|k{nv+w&Ku?fyk4Ki4I?);M|5Axm)t+BaE)D zm(`AQ#k^DWrjbuXoJf2{Aj^KT zFb1zMSqxq|vceV+Mf-)$oPflsO$@*A0n0Z!R{&(xh8s}=;t(lIy zv$S8x>m;vQNHuRzoaOo?eiWFe{0;$s`Bc+Osz~}Van${u;g(su`3lJ^TEfo~nERfP z)?aFzpDgnLYiERsKPu|0tq4l2wT)Atr6Qb%m-AUn6HnCue*yWICp7TjW$@sO zm5rm4aTcPQ(rfi7a`xP7cKCFrJD}*&_~xgLyr^-bmsL}y;A5P|al8J3WUoBSjqu%v zxC;mK!g(7r6RRJ852Z~feoC&sD3(6}^5-uLK8o)9{8L_%%rItZK9C){UxB|;G>JbP zsRRtS4-3B*5c+K2kvmgZK8472%l>3cntWUOVHxB|{Ay~aOg5RN;{PJgeVD*H%ac+y!h#wi%o2bF2Ca8IyMyH{>4#{E_8u^@+l-+n=V}Sq?$O z{091@v%Bd*3pk0^2UtiF9Z+(a@wy6 zUdw8J*ze$K#=$48IBi1U%;hmhO>lu!uU;+RS}p&6@rQila7WftH->*A4=5W|Fmtze z)7E}jh@cbmr9iup^i%*(uF%LG&!+Fyl@LFA-}Ca#bxRfDJAiR2dt6644TaYw1Ma79 zt8&DYj31j^5WPNf5P&{)J?WlCe@<3u^78wnd(Ja4^a>{^Tw}W>|Cjt^If|7l^l)^Q zbz|7~CF(k_9~n|h;ysZ+jHzkXf(*O*@5m zLzUmbHp=x!Q|!9NVXyipZ3)^GuIG$k;D)EK!a5=8MFLI_lpf`HPKl=-Ww%z8H_0$j ztJ||IfFG1lE9nmQ0+jPQy zCBdKkjArH@K7jVcMNz);Q(Q^R{d5G?-kk;Uu_IXSyWB)~KGIizZL(^&qF;|1PI7!E zTP`%l)gpX|OFn&)M%txpQ2F!hdA~hX1Cm5)IrdljqzRg!f{mN%G~H1&oqe`5eJCIF zHdD7O;AX-{XEV(a`gBFJ9ews#CVS2y!&>Cm_dm3C8*n3MA*e67(WC?uP@8TXuMroq z{#w$%z@CBIkRM7?}Xib+>hRjy?%G!fiw8! z8(gB+8J~KOU}yO7UGm&1g_MDJ$IXS!`+*b*QW2x)9>K~Y*E&bYMnjl6h!{17_8d!%&9D`a7r&LKZjC<&XOvTRaKJ1 zUY@hl5^R&kZl3lU3njk`3dPzxj$2foOL26r(9zsVF3n_F#v)s5vv3@dgs|lP#eylq62{<-vczqP!RpVBTgI>@O6&sU>W|do17+#OzQ7o5A$ICH z?GqwqnK^n2%LR;$^oZM;)+>$X3s2n}2jZ7CdWIW0lnGK-b#EG01)P@aU`pg}th&J-TrU`tIpb5t((0eu|!u zQz+3ZiOQ^?RxxK4;zs=l8q!-n7X{@jSwK(iqNFiRColuEOg}!7cyZi`iBX4g1pNBj zAPzL?P^Ljhn;1$r8?bc=#n|Ed7wB&oHcw()&*k#SS#h}jO?ZB246EGItsz*;^&tzp zu^YJ0=lwsi`eP_pU8}6JA7MS;9pfD;DsSsLo~ogzMNP70@@;Fm8f0^;>$Z>~}GWRw!W5J3tNX*^2+1f3hz{~rIzJo z6W%J(H!g-eI_J1>0juX$X4Cl6i+3wbc~k146UIX&G22}WE>0ga#WLsn9tY(&29zBvH1$`iWtTe zG2jYl@P!P)eb<5DsR72BdI7-zP&cZNI{7q3e@?N8IKc4DE#UVr->|-ryuJXk^u^>4 z$3wE~=q390;XuOQP~TNoDR?#|NSPJ%sTMInA6*rJ%go|=YjGe!B>z6u$IhgQSwoV* zjy3F2#I>uK{42{&IqP59)Y(1*Z>>#W8rCf4_eVsH)`v!P#^;BgzKDR`ARGEZzkNX+ zJUQu=*-ol=Xqqt5=`=pA@BIn@6a9G8C{c&`i^(i+BxQO9?YZ3iu%$$da&Kb?2kCCo zo7t$UpSFWqmydXf@l3bVJ=%K?SSw)|?srhJ-1ZdFu*5QhL$~-IQS!K1s@XzAtv6*Y zl8@(5BlWYLt1yAWy?rMD&bwze8bC3-GfNH=p zynNFCdxyX?K&G(ZZ)afguQ2|r;XoV^=^(;Cku#qYn4Lus`UeKt6rAlFo_rU`|Rq z&G?~iWMBio<78of-2X(ZYHx~=U0Vz4btyXkctMKdc9UM!vYr~B-(>)(Hc|D zMzkN4!PBg%tZoh+=Gba!0++d193gbMk2&krfDgcbx0jI92cq?FFESVg0D$>F+bil} zY~$)|>1HZsX=5sAZ2WgPB5P=8X#TI+NQ(M~GqyVB53c6IdX=k>Wu@A0Svf5#?uHaF zsYn|koIi3$(%GZ2+G+7Fv^lHTb#5b8sAHSTnL^qWZLM<(1|9|QFw9pnRU{svj}_Al zL)b9>fN{QiA($8peNEJyy`(a{&uh-T4_kdZFIVsKKVM(?05}76EEz?#W za^fiZOAd14IJ4zLX-n7Lq0qlQ^lW8Cvz4UKkV9~P}>sq0?xD3vg+$4vLm~C(+ zM{-3Z#qnZ09bJ>}j?6ry^h+@PfaD7*jZxBEY4)UG&daWb??6)TP+|3#Z&?GL?1i+280CFsE|vIXQbm| zM}Pk!U`U5NsNbyKzkrul-DzwB{X?n3E6?TUHr{M&+R*2%yOiXdW-_2Yd6?38M9Vy^ z*lE%gA{wwoSR~vN0=no}tP2Ul5Gk5M(Xq`$nw#ndFk`tcpd5A=Idue`XZ!FS>Q zG^0w#>P4pPG+*NC9gLP4x2m=cKP}YuS!l^?sHSFftZy{4CoQrb_ z^20(NnG`wAhMI=eq)SsIE~&Gp9Ne0nD4%Xiu|0Fj1UFk?6avDqjdXz{O1nKao*46y zT8~iA%Exu=G#{x=KD;_C&M+Zx4+n`sHT>^>=-1YM;H<72k>$py1?F3#T1*ef9mLZw z5naLQr?n7K;2l+{_uIw*_1nsTn~I|kkCgrn;|G~##hM;9l7Jy$yJfmk+&}W@JeKcF zx@@Woiz8qdi|D%aH3XTx5*wDlbs?dC1_nrFpm^QbG@wM=i2?Zg;$VK!c^Dp8<}BTI zyRhAq@#%2pGV49*Y5_mV4+OICP|%I(dQ7x=6Ob}>EjnB_-_18*xrY?b%-yEDT(wrO z9RY2QT0`_OpGfMObKHV;QLVnrK%mc?$WAdIT`kJQT^n%GuzE7|9@k3ci5fYOh(287 zuIbg!GB3xLg$YN=n)^pHGB0jH+_iIiC=nUcD;G6LuJsjn2VI1cyZx=a?ShCsF==QK z;q~*m&}L<-cb+mDDXzvvrRsybcgQ;Vg21P(uLv5I+eGc7o7tc6`;OA9{soHFOz zT~2?>Ts}gprIX$wRBb4yE>ot<8+*Bv`qbSDv*VtRi|cyWS>)Fjs>fkNOH-+PX&4(~ z&)T8Zam2L6puQl?;5zg9h<}k4#|yH9czHw;1jw-pwBM*O2hUR6yvHATrI%^mvs9q_ z&ccT0>f#eDG<^WG^q@oVqlJrhxH)dcq2cty@l3~|5#UDdExyXUmLQ}f4#;6fI{f^t zDCsgIJ~0`af%YR%Ma5VQq-p21k`vaBu6WE?66+5=XUd%Ay%D$irN>5LhluRWt7 zov-=f>QbMk*G##&DTQyou$s7UqjjW@k6=!I@!k+S{pP8R(2=e@io;N8E`EOB;OGoI zw6Q+{X1_I{OO0HPpBz!X!@`5YQ2)t{+!?M_iH25X(d~-Zx~cXnS9z>u?+If|iNJbx zyFU2d1!ITX64D|lE0Z{dLRqL1Ajj=CCMfC4lD3&mYR_R_VZ>_7_~|<^o*%_&jevU+ zQ4|qzci=0}Jydw|LXLCrOl1_P6Xf@c0$ieK2^7@A9UbF{@V_0p%lqW|L?5k>bVM8|p5v&2g;~r>B8uo<4N+`B zH{J)h;SYiIVx@#jI&p-v3dwL5QNV1oxPr8J%ooezTnLW>i*3Isb49%5i!&ac_dEXv zvXmVUck^QHmyrF8>CGXijC_R-y(Qr{3Zt~EmW)-nC!tiH`wlw5D*W7Pip;T?&j%kX z6DkZX4&}iw>hE(boLyjOoupf6JpvBG8}jIh!!VhnD0>}KSMMo{1#uU6kiFcA04~|7 zVO8eI&x1`g4CZ<2cYUI(n#wz2MtVFHx47yE5eL~8bot~>EHbevSt}LLMQX?odD{Ux zJMnam{d)W4da{l7&y-JrgiU~qY3$~}_F#G7|MxT)e;G{U`In&?`j<5D->}cb{}{T(4DF0BOk-=1195KB-E*o@c?`>y#4=dMtYtSY=&L{!TAjFVcq0y@AH`vH! z$41+u!Ld&}F^COPgL(EE{0X7LY&%D7-(?!kjFF7=qw<;`V{nwWBq<)1QiGJgUc^Vz ztMUlq1bZqKn17|6x6iAHbWc~l1HcmAxr%$Puv!znW)!JiukwIrqQ00|H$Z)OmGG@= zv%A8*4cq}(?qn4rN6o`$Y))(MyXr8R<2S^J+v(wmFmtac!%VOfN?&(8Nr!T@kV`N; z*Q33V3t`^rN&aBiHet)18wy{*wi1=W!B%B-Q6}SCrUl$~Hl{@!95ydml@FK8P=u4s z4e*7gV2s=YxEvskw2Ju!2%{8h01rx-3`NCPc(O zH&J0VH5etNB2KY6k4R@2Wvl^Ck$MoR3=)|SEclT2ccJ!RI9Nuter7u9@;sWf-%um;GfI!=eEIQ2l2p_YWUd{|6EG ze{yO6;lMc>;2tPrsNdi@&1K6(1;|$xe8vLgiouj%QD%gYk`4p{Ktv9|j+!OF-P?@p z;}SV|oIK)iwlBs+`ROXkhd&NK zzo__r!B>tOXpBJMDcv!Mq54P+n4(@dijL^EpO1wdg~q+!DT3lB<>9AANSe!T1XgC=J^)IP0XEZ()_vpu!!3HQyJhwh?r`Ae%Yr~b% zO*NY9t9#qWa@GCPYOF9aron7thfWT`eujS4`t2uG6)~JRTI;f(ZuoRQwjZjp5Pg34 z)rp$)Kr?R+KdJ;IO;pM{$6|2y=k_siqvp%)2||cHTe|b5Ht8&A{wazGNca zX$Ol?H)E_R@SDi~4{d-|8nGFhZPW;Cts1;08TwUvLLv&_2$O6Vt=M)X;g%HUr$&06 zISZb(6)Q3%?;3r~*3~USIg=HcJhFtHhIV(siOwV&QkQe#J%H9&E21!C*d@ln3E@J* zVqRO^<)V^ky-R|%{(9`l-(JXq9J)1r$`uQ8a}$vr9E^nNiI*thK8=&UZ0dsFN_eSl z(q~lnD?EymWLsNa3|1{CRPW60>DSkY9YQ;$4o3W7Ms&@&lv9eH!tk~N&dhqX&>K@} zi1g~GqglxkZ5pEFkllJ)Ta1I^c&Bt6#r(QLQ02yHTaJB~- zCcE=5tmi`UA>@P=1LBfBiqk)HB4t8D?02;9eXj~kVPwv?m{5&!&TFYhu>3=_ zsGmYZ^mo*-j69-42y&Jj0cBLLEulNRZ9vXE)8~mt9C#;tZs;=#M=1*hebkS;7(aGf zcs7zH(I8Eui9UU4L--))yy`&d&$In&VA2?DAEss4LAPCLd>-$i?lpXvn!gu^JJ$(DoUlc6wE98VLZ*z`QGQov5l4Fm_h?V-;mHLYDVOwKz7>e4+%AzeO>P6v}ndPW| zM>m#6Tnp7K?0mbK=>gV}=@k*0Mr_PVAgGMu$j+pWxzq4MAa&jpCDU&-5eH27Iz>m^ zax1?*HhG%pJ((tkR(V(O(L%7v7L%!_X->IjS3H5kuXQT2!ow(;%FDE>16&3r){!ex zhf==oJ!}YU89C9@mfDq!P3S4yx$aGB?rbtVH?sHpg?J5C->!_FHM%Hl3#D4eplxzQ zRA+<@LD%LKSkTk2NyWCg7u=$%F#;SIL44~S_OGR}JqX}X+=bc@swpiClB`Zbz|f!4 z7Ysah7OkR8liXfI`}IIwtEoL}(URrGe;IM8%{>b1SsqXh)~w}P>yiFRaE>}rEnNkT z!HXZUtxUp1NmFm)Dm@-{FI^aRQqpSkz}ZSyKR%Y}YHNzBk)ZIp} zMtS=aMvkgWKm9&oTcU0?S|L~CDqA+sHpOxwnswF-fEG)cXCzUR?ps@tZa$=O)=L+5 zf%m58cq8g_o}3?Bhh+c!w4(7AjxwQ3>WnVi<{{38g7yFboo>q|+7qs<$8CPXUFAN< zG&}BHbbyQ5n|qqSr?U~GY{@GJ{(Jny{bMaOG{|IkUj7tj^9pa9|FB_<+KHLxSxR;@ zHpS$4V)PP+tx}22fWx(Ku9y+}Ap;VZqD0AZW4gCDTPCG=zgJmF{|x;(rvdM|2|9a}cex6xrMkERnkE;}jvU-kmzd%_J50$M`lIPCKf+^*zL=@LW`1SaEc%=m zQ+lT06Gw+wVwvQ9fZ~#qd430v2HndFsBa9WjD0P}K(rZYdAt^5WQIvb%D^Q|pkVE^ zte$&#~zmULFACGfS#g=2OLOnIf2Of-k!(BIHjs77nr!5Q1*I9 z1%?=~#Oss!rV~?-6Gm~BWJiA4mJ5TY&iPm_$)H1_rTltuU1F3I(qTQ^U$S>%$l z)Wx1}R?ij0idp@8w-p!Oz{&*W;v*IA;JFHA9%nUvVDy7Q8woheC#|8QuDZb-L_5@R zOqHwrh|mVL9b=+$nJxM`3eE{O$sCt$UK^2@L$R(r^-_+z?lOo+me-VW=Zw z-Bn>$4ovfWd%SPY`ab-u9{INc*k2h+yH%toDHIyqQ zO68=u`N}RIIs7lsn1D){)~%>ByF<>i@qFb<-axvu(Z+6t7v<^z&gm9McRB~BIaDn$ z#xSGT!rzgad8o>~kyj#h1?7g96tOcCJniQ+*#=b7wPio>|6a1Z?_(TS{)KrPe}(8j z!#&A=k(&Pj^F;r)CI=Z{LVu>uj!_W1q4b`N1}E(i%;BWjbEcnD=mv$FL$l?zS6bW!{$7j1GR5ocn94P2u{ z70tAAcpqtQo<@cXw~@i-@6B23;317|l~S>CB?hR5qJ%J3EFgyBdJd^fHZu7AzHF(BQ!tyAz^L0`X z23S4Fe{2X$W0$zu9gm%rg~A>ijaE#GlYlrF9$ds^QtaszE#4M(OLVP2O-;XdT(XIC zatwzF*)1c+t~c{L=fMG8Z=k5lv>U0;C{caN1NItnuSMp)6G3mbahu>E#sj&oy94KC zpH}8oEw{G@N3pvHhp{^-YaZeH;K+T_1AUv;IKD<=mv^&Ueegrb!yf`4VlRl$M?wsl zZyFol(2|_QM`e_2lYSABpKR{{NlxlDSYQNkS;J66aT#MSiTx~;tUmvs-b*CrR4w=f z8+0;*th6kfZ3|5!Icx3RV11sp=?`0Jy3Fs0N4GZQMN=8HmT6%x9@{Dza)k}UwL6JT zHRDh;%!XwXr6yuuy`4;Xsn0zlR$k%r%9abS1;_v?`HX_hI|+EibVnlyE@3aL5vhQq zlIG?tN^w@0(v9M*&L+{_+RQZw=o|&BRPGB>e5=ys7H`nc8nx)|-g;s7mRc7hg{GJC zAe^vCIJhajmm7C6g! zL&!WAQ~5d_5)00?w_*|*H>3$loHrvFbitw#WvLB!JASO?#5Ig5$Ys10n>e4|3d;tS zELJ0|R4n3Az(Fl3-r^QiV_C;)lQ1_CW{5bKS15U|E9?ZgLec@%kXr84>5jV2a5v=w z?pB1GPdxD$IQL4)G||B_lI+A=08MUFFR4MxfGOu07vfIm+j=z9tp~5i_6jb`tR>qV z$#`=BQ*jpCjm$F0+F)L%xRlnS%#&gro6PiRfu^l!EVan|r3y}AHJQOORGx4~ z&<)3=K-tx518DZyp%|!EqpU!+X3Et7n2AaC5(AtrkW>_57i}$eqs$rupubg0a1+WO zGHZKLN2L0D;ab%{_S1Plm|hx8R?O14*w*f&2&bB050n!R2by zw!@XOQx$SqZ5I<(Qu$V6g>o#A!JVwErWv#(Pjx=KeS0@hxr4?13zj#oWwPS(7Ro|v z>Mp@Kmxo79q|}!5qtX2-O@U&&@6s~!I&)1WQIl?lTnh6UdKT_1R640S4~f=_xoN3- zI+O)$R@RjV$F=>Ti7BlnG1-cFKCC(t|Qjm{SalS~V-tX#+2ekRhwmN zZr`8{QF6y~Z!D|{=1*2D-JUa<(1Z=;!Ei!KiRNH?o{p5o3crFF=_pX9O-YyJchr$~ zRC`+G+8kx~fD2k*ZIiiIGR<8r&M@3H?%JVOfE>)})7ScOd&?OjgAGT@WVNSCZ8N(p zuQG~76GE3%(%h1*vUXg$vH{ua0b`sQ4f0*y=u~lgyb^!#CcPJa2mkSEHGLsnO^kb$ zru5_l#nu=Y{rSMWiYx?nO{8I!gH+?wEj~UM?IrG}E|bRIBUM>UlY<`T1EHpRr36vv zBi&dG8oxS|J$!zoaq{+JpJy+O^W(nt*|#g32bd&K^w-t>!Vu9N!k9eA8r!Xc{utY> zg9aZ(D2E0gL#W0MdjwES-7~Wa8iubPrd?8-$C4BP?*wok&O8+ykOx{P=Izx+G~hM8 z*9?BYz!T8~dzcZr#ux8kS7u7r@A#DogBH8km8Ry4slyie^n|GrTbO|cLhpqgMdsjX zJ_LdmM#I&4LqqsOUIXK8gW;V0B(7^$y#h3h>J0k^WJfAMeYek%Y-Dcb_+0zPJez!GM zAmJ1u;*rK=FNM0Nf}Y!!P9c4)HIkMnq^b;JFd!S3?_Qi2G#LIQ)TF|iHl~WKK6JmK zbv7rPE6VkYr_%_BT}CK8h=?%pk@3cz(UrZ{@h40%XgThP*-Oeo`T0eq9 zA8BnWZKzCy5e&&_GEsU4*;_k}(8l_&al5K-V*BFM=O~;MgRkYsOs%9eOY6s6AtE*<7GQAR2ulC3RAJrG_P1iQK5Z~&B z&f8X<>yJV6)oDGIlS$Y*D^Rj(cszTy5c81a5IwBr`BtnC6_e`ArI8CaTX_%rx7;cn zR-0?J_LFg*?(#n~G8cXut(1nVF0Oka$A$1FGcERU<^ggx;p@CZc?3UB41RY+wLS`LWFNSs~YP zuw1@DNN3lTd|jDL7gjBsd9}wIw}4xT2+8dBQzI00m<@?c2L%>}QLfK5%r!a-iII`p zX@`VEUH)uj^$;7jVUYdADQ2k*!1O3WdfgF?OMtUXNpQ1}QINamBTKDuv19^{$`8A1 zeq%q*O0mi@(%sZU>Xdb0Ru96CFqk9-L3pzLVsMQ`Xpa~N6CR{9Rm2)A|CI21L(%GW zh&)Y$BNHa=FD+=mBw3{qTgw)j0b!Eahs!rZnpu)z!!E$*eXE~##yaXz`KE5(nQM`s zD!$vW9XH)iMxu9R>r$VlLk9oIR%HxpUiW=BK@4U)|1WNQ=mz9a z^!KkO=>GaJ!GBXm{KJj^;kh-MkUlEQ%lza`-G&}C5y1>La1sR6hT=d*NeCnuK%_LV zOXt$}iP6(YJKc9j-Fxq~*ItVUqljQ8?oaysB-EYtFQp9oxZ|5m0^Hq(qV!S+hq#g( z?|i*H2MIr^Kxgz+3vIljQ*Feejy6S4v~jKEPTF~Qhq!(ms5>NGtRgO5vfPPc4Z^AM zTj!`5xEreIN)vaNxa|q6qWdg>+T`Ol0Uz)ckXBXEGvPNEL3R8hB3=C5`@=SYgAju1 z!)UBr{2~=~xa{b8>x2@C7weRAEuatC)3pkRhT#pMPTpSbA|tan%U7NGMvzmF?c!V8 z=pEWxbdXbTAGtWTyI?Fml%lEr-^AE}w#l(<7OIw;ctw}imYax&vR4UYNJZK6P7ZOd zP87XfhnUHxCUHhM@b*NbTi#(-8|wcv%3BGNs#zRCVV(W?1Qj6^PPQa<{yaBwZ`+<`w|;rqUY_C z&AeyKwwf*q#OW-F()lir=T^<^wjK65Lif$puuU5+tk$;e_EJ;Lu+pH>=-8=PDhkBg z8cWt%@$Sc#C6F$Vd+0507;{OOyT7Hs%nKS88q-W!$f~9*WGBpHGgNp}=C*7!RiZ5s zn1L_DbKF@B8kwhDiLKRB@lsXVVLK|ph=w%_`#owlf@s@V(pa`GY$8h%;-#h@TsO|Y8V=n@*!Rog7<7Cid%apR|x zOjhHCyfbIt%+*PCveTEcuiDi%Wx;O;+K=W?OFUV%)%~6;gl?<0%)?snDDqIvkHF{ zyI02)+lI9ov42^hL>ZRrh*HhjF9B$A@=H94iaBESBF=eC_KT$8A@uB^6$~o?3Wm5t1OIaqF^~><2?4e3c&)@wKn9bD? zoeCs;H>b8DL^F&>Xw-xjZEUFFTv>JD^O#1E#)CMBaG4DX9bD(Wtc8Rzq}9soQ8`jf zeSnHOL}<+WVSKp4kkq&?SbETjq6yr@4%SAqOG=9E(3YeLG9dtV+8vmzq+6PFPk{L; z(&d++iu=^F%b+ea$i2UeTC{R*0Isk;vFK!no<;L+(`y`3&H-~VTdKROkdyowo1iqR zbVW(3`+(PQ2>TKY>N!jGmGo7oeoB8O|P_!Ic@ zZ^;3dnuXo;WJ?S+)%P>{Hcg!Jz#2SI(s&dY4QAy_vRlmOh)QHvs_7c&zkJCmJGVvV zX;Mtb>QE+xp`KyciG$Cn*0?AK%-a|=o!+7x&&yzHQOS>8=B*R=niSnta^Pxp1`=md z#;$pS$4WCT?mbiCYU?FcHGZ#)kHVJTTBt^%XE(Q};aaO=Zik0UgLcc0I(tUpt(>|& zcxB_|fxCF7>&~5eJ=Dpn&5Aj{A^cV^^}(7w#p;HG&Q)EaN~~EqrE1qKrMAc&WXIE;>@<&)5;gD2?={Xf@Mvn@OJKw=8Mgn z!JUFMwD+s==JpjhroT&d{$kQAy%+d`a*XxDEVxy3`NHzmITrE`o!;5ClXNPb4t*8P zzAivdr{j_v!=9!^?T3y?gzmqDWX6mkzhIzJ-3S{T5bcCFMr&RPDryMcdwbBuZbsgN zGrp@^i?rcfN7v0NKGzDPGE#4yszxu=I_`MI%Z|10nFjU-UjQXXA?k8Pk|OE<(?ae) zE%vG#eZAlj*E7_3dx#Zz4kMLj>H^;}33UAankJiDy5ZvEhrjr`!9eMD8COp}U*hP+ zF}KIYx@pkccIgyxFm#LNw~G&`;o&5)2`5aogs`1~7cMZQ7zj!%L4E`2yzlQN6REX20&O<9 zKV6fyr)TScJPPzNTC2gL+0x#=u>(({{D7j)c-%tvqls3#Y?Z1m zV5WUE)zdJ{$p>yX;^P!UcXP?UD~YM;IRa#Rs5~l+*$&nO(;Ers`G=0D!twR(0GF@c zHl9E5DQI}Oz74n zfKP>&$q0($T4y$6w(p=ERAFh+>n%iaeRA%!T%<^+pg?M)@ucY<&59$x9M#n+V&>}=nO9wCV{O~lg&v#+jcUj(tQ z`0u1YH)-`U$15a{pBkGyPL0THv1P|4e@pf@3IBZS4dVJPo#H>pWq%Lr0YS-SeWash z8R7=jb28KPMI|_lo#GEO|5B?N_e``H*23{~a!AmUJ+fb4HX-%QI@lSEUxKlGV7z7Q zSKw@-TR>@1RL%w{x}dW#k1NgW+q4yt2Xf1J62Bx*O^WG8OJ|FqI4&@d3_o8Id@*)4 zYrk=>@!wv~mh7YWv*bZhxqSmFh2Xq)o=m;%n$I?GSz49l1$xRpPu_^N(vZ>*>Z<04 z2+rP70oM=NDysd!@fQdM2OcyT?3T^Eb@lIC-UG=Bw{BjQ&P`KCv$AcJ;?`vdZ4){d z&gkoUK{$!$$K`3*O-jyM1~p-7T*qb)Ys>Myt^;#1&a%O@x8A+E>! zY8=eD`ZG)LVagDLBeHg>=atOG?Kr%h4B%E6m@J^C+U|y)XX@f z8oyJDW|9g=<#f<{JRr{y#~euMnv)`7j=%cHWLc}ngjq~7k**6%4u>Px&W%4D94(r* z+akunK}O0DC2A%Xo9jyF;DobX?!1I(7%}@7F>i%&nk*LMO)bMGg2N+1iqtg+r(70q zF5{Msgsm5GS7DT`kBsjMvOrkx&|EU!{{~gL4d2MWrAT=KBQ-^zQCUq{5PD1orxlIL zq;CvlWx#f1NWvh`hg011I%?T_s!e38l*lWVt|~z-PO4~~1g)SrJ|>*tXh=QfXT)%( z+ex+inPvD&O4Ur;JGz>$sUOnWdpSLcm1X%aQDw4{dB!cnj`^muI$CJ2%p&-kULVCE z>$eMR36kN$wCPR+OFDM3-U(VOrp9k3)lI&YVFqd;Kpz~K)@Fa&FRw}L(SoD z9B4a+hQzZT-BnVltst&=kq6Y(f^S4hIGNKYBgMxGJ^;2yrO}P3;r)(-I-CZ)26Y6? z&rzHI_1GCvGkgy-t1E;r^3Le30|%$ebDRu2+gdLG)r=A~Qz`}~&L@aGJ{}vVs_GE* zVUjFnzHiXfKQbpv&bR&}l2bzIjAooB)=-XNcYmrGmBh(&iu@o!^hn0^#}m2yZZUK8 zufVm7Gq0y`Mj;9b>`c?&PZkU0j4>IL=UL&-Lp3j&47B5pAW4JceG{!XCA)kT<%2nqCxj<)uy6XR_uws~>_MEKPOpAQ!H zkn>FKh)<9DwwS*|Y(q?$^N!6(51O0 z^JM~Ax{AI1Oj$fs-S5d4T7Z_i1?{%0SsIuQ&r8#(JA=2iLcTN+?>wOL532%&dMYkT z*T5xepC+V6zxhS@vNbMoi|i)=rpli@R9~P!39tWbSSb904ekv7D#quKbgFEMTb48P zuq(VJ+&L8aWU(_FCD$3^uD!YM%O^K(dvy~Wm2hUuh6bD|#(I39Xt>N1Y{ZqXL`Fg6 zKQ?T2htHN!(Bx;tV2bfTtIj7e)liN-29s1kew>v(D^@)#v;}C4-G=7x#;-dM4yRWm zyY`cS21ulzMK{PoaQ6xChEZ}o_#}X-o}<&0)$1#3we?+QeLt;aVCjeA)hn!}UaKt< zat1fHEx13y-rXNMvpUUmCVzocPmN~-Y4(YJvQ#db)4|%B!rBsgAe+*yor~}FrNH08 z3V!97S}D7d$zbSD{$z;@IYMxM6aHdypIuS*pr_U6;#Y!_?0i|&yU*@16l z*dcMqDQgfNBf}?quiu4e>H)yTVfsp#f+Du0@=Kc41QockXkCkvu>FBd6Q+@FL!(Yx z2`YuX#eMEiLEDhp+9uFqME_E^faV&~9qjBHJkIp~%$x^bN=N)K@kvSVEMdDuzA0sn z88CBG?`RX1@#hQNd`o^V{37)!w|nA)QfiYBE^m=yQKv-fQF+UCMcuEe1d4BH7$?>b zJl-r9@0^Ie=)guO1vOd=i$_4sz>y3x^R7n4ED!5oXL3@5**h(xr%Hv)_gILarO46q+MaDOF%ChaymKoI6JU5Pg;7#2n9-18|S1;AK+ zgsn6;k6-%!QD>D?cFy}8F;r@z8H9xN1jsOBw2vQONVqBVEbkiNUqgw~*!^##ht>w0 zUOykwH=$LwX2j&nLy=@{hr)2O&-wm-NyjW7n~Zs9UlH;P7iP3 zI}S(r0YFVYacnKH(+{*)Tbw)@;6>%=&Th=+Z6NHo_tR|JCI8TJiXv2N7ei7M^Q+RM z?9o`meH$5Yi;@9XaNR#jIK^&{N|DYNNbtdb)XW1Lv2k{E>;?F`#Pq|&_;gm~&~Zc9 zf+6ZE%{x4|{YdtE?a^gKyzr}dA>OxQv+pq|@IXL%WS0CiX!V zm$fCePA%lU{%pTKD7|5NJHeXg=I0jL@$tOF@K*MI$)f?om)D63K*M|r`gb9edD1~Y zc|w7N)Y%do7=0{RC|AziW7#am$)9jciRJ?IWl9PE{G3U+$%FcyKs_0Cgq`=K3@ttV z9g;M!3z~f_?P%y3-ph%vBMeS@p7P&Ea8M@97+%XEj*(1E6vHj==d zjsoviB>j^$_^OI_DEPvFkVo(BGRo%cJeD){6Uckei=~1}>sp299|IRjhXe)%?uP0I zF5+>?0#Ye}T^Y$u_rc4=lPcq4K^D(TZG-w30-YiEM=dcK+4#o*>lJ8&JLi+3UcpZk z!^?95S^C0ja^jwP`|{<+3cBVog$(mRdQmadS+Vh~z zS@|P}=|z3P6uS+&@QsMp0no9Od&27O&14zHXGAOEy zh~OKpymK5C%;LLb467@KgIiVwYbYd6wFxI{0-~MOGfTq$nBTB!{SrWmL9Hs}C&l&l#m?s*{tA?BHS4mVKHAVMqm63H<|c5n0~k)-kbg zXidai&9ZUy0~WFYYKT;oe~rytRk?)r8bptITsWj(@HLI;@=v5|XUnSls7$uaxFRL+ zRVMGuL3w}NbV1`^=Pw*0?>bm8+xfeY(1PikW*PB>>Tq(FR`91N0c2&>lL2sZo5=VD zQY{>7dh_TX98L2)n{2OV=T10~*YzX27i2Q7W86M4$?gZIXZaBq#sA*{PH8){|GUi;oM>e?ua7eF4WFuFYZSG| zze?srg|5Ti8Og{O zeFxuw9!U+zhyk?@w zjsA6(oKD=Ka;A>Ca)oPORxK+kxH#O@zhC!!XS4@=swnuMk>t+JmLmFiE^1aX3f<)D@`%K0FGK^gg1a1j>zi z2KhV>sjU7AX3F$SEqrXSC}fRx64GDoc%!u2Yag68Lw@w9v;xOONf@o)Lc|Uh3<21ctTYu-mFZuHk*+R{GjXHIGq3p)tFtQp%TYqD=j1&y)>@zxoxUJ!G@ zgI0XKmP6MNzw>nRxK$-Gbzs}dyfFzt>#5;f6oR27ql!%+{tr+(`(>%51|k`ML} zY4eE)Lxq|JMas(;JibNQds1bUB&r}ydMQXBY4x(^&fY_&LlQC)3hylc$~8&~|06-D z#T+%66rYbHX%^KuqJED_wuGB+=h`nWA!>1n0)3wZrBG3%`b^Ozv6__dNa@%V14|!D zQ?o$z5u0^8`giv%qE!BzZ!3j;BlDlJDk)h@9{nSQeEk!z9RGW) z${RSF3phEM*ce*>Xdp}585vj$|40=&S{S-GTiE?Op*vY&Lvr9}BO$XWy80IF+6@%n z5*2ueT_g@ofP#u5pxb7n*fv^Xtt7&?SRc{*2Ka-*!BuOpf}neHGCiHy$@Ka1^Dint z;DkmIL$-e)rj4o2WQV%Gy;Xg(_Bh#qeOsTM2f@KEe~4kJ8kNLQ+;(!j^bgJMcNhvklP5Z6I+9Fq@c&D~8Fb-4rmDT!MB5QC{Dsb;BharP*O;SF4& zc$wj-7Oep7#$WZN!1nznc@Vb<_Dn%ga-O#J(l=OGB`dy=Sy&$(5-n3zzu%d7E#^8`T@}V+5B;PP8J14#4cCPw-SQTdGa2gWL0*zKM z#DfSXs_iWOMt)0*+Y>Lkd=LlyoHjublNLefhKBv@JoC>P7N1_#> zv=mLWe96%EY;!ZGSQDbZWb#;tzqAGgx~uk+-$+2_8U`!ypbwXl z^2E-FkM1?lY@yt8=J3%QK+xaZ6ok=-y%=KXCD^0r!5vUneW>95PzCkOPO*t}p$;-> ze5j-BLT_;)cZQzR2CEsm@rU7GZfFtdp*a|g4wDr%8?2QkIGasRfDWT-Dvy*U{?IHT z*}wGnzdlSptl#ZF^sf)KT|BJs&kLG91^A6ls{CzFprZ6-Y!V0Xysh%9p%iMd7HLsS zN+^Un$tDV)T@i!v?3o0Fsx2qI(AX_$dDkBzQ@fRM%n zRXk6hb9Py#JXUs+7)w@eo;g%QQ95Yq!K_d=z{0dGS+pToEI6=Bo8+{k$7&Z zo4>PH(`ce8E-Ps&uv`NQ;U$%t;w~|@E3WVOCi~R4oj5wP?%<*1C%}Jq%a^q~T7u>K zML5AKfQDv6>PuT`{SrKHRAF+^&edg6+5R_#H?Lz3iGoWo#PCEd0DS;)2U({{X#zU^ zw_xv{4x7|t!S)>44J;KfA|DC?;uQ($l+5Vp7oeqf7{GBF9356nx|&B~gs+@N^gSdd zvb*>&W)|u#F{Z_b`f#GVtQ`pYv3#||N{xj1NgB<#=Odt6{eB%#9RLt5v zIi|0u70`#ai}9fJjKv7dE!9ZrOIX!3{$z_K5FBd-Kp-&e4(J$LD-)NMTp^_pB`RT; zftVVlK2g@+1Ahv2$D){@Y#cL#dUj9*&%#6 zd2m9{1NYp>)6=oAvqdCn5#cx{AJ%S8skUgMglu2*IAtd+z1>B&`MuEAS(D(<6X#Lj z?f4CFx$)M&$=7*>9v1ER4b6!SIz-m0e{o0BfkySREchp?WdVPpQCh!q$t>?rL!&Jg zd#heM;&~A}VEm8Dvy&P|J*eAV&w!&Nx6HFV&B8jJFVTmgLaswn!cx$&%JbTsloz!3 zMEz1d`k==`Ueub_JAy_&`!ogbwx27^ZXgFNAbx=g_I~5nO^r)}&myw~+yY*cJl4$I znNJ32M&K=0(2Dj_>@39`3=FX!v3nZHno_@q^!y}%(yw0PqOo=);6Y@&ylVe>nMOZ~ zd>j#QQSBn3oaWd;qy$&5(5H$Ayi)0haAYO6TH>FR?rhqHmNOO+(})NB zLI@B@v0)eq!ug`>G<@htRlp3n!EpU|n+G+AvXFrWSUsLMBfL*ZB`CRsIVHNTR&b?K zxBgsN0BjfB>UVcJ|x%=-zb%OV7lmZc& zxiupadZVF7)6QuhoY;;FK2b*qL0J-Rn-8!X4ZY$-ZSUXV5DFd7`T41c(#lAeLMoeT z4%g655v@7AqT!i@)Edt5JMbN(=Q-6{=L4iG8RA%}w;&pKmtWvI4?G9pVRp|RTw`g0 zD5c12B&A2&P6Ng~8WM2eIW=wxd?r7A*N+&!Be7PX3s|7~z=APxm=A?5 zt>xB4WG|*Td@VX{Rs)PV0|yK`oI3^xn(4c_j&vgxk_Y3o(-`_5o`V zRTghg6%l@(qodXN;dB#+OKJEEvhfcnc#BeO2|E(5df-!fKDZ!%9!^BJ_4)9P+9Dq5 zK1=(v?KmIp34r?z{NEWnLB3Px{XYwy-akun4F7xTRr2^zeYW{gcK9)>aJDdU5;w5@ zak=<+-PLH-|04pelTb%ULpuuuJC7DgyT@D|p{!V!0v3KpDnRjANN12q6SUR3mb9<- z>2r~IApQGhstZ!3*?5V z8#)hJ0TdZg0M-BK#nGFP>$i=qk82DO z7h;Ft!D5E15OgW)&%lej*?^1~2=*Z5$2VX>V{x8SC+{i10BbtUk9@I#Vi&hX)q

    Q!LwySI{Bnv%Sm)yh{^sSVJ8&h_D-BJ_YZe5eCaAWU9b$O2c z$T|{vWVRtOL!xC0DTc(Qbe`ItNtt5hr<)VijD0{U;T#bUEp381_y`%ZIav?kuYG{iyYdEBPW=*xNSc;Rlt6~F4M`5G+VtOjc z*0qGzCb@gME5udTjJA-9O<&TWd~}ysBd(eVT1-H82-doyH9RST)|+Pb{o*;$j9Tjs zhU!IlsPsj8=(x3bAKJTopW3^6AKROHR^7wZ185wJGVhA~hEc|LP;k7NEz-@4p5o}F z`AD6naG3(n=NF9HTH81=F+Q|JOz$7wm9I<+#BSmB@o_cLt2GkW9|?7mM;r!JZp89l zbo!Hp8=n!XH1{GwaDU+k)pGp`C|cXkCU5%vcH)+v@0eK>%7gWxmuMu9YLlChA|_D@ zi#5zovN_!a-0?~pUV-Rj*1P)KwdU-LguR>YM&*Nen+ln8Q$?WFCJg%DY%K}2!!1FE zDv-A%Cbwo^p(lzac&_TZ-l#9kq`mhLcY3h9ZTUVCM(Ad&=EriQY5{jJv<5K&g|*Lk zgV%ILnf1%8V2B0E&;Sp4sYbYOvvMebLwYwzkRQ#F8GpTQq#uv=J`uaSJ34OWITeSGo6+-8Xw znCk*n{kdDEi)Hi&u^)~cs@iyCkFWB2SWZU|Uc%^43ZIZQ-vWNExCCtDWjqHs;;tWf$v{}0{p0Rvxkq``)*>+Akq%|Na zA`@~-Vfe|+(AIlqru+7Ceh4nsVmO9p9jc8}HX^W&ViBDXT+uXbT#R#idPn&L>+#b6 zflC-4C5-X;kUnR~L>PSLh*gvL68}RBsu#2l`s_9KjUWRhiqF`j)`y`2`YU(>3bdBj z?>iyjEhe-~$^I5!nn%B6Wh+I`FvLNvauve~eX<+Ipl&04 zT}};W&1a3%W?dJ2=N#0t?e+aK+%t}5q%jSLvp3jZ%?&F}nOOWr>+{GFIa%wO_2`et z=JzoRR~}iKuuR+azPI8;Gf9)z3kyA4EIOSl!sRR$DlW}0>&?GbgPojmjmnln;cTqCt=ADbE zZ8GAnoM+S1(5$i8^O4t`ue;vO4i}z0wz-QEIVe5_u03;}-!G1NyY8;h^}y;tzY}i5 zqQr#Ur3Fy8sSa$Q0ys+f`!`+>9WbvU_I`Sj;$4{S>O3?#inLHCrtLy~!s#WXV=oVP zeE93*Nc`PBi4q@%Ao$x4lw9vLHM!6mn3-b_cebF|n-2vt-zYVF_&sDE--J-P;2WHo z+@n2areE0o$LjvjlV2X7ZU@j+`{*8zq`JR3gKF#EW|#+{nMyo-a>nFFTg&vhyT=b} zDa8+v0(Dgx0yRL@ZXOYIlVSZ0|MFizy0VPW8;AfA5|pe!#j zX}Py^8fl5SyS4g1WSKKtnyP+_PoOwMMwu`(i@Z)diJp~U54*-miOchy7Z35eL>^M z4p<-aIxH4VUZgS783@H%M7P9hX>t{|RU7$n4T(brCG#h9e9p! z+o`i;EGGq3&pF;~5V~eBD}lC)>if$w%Vf}AFxGqO88|ApfHf&Bvu+xdG)@vuF}Yvk z)o;~k-%+0K0g+L`Wala!$=ZV|z$e%>f0%XoLib%)!R^RoS+{!#X?h-6uu zF&&KxORdZU&EwQFITIRLo(7TA3W}y6X{?Y%y2j0It!ekU#<)$qghZtpcS>L3uh`Uj z7GY;6f$9qKynP#oS3$$a{p^{D+0oJQ71`1?OAn_m8)UGZmj3l*ZI)`V-a>MKGGFG< z&^jg#Ok%(hhm>hSrZ5;Qga4u(?^i>GiW_j9%_7M>j(^|Om$#{k+^*ULnEgzW_1gCICtAD^WpC`A z{9&DXkG#01Xo)U$OC(L5Y$DQ|Q4C6CjUKk1UkPj$nXH##J{c8e#K|&{mA*;b$r0E4 zUNo0jthwA(c&N1l=PEe8Rw_8cEl|-eya9z&H3#n`B$t#+aJ03RFMzrV@gowbe8v(c zIFM60^0&lCFO10NU4w@|61xiZ4CVXeaKjd;d?sv52XM*lS8XiVjgWpRB;&U_C0g+`6B5V&w|O6B*_q zsATxL!M}+$He)1eOWECce#eS@2n^xhlB4<_Nn?yCVEQWDs(r`|@2GqLe<#(|&P0U? z$7V5IgpWf09uIf_RazRwC?qEqRaHyL?iiS05UiGesJy%^>-C{{ypTBI&B0-iUYhk> zIk<5xpsuV@g|z(AZD+C-;A!fTG=df1=<%nxy(a(IS+U{ME4ZbDEBtcD_3V=icT6*_ z)>|J?>&6%nvHhZERBtjK+s4xnut*@>GAmA5m*OTp$!^CHTr}vM4n(X1Q*;{e-Rd2BCF-u@1ZGm z!S8hJ6L=Gl4T_SDa7Xx|-{4mxveJg=ctf`BJ*fy!yF6Dz&?w(Q_6B}WQVtNI!BVBC zKfX<>7vd6C96}XAQmF-Jd?1Q4eTfRB3q7hCh0f!(JkdWT5<{iAE#dKy*Jxq&3a1@~ z8C||Dn2mFNyrUV|<-)C^_y7@8c2Fz+2jrae9deBDu;U}tJ{^xAdxCD248(k;dCJ%o z`y3sADe>U%suxwwv~8A1+R$VB=Q?%U?4joI$um;aH+eCrBqpn- z%79D_7rb;R-;-9RTrwi9dPlg8&@tfWhhZ(Vx&1PQ+6(huX`;M9x~LrW~~#3{j0Bh2kDU$}@!fFQej4VGkJv?M4rU^x!RU zEwhu$!CA_iDjFjrJa`aocySDX16?~;+wgav;}Zut6Mg%C4>}8FL?8)Kgwc(Qlj{@#2Pt0?G`$h7P#M+qoXtlV@d}%c&OzO+QYKK`kyXaK{U(O^2DyIXCZlNQjt0^8~8JzNGrIxhj}}M z&~QZlbx%t;MJ(Vux;2tgNKGlAqphLq%pd}JG9uoVHUo?|hN{pLQ6Em%r*+7t^<);X zm~6=qChlNAVXNN*Sow->*4;}T;l;D1I-5T{Bif@4_}=>l`tK;qqDdt5zvisCKhMAH z#r}`)7VW?LZqfdmXQ%zo5bJ00{Xb9^YKrk0Nf|oIW*K@(=`o2Vndz}ZDyk{!u}PVx zzd--+_WC*U{~DH3{?GI64IB+@On&@9X>EUAo&L+G{L^dozaI4C3G#2wr~hseW@K&g zKWs{uHu-9Je!3;4pE>eBltKUXb^*hG8I&413)$J&{D4N%7PcloU6bn%jPxJyQL?g* z9g+YFFEDiE`8rW^laCNzQmi7CTnPfwyg3VDHRAl>h=In6jeaVOP@!-CP60j3+#vpL zEYmh_oP0{-gTe7Or`L6x)6w?77QVi~jD8lWN@3RHcm80iV%M1A!+Y6iHM)05iC64tb$X2lV_%Txk@0l^hZqi^%Z?#- zE;LE0uFx)R08_S-#(wC=dS&}vj6P4>5ZWjhthP=*Hht&TdLtKDR;rXEX4*z0h74FA zMCINqrh3Vq;s%3MC1YL`{WjIAPkVL#3rj^9Pj9Ss7>7duy!9H0vYF%>1jh)EPqvlr6h%R%CxDsk| z!BACz7E%j?bm=pH6Eaw{+suniuY7C9Ut~1cWfOX9KW9=H><&kQlinPV3h9R>3nJvK z4L9(DRM=x;R&d#a@oFY7mB|m8h4692U5eYfcw|QKwqRsshN(q^v$4$)HgPpAJDJ`I zkqjq(8Cd!K!+wCd=d@w%~e$=gdUgD&wj$LQ1r>-E=O@c ze+Z$x{>6(JA-fNVr)X;*)40Eym1TtUZI1Pwwx1hUi+G1Jlk~vCYeXMNYtr)1?qwyg zsX_e*$h?380O00ou?0R@7-Fc59o$UvyVs4cUbujHUA>sH!}L54>`e` zHUx#Q+Hn&Og#YVOuo*niy*GU3rH;%f``nk#NN5-xrZ34NeH$l`4@t);4(+0|Z#I>Y z)~Kzs#exIAaf--65L0UHT_SvV8O2WYeD>Mq^Y6L!Xu8%vnpofG@w!}R7M28?i1*T&zp3X4^OMCY6(Dg<-! zXmcGQrRgHXGYre7GfTJ)rhl|rs%abKT_Nt24_Q``XH{88NVPW+`x4ZdrMuO0iZ0g` z%p}y};~T5gbb9SeL8BSc`SO#ixC$@QhXxZ=B}L`tP}&k?1oSPS=4%{UOHe0<_XWln zwbl5cn(j-qK`)vGHY5B5C|QZd5)W7c@{bNVXqJ!!n$^ufc?N9C-BF2QK1(kv++h!>$QbAjq)_b$$PcJdV+F7hz0Hu@ zqj+}m0qn{t^tD3DfBb~0B36|Q`bs*xs|$i^G4uNUEBl4g;op-;Wl~iThgga?+dL7s zUP(8lMO?g{GcYpDS{NM!UA8Hco?#}eNEioRBHy4`mq!Pd-9@-97|k$hpEX>xoX+dY zDr$wfm^P&}Wu{!%?)U_(%Mn79$(ywvu*kJ9r4u|MyYLI_67U7%6Gd_vb##Nerf@>& z8W11z$$~xEZt$dPG}+*IZky+os5Ju2eRi;1=rUEeIn>t-AzC_IGM-IXWK3^6QNU+2pe=MBn4I*R@A%-iLDCOHTE-O^wo$sL_h{dcPl=^muAQb`_BRm};=cy{qSkui;`WSsj9%c^+bIDQ z0`_?KX0<-=o!t{u(Ln)v>%VGL z0pC=GB7*AQ?N7N{ut*a%MH-tdtNmNC+Yf$|KS)BW(gQJ*z$d{+{j?(e&hgTy^2|AR9vx1Xre2fagGv0YXWqtNkg*v%40v?BJBt|f9wX5 z{QTlCM}b-0{mV?IG>TW_BdviUKhtosrBqdfq&Frdz>cF~yK{P@(w{Vr7z2qKFwLhc zQuogKO@~YwyS9%+d-zD7mJG~@?EFJLSn!a&mhE5$_4xBl&6QHMzL?CdzEnC~C3$X@ zvY!{_GR06ep5;<#cKCSJ%srxX=+pn?ywDwtJ2{TV;0DKBO2t++B(tIO4)Wh`rD13P z4fE$#%zkd=UzOB74gi=-*CuID&Z3zI^-`4U^S?dHxK8fP*;fE|a(KYMgMUo`THIS1f!*6dOI2 zFjC3O=-AL`6=9pp;`CYPTdVX z8(*?V&%QoipuH0>WKlL8A*zTKckD!paN@~hh zmXzm~qZhMGVdQGd=AG8&20HW0RGV8X{$9LldFZYm zE?}`Q3i?xJRz43S?VFMmqRyvWaS#(~Lempg9nTM$EFDP(Gzx#$r)W&lpFKqcAoJh-AxEw$-bjW>`_+gEi z2w`99#UbFZGiQjS8kj~@PGqpsPX`T{YOj`CaEqTFag;$jY z8_{Wzz>HXx&G*Dx<5skhpETxIdhKH?DtY@b9l8$l?UkM#J-Snmts7bd7xayKTFJ(u zyAT&@6cAYcs{PBfpqZa%sxhJ5nSZBPji?Zlf&}#L?t)vC4X5VLp%~fz2Sx<*oN<7` z?ge=k<=X7r<~F7Tvp9#HB{!mA!QWBOf%EiSJ6KIF8QZNjg&x~-%e*tflL(ji_S^sO ztmib1rp09uon}RcsFi#k)oLs@$?vs(i>5k3YN%$T(5Or(TZ5JW9mA6mIMD08=749$ z!d+l*iu{Il7^Yu}H;lgw=En1sJpCKPSqTCHy4(f&NPelr31^*l%KHq^QE>z>Ks_bH zjbD?({~8Din7IvZeJ>8Ey=e;I?thpzD=zE5UHeO|neioJwG;IyLk?xOz(yO&0DTU~ z^#)xcs|s>Flgmp;SmYJ4g(|HMu3v7#;c*Aa8iF#UZo7CvDq4>8#qLJ|YdZ!AsH%^_7N1IQjCro

    K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..be52383e --- /dev/null +++ b/src/ServiceStackIDEA/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..4f906e0c --- /dev/null +++ b/src/ServiceStackIDEA/gradlew @@ -0,0 +1,185 @@ +#!/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 new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/src/ServiceStackIDEA/gradlew.bat @@ -0,0 +1,89 @@ +@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 From d19328b3519f755487f5dae16631a111f9b2f5ff Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 4 Jan 2021 08:15:10 +1100 Subject: [PATCH 010/101] Update plugin xml and gradle build to try resolve plugin publish issues. --- src/ServiceStackIDEA/build.gradle | 2 +- src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ServiceStackIDEA/build.gradle b/src/ServiceStackIDEA/build.gradle index de737d54..ca6369b0 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','java'] + plugins 'maven','java' pluginName 'ServiceStackIDEA' updateSinceUntilBuild false diff --git a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml index 2802b419..128401e0 100644 --- a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml +++ b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml @@ -31,11 +31,13 @@ + + - com.intellij.modules.lang com.intellij.modules.platform + com.intellij.modules.lang From 4418b6dc16bb63193a8b966684a23cfe0f30743f Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 4 Jan 2021 08:22:10 +1100 Subject: [PATCH 011/101] Update plugin xml and gradle build to try resolve plugin publish issues. --- src/ServiceStackIDEA/build.gradle | 2 +- src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ServiceStackIDEA/build.gradle b/src/ServiceStackIDEA/build.gradle index ca6369b0..1e06d97c 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','java' + plugins = ['maven','com.intellij.java'] pluginName 'ServiceStackIDEA' updateSinceUntilBuild false diff --git a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml index 128401e0..af362d5f 100644 --- a/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml +++ b/src/ServiceStackIDEA/src/main/resources/META-INF/plugin.xml @@ -31,13 +31,12 @@ - - com.intellij.modules.platform com.intellij.modules.lang + com.intellij.java From 5978e10106298e23a285f7bcc919e4dffba1bf06 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 1 Mar 2021 02:40:40 +0800 Subject: [PATCH 012/101] Upgrade deps --- .idea/ServiceStack.Java.iml | 1 + src/AndroidClient/.idea/.gitignore | 3 + .../.idea/caches/build_file_checksums.ser | Bin 845 -> 845 bytes .../.idea/codeStyles/Project.xml | 119 +------------ .../.idea/codeStyles/codeStyleConfig.xml | 5 + src/AndroidClient/.idea/compiler.xml | 6 + src/AndroidClient/.idea/gradle.xml | 1 + src/AndroidClient/.idea/jarRepositories.xml | 40 +++++ src/AndroidClient/.idea/misc.xml | 2 +- src/AndroidClient/.idea/modules.xml | 16 +- .../modules/android/AndroidClient.android.iml | 110 ++++++++++++ .../AndroidClient.androidchat.iml} | 128 +++++++------- .../.idea/modules/app/AndroidClient.app.iml | 153 +++++++++++++++++ .../modules/client/AndroidClient.client.iml} | 35 ++-- .../modules/kotlin/AndroidClient.kotlin.iml | 126 ++++++++++++++ .../techstacks/AndroidClient.techstacks.iml | 151 ++++++++++++++++ .../AndroidClient.techstackskotlin.iml | 162 ++++++++++++++++++ src/AndroidClient/AndroidClient.iml | 2 +- src/AndroidClient/android/android.iml | 110 ------------ src/AndroidClient/app/app.iml | 153 ----------------- .../net/androidclient/ApplicationTest.java | 9 +- src/AndroidClient/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 6 +- src/AndroidClient/kotlin/build.gradle | 10 +- .../net/kotlin/ApplicationTest.kt | 25 ++- .../techstacks/TechStacksServiceTests.kt | 2 +- .../techstacks/TechStacksServiceTestsAsync.kt | 52 +++--- .../test/TestInterfaceMarkerTestsAsync.kt | 47 +++-- .../net/kotlin/test/TestServiceTests.kt | 152 ++++++++-------- .../net/kotlin/test/TestServiceTestsAsync.kt | 140 ++++++++------- .../net/kotlin/ExampleUnitTest.java | 2 +- .../net/techstacks/ApplicationTest.java | 9 +- .../net/techstackskotlin/ApplicationTest.kt | 8 +- src/ServiceStackIDEA/.idea/.name | 2 +- 34 files changed, 1078 insertions(+), 711 deletions(-) create mode 100644 src/AndroidClient/.idea/.gitignore create mode 100644 src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml create mode 100644 src/AndroidClient/.idea/compiler.xml create mode 100644 src/AndroidClient/.idea/jarRepositories.xml create mode 100644 src/AndroidClient/.idea/modules/android/AndroidClient.android.iml rename src/AndroidClient/{androidchat/androidchat.iml => .idea/modules/androidchat/AndroidClient.androidchat.iml} (54%) create mode 100644 src/AndroidClient/.idea/modules/app/AndroidClient.app.iml rename src/AndroidClient/{client/client.iml => .idea/modules/client/AndroidClient.client.iml} (51%) create mode 100644 src/AndroidClient/.idea/modules/kotlin/AndroidClient.kotlin.iml create mode 100644 src/AndroidClient/.idea/modules/techstacks/AndroidClient.techstacks.iml create mode 100644 src/AndroidClient/.idea/modules/techstackskotlin/AndroidClient.techstackskotlin.iml delete mode 100644 src/AndroidClient/android/android.iml delete mode 100644 src/AndroidClient/app/app.iml diff --git a/.idea/ServiceStack.Java.iml b/.idea/ServiceStack.Java.iml index c2ece305..ac9e42a7 100644 --- a/.idea/ServiceStack.Java.iml +++ b/.idea/ServiceStack.Java.iml @@ -18,6 +18,7 @@ + \ No newline at end of file diff --git a/src/AndroidClient/.idea/.gitignore b/src/AndroidClient/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/src/AndroidClient/.idea/.gitignore @@ -0,0 +1,3 @@ +# 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 index 5d7fb51d4261d53cf9101aa2420ec2decc61e8a1..cc831a33e22e8b081578b9aff044e3b9cb23afc3 100644 GIT binary patch delta 96 zcmV-m0H6QO2F(VLM+jiKkO>`u-ei$aNCkK4;c+~%oL~V99du=5XmfO7V{3Dh@d6!_ zO#%`D43m!m77#6l-lGbOC=>A-8eVs_BW{yj0 - - - - - -

    - - - - xmlns:android - - ^$ - - - -
    -
    - - - - xmlns:.* - - ^$ - - - BY_NAME - -
    -
    - - - - .*:id - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:name - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - name - - ^$ - - - -
    -
    - - - - style - - ^$ - - - -
    -
    - - - - .* - - ^$ - - - BY_NAME - -
    -
    - - - - .* - - http://schemas.android.com/apk/res/android - - - ANDROID_ATTRIBUTE_ORDER - -
    -
    - - - - .* - - .* - - - BY_NAME - -
    - - + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml b/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..a55e7a17 --- /dev/null +++ b/src/AndroidClient/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/src/AndroidClient/.idea/compiler.xml b/src/AndroidClient/.idea/compiler.xml new file mode 100644 index 00000000..61a9130c --- /dev/null +++ b/src/AndroidClient/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/.idea/gradle.xml b/src/AndroidClient/.idea/gradle.xml index 4e5f2d1e..4bb13eb0 100644 --- a/src/AndroidClient/.idea/gradle.xml +++ b/src/AndroidClient/.idea/gradle.xml @@ -21,6 +21,7 @@ diff --git a/src/AndroidClient/.idea/jarRepositories.xml b/src/AndroidClient/.idea/jarRepositories.xml new file mode 100644 index 00000000..28af8c32 --- /dev/null +++ b/src/AndroidClient/.idea/jarRepositories.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/.idea/misc.xml b/src/AndroidClient/.idea/misc.xml index b0c7b20c..3386629a 100644 --- a/src/AndroidClient/.idea/misc.xml +++ b/src/AndroidClient/.idea/misc.xml @@ -29,7 +29,7 @@ - + diff --git a/src/AndroidClient/.idea/modules.xml b/src/AndroidClient/.idea/modules.xml index 61f53ccf..4737574c 100644 --- a/src/AndroidClient/.idea/modules.xml +++ b/src/AndroidClient/.idea/modules.xml @@ -2,14 +2,14 @@ - - - - - - - - + + + + + + + + \ 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 new file mode 100644 index 00000000..719d2bd5 --- /dev/null +++ b/src/AndroidClient/.idea/modules/android/AndroidClient.android.iml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/androidchat/androidchat.iml b/src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml similarity index 54% rename from src/AndroidClient/androidchat/androidchat.iml rename to src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml index 57319fad..0cd547a5 100644 --- a/src/AndroidClient/androidchat/androidchat.iml +++ b/src/AndroidClient/.idea/modules/androidchat/AndroidClient.androidchat.iml @@ -1,11 +1,11 @@ - + @@ -19,72 +19,72 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -162,7 +162,7 @@ - + \ 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 new file mode 100644 index 00000000..ed3af82e --- /dev/null +++ b/src/AndroidClient/.idea/modules/app/AndroidClient.app.iml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/client/client.iml b/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml similarity index 51% rename from src/AndroidClient/client/client.iml rename to src/AndroidClient/.idea/modules/client/AndroidClient.client.iml index 63814840..5d78a369 100644 --- a/src/AndroidClient/client/client.iml +++ b/src/AndroidClient/.idea/modules/client/AndroidClient.client.iml @@ -1,6 +1,12 @@ - + + + + + - - - - - - + + - - - - - - - + + + + + + + @@ -33,8 +33,5 @@ - - - \ 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 new file mode 100644 index 00000000..c960f129 --- /dev/null +++ b/src/AndroidClient/.idea/modules/kotlin/AndroidClient.kotlin.iml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 00000000..af79eb16 --- /dev/null +++ b/src/AndroidClient/.idea/modules/techstacks/AndroidClient.techstacks.iml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 00000000..bcfedcc9 --- /dev/null +++ b/src/AndroidClient/.idea/modules/techstackskotlin/AndroidClient.techstackskotlin.iml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AndroidClient/AndroidClient.iml b/src/AndroidClient/AndroidClient.iml index fa760751..5eadafc9 100644 --- a/src/AndroidClient/AndroidClient.iml +++ b/src/AndroidClient/AndroidClient.iml @@ -1,5 +1,5 @@ - + diff --git a/src/AndroidClient/android/android.iml b/src/AndroidClient/android/android.iml deleted file mode 100644 index b513b716..00000000 --- a/src/AndroidClient/android/android.iml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/app/app.iml b/src/AndroidClient/app/app.iml deleted file mode 100644 index e7f018ff..00000000 --- a/src/AndroidClient/app/app.iml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AndroidClient/app/src/androidTest/java/servicestack/net/androidclient/ApplicationTest.java b/src/AndroidClient/app/src/androidTest/java/servicestack/net/androidclient/ApplicationTest.java index ed5b6b84..22bbd47e 100644 --- a/src/AndroidClient/app/src/androidTest/java/servicestack/net/androidclient/ApplicationTest.java +++ b/src/AndroidClient/app/src/androidTest/java/servicestack/net/androidclient/ApplicationTest.java @@ -1,13 +1,6 @@ package servicestack.net.androidclient; import android.app.Application; -import android.test.ApplicationTestCase; -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } +public class ApplicationTest { } \ No newline at end of file diff --git a/src/AndroidClient/build.gradle b/src/AndroidClient/build.gradle index 7daa0082..58bd80ba 100644 --- a/src/AndroidClient/build.gradle +++ b/src/AndroidClient/build.gradle @@ -11,7 +11,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + 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" diff --git a/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties b/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties index 09ff7542..cc75e168 100644 --- a/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties +++ b/src/AndroidClient/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Mar 03 13:41:28 AWST 2020 +#Sun Feb 28 23:37:31 AWST 2021 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +zipStoreBase=GRADLE_USER_HOME diff --git a/src/AndroidClient/kotlin/build.gradle b/src/AndroidClient/kotlin/build.gradle index b93b3b49..8162c4c0 100644 --- a/src/AndroidClient/kotlin/build.gradle +++ b/src/AndroidClient/kotlin/build.gradle @@ -2,11 +2,11 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 1 versionName "1.0" } @@ -24,14 +24,14 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) + androidTestImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12' - implementation 'com.android.support:appcompat-v7:28.0.0' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation project(':android') - androidTestImplementation 'com.google.code.gson:gson:2.8.2' + androidTestImplementation 'com.google.code.gson:gson:2.8.6' } buildscript { - ext.kotlin_version = '1.3.61' + ext.kotlin_version = '1.4.31' repositories { mavenCentral() } 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 4b833f98..da68387f 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 @@ -1,34 +1,33 @@ package test.servicestack.net.kotlinapp -import android.app.Application -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.test.ApplicationTestCase import com.google.gson.Gson -import junit.framework.Assert +import junit.framework.TestCase.assertTrue import net.servicestack.android.AndroidLogProvider import net.servicestack.android.AndroidServiceClient -import net.servicestack.client.* -import test.servicestack.net.kotlin.techstacks.* -import java.net.HttpURLConnection -import java.util.* +import net.servicestack.client.Log +import org.junit.BeforeClass +import org.junit.Test +import test.servicestack.net.kotlin.techstacks.Technology +import test.servicestack.net.kotlin.techstacks.TechnologyTier /** * [Testing Fundamentals](http://d.android.com/tools/testing/testing_android.html) */ -class ApplicationTest : ApplicationTestCase(Application::class.java) { +public class AndroidServiceClientTests { - override fun setUp() { - super.setUp() + @BeforeClass + fun setUp() { Log.Instance = AndroidLogProvider("ZZZ"); val client = AndroidServiceClient("https://www.techstacks.io") } + @Test fun test_Fail() { - Assert.assertTrue(true) + assertTrue(true) } + @Test fun test_Can_Serialize_Technology(){ val dto = Technology(); dto.name = "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 16619d78..38487449 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 @@ -113,7 +113,7 @@ class TechStacksServiceTests : TestCase() { fun test_Can_deserialize_Overview() { //Latest Android Update broke test resources - val stream = this.javaClass.classLoader.getResourceAsStream("assets/overview.json"); + val stream = this.javaClass.classLoader!!.getResourceAsStream("assets/overview.json"); val json = Utils.readToEnd(stream, "UTF-8"); val dto = client.fromJson(json, OverviewResponse::class.java) as OverviewResponse 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 f48f48ee..0e1a0598 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 @@ -2,9 +2,9 @@ package test.servicestack.net.kotlin.techstacks -import android.app.Application -import android.test.ApplicationTestCase -import junit.framework.Assert +import junit.framework.TestCase.assertTrue +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertNotNull import net.servicestack.android.AndroidLogProvider import net.servicestack.android.AndroidServiceClient import net.servicestack.client.AsyncSuccess @@ -12,7 +12,7 @@ import net.servicestack.client.Log import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit -class TechStacksServiceTestsAsync : ApplicationTestCase(Application::class.java) { +class TechStacksServiceTestsAsync { init { Log.Instance = AndroidLogProvider("ZZZ") } @@ -28,7 +28,7 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -36,13 +36,13 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application val signal = CountDownLatch(1) client.getAsync(AppOverview(), AsyncSuccess { - Assert.assertNotNull(it) - Assert.assertTrue(it.topTechnologies.size > 0) - Assert.assertTrue(it.allTiers.size > 0) + assertNotNull(it) + assertTrue(it.topTechnologies.size > 0) + assertTrue(it.allTiers.size > 0) signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -54,7 +54,7 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -66,7 +66,7 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -81,7 +81,7 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -93,7 +93,7 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -104,11 +104,11 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application val signal = CountDownLatch(1) client.getAsync>(request, AsyncSuccess> { - Assert.assertEquals(1, it.results.size) + assertEquals(1, it.results.size) signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -120,28 +120,28 @@ class TechStacksServiceTestsAsync : ApplicationTestCase(Application client.getAsync>(request, hashMapOf(Pair("DescriptionContains", "framework")), AsyncSuccess> { - Assert.assertEquals(5, it.results.size) + assertEquals(5, it.results.size) signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } companion object { fun assertOverviewResponse(r: OverviewResponse) { - Assert.assertNotNull(r) - Assert.assertTrue(r.topUsers.size > 0) - Assert.assertTrue(r.topTechnologies.size > 0) - Assert.assertTrue(r.latestTechStacks.size > 0) - Assert.assertTrue(r.latestTechStacks[0].technologyChoices.size > 0) - Assert.assertTrue(r.topTechnologiesByTier.size > 0) + assertNotNull(r) + assertTrue(r.topUsers.size > 0) + assertTrue(r.topTechnologies.size > 0) + assertTrue(r.latestTechStacks.size > 0) + assertTrue(r.latestTechStacks[0].technologyChoices.size > 0) + assertTrue(r.topTechnologiesByTier.size > 0) } fun assertGetTechnologyResponse(r: GetTechnologyResponse) { - Assert.assertNotNull(r) - Assert.assertEquals("ServiceStack", r.technology?.name) - Assert.assertTrue(r.technologyStacks.size > 0) + assertNotNull(r) + assertEquals("ServiceStack", r.technology?.name) + assertTrue(r.technologyStacks.size > 0) } } } \ No newline at end of file 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 9ac25672..c3d69e8f 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 @@ -2,16 +2,15 @@ package test.servicestack.net.kotlin.test -import android.app.Application -import android.test.ApplicationTestCase -import junit.framework.Assert +import junit.framework.TestCase.assertTrue +import junit.framework.TestCase.assertEquals import net.servicestack.android.AndroidServiceClient import net.servicestack.client.AsyncSuccess import net.servicestack.client.HttpMethods import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit -class TestInterfaceMarkerTestsAsync : ApplicationTestCase(Application::class.java) { +class TestInterfaceMarkerTestsAsync { internal var client = AndroidServiceClient("http://test.servicestack.net") @@ -23,13 +22,13 @@ class TestInterfaceMarkerTestsAsync : ApplicationTestCase(Applicati request.id = 1 client.sendAsync(request, AsyncSuccess { - Assert.assertEquals(1, it.id) - Assert.assertEquals(HttpMethods.Post, it.requestMethod) - Assert.assertEquals("/json/reply/SendDefault", it.pathInfo) + assertEquals(1, it.id) + assertEquals(HttpMethods.Post, it.requestMethod) + assertEquals("/json/reply/SendDefault", it.pathInfo) signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -39,13 +38,13 @@ class TestInterfaceMarkerTestsAsync : ApplicationTestCase(Applicati var request = SendRestGet() request.id = 1 client.sendAsync(request,AsyncSuccess { - Assert.assertEquals(1, it.id!!) - Assert.assertEquals(HttpMethods.Get, it?.requestMethod) - Assert.assertEquals("/json/reply/SendRestGet", it?.pathInfo) + assertEquals(1, it.id!!) + assertEquals(HttpMethods.Get, it?.requestMethod) + assertEquals("/json/reply/SendRestGet", it?.pathInfo) signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -55,13 +54,13 @@ class TestInterfaceMarkerTestsAsync : ApplicationTestCase(Applicati var request = SendGet() request.id = 1 client.sendAsync(request,AsyncSuccess { - Assert.assertEquals(1, it.id!!) - Assert.assertEquals(HttpMethods.Get, it.requestMethod!!) - Assert.assertEquals("/json/reply/SendGet", it.pathInfo!!) + assertEquals(1, it.id!!) + assertEquals(HttpMethods.Get, it.requestMethod!!) + assertEquals("/json/reply/SendGet", it.pathInfo!!) signal.countDown() }) - Assert.assertTrue(signal.await(500, TimeUnit.SECONDS)) + assertTrue(signal.await(500, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -71,13 +70,13 @@ class TestInterfaceMarkerTestsAsync : ApplicationTestCase(Applicati var request = SendPost() request.id = 1 client.sendAsync(request,AsyncSuccess { - Assert.assertEquals(1, it.id!!) - Assert.assertEquals(HttpMethods.Post, it.requestMethod) - Assert.assertEquals("/json/reply/SendPost", it.pathInfo) + assertEquals(1, it.id!!) + assertEquals(HttpMethods.Post, it.requestMethod) + assertEquals("/json/reply/SendPost", it.pathInfo) signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -87,12 +86,12 @@ class TestInterfaceMarkerTestsAsync : ApplicationTestCase(Applicati var request = SendPut() request.id = 1 client.sendAsync(request,AsyncSuccess { - Assert.assertEquals(1, it.id!!) - Assert.assertEquals(HttpMethods.Put, it.requestMethod) - Assert.assertEquals("/json/reply/SendPut", it.pathInfo) + assertEquals(1, it.id!!) + assertEquals(HttpMethods.Put, it.requestMethod) + assertEquals("/json/reply/SendPut", it.pathInfo) signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } } 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 9fcc14b2..711298aa 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 @@ -21,7 +21,7 @@ class TestServiceTests : TestCase() { val response = client.get(request) - Assert.assertEquals("Hello, World!", response.result) + assertEquals("Hello, World!", response.result) } fun test_does_fire_Request_and_Response_Filters() { @@ -41,17 +41,17 @@ class TestServiceTests : TestCase() { val response = client.get(request) - Assert.assertEquals("Hello, World!", response.result) + assertEquals("Hello, World!", response.result) val results = strJoin(", ", events) - Assert.assertEquals("RequestFilter, GlobalRequestFilter, ResponseFilter, GlobalResponseFilter", results) + assertEquals("RequestFilter, GlobalRequestFilter, ResponseFilter, GlobalResponseFilter", results) } fun test_Can_GET_Hello_with_CustomPath() { val response = client.get("/hello/World", HelloResponse::class.java) - Assert.assertEquals("Hello, World!", response.result) + assertEquals("Hello, World!", response.result) } fun test_Can_POST_Hello_with_CustomPath() { @@ -60,21 +60,21 @@ class TestServiceTests : TestCase() { val response = client.post("/hello", request, HelloResponse::class.java) - Assert.assertEquals("Hello, World!", response.result) + assertEquals("Hello, World!", response.result) } fun test_Can_GET_Hello_with_CustomPath_raw() { val response = client.get("/hello/World") val json = Utils.readToEnd(response) - Assert.assertEquals("{\"result\":\"Hello, World!\"}", json) + assertEquals("{\"result\":\"Hello, World!\"}", json) } fun test_Can_POST_Hello_with_CustomPath_raw() { val response = client.post("/hello", Utils.toUtf8Bytes("Name=World"), MimeTypes.FormUrlEncoded) val json = Utils.readToEnd(response) - Assert.assertEquals("{\"result\":\"Hello, World!\"}", json) + assertEquals("{\"result\":\"Hello, World!\"}", json) } fun test_Can_POST_test_HelloAllTypes() { @@ -115,15 +115,15 @@ class TestServiceTests : TestCase() { thrownError = webEx } - Assert.assertNotNull(globalError) - Assert.assertNotNull(localError) - Assert.assertNotNull(thrownError) + assertNotNull(globalError) + assertNotNull(localError) + assertNotNull(thrownError) val status = thrownError!!.responseStatus - Assert.assertEquals("NotFound", status.errorCode) - Assert.assertEquals("not here", status.message) - Assert.assertNotNull(status.stackTrace) + assertEquals("NotFound", status.errorCode) + assertEquals("not here", status.message) + assertNotNull(status.stackTrace) } fun test_Does_handle_ValidationException() { @@ -132,27 +132,27 @@ class TestServiceTests : TestCase() { try { client.post(request) - Assert.fail("Should throw") + fail("Should throw") } catch (webEx: WebServiceException) { val status = webEx.responseStatus - Assert.assertNotNull(status) - Assert.assertEquals(3, status.getErrors().size) + assertNotNull(status) + assertEquals(3, status.getErrors().size) - Assert.assertEquals(status.errors[0].errorCode, status.errorCode) - Assert.assertEquals(status.errors[0].message, status.message) + assertEquals(status.errors[0].errorCode, status.errorCode) + assertEquals(status.errors[0].message, status.message) - Assert.assertEquals("InclusiveBetween", status.errors[0].errorCode) - Assert.assertEquals("'Age' must be between 1 and 120. You entered 0.", status.errors[0].message) - Assert.assertEquals("Age", status.errors[0].fieldName) + assertEquals("InclusiveBetween", status.errors[0].errorCode) + assertEquals("'Age' must be between 1 and 120. You entered 0.", status.errors[0].message) + assertEquals("Age", status.errors[0].fieldName) - Assert.assertEquals("NotEmpty", status.errors[1].errorCode) - Assert.assertEquals("'Required' should not be empty.", status.errors[1].message) - Assert.assertEquals("Required", status.errors[1].fieldName) + assertEquals("NotEmpty", status.errors[1].errorCode) + assertEquals("'Required' must not be empty.", status.errors[1].message) + assertEquals("Required", status.errors[1].fieldName) - Assert.assertEquals("Email", status.errors[2].errorCode) - Assert.assertEquals("'Email' is not a valid email address.", status.errors[2].message) - Assert.assertEquals("Email", status.errors[2].fieldName) + assertEquals("Email", status.errors[2].errorCode) + assertEquals("'Email' is not a valid email address.", status.errors[2].message) + assertEquals("Email", status.errors[2].fieldName) } } @@ -165,26 +165,26 @@ class TestServiceTests : TestCase() { val response = client.post(request) - Assert.assertNotNull(response) - Assert.assertEquals(request.age, response.age) - Assert.assertEquals(request.required, response.required) - Assert.assertEquals(request.email, response.email) + assertNotNull(response) + assertEquals(request.age, response.age) + assertEquals(request.required, response.required) + assertEquals(request.email, response.email) } fun test_does_handle_auth_failure() { - val techStacksClient = JsonServiceClient("http://techstacks.io/") + val techStacksClient = JsonServiceClient("https://techstacks.io") var errorCode = 0 try { val request = LockTechStack() request.technologyStackId = 6.toLong() val res = techStacksClient.post(request) - Assert.fail("Should throw") + fail("Should throw") } catch (ex: WebServiceException) { //private StatusCode has correct code, response status is null due to empty response body. errorCode = ex.statusCode } - Assert.assertEquals(errorCode, 401) + assertEquals(errorCode, 401) } fun test_Can_send_ReturnVoid() { @@ -195,31 +195,31 @@ class TestServiceTests : TestCase() { request.id = 1 client.send(request) - Assert.assertEquals(HttpMethods.Post, sentMethods[sentMethods.size - 1]) + assertEquals(HttpMethods.Post, sentMethods[sentMethods.size - 1]) request.id = 2 client.get(request) - Assert.assertEquals(HttpMethods.Get, sentMethods[sentMethods.size - 1]) + assertEquals(HttpMethods.Get, sentMethods[sentMethods.size - 1]) request.id = 3 client.post(request) - Assert.assertEquals(HttpMethods.Post, sentMethods[sentMethods.size - 1]) + assertEquals(HttpMethods.Post, sentMethods[sentMethods.size - 1]) request.id = 4 client.put(request) - Assert.assertEquals(HttpMethods.Put, sentMethods[sentMethods.size - 1]) + assertEquals(HttpMethods.Put, sentMethods[sentMethods.size - 1]) request.id = 5 client.delete(request) - Assert.assertEquals(HttpMethods.Delete, sentMethods[sentMethods.size - 1]) + assertEquals(HttpMethods.Delete, sentMethods[sentMethods.size - 1]) } fun test_Can_get_response_as_Raw_String() { val request = HelloString() request.name = "World" val response = client.get(request) - Assert.assertEquals("World", response) + assertEquals("World", response) } fun test_Can_get_response_as_Raw_Bytes() { val response = client.get("/json/reply/HelloString?Name=World", ByteArray::class.java) - Assert.assertEquals("World", Utils.fromUtf8Bytes(response)) + assertEquals("World", Utils.fromUtf8Bytes(response)) } companion object { @@ -235,7 +235,7 @@ class TestServiceTests : TestCase() { } fun assertHelloAllTypesResponse(actual: HelloAllTypesResponse, expected: HelloAllTypes) { - Assert.assertNotNull(actual) + assertNotNull(actual) assertAllTypes(actual.allTypes!!, expected.allTypes!!) assertAllCollectionTypes(actual.allCollectionTypes!!, expected.allCollectionTypes!!) } @@ -290,36 +290,36 @@ class TestServiceTests : TestCase() { } fun assertAllTypes(actual: AllTypes, expected: AllTypes) { - Assert.assertEquals(expected.id, actual.id) - Assert.assertEquals(expected.Byte, actual.Byte) - Assert.assertEquals(expected.Short, actual.Short) - Assert.assertEquals(expected.Int, actual.Int) - Assert.assertEquals(expected.Long, actual.Long) - Assert.assertEquals(expected.uShort, actual.uShort) - Assert.assertEquals(expected.uLong, actual.uLong) - Assert.assertEquals(expected.Float, actual.Float) - Assert.assertEquals(expected.Double, actual.Double) - Assert.assertEquals(expected.decimal, actual.decimal) - Assert.assertEquals(expected.string, actual.string) - Assert.assertEquals(expected.dateTime, actual.dateTime) - Assert.assertEquals(expected.timeSpan, actual.timeSpan) - Assert.assertEquals(expected.guid, actual.guid) - Assert.assertEquals(expected.Char, actual.Char) - Assert.assertEquals(expected.stringArray, actual.stringArray) - Assert.assertEquals(expected.stringList, actual.stringList) - - Assert.assertEquals(expected.stringMap, actual.stringMap) - Assert.assertEquals(expected.intStringMap, actual.intStringMap) - - Assert.assertEquals(expected.subType?.id, actual.subType?.id) - Assert.assertEquals(expected.subType?.name, actual.subType?.name) + assertEquals(expected.id, actual.id) + assertEquals(expected.Byte, actual.Byte) + assertEquals(expected.Short, actual.Short) + assertEquals(expected.Int, actual.Int) + assertEquals(expected.Long, actual.Long) + assertEquals(expected.uShort, actual.uShort) + assertEquals(expected.uLong, actual.uLong) + assertEquals(expected.Float, actual.Float) + assertEquals(expected.Double, actual.Double) + assertEquals(expected.decimal, actual.decimal) + assertEquals(expected.string, actual.string) + assertEquals(expected.dateTime, actual.dateTime) + assertEquals(expected.timeSpan, actual.timeSpan) + assertEquals(expected.guid, actual.guid) + assertEquals(expected.Char, actual.Char) + assertEquals(expected.stringArray, actual.stringArray) + assertEquals(expected.stringList, actual.stringList) + + assertEquals(expected.stringMap, actual.stringMap) + assertEquals(expected.intStringMap, actual.intStringMap) + + assertEquals(expected.subType?.id, actual.subType?.id) + assertEquals(expected.subType?.name, actual.subType?.name) } fun assertAllCollectionTypes(actual: AllCollectionTypes, expected: AllCollectionTypes) { - Assert.assertEquals(expected.intArray, actual.intArray) - Assert.assertEquals(expected.intList, actual.intList) - Assert.assertEquals(expected.stringArray, actual.stringArray) - Assert.assertEquals(expected.stringList, actual.stringList) + assertEquals(expected.intArray, actual.intArray) + assertEquals(expected.intList, actual.intList) + assertEquals(expected.stringArray, actual.stringArray) + assertEquals(expected.stringList, actual.stringList) assertPocoEquals(expected.pocoArray!!, actual.pocoArray!!) assertPocoEquals(expected.pocoList!!, actual.pocoList!!) @@ -328,43 +328,43 @@ class TestServiceTests : TestCase() { } fun assertPocoEquals(expected: List, actual: List) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (i in actual.indices) { assertPocoEquals(expected[i], actual[i]) } } fun assertPocoLookupEquals(expected: HashMap>, actual: HashMap>) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (key in actual.keys) { assertPocoEquals(expected[key]!!, actual[key]!!) } } fun assertPocoLookupMapEquals(expected: HashMap>>, actual: HashMap>>) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (key in actual.keys) { assertPocoEquals(expected[key]!!, actual[key]!!) } } fun assertPocoEquals(expected: ArrayList>, actual: ArrayList>) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (i in actual.indices) { assertPocoEquals(expected[i], actual[i]) } } fun assertPocoEquals(expected: HashMap, actual: HashMap) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (key in actual.keys) { assertPocoEquals(expected[key]!!, actual[key]!!) } } fun assertPocoEquals(expected: Poco, actual: Poco) { - Assert.assertNotNull(actual) - Assert.assertEquals(actual.name, expected.name) + assertNotNull(actual) + assertEquals(actual.name, expected.name) } fun strJoin(sSep: String, aArr: ArrayList): String { 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 141ea1d0..2846efb0 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 @@ -2,10 +2,8 @@ package test.servicestack.net.kotlin.test -import android.app.Application -import android.test.ApplicationTestCase import android.text.TextUtils -import junit.framework.Assert +import junit.framework.TestCase.* import net.servicestack.android.AndroidLogProvider import net.servicestack.android.AndroidServiceClient import net.servicestack.client.* @@ -15,7 +13,7 @@ import java.util.* import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit -class TestServiceTestsAsync : ApplicationTestCase(Application::class.java) { +class TestServiceTestsAsync { init { Log.Instance = AndroidLogProvider("ZZZ") } @@ -41,18 +39,18 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas val signal = CountDownLatch(1) client.getAsync(request, AsyncSuccess { - Assert.assertEquals("Hello, World!", it.result) + assertEquals("Hello, World!", it.result) val results = TextUtils.join(", ", events) - Assert.assertEquals("RequestFilter, GlobalRequestFilter, ResponseFilter, GlobalResponseFilter", results) + assertEquals("RequestFilter, GlobalRequestFilter, ResponseFilter, GlobalResponseFilter", results) AndroidServiceClient.GlobalRequestFilter = null AndroidServiceClient.GlobalResponseFilter = null signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -66,7 +64,7 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -80,7 +78,7 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) } @Throws(InterruptedException::class) @@ -103,23 +101,23 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas val signal = CountDownLatch(1) testClient.putAsync(request, AsyncSuccess { - Assert.fail("should not succeed") + fail("should not succeed") }, AsyncError { thrownError = it as WebServiceException signal.countDown() }) - Assert.assertTrue(signal.await(5, TimeUnit.SECONDS)) + assertTrue(signal.await(5, TimeUnit.SECONDS)) - Assert.assertNotNull(globalError) - Assert.assertNotNull(localError) - Assert.assertNotNull(thrownError) + assertNotNull(globalError) + assertNotNull(localError) + assertNotNull(thrownError) val status = thrownError!!.responseStatus!! - Assert.assertEquals("NotFound", status.errorCode) - Assert.assertEquals("not here", status.message) - Assert.assertNotNull(status.stackTrace) + assertEquals("NotFound", status.errorCode) + assertEquals("not here", status.message) + assertNotNull(status.stackTrace) } fun test_Does_handle_ValidationException_Async() { @@ -129,27 +127,27 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas val signal = CountDownLatch(1) client.postAsync(request, AsyncSuccess { - Assert.fail("should not succeed") + fail("should not succeed") }, AsyncError { val webEx = it as WebServiceException val status = webEx.responseStatus!! - Assert.assertEquals(3, status.errors.size) + assertEquals(3, status.errors.size) - Assert.assertEquals(status.errors[0].errorCode, status.errorCode) - Assert.assertEquals(status.errors[0].message, status.message) + assertEquals(status.errors[0].errorCode, status.errorCode) + assertEquals(status.errors[0].message, status.message) - Assert.assertEquals("InclusiveBetween", status.errors[0].errorCode) - Assert.assertEquals("'Age' must be between 1 and 120. You entered 0.", status.errors[0].message) - Assert.assertEquals("Age", status.errors[0].fieldName) + assertEquals("InclusiveBetween", status.errors[0].errorCode) + assertEquals("'Age' must be between 1 and 120. You entered 0.", status.errors[0].message) + assertEquals("Age", status.errors[0].fieldName) - Assert.assertEquals("NotEmpty", status.errors[1].errorCode) - Assert.assertEquals("'Required' should not be empty.", status.errors[1].message) - Assert.assertEquals("Required", status.errors[1].fieldName) + assertEquals("NotEmpty", status.errors[1].errorCode) + assertEquals("'Required' should not be empty.", status.errors[1].message) + assertEquals("Required", status.errors[1].fieldName) - Assert.assertEquals("Email", status.errors[2].errorCode) - Assert.assertEquals("'Email' is not a valid email address.", status.errors[2].message) - Assert.assertEquals("Email", status.errors[2].fieldName) + assertEquals("Email", status.errors[2].errorCode) + assertEquals("'Email' is not a valid email address.", status.errors[2].message) + assertEquals("Email", status.errors[2].fieldName) signal.countDown() }) } @@ -163,10 +161,10 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas var request = HelloReturnVoid() request.id = 1 - client.sendAsync(request, { - Assert.assertEquals(HttpMethods.Post, sentMethods[sentMethods.size - 1]) + client.sendAsync(request) { + assertEquals(HttpMethods.Post, sentMethods[sentMethods.size - 1]) signal.countDown() - }) + } } fun test_Can_delete_ReturnVoid_Async() { @@ -178,10 +176,10 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas var request = HelloReturnVoid() request.id = 1 - client.deleteAsync(request, { - Assert.assertEquals(HttpMethods.Delete, sentMethods[sentMethods.size - 1]) + client.deleteAsync(request) { + assertEquals(HttpMethods.Delete, sentMethods[sentMethods.size - 1]) signal.countDown() - }) + } } companion object { @@ -197,7 +195,7 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas } fun assertHelloAllTypesResponse(actual: HelloAllTypesResponse, expected: HelloAllTypes) { - Assert.assertNotNull(actual) + assertNotNull(actual) assertAllTypes(actual.allTypes!!, expected.allTypes!!) assertAllCollectionTypes(actual.allCollectionTypes!!, expected.allCollectionTypes!!) } @@ -252,36 +250,36 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas } fun assertAllTypes(actual: AllTypes, expected: AllTypes) { - Assert.assertEquals(expected.id, actual.id) - Assert.assertEquals(expected.Byte, actual.Byte) - Assert.assertEquals(expected.Short, actual.Short) - Assert.assertEquals(expected.Int, actual.Int) - Assert.assertEquals(expected.Long, actual.Long) - Assert.assertEquals(expected.uShort, actual.uShort) - Assert.assertEquals(expected.uLong, actual.uLong) - Assert.assertEquals(expected.Float, actual.Float) - Assert.assertEquals(expected.Double, actual.Double) - Assert.assertEquals(expected.decimal, actual.decimal) - Assert.assertEquals(expected.string, actual.string) - Assert.assertEquals(expected.dateTime, actual.dateTime) - Assert.assertEquals(expected.timeSpan, actual.timeSpan) - Assert.assertEquals(expected.guid, actual.guid) - Assert.assertEquals(expected.Char, actual.Char) - Assert.assertEquals(expected.stringArray, actual.stringArray) - Assert.assertEquals(expected.stringList, actual.stringList) - - Assert.assertEquals(expected.stringMap, actual.stringMap) - Assert.assertEquals(expected.intStringMap, actual.intStringMap) - - Assert.assertEquals(expected.subType?.id, actual.subType?.id) - Assert.assertEquals(expected.subType?.name, actual.subType?.name) + assertEquals(expected.id, actual.id) + assertEquals(expected.Byte, actual.Byte) + assertEquals(expected.Short, actual.Short) + assertEquals(expected.Int, actual.Int) + assertEquals(expected.Long, actual.Long) + assertEquals(expected.uShort, actual.uShort) + assertEquals(expected.uLong, actual.uLong) + assertEquals(expected.Float, actual.Float) + assertEquals(expected.Double, actual.Double) + assertEquals(expected.decimal, actual.decimal) + assertEquals(expected.string, actual.string) + assertEquals(expected.dateTime, actual.dateTime) + assertEquals(expected.timeSpan, actual.timeSpan) + assertEquals(expected.guid, actual.guid) + assertEquals(expected.Char, actual.Char) + assertEquals(expected.stringArray, actual.stringArray) + assertEquals(expected.stringList, actual.stringList) + + assertEquals(expected.stringMap, actual.stringMap) + assertEquals(expected.intStringMap, actual.intStringMap) + + assertEquals(expected.subType?.id, actual.subType?.id) + assertEquals(expected.subType?.name, actual.subType?.name) } fun assertAllCollectionTypes(actual: AllCollectionTypes, expected: AllCollectionTypes) { - Assert.assertEquals(expected.intArray, actual.intArray) - Assert.assertEquals(expected.intList, actual.intList) - Assert.assertEquals(expected.stringArray, actual.stringArray) - Assert.assertEquals(expected.stringList, actual.stringList) + assertEquals(expected.intArray, actual.intArray) + assertEquals(expected.intList, actual.intList) + assertEquals(expected.stringArray, actual.stringArray) + assertEquals(expected.stringList, actual.stringList) assertPocoEquals(expected.pocoArray!!, actual.pocoArray!!) assertPocoEquals(expected.pocoList!!, actual.pocoList!!) @@ -290,43 +288,43 @@ class TestServiceTestsAsync : ApplicationTestCase(Application::clas } fun assertPocoEquals(expected: List, actual: List) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (i in actual.indices) { assertPocoEquals(expected[i], actual[i]) } } fun assertPocoLookupEquals(expected: HashMap>, actual: HashMap>) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (key in actual.keys) { assertPocoEquals(expected[key]!!, actual[key]!!) } } fun assertPocoLookupMapEquals(expected: HashMap>>, actual: HashMap>>) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (key in actual.keys) { assertPocoEquals(expected[key]!!, actual[key]!!) } } fun assertPocoEquals(expected: ArrayList>, actual: ArrayList>) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (i in actual.indices) { assertPocoEquals(expected[i], actual[i]) } } fun assertPocoEquals(expected: HashMap, actual: HashMap) { - Assert.assertEquals(expected.size, actual.size) + assertEquals(expected.size, actual.size) for (key in actual.keys) { assertPocoEquals(expected[key]!!, actual[key]!!) } } fun assertPocoEquals(expected: Poco, actual: Poco) { - Assert.assertNotNull(actual) - Assert.assertEquals(actual.name, expected.name) + assertNotNull(actual) + assertEquals(actual.name, expected.name) } } } \ No newline at end of file diff --git a/src/AndroidClient/kotlin/src/test/java/test/servicestack/net/kotlin/ExampleUnitTest.java b/src/AndroidClient/kotlin/src/test/java/test/servicestack/net/kotlin/ExampleUnitTest.java index 38cc9940..6b4d3392 100644 --- a/src/AndroidClient/kotlin/src/test/java/test/servicestack/net/kotlin/ExampleUnitTest.java +++ b/src/AndroidClient/kotlin/src/test/java/test/servicestack/net/kotlin/ExampleUnitTest.java @@ -2,7 +2,7 @@ import org.junit.Test; -import static org.junit.Assert.*; +import static junit.framework.TestCase.assertEquals; /** * To work on unit tests, switch the Test Artifact in the Build Variants view. diff --git a/src/AndroidClient/techstacks/src/androidTest/java/servicestack/net/techstacks/ApplicationTest.java b/src/AndroidClient/techstacks/src/androidTest/java/servicestack/net/techstacks/ApplicationTest.java index 15f8b282..502bac2d 100644 --- a/src/AndroidClient/techstacks/src/androidTest/java/servicestack/net/techstacks/ApplicationTest.java +++ b/src/AndroidClient/techstacks/src/androidTest/java/servicestack/net/techstacks/ApplicationTest.java @@ -1,13 +1,6 @@ package servicestack.net.techstacks; import android.app.Application; -import android.test.ApplicationTestCase; -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } +public class ApplicationTest { } \ No newline at end of file diff --git a/src/AndroidClient/techstackskotlin/src/androidTest/java/servicestack/net/techstackskotlin/ApplicationTest.kt b/src/AndroidClient/techstackskotlin/src/androidTest/java/servicestack/net/techstackskotlin/ApplicationTest.kt index ca746e1b..505bc53c 100644 --- a/src/AndroidClient/techstackskotlin/src/androidTest/java/servicestack/net/techstackskotlin/ApplicationTest.kt +++ b/src/AndroidClient/techstackskotlin/src/androidTest/java/servicestack/net/techstackskotlin/ApplicationTest.kt @@ -1,9 +1,5 @@ package servicestack.net.techstackskotlin -import android.app.Application -import android.test.ApplicationTestCase +class ApplicationTest { -/** - * [Testing Fundamentals](http://d.android.com/tools/testing/testing_android.html) - */ -class ApplicationTest : ApplicationTestCase(Application::class.java) \ No newline at end of file +} \ No newline at end of file diff --git a/src/ServiceStackIDEA/.idea/.name b/src/ServiceStackIDEA/.idea/.name index 5d155d6d..bd17f1d1 100644 --- a/src/ServiceStackIDEA/.idea/.name +++ b/src/ServiceStackIDEA/.idea/.name @@ -1 +1 @@ -ServiceStackIDEA \ No newline at end of file +ServiceStackIDEA.iml \ No newline at end of file From 363801e2e5dc744d631dcde6a9f87daa405d2e2c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 1 Mar 2021 02:41:20 +0800 Subject: [PATCH 013/101] Add support for refresh token cookies --- .../servicestack/client/GetAccessToken.java | 26 + .../client/GetAccessTokenResponse.java | 23 + .../client/JsonServiceClient.java | 68 +- .../client/RefreshTokenException.java | 7 + .../servicestack/client/ServiceClient.java | 9 + .../servicestack/client/TestAuthTests.java | 26 + .../net/servicestack/client/testdtos.java | 1528 ++++++++++++----- .../client/src/test/java/test/dtos.java | 1526 +++++++++++----- 8 files changed, 2278 insertions(+), 935 deletions(-) create mode 100644 src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessToken.java create mode 100644 src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessTokenResponse.java create mode 100644 src/AndroidClient/client/src/main/java/net/servicestack/client/RefreshTokenException.java diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessToken.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessToken.java new file mode 100644 index 00000000..e85ac084 --- /dev/null +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessToken.java @@ -0,0 +1,26 @@ +package net.servicestack.client; + +import java.util.HashMap; + +@Route("/access-token") +@DataContract +public class GetAccessToken implements IReturn, IPost +{ + @DataMember(Order=1) + public String refreshToken = null; + + @DataMember(Order=2) + public Boolean useTokenCookie = null; + + @DataMember(Order=3) + public HashMap meta = null; + + public String getRefreshToken() { return refreshToken; } + public GetAccessToken setRefreshToken(String value) { this.refreshToken = value; return this; } + public Boolean isUseTokenCookie() { return useTokenCookie; } + public GetAccessToken setUseTokenCookie(Boolean value) { this.useTokenCookie = 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; } +} diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessTokenResponse.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessTokenResponse.java new file mode 100644 index 00000000..09d563a1 --- /dev/null +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/GetAccessTokenResponse.java @@ -0,0 +1,23 @@ +package net.servicestack.client; + +import java.util.HashMap; + +@DataContract +public 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; } +} \ No newline at end of file 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 38e34408..fe002913 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 @@ -26,6 +26,7 @@ import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.Date; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -39,6 +40,7 @@ public class JsonServiceClient implements ServiceClient { String userName; String password; String bearerToken; + String refreshToken; Integer timeoutMs; public ConnectionFilter RequestFilter; @@ -179,7 +181,7 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt if (bearerToken != null) { req.setRequestProperty(HttpHeaders.Authorization, "Bearer " + bearerToken); req.setRequestProperty("X-Auth", "Bearer"); // HttpURLConnection doesn't allow re-reading Authorization Header - } else if (forceAuthentication || alwaysSendBasicAuthHeaders) { + } else if (getTokenCookie() == null && (forceAuthentication || alwaysSendBasicAuthHeaders)) { req.setRequestProperty(HttpHeaders.Authorization, "Basic " + Utils.toBase64String(userName + ":" + password)); req.setRequestProperty("X-Auth", "Basic"); // HttpURLConnection doesn't allow re-reading Authorization Header } @@ -208,12 +210,11 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt } } - private static boolean shouldAuthenticate(HttpURLConnection req, String userName, String password){ + private static boolean shouldAuthenticate(HttpURLConnection req, boolean hasAuthInfo){ try { return req.getResponseCode() == 401 - && req.getRequestProperty("X-Auth") == null //only auth if auth never attempted - && userName != null - && password != null; + && req.getRequestProperty("X-Auth") == null //only auth if auth never attempted + && hasAuthInfo; } catch (IOException e) { return false; } @@ -308,6 +309,21 @@ public void setTokenCookie(String value) { setCookie("ss-tok", value, (long) (365 * 24 * 60 * 60)); //1 year } + @Override + public void setRefreshToken(String bearerToken) { + this.refreshToken = bearerToken; + } + + @Override + public String getRefreshToken() { + return refreshToken; + } + + @Override + public void setRefreshTokenCookie(String value) { + setCookie("ss-reftok", value, (long) (365 * 24 * 60 * 60)); //1 year + } + @Override public void setCredentials(String userName, String password) { this.userName = userName; @@ -370,8 +386,26 @@ public TResponse send(String requestUrl, String httpMethod, byte[] r if (responseCode >= 400){ boolean success = false; - if (shouldAuthenticate(req, userName, password)){ + boolean hasRefreshTokenCookie = getRefreshTokenCookie() != null; + boolean hasRefreshToken = refreshToken != null || hasRefreshTokenCookie; + if (shouldAuthenticate(req, (userName !=null && password != null) + || bearerToken != null + || hasRefreshToken)) { req.disconnect(); + + if (hasRefreshToken) { + GetAccessToken refreshRequest = new GetAccessToken() + .setRefreshToken(refreshToken); + try { + GetAccessTokenResponse response = post(refreshRequest); + if (response.getAccessToken() != null) { + this.setBearerToken(response.getAccessToken()); + } + } catch (WebServiceException e) { + throw new RefreshTokenException(e); + } + } + req = createRequest(requestUrl, httpMethod, requestBody, requestType, true); success = req.getResponseCode() < 400; @@ -583,6 +617,28 @@ public HttpURLConnection delete(String path) { return createRequest(resolveUrl(path), HttpMethods.Delete, null, null); } + public List getCookies() { + CookieManager cookieManager = (CookieManager) CookieHandler.getDefault(); + return cookieManager.getCookieStore().getCookies(); + } + + public String getCookieValue(String name) { + CookieManager cookieManager = (CookieManager) CookieHandler.getDefault(); + for (HttpCookie cookie : cookieManager.getCookieStore().getCookies()) { + if (cookie.getName().equals(name)) { + return cookie.getValue(); + } + } + return null; + } + + public String getTokenCookie() { + return getCookieValue("ss-tok"); + } + public String getRefreshTokenCookie() { + return getCookieValue("ss-reftok"); + } + @Override public void setCookie(String name, String value) { setCookie(name, value, null); diff --git a/src/AndroidClient/client/src/main/java/net/servicestack/client/RefreshTokenException.java b/src/AndroidClient/client/src/main/java/net/servicestack/client/RefreshTokenException.java new file mode 100644 index 00000000..c02d54a0 --- /dev/null +++ b/src/AndroidClient/client/src/main/java/net/servicestack/client/RefreshTokenException.java @@ -0,0 +1,7 @@ +package net.servicestack.client; + +public class RefreshTokenException extends RuntimeException { + public RefreshTokenException(WebServiceException innerException) { + super(innerException.getMessage(), innerException); + } +} 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 1272b2b3..6ff6affa 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 @@ -9,9 +9,15 @@ public interface ServiceClient { boolean getAlwaysSendBasicAuthHeaders(); + void setBearerToken(String value); String getBearerToken(); void setTokenCookie(String value); + + void setRefreshToken(String bearerToken); + String getRefreshToken(); + void setRefreshTokenCookie(String value); + void setAlwaysSendBasicAuthHeaders(boolean value); void setCredentials(String userName, String password); @@ -51,4 +57,7 @@ public interface ServiceClient { void setCookie(String name, String value); void setCookie(String name, String value, Long expiresInSecs); void clearCookies(); + String getCookieValue(String name); + String getTokenCookie(); + String getRefreshTokenCookie(); } 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 19c5a4ce..d7790a1d 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 @@ -82,4 +82,30 @@ public void test_can_authenticate_with_CredentialsAuth(){ assertEquals("test DisplayName", response.getDisplayName()); assertNotNull(response.getSessionId()); } + + public void test_Does_fetch_AccessToken_using_RefreshTokenCookies(){ + ServiceClient client = CreateClient(); + + testdtos.AuthenticateResponse authResponse = client.post(new testdtos.Authenticate() + .setProvider("credentials") + .setUserName("test") + .setPassword("test")); + + String initialAccessToken = client.getTokenCookie(); + String initialRefreshToken = client.getRefreshTokenCookie(); + assertNotNull(initialAccessToken); + assertNotNull(initialRefreshToken); + + testdtos.Secured request = new testdtos.Secured() + .setName("test"); + testdtos.SecuredResponse response = client.send(request); + assertEquals(response.getResult(), request.getName()); + + client.post(new testdtos.InvalidateLastAccessToken()); + + response = client.send(request); + assertEquals(response.getResult(), request.getName()); + String latestAccessToken = client.getTokenCookie(); + assertNotSame(latestAccessToken, initialAccessToken); + } } 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 91109460..46cbe512 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 @@ -1,10 +1,10 @@ /* Options: -Date: 2017-02-08 06:36:03 -Version: 4.00 +Date: 2021-02-28 17:49:27 +Version: 5.105 Tip: To override a DTO option, remove "//" prefix before updating BaseUrl: http://test.servicestack.net -Package: net.servicestack.client.tests +Package: net.servicestack.client GlobalNamespace: testdtos //AddPropertyAccessors: True //SettersReturnThis: True @@ -43,6 +43,20 @@ public static class CustomHttpError implements IReturn public Object getResponseType() { return responseType; } } + public static class DummyTypes + { + public ArrayList helloResponses = null; + public ArrayList listResult = null; + public ArrayList arrayResult = 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; } + } + @Route("/throwhttperror/{Status}") public static class ThrowHttpError { @@ -114,51 +128,6 @@ public static class ThrowBusinessError implements IReturn - { - public Integer id = null; - public String name = null; - public ExternalEnum externalEnum = null; - - public Integer getId() { return id; } - public ExternalOperation setId(Integer value) { this.id = value; return this; } - public String getName() { return name; } - public ExternalOperation setName(String value) { this.name = value; return this; } - public ExternalEnum getExternalEnum() { return externalEnum; } - public ExternalOperation setExternalEnum(ExternalEnum value) { this.externalEnum = value; return this; } - private static Object responseType = ExternalOperationResponse.class; - public Object getResponseType() { return responseType; } - } - - public static class ExternalOperation2 implements IReturn - { - public Integer id = null; - - public Integer getId() { return id; } - public ExternalOperation2 setId(Integer value) { this.id = value; return this; } - private static Object responseType = ExternalOperation2Response.class; - public Object getResponseType() { return responseType; } - } - - public static class ExternalOperation3 implements IReturn - { - public Integer id = null; - - public Integer getId() { return id; } - public ExternalOperation3 setId(Integer value) { this.id = value; return this; } - private static Object responseType = ExternalReturnTypeResponse.class; - public Object getResponseType() { return responseType; } - } - - public static class ExternalOperation4 - { - public Integer id = null; - - public Integer getId() { return id; } - public ExternalOperation4 setId(Integer value) { this.id = value; return this; } - } - - @Route("/{Path*}") public static class RootPathRoutes { public String path = null; @@ -191,48 +160,58 @@ public static class GetProject implements IReturn } @Route("/image-stream") - public static class ImageAsStream + 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("/image-bytes") - public static class ImageAsBytes + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-custom") - public static class ImageAsCustomResult + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-response") - public static class ImageWriteToResponse + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-file") - public static class ImageAsFile + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-redirect") @@ -244,31 +223,92 @@ public static class ImageAsRedirect public ImageAsRedirect setFormat(String value) { this.format = value; return this; } } - @Route("/image-draw/{Name}") - public static class DrawImage + @Route("/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 DrawImage setName(String value) { this.name = value; return this; } + public HelloImage setName(String value) { this.name = value; return this; } public String getFormat() { return format; } - public DrawImage setFormat(String value) { this.format = value; return this; } + public HelloImage setFormat(String value) { this.format = value; return this; } public Integer getWidth() { return width; } - public DrawImage setWidth(Integer value) { this.width = value; return this; } + public HelloImage setWidth(Integer value) { this.width = value; return this; } public Integer getHeight() { return height; } - public DrawImage setHeight(Integer value) { this.height = value; return this; } + public HelloImage setHeight(Integer value) { this.height = value; return this; } public Integer getFontSize() { return fontSize; } - public DrawImage setFontSize(Integer value) { this.fontSize = value; return this; } + 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 DrawImage setForeground(String value) { this.foreground = value; return this; } + public HelloImage setForeground(String value) { this.foreground = value; return this; } public String getBackground() { return background; } - public DrawImage setBackground(String value) { this.background = value; return this; } + public HelloImage setBackground(String value) { this.background = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route("/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("/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("/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("/jwt-invalidate") + public static class InvalidateLastAccessToken implements IReturn + { + + private static Object responseType = EmptyResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route("/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("/metadatatest") @@ -322,6 +362,24 @@ public static class TextFileTest public TextFileTest setAsAttachment(Boolean value) { this.asAttachment = value; return this; } } + @Route("/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("/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("/hello") // @Route("/hello/{Name}") public static class Hello implements IReturn @@ -339,6 +397,21 @@ public static class Hello implements IReturn 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; @@ -386,20 +459,26 @@ public static class HelloWithEnum public HelloWithEnum setEnumFlags(EnumFlags value) { this.enumFlags = value; return this; } } - public static class HelloExternal + 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 HelloExternal setName(String value) { this.name = value; return this; } + 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") + @Api(Description="AllowedAttributes Description") + @ApiResponse(Description="Your request was not understood", StatusCode=400) @DataContract public static class AllowedAttributes { @@ -408,7 +487,7 @@ public static class AllowedAttributes */ @DataMember(Name="Aliased") @SerializedName("Aliased") - @ApiMember(ParameterType="path", Description="Range Description", DataType="double", IsRequired=true) + @ApiMember(DataType="double", Description="Range Description", IsRequired=true, ParameterType="path") public Double range = null; public Double getRange() { return range; } @@ -432,7 +511,17 @@ public static class HelloAllTypes implements IReturn public Object getResponseType() { return responseType; } } - public static class AllTypes + 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; @@ -513,6 +602,8 @@ public static class AllTypes 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 HelloString implements IReturn @@ -837,6 +928,54 @@ public static class GetRequest2 implements IReturn>, IGet public Object getResponseType() { return responseType; } } + @Route("/sendjson") + public static class SendJson implements IReturn + { + public Integer id = null; + public String name = 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; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route("/sendtext") + public static class SendText implements IReturn + { + public Integer id = null; + public String name = null; + public String contentType = 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; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route("/sendraw") + public static class SendRaw implements IReturn> + { + public Integer id = null; + public String name = null; + public String contentType = 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; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + public static class SendDefault implements IReturn { public Integer id = null; @@ -888,6 +1027,14 @@ public static class SendPut implements IReturn, IPut 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("/session") public static class GetSession implements IReturn { @@ -907,6 +1054,44 @@ public static class UpdateSession implements IReturn public Object getResponseType() { return responseType; } } + @Route("/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; @@ -917,6 +1102,16 @@ public static class StoreLogs implements IReturn 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("/testauth") public static class TestAuth implements IReturn { @@ -925,6 +1120,44 @@ public static class TestAuth implements IReturn 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("/testdata/AllTypes") + public static class TestDataAllTypes implements IReturn + { + + private static Object responseType = AllTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route("/testdata/AllCollectionTypes") + public static class TestDataAllCollectionTypes implements IReturn + { + + private static Object responseType = AllCollectionTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route("/custom") + // @Route("/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("/void-response") public static class TestVoidResponse { @@ -1024,20 +1257,39 @@ public static class EchoCollections implements IReturn public Object getResponseType() { return responseType; } } + @Route("/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; } + } + @Route("/auth") // @Route("/auth/{provider}") - // @Route("/authenticate") - // @Route("/authenticate/{provider}") @DataContract public static class Authenticate implements IReturn, IPost { @@ -1062,31 +1314,40 @@ public static class Authenticate implements IReturn, IPost @DataMember(Order=7) public Boolean rememberMe = null; - @DataMember(Order=8) - @SerializedName("continue") public String Continue = null; - @DataMember(Order=9) - public String nonce = null; + public String errorView = null; @DataMember(Order=10) - public String uri = null; + public String nonce = null; @DataMember(Order=11) - public String response = null; + public String uri = null; @DataMember(Order=12) - public String qop = null; + public String response = null; @DataMember(Order=13) - public String nc = null; + public String qop = null; @DataMember(Order=14) - public String cnonce = null; + public String nc = null; @DataMember(Order=15) - public Boolean useTokenCookie = null; + public String cnonce = null; @DataMember(Order=16) + public Boolean useTokenCookie = null; + + @DataMember(Order=17) + public String accessToken = null; + + @DataMember(Order=18) + public String accessTokenSecret = null; + + @DataMember(Order=19) + public String scope = null; + + @DataMember(Order=20) public HashMap meta = null; public String getProvider() { return provider; } @@ -1103,8 +1364,8 @@ public static class Authenticate implements IReturn, IPost 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 getContinue() { return Continue; } - public Authenticate setContinue(String value) { this.Continue = value; return this; } + public String getErrorView() { return errorView; } + public Authenticate setErrorView(String value) { this.errorView = value; return this; } public String getNonce() { return nonce; } public Authenticate setNonce(String value) { this.nonce = value; return this; } public String getUri() { return uri; } @@ -1119,6 +1380,12 @@ public static class Authenticate implements IReturn, IPost public Authenticate setCnonce(String value) { this.cnonce = value; return this; } public Boolean isUseTokenCookie() { return useTokenCookie; } public Authenticate setUseTokenCookie(Boolean value) { this.useTokenCookie = 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 getScope() { return scope; } + public Authenticate setScope(String value) { this.scope = value; return this; } public HashMap getMeta() { return meta; } public Authenticate setMeta(HashMap value) { this.meta = value; return this; } private static Object responseType = AuthenticateResponse.class; @@ -1137,6 +1404,9 @@ public static class AssignRoles implements IReturn, IPost @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; } @@ -1144,6 +1414,8 @@ public static class AssignRoles implements IReturn, IPost 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; } } @@ -1160,6 +1432,9 @@ public static class UnAssignRoles implements IReturn, IPo @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; } @@ -1167,11 +1442,54 @@ public static class UnAssignRoles implements IReturn, IPo 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 QueryPocoBase extends QueryBase_1 implements IReturn> + @Route("/session-to-token") + @DataContract + public static class ConvertSessionToToken implements IReturn, 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; } + private static Object responseType = ConvertSessionToTokenResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route("/access-token") + @DataContract + public static class GetAccessToken implements IReturn, IPost + { + @DataMember(Order=1) + public String refreshToken = null; + + @DataMember(Order=2) + public Boolean useTokenCookie = null; + + @DataMember(Order=3) + public HashMap meta = null; + + public String getRefreshToken() { return refreshToken; } + public GetAccessToken setRefreshToken(String value) { this.refreshToken = value; return this; } + public Boolean isUseTokenCookie() { return useTokenCookie; } + public GetAccessToken setUseTokenCookie(Boolean value) { this.useTokenCookie = 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; } + } + + public static class QueryPocoBase extends QueryDb_1 implements IReturn> { public Integer id = null; @@ -1181,7 +1499,7 @@ public static class QueryPocoBase extends QueryBase_1 public Object getResponseType() { return responseType; } } - public static class QueryPocoIntoBase extends QueryBase_2 implements IReturn> + public static class QueryPocoIntoBase extends QueryDb_2 implements IReturn> { public Integer id = null; @@ -1191,8 +1509,8 @@ public static class QueryPocoIntoBase extends QueryBase_2 implements IReturn> + @Route(Path="/rockstars", Verbs="GET") + public static class QueryRockstars extends QueryDb_1 implements IReturn> { private static Object responseType = new TypeToken>(){}.getType(); @@ -1220,19 +1538,19 @@ public static class ThrowTypeResponse public static class ThrowValidationResponse { + public ResponseStatus responseStatus = null; public Integer age = null; public String required = null; public String email = null; - public ResponseStatus responseStatus = null; + public ResponseStatus getResponseStatus() { return responseStatus; } + public ThrowValidationResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } 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 @@ -1243,47 +1561,66 @@ public static class ThrowBusinessErrorResponse public ThrowBusinessErrorResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } - public static class ExternalOperationResponse + public static class Account { - public String result = null; + public String name = null; - public String getResult() { return result; } - public ExternalOperationResponse setResult(String value) { this.result = value; return this; } + public String getName() { return name; } + public Account setName(String value) { this.name = value; return this; } } - public static class ExternalOperation2Response + public static class Project { - public ExternalType externalType = null; + public String account = null; + public String name = null; - public ExternalType getExternalType() { return externalType; } - public ExternalOperation2Response setExternalType(ExternalType value) { this.externalType = value; return this; } + 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 ExternalReturnTypeResponse + public static class SecuredResponse { - public ExternalEnum3 externalEnum3 = null; + public String result = null; + public ResponseStatus responseStatus = null; - public ExternalEnum3 getExternalEnum3() { return externalEnum3; } - public ExternalReturnTypeResponse setExternalEnum3(ExternalEnum3 value) { this.externalEnum3 = value; return this; } + 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 Account + public static class CreateJwtResponse { - public String name = null; + public String token = null; + public ResponseStatus responseStatus = null; - public String getName() { return name; } - public Account setName(String value) { this.name = value; return this; } + 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 Project + public static class CreateRefreshJwtResponse { - public String account = null; - public String name = null; + public String token = null; + public ResponseStatus responseStatus = 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 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; } + } + + @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 MetadataTestResponse @@ -1329,6 +1666,19 @@ public static class HelloResponse 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; @@ -1343,6 +1693,14 @@ public static class HelloAllTypesResponse 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 { @@ -1484,6 +1842,36 @@ public static class GetSessionResponse 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; @@ -1515,8 +1903,37 @@ public static class TestAuthResponse public TestAuthResponse setResponseStatus(ResponseStatus value) { this.responseStatus = 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; } + } + @DataContract - public static class AuthenticateResponse + public static class AuthenticateResponse implements IHasSessionId, IHasBearerToken { @DataMember(Order=1) public String userId = null; @@ -1537,9 +1954,21 @@ public static class AuthenticateResponse public String bearerToken = null; @DataMember(Order=7) - public ResponseStatus responseStatus = null; + public String refreshToken = null; @DataMember(Order=8) + public String profileUrl = null; + + @DataMember(Order=9) + public ArrayList roles = null; + + @DataMember(Order=10) + public ArrayList permissions = null; + + @DataMember(Order=11) + public ResponseStatus responseStatus = null; + + @DataMember(Order=12) public HashMap meta = null; public String getUserId() { return userId; } @@ -1554,6 +1983,14 @@ public static class AuthenticateResponse 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 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 ResponseStatus getResponseStatus() { return responseStatus; } public AuthenticateResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } public HashMap getMeta() { return meta; } @@ -1570,12 +2007,17 @@ public static class AssignRolesResponse 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; } } @@ -1590,16 +2032,66 @@ public static class UnAssignRolesResponse 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; } } + @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; } + } + + @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; } + } + @DataContract public static class QueryResponse { @@ -1630,119 +2122,376 @@ public static class QueryResponse public QueryResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } - public static enum ExternalEnum + public static interface IAuthTokens { - Foo, - Bar, - Baz; + 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 ExternalType + @DataContract + public static class AuthUserSession { - public ExternalEnum2 externalEnum2 = null; - - public ExternalEnum2 getExternalEnum2() { return externalEnum2; } - public ExternalType setExternalEnum2(ExternalEnum2 value) { this.externalEnum2 = value; return this; } - } + @DataMember(Order=1) + public String referrerUrl = null; - public static enum ExternalEnum3 - { - Un, - Deux, - Trois; - } + @DataMember(Order=2) + public String id = null; - 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; } - } + @DataMember(Order=3) + public String userAuthId = null; - @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; } - } + @DataMember(Order=4) + public String userAuthName = null; - public static class NestedClass - { - public String value = null; - - public String getValue() { return value; } - public NestedClass setValue(String value) { this.value = value; return this; } - } + @DataMember(Order=5) + public String userName = null; - public static class ListResult - { - public String result = null; - - public String getResult() { return result; } - public ListResult setResult(String value) { this.result = value; return this; } - } + @DataMember(Order=6) + public String twitterUserId = null; - public static class ArrayResult - { - public String result = null; - - public String getResult() { return result; } - public ArrayResult setResult(String value) { this.result = value; return this; } - } + @DataMember(Order=7) + public String twitterScreenName = null; - public static enum EnumType - { - Value1, - Value2; - } + @DataMember(Order=8) + public String facebookUserId = null; - @Flags() - public static enum EnumFlags - { - @SerializedName("1") Value1(1), - @SerializedName("2") Value2(2), - @SerializedName("4") Value3(4); + @DataMember(Order=9) + public String facebookUserName = null; - private final int value; - EnumFlags(final int intValue) { value = intValue; } - public int getValue() { return value; } - } + @DataMember(Order=10) + public String firstName = null; - public static class AllCollectionTypes + @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; + + 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 static class MetadataTestChild { - 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 String name = null; + public ArrayList results = 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 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 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 + { + @SerializedName("1") Value1(1), + @SerializedName("2") Value2(2), + @SerializedName("4") Value3(4); + + private final int value; + EnumFlags(final int intValue) { value = intValue; } + public int getValue() { return value; } } public static class KeyValuePair @@ -1767,6 +2516,89 @@ public static class SubType 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; @@ -1926,7 +2758,24 @@ public static class Logger public Logger setDevices(ArrayList value) { this.devices = value; return this; } } - 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 QueryDb_1 extends QueryBase { } @@ -1942,7 +2791,7 @@ public static class OnlyDefinedInGenericType public OnlyDefinedInGenericType setName(String value) { this.name = value; return this; } } - public static class QueryBase_2 extends QueryBase + public static class QueryDb_2 extends QueryBase { } @@ -1969,30 +2818,6 @@ public static class OnlyDefinedInGenericTypeInto public OnlyDefinedInGenericTypeInto setName(String value) { this.name = 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 enum ExternalEnum2 - { - Uno, - Due, - Tre; - } - public static class MetadataTestNestedChild { public String name = null; @@ -2020,234 +2845,6 @@ public static class TypesGroup } - 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 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 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 ArrayList getProviderOAuthAccess() { return providerOAuthAccess; } - public AuthUserSession setProviderOAuthAccess(ArrayList value) { this.providerOAuthAccess = value; return this; } - } - public static class Device { public Long id = null; @@ -2265,6 +2862,7 @@ public static class Device public Device setChannels(ArrayList value) { this.channels = value; return this; } } + @DataContract public static class QueryBase { @DataMember(Order=1) diff --git a/src/AndroidClient/client/src/test/java/test/dtos.java b/src/AndroidClient/client/src/test/java/test/dtos.java index d272f5d2..880d6ba6 100644 --- a/src/AndroidClient/client/src/test/java/test/dtos.java +++ b/src/AndroidClient/client/src/test/java/test/dtos.java @@ -1,6 +1,6 @@ /* Options: -Date: 2017-02-08 06:36:11 -Version: 4.00 +Date: 2021-02-28 17:45:25 +Version: 5.105 Tip: To override a DTO option, remove "//" prefix before updating BaseUrl: http://test.servicestack.net @@ -43,6 +43,20 @@ public static class CustomHttpError implements IReturn public Object getResponseType() { return responseType; } } + public static class DummyTypes + { + public ArrayList helloResponses = null; + public ArrayList listResult = null; + public ArrayList arrayResult = 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; } + } + @Route("/throwhttperror/{Status}") public static class ThrowHttpError { @@ -114,51 +128,6 @@ public static class ThrowBusinessError implements IReturn - { - public Integer id = null; - public String name = null; - public ExternalEnum externalEnum = null; - - public Integer getId() { return id; } - public ExternalOperation setId(Integer value) { this.id = value; return this; } - public String getName() { return name; } - public ExternalOperation setName(String value) { this.name = value; return this; } - public ExternalEnum getExternalEnum() { return externalEnum; } - public ExternalOperation setExternalEnum(ExternalEnum value) { this.externalEnum = value; return this; } - private static Object responseType = ExternalOperationResponse.class; - public Object getResponseType() { return responseType; } - } - - public static class ExternalOperation2 implements IReturn - { - public Integer id = null; - - public Integer getId() { return id; } - public ExternalOperation2 setId(Integer value) { this.id = value; return this; } - private static Object responseType = ExternalOperation2Response.class; - public Object getResponseType() { return responseType; } - } - - public static class ExternalOperation3 implements IReturn - { - public Integer id = null; - - public Integer getId() { return id; } - public ExternalOperation3 setId(Integer value) { this.id = value; return this; } - private static Object responseType = ExternalReturnTypeResponse.class; - public Object getResponseType() { return responseType; } - } - - public static class ExternalOperation4 - { - public Integer id = null; - - public Integer getId() { return id; } - public ExternalOperation4 setId(Integer value) { this.id = value; return this; } - } - - @Route("/{Path*}") public static class RootPathRoutes { public String path = null; @@ -191,48 +160,58 @@ public static class GetProject implements IReturn } @Route("/image-stream") - public static class ImageAsStream + 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("/image-bytes") - public static class ImageAsBytes + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-custom") - public static class ImageAsCustomResult + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-response") - public static class ImageWriteToResponse + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-file") - public static class ImageAsFile + 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 = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } } @Route("/image-redirect") @@ -244,31 +223,92 @@ public static class ImageAsRedirect public ImageAsRedirect setFormat(String value) { this.format = value; return this; } } - @Route("/image-draw/{Name}") - public static class DrawImage + @Route("/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 DrawImage setName(String value) { this.name = value; return this; } + public HelloImage setName(String value) { this.name = value; return this; } public String getFormat() { return format; } - public DrawImage setFormat(String value) { this.format = value; return this; } + public HelloImage setFormat(String value) { this.format = value; return this; } public Integer getWidth() { return width; } - public DrawImage setWidth(Integer value) { this.width = value; return this; } + public HelloImage setWidth(Integer value) { this.width = value; return this; } public Integer getHeight() { return height; } - public DrawImage setHeight(Integer value) { this.height = value; return this; } + public HelloImage setHeight(Integer value) { this.height = value; return this; } public Integer getFontSize() { return fontSize; } - public DrawImage setFontSize(Integer value) { this.fontSize = value; return this; } + 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 DrawImage setForeground(String value) { this.foreground = value; return this; } + public HelloImage setForeground(String value) { this.foreground = value; return this; } public String getBackground() { return background; } - public DrawImage setBackground(String value) { this.background = value; return this; } + public HelloImage setBackground(String value) { this.background = value; return this; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + + @Route("/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("/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("/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("/jwt-invalidate") + public static class InvalidateLastAccessToken implements IReturn + { + + private static Object responseType = EmptyResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route("/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("/metadatatest") @@ -322,6 +362,24 @@ public static class TextFileTest public TextFileTest setAsAttachment(Boolean value) { this.asAttachment = value; return this; } } + @Route("/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("/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("/hello") // @Route("/hello/{Name}") public static class Hello implements IReturn @@ -339,6 +397,21 @@ public static class Hello implements IReturn 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; @@ -386,20 +459,26 @@ public static class HelloWithEnum public HelloWithEnum setEnumFlags(EnumFlags value) { this.enumFlags = value; return this; } } - public static class HelloExternal + 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 HelloExternal setName(String value) { this.name = value; return this; } + 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") + @Api(Description="AllowedAttributes Description") + @ApiResponse(Description="Your request was not understood", StatusCode=400) @DataContract public static class AllowedAttributes { @@ -408,7 +487,7 @@ public static class AllowedAttributes */ @DataMember(Name="Aliased") @SerializedName("Aliased") - @ApiMember(ParameterType="path", Description="Range Description", DataType="double", IsRequired=true) + @ApiMember(DataType="double", Description="Range Description", IsRequired=true, ParameterType="path") public Double range = null; public Double getRange() { return range; } @@ -432,7 +511,17 @@ public static class HelloAllTypes implements IReturn public Object getResponseType() { return responseType; } } - public static class AllTypes + 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; @@ -513,6 +602,8 @@ public static class AllTypes 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 HelloString implements IReturn @@ -837,6 +928,54 @@ public static class GetRequest2 implements IReturn>, IGet public Object getResponseType() { return responseType; } } + @Route("/sendjson") + public static class SendJson implements IReturn + { + public Integer id = null; + public String name = 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; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route("/sendtext") + public static class SendText implements IReturn + { + public Integer id = null; + public String name = null; + public String contentType = 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; } + private static Object responseType = String.class; + public Object getResponseType() { return responseType; } + } + + @Route("/sendraw") + public static class SendRaw implements IReturn> + { + public Integer id = null; + public String name = null; + public String contentType = 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; } + private static Object responseType = new TypeToken>(){}.getType(); + public Object getResponseType() { return responseType; } + } + public static class SendDefault implements IReturn { public Integer id = null; @@ -888,6 +1027,14 @@ public static class SendPut implements IReturn, IPut 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("/session") public static class GetSession implements IReturn { @@ -907,6 +1054,44 @@ public static class UpdateSession implements IReturn public Object getResponseType() { return responseType; } } + @Route("/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; @@ -917,6 +1102,16 @@ public static class StoreLogs implements IReturn 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("/testauth") public static class TestAuth implements IReturn { @@ -925,6 +1120,44 @@ public static class TestAuth implements IReturn 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("/testdata/AllTypes") + public static class TestDataAllTypes implements IReturn + { + + private static Object responseType = AllTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route("/testdata/AllCollectionTypes") + public static class TestDataAllCollectionTypes implements IReturn + { + + private static Object responseType = AllCollectionTypes.class; + public Object getResponseType() { return responseType; } + } + + @Route("/custom") + // @Route("/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("/void-response") public static class TestVoidResponse { @@ -1024,20 +1257,39 @@ public static class EchoCollections implements IReturn public Object getResponseType() { return responseType; } } + @Route("/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; } + } + @Route("/auth") // @Route("/auth/{provider}") - // @Route("/authenticate") - // @Route("/authenticate/{provider}") @DataContract public static class Authenticate implements IReturn, IPost { @@ -1062,31 +1314,40 @@ public static class Authenticate implements IReturn, IPost @DataMember(Order=7) public Boolean rememberMe = null; - @DataMember(Order=8) - @SerializedName("continue") public String Continue = null; - @DataMember(Order=9) - public String nonce = null; + public String errorView = null; @DataMember(Order=10) - public String uri = null; + public String nonce = null; @DataMember(Order=11) - public String response = null; + public String uri = null; @DataMember(Order=12) - public String qop = null; + public String response = null; @DataMember(Order=13) - public String nc = null; + public String qop = null; @DataMember(Order=14) - public String cnonce = null; + public String nc = null; @DataMember(Order=15) - public Boolean useTokenCookie = null; + public String cnonce = null; @DataMember(Order=16) + public Boolean useTokenCookie = null; + + @DataMember(Order=17) + public String accessToken = null; + + @DataMember(Order=18) + public String accessTokenSecret = null; + + @DataMember(Order=19) + public String scope = null; + + @DataMember(Order=20) public HashMap meta = null; public String getProvider() { return provider; } @@ -1103,8 +1364,8 @@ public static class Authenticate implements IReturn, IPost 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 getContinue() { return Continue; } - public Authenticate setContinue(String value) { this.Continue = value; return this; } + public String getErrorView() { return errorView; } + public Authenticate setErrorView(String value) { this.errorView = value; return this; } public String getNonce() { return nonce; } public Authenticate setNonce(String value) { this.nonce = value; return this; } public String getUri() { return uri; } @@ -1119,6 +1380,12 @@ public static class Authenticate implements IReturn, IPost public Authenticate setCnonce(String value) { this.cnonce = value; return this; } public Boolean isUseTokenCookie() { return useTokenCookie; } public Authenticate setUseTokenCookie(Boolean value) { this.useTokenCookie = 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 getScope() { return scope; } + public Authenticate setScope(String value) { this.scope = value; return this; } public HashMap getMeta() { return meta; } public Authenticate setMeta(HashMap value) { this.meta = value; return this; } private static Object responseType = AuthenticateResponse.class; @@ -1137,6 +1404,9 @@ public static class AssignRoles implements IReturn, IPost @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; } @@ -1144,6 +1414,8 @@ public static class AssignRoles implements IReturn, IPost 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; } } @@ -1160,6 +1432,9 @@ public static class UnAssignRoles implements IReturn, IPo @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; } @@ -1167,11 +1442,54 @@ public static class UnAssignRoles implements IReturn, IPo 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 QueryPocoBase extends QueryBase_1 implements IReturn> + @Route("/session-to-token") + @DataContract + public static class ConvertSessionToToken implements IReturn, 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; } + private static Object responseType = ConvertSessionToTokenResponse.class; + public Object getResponseType() { return responseType; } + } + + @Route("/access-token") + @DataContract + public static class GetAccessToken implements IReturn, IPost + { + @DataMember(Order=1) + public String refreshToken = null; + + @DataMember(Order=2) + public Boolean useTokenCookie = null; + + @DataMember(Order=3) + public HashMap meta = null; + + public String getRefreshToken() { return refreshToken; } + public GetAccessToken setRefreshToken(String value) { this.refreshToken = value; return this; } + public Boolean isUseTokenCookie() { return useTokenCookie; } + public GetAccessToken setUseTokenCookie(Boolean value) { this.useTokenCookie = 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; } + } + + public static class QueryPocoBase extends QueryDb_1 implements IReturn> { public Integer id = null; @@ -1181,7 +1499,7 @@ public static class QueryPocoBase extends QueryBase_1 public Object getResponseType() { return responseType; } } - public static class QueryPocoIntoBase extends QueryBase_2 implements IReturn> + public static class QueryPocoIntoBase extends QueryDb_2 implements IReturn> { public Integer id = null; @@ -1191,8 +1509,8 @@ public static class QueryPocoIntoBase extends QueryBase_2 implements IReturn> + @Route(Path="/rockstars", Verbs="GET") + public static class QueryRockstars extends QueryDb_1 implements IReturn> { private static Object responseType = new TypeToken>(){}.getType(); @@ -1220,19 +1538,19 @@ public static class ThrowTypeResponse public static class ThrowValidationResponse { + public ResponseStatus responseStatus = null; public Integer age = null; public String required = null; public String email = null; - public ResponseStatus responseStatus = null; + public ResponseStatus getResponseStatus() { return responseStatus; } + public ThrowValidationResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } 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 @@ -1243,47 +1561,66 @@ public static class ThrowBusinessErrorResponse public ThrowBusinessErrorResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } - public static class ExternalOperationResponse + public static class Account { - public String result = null; + public String name = null; - public String getResult() { return result; } - public ExternalOperationResponse setResult(String value) { this.result = value; return this; } + public String getName() { return name; } + public Account setName(String value) { this.name = value; return this; } } - public static class ExternalOperation2Response + public static class Project { - public ExternalType externalType = null; + public String account = null; + public String name = null; - public ExternalType getExternalType() { return externalType; } - public ExternalOperation2Response setExternalType(ExternalType value) { this.externalType = value; return this; } + 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 ExternalReturnTypeResponse + public static class SecuredResponse { - public ExternalEnum3 externalEnum3 = null; + public String result = null; + public ResponseStatus responseStatus = null; - public ExternalEnum3 getExternalEnum3() { return externalEnum3; } - public ExternalReturnTypeResponse setExternalEnum3(ExternalEnum3 value) { this.externalEnum3 = value; return this; } + 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 Account + public static class CreateJwtResponse { - public String name = null; + public String token = null; + public ResponseStatus responseStatus = null; - public String getName() { return name; } - public Account setName(String value) { this.name = value; return this; } + 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 Project + public static class CreateRefreshJwtResponse { - public String account = null; - public String name = null; + public String token = null; + public ResponseStatus responseStatus = 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 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; } + } + + @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 MetadataTestResponse @@ -1329,6 +1666,19 @@ public static class HelloResponse 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; @@ -1343,6 +1693,14 @@ public static class HelloAllTypesResponse 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 { @@ -1484,6 +1842,36 @@ public static class GetSessionResponse 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; @@ -1515,8 +1903,37 @@ public static class TestAuthResponse public TestAuthResponse setResponseStatus(ResponseStatus value) { this.responseStatus = 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; } + } + @DataContract - public static class AuthenticateResponse + public static class AuthenticateResponse implements IHasSessionId, IHasBearerToken { @DataMember(Order=1) public String userId = null; @@ -1537,9 +1954,21 @@ public static class AuthenticateResponse public String bearerToken = null; @DataMember(Order=7) - public ResponseStatus responseStatus = null; + public String refreshToken = null; @DataMember(Order=8) + public String profileUrl = null; + + @DataMember(Order=9) + public ArrayList roles = null; + + @DataMember(Order=10) + public ArrayList permissions = null; + + @DataMember(Order=11) + public ResponseStatus responseStatus = null; + + @DataMember(Order=12) public HashMap meta = null; public String getUserId() { return userId; } @@ -1554,6 +1983,14 @@ public static class AuthenticateResponse 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 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 ResponseStatus getResponseStatus() { return responseStatus; } public AuthenticateResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } public HashMap getMeta() { return meta; } @@ -1570,12 +2007,17 @@ public static class AssignRolesResponse 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; } } @@ -1590,16 +2032,66 @@ public static class UnAssignRolesResponse 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; } } + @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; } + } + + @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; } + } + @DataContract public static class QueryResponse { @@ -1630,119 +2122,376 @@ public static class QueryResponse public QueryResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } - public static enum ExternalEnum + public static interface IAuthTokens { - Foo, - Bar, - Baz; + 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 ExternalType + @DataContract + public static class AuthUserSession { - public ExternalEnum2 externalEnum2 = null; - - public ExternalEnum2 getExternalEnum2() { return externalEnum2; } - public ExternalType setExternalEnum2(ExternalEnum2 value) { this.externalEnum2 = value; return this; } - } + @DataMember(Order=1) + public String referrerUrl = null; - public static enum ExternalEnum3 - { - Un, - Deux, - Trois; - } + @DataMember(Order=2) + public String id = null; - 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; } - } + @DataMember(Order=3) + public String userAuthId = null; - @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; } - } + @DataMember(Order=4) + public String userAuthName = null; - public static class NestedClass - { - public String value = null; - - public String getValue() { return value; } - public NestedClass setValue(String value) { this.value = value; return this; } - } + @DataMember(Order=5) + public String userName = null; - public static class ListResult - { - public String result = null; - - public String getResult() { return result; } - public ListResult setResult(String value) { this.result = value; return this; } - } + @DataMember(Order=6) + public String twitterUserId = null; - public static class ArrayResult - { - public String result = null; - - public String getResult() { return result; } - public ArrayResult setResult(String value) { this.result = value; return this; } - } + @DataMember(Order=7) + public String twitterScreenName = null; - public static enum EnumType - { - Value1, - Value2; - } + @DataMember(Order=8) + public String facebookUserId = null; - @Flags() - public static enum EnumFlags - { - @SerializedName("1") Value1(1), - @SerializedName("2") Value2(2), - @SerializedName("4") Value3(4); + @DataMember(Order=9) + public String facebookUserName = null; - private final int value; - EnumFlags(final int intValue) { value = intValue; } - public int getValue() { return value; } - } + @DataMember(Order=10) + public String firstName = null; - public static class AllCollectionTypes + @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; + + 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 static class MetadataTestChild { - 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 String name = null; + public ArrayList results = 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 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 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 + { + @SerializedName("1") Value1(1), + @SerializedName("2") Value2(2), + @SerializedName("4") Value3(4); + + private final int value; + EnumFlags(final int intValue) { value = intValue; } + public int getValue() { return value; } } public static class KeyValuePair @@ -1767,6 +2516,89 @@ public static class SubType 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; @@ -1926,7 +2758,24 @@ public static class Logger public Logger setDevices(ArrayList value) { this.devices = value; return this; } } - 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 QueryDb_1 extends QueryBase { } @@ -1942,7 +2791,7 @@ public static class OnlyDefinedInGenericType public OnlyDefinedInGenericType setName(String value) { this.name = value; return this; } } - public static class QueryBase_2 extends QueryBase + public static class QueryDb_2 extends QueryBase { } @@ -1969,30 +2818,6 @@ public static class OnlyDefinedInGenericTypeInto public OnlyDefinedInGenericTypeInto setName(String value) { this.name = 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 enum ExternalEnum2 - { - Uno, - Due, - Tre; - } - public static class MetadataTestNestedChild { public String name = null; @@ -2020,234 +2845,6 @@ public static class TypesGroup } - 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 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 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 ArrayList getProviderOAuthAccess() { return providerOAuthAccess; } - public AuthUserSession setProviderOAuthAccess(ArrayList value) { this.providerOAuthAccess = value; return this; } - } - public static class Device { public Long id = null; @@ -2265,6 +2862,7 @@ public static class Device public Device setChannels(ArrayList value) { this.channels = value; return this; } } + @DataContract public static class QueryBase { @DataMember(Order=1) From 1d4bf8b992ff52ffacc3c1c044d3d37da1959c82 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 1 Mar 2021 02:54:17 +0800 Subject: [PATCH 014/101] Update AndroidClient --- .../servicestack/client/GetAccessToken.java | 26 +++++++ .../client/GetAccessTokenResponse.java | 23 +++++++ .../client/JsonServiceClient.java | 68 +++++++++++++++++-- .../client/RefreshTokenException.java | 7 ++ .../servicestack/client/ServiceClient.java | 9 +++ 5 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessToken.java create mode 100644 src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessTokenResponse.java create mode 100644 src/AndroidClient/android/src/main/java/net/servicestack/client/RefreshTokenException.java diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessToken.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessToken.java new file mode 100644 index 00000000..e85ac084 --- /dev/null +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessToken.java @@ -0,0 +1,26 @@ +package net.servicestack.client; + +import java.util.HashMap; + +@Route("/access-token") +@DataContract +public class GetAccessToken implements IReturn, IPost +{ + @DataMember(Order=1) + public String refreshToken = null; + + @DataMember(Order=2) + public Boolean useTokenCookie = null; + + @DataMember(Order=3) + public HashMap meta = null; + + public String getRefreshToken() { return refreshToken; } + public GetAccessToken setRefreshToken(String value) { this.refreshToken = value; return this; } + public Boolean isUseTokenCookie() { return useTokenCookie; } + public GetAccessToken setUseTokenCookie(Boolean value) { this.useTokenCookie = 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; } +} diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessTokenResponse.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessTokenResponse.java new file mode 100644 index 00000000..09d563a1 --- /dev/null +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/GetAccessTokenResponse.java @@ -0,0 +1,23 @@ +package net.servicestack.client; + +import java.util.HashMap; + +@DataContract +public 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; } +} \ No newline at end of file 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 38e34408..fe002913 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 @@ -26,6 +26,7 @@ import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.Date; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -39,6 +40,7 @@ public class JsonServiceClient implements ServiceClient { String userName; String password; String bearerToken; + String refreshToken; Integer timeoutMs; public ConnectionFilter RequestFilter; @@ -179,7 +181,7 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt if (bearerToken != null) { req.setRequestProperty(HttpHeaders.Authorization, "Bearer " + bearerToken); req.setRequestProperty("X-Auth", "Bearer"); // HttpURLConnection doesn't allow re-reading Authorization Header - } else if (forceAuthentication || alwaysSendBasicAuthHeaders) { + } else if (getTokenCookie() == null && (forceAuthentication || alwaysSendBasicAuthHeaders)) { req.setRequestProperty(HttpHeaders.Authorization, "Basic " + Utils.toBase64String(userName + ":" + password)); req.setRequestProperty("X-Auth", "Basic"); // HttpURLConnection doesn't allow re-reading Authorization Header } @@ -208,12 +210,11 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt } } - private static boolean shouldAuthenticate(HttpURLConnection req, String userName, String password){ + private static boolean shouldAuthenticate(HttpURLConnection req, boolean hasAuthInfo){ try { return req.getResponseCode() == 401 - && req.getRequestProperty("X-Auth") == null //only auth if auth never attempted - && userName != null - && password != null; + && req.getRequestProperty("X-Auth") == null //only auth if auth never attempted + && hasAuthInfo; } catch (IOException e) { return false; } @@ -308,6 +309,21 @@ public void setTokenCookie(String value) { setCookie("ss-tok", value, (long) (365 * 24 * 60 * 60)); //1 year } + @Override + public void setRefreshToken(String bearerToken) { + this.refreshToken = bearerToken; + } + + @Override + public String getRefreshToken() { + return refreshToken; + } + + @Override + public void setRefreshTokenCookie(String value) { + setCookie("ss-reftok", value, (long) (365 * 24 * 60 * 60)); //1 year + } + @Override public void setCredentials(String userName, String password) { this.userName = userName; @@ -370,8 +386,26 @@ public TResponse send(String requestUrl, String httpMethod, byte[] r if (responseCode >= 400){ boolean success = false; - if (shouldAuthenticate(req, userName, password)){ + boolean hasRefreshTokenCookie = getRefreshTokenCookie() != null; + boolean hasRefreshToken = refreshToken != null || hasRefreshTokenCookie; + if (shouldAuthenticate(req, (userName !=null && password != null) + || bearerToken != null + || hasRefreshToken)) { req.disconnect(); + + if (hasRefreshToken) { + GetAccessToken refreshRequest = new GetAccessToken() + .setRefreshToken(refreshToken); + try { + GetAccessTokenResponse response = post(refreshRequest); + if (response.getAccessToken() != null) { + this.setBearerToken(response.getAccessToken()); + } + } catch (WebServiceException e) { + throw new RefreshTokenException(e); + } + } + req = createRequest(requestUrl, httpMethod, requestBody, requestType, true); success = req.getResponseCode() < 400; @@ -583,6 +617,28 @@ public HttpURLConnection delete(String path) { return createRequest(resolveUrl(path), HttpMethods.Delete, null, null); } + public List getCookies() { + CookieManager cookieManager = (CookieManager) CookieHandler.getDefault(); + return cookieManager.getCookieStore().getCookies(); + } + + public String getCookieValue(String name) { + CookieManager cookieManager = (CookieManager) CookieHandler.getDefault(); + for (HttpCookie cookie : cookieManager.getCookieStore().getCookies()) { + if (cookie.getName().equals(name)) { + return cookie.getValue(); + } + } + return null; + } + + public String getTokenCookie() { + return getCookieValue("ss-tok"); + } + public String getRefreshTokenCookie() { + return getCookieValue("ss-reftok"); + } + @Override public void setCookie(String name, String value) { setCookie(name, value, null); diff --git a/src/AndroidClient/android/src/main/java/net/servicestack/client/RefreshTokenException.java b/src/AndroidClient/android/src/main/java/net/servicestack/client/RefreshTokenException.java new file mode 100644 index 00000000..c02d54a0 --- /dev/null +++ b/src/AndroidClient/android/src/main/java/net/servicestack/client/RefreshTokenException.java @@ -0,0 +1,7 @@ +package net.servicestack.client; + +public class RefreshTokenException extends RuntimeException { + public RefreshTokenException(WebServiceException innerException) { + super(innerException.getMessage(), innerException); + } +} 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 1272b2b3..6ff6affa 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 @@ -9,9 +9,15 @@ public interface ServiceClient { boolean getAlwaysSendBasicAuthHeaders(); + void setBearerToken(String value); String getBearerToken(); void setTokenCookie(String value); + + void setRefreshToken(String bearerToken); + String getRefreshToken(); + void setRefreshTokenCookie(String value); + void setAlwaysSendBasicAuthHeaders(boolean value); void setCredentials(String userName, String password); @@ -51,4 +57,7 @@ public interface ServiceClient { void setCookie(String name, String value); void setCookie(String name, String value, Long expiresInSecs); void clearCookies(); + String getCookieValue(String name); + String getTokenCookie(); + String getRefreshTokenCookie(); } From 2ab618e89f4616af585e62990a45bbaac91b24a2 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 1 Mar 2021 18:08:19 +0800 Subject: [PATCH 015/101] Merge test dtos to use test.servicestack.net + https://techstacks.io --- .../src/androidTest/java/chat/chatdtos.java | 273 -- .../servicestack/android/ApplicationTest.java | 2 +- .../android/ServerEventClientTests.java | 101 +- .../android/TestGlobalReceiver.java | 3 +- .../android/TestJavaScriptReceiver.java | 5 +- .../android/TestNamedReceiver.java | 2 +- .../techstacks/TechStacksServiceTests.java | 4 +- .../TechStacksServiceTestsAsync.java | 2 +- .../servicestack/android/techstacks/dtos.java | 729 ++--- .../net/servicestack/android/test/dtos.java | 2342 +++++++++++------ .../servicestack/net/androidchat/App.java | 2 +- .../servicestack/net/androidchat/dtos.java | 2 +- .../net/androidclient/techstacksdtos.java | 2 +- .../client/src/test/java/chat/chatdtos.java | 2 +- .../client/ServerEventClientTests.java | 95 +- .../client/TechStacksServiceTests.java | 2 +- .../servicestack/client/TestServiceTests.java | 2 +- .../client/src/test/resources/overview.json | 2 +- .../techstacks/TechStacksServiceTests.kt | 2 +- .../techstacks/TechStacksServiceTestsAsync.kt | 2 +- .../kotlin/src/main/assets/overview.json | 2 +- .../java/servicestack/net/techstacks/App.java | 2 +- .../java/servicestack/net/techstacks/dto.java | 2 +- 23 files changed, 2053 insertions(+), 1529 deletions(-) delete mode 100644 src/AndroidClient/android/src/androidTest/java/chat/chatdtos.java diff --git a/src/AndroidClient/android/src/androidTest/java/chat/chatdtos.java b/src/AndroidClient/android/src/androidTest/java/chat/chatdtos.java deleted file mode 100644 index 1189595a..00000000 --- a/src/AndroidClient/android/src/androidTest/java/chat/chatdtos.java +++ /dev/null @@ -1,273 +0,0 @@ -/* Options: -Date: 2017-02-12 03:54:05 -Version: 4.00 -Tip: To override a DTO option, remove "//" prefix before updating -BaseUrl: http://chat.servicestack.net - -Package: chat -GlobalNamespace: chatdtos -//AddPropertyAccessors: True -//SettersReturnThis: True -//AddServiceStackTypes: True -//AddResponseStatus: False -//AddDescriptionAsComments: True -//AddImplicitVersion: -//IncludeTypes: -ExcludeTypes: Authenticate,AuthenticateResponse,AssignRoles,AssignRolesResponse,UnAssignRoles,UnAssignRolesResponse -//TreatTypesAsStrings: -//DefaultImports: java.math.*,java.util.*,net.servicestack.client.*,com.google.gson.annotations.*,com.google.gson.reflect.* -*/ - -package chat; - -import java.math.*; -import java.util.*; -import net.servicestack.client.*; -import com.google.gson.annotations.*; -import com.google.gson.reflect.*; - -public class chatdtos -{ - - @Route("/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("/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("/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("/reset") - public static class ClearChatHistory implements IReturnVoid - { - - } - - @Route("/reset-serverevents") - public static class ResetServerEvents implements IReturnVoid - { - - } - - @Route("/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("/account") - public static class GetUserDetails implements IReturn - { - - private static Object responseType = GetUserDetailsResponse.class; - public Object getResponseType() { return responseType; } - } - - 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 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; } - } - -} diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ApplicationTest.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ApplicationTest.java index 70331d83..2d1b0725 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ApplicationTest.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ApplicationTest.java @@ -26,7 +26,7 @@ @RunWith(AndroidJUnit4.class) public class ApplicationTest { - AndroidServiceClient client = new AndroidServiceClient("http://techstacks.io"); + AndroidServiceClient client = new AndroidServiceClient("https://techstacks.io"); @Test public void test_Can_download_image_bytes(){ diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ServerEventClientTests.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ServerEventClientTests.java index 952788dd..d7978be3 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ServerEventClientTests.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/ServerEventClientTests.java @@ -2,32 +2,18 @@ import android.os.Build; import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertTrue; +import junit.framework.TestCase; +import static net.servicestack.android.test.dtos.*; import static org.junit.Assert.assertArrayEquals; import net.servicestack.client.JsonUtils; import net.servicestack.client.Log; -import net.servicestack.client.Utils; -import net.servicestack.client.sse.ExceptionCallback; -import net.servicestack.client.sse.GetEventSubscribers; -import net.servicestack.client.sse.ServerEventCallback; -import net.servicestack.client.sse.ServerEventConnect; -import net.servicestack.client.sse.ServerEventConnectCallback; -import net.servicestack.client.sse.ServerEventJoin; -import net.servicestack.client.sse.ServerEventLeave; -import net.servicestack.client.sse.ServerEventMessage; -import net.servicestack.client.sse.ServerEventMessageCallback; -import net.servicestack.client.sse.ServerEventUser; -import net.servicestack.client.sse.ServerEventsClient; -import net.servicestack.client.sse.SingletonInstanceResolver; +import net.servicestack.client.sse.*; import net.servicestack.func.Action; import net.servicestack.func.Func; import net.servicestack.func.Predicate; +import org.junit.Test; +import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.HashMap; @@ -35,13 +21,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import static chat.chatdtos.ChatMessage; -import static chat.chatdtos.CustomType; -import static chat.chatdtos.PostChatToChannel; -import static chat.chatdtos.PostObjectToChannel; -import static chat.chatdtos.PostRawToChannel; -import static chat.chatdtos.ResetServerEvents; -import static chat.chatdtos.SetterType; /** * Created by mythz on 2/10/2017. @@ -49,7 +28,7 @@ @android.support.annotation.RequiresApi(api = Build.VERSION_CODES.KITKAT) @RunWith(AndroidJUnit4.class) -public class ServerEventClientTests { +public class ServerEventClientTests extends TestCase { public ServerEventClientTests() { Log.setInstance(new AndroidLogProvider("ZZZ", true)); @@ -65,7 +44,7 @@ public ServerEventsClient createServerEventsClient(String baseUrl, String... cha public void Can_connect_to_ServerEventsStream() throws Exception { final CountDownLatch signal = new CountDownLatch(1); - try (ServerEventsClient client = createServerEventsClient("http://chat.servicestack.net", "home") + try (ServerEventsClient client = createServerEventsClient("https://chat.netcore.io", "home") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -82,13 +61,13 @@ public void execute(ServerEventConnect e) { public void Does_fire_onJoin_events() throws Exception { final CountDownLatch signal = new CountDownLatch(1); - try(ServerEventsClient client = createServerEventsClient("http://chat.servicestack.net", "home")) + try(ServerEventsClient client = createServerEventsClient("https://chat.netcore.io", "home")) { client .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { - assertTrue(e.getHeartbeatUrl().startsWith("http://chat.servicestack.net")); + assertTrue(e.getHeartbeatUrl().startsWith("https://chat.netcore.io")); } }) .setOnCommand(new ServerEventMessageCallback() { @@ -114,7 +93,7 @@ public void Does_fire_onJoin_events_for_multiple_Channels() throws Exception { final String[] channels = new String[] { "A", "B", "C" }; final List joinMsgs = new ArrayList<>(); - try (ServerEventsClient client = createServerEventsClient("http://chat.servicestack.net", channels)) + try (ServerEventsClient client = createServerEventsClient("https://chat.netcore.io", channels)) { client .setOnCommand(new ServerEventMessageCallback() { @@ -143,7 +122,7 @@ public void execute(ServerEventMessage e) { private void clearPreviousRun(String[] channels) throws Exception { final CountDownLatch signal = new CountDownLatch(1); - try (ServerEventsClient client = createServerEventsClient("http://chat.servicestack.net", channels) + try (ServerEventsClient client = createServerEventsClient("https://chat.netcore.io", channels) .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -170,7 +149,7 @@ public void Does_fire_all_callbacks() throws Exception { final List commands = new ArrayList<>(); final List errors = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -213,7 +192,7 @@ public void execute(Exception e) { connectMsgs.clear(); commands.clear(); - try(ServerEventsClient client2 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client2 = createServerEventsClient("https://chat.netcore.io") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -297,7 +276,7 @@ public void Does_receive_messages() throws Exception { final List msgs2 = new ArrayList<>(); try ( - ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -317,7 +296,7 @@ public void execute(ServerEventMessage e) { } }); - ServerEventsClient client2 = createServerEventsClient("http://chat.servicestack.net") + ServerEventsClient client2 = createServerEventsClient("https://chat.netcore.io") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -399,7 +378,7 @@ public void Does_send_multiple_heartbeats() throws Exception { final CountDownLatch signal = new CountDownLatch(1); final List heartbeats = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -427,7 +406,7 @@ public void Does_reconnect_on_lost_connection() throws Exception { final List connectMsgs = new ArrayList<>(); final List msgs1 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -454,7 +433,7 @@ public void execute(ServerEventMessage e) { client1.getServiceClient().post(new ResetServerEvents()); - try(ServerEventsClient client2 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client2 = createServerEventsClient("https://chat.netcore.io") .setOnConnect(new ServerEventConnectCallback() { @Override public void execute(ServerEventConnect e) { @@ -487,7 +466,7 @@ public void Does_send_message_to_Handler() throws Exception { final List chatMsgs = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .registerHandler("chat", new ServerEventCallback() { @Override public void execute(ServerEventsClient client, ServerEventMessage e) { @@ -522,7 +501,7 @@ public void execute(ServerEventsClient client, ServerEventMessage e) { public void Does_send_message_to_named_receiver() throws Exception { final List msgs1 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .registerNamedReceiver("test", TestNamedReceiver.class) .setOnMessage(new ServerEventMessageCallback() { @Override @@ -592,7 +571,7 @@ public void execute(ServerEventMessage e) { public void Does_send_message_to_global_receiver() throws Exception { final List msgs1 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .registerReceiver(TestGlobalReceiver.class) .setOnMessage(new ServerEventMessageCallback() { @Override @@ -622,7 +601,7 @@ public void execute(ServerEventMessage e) { public void Does_set_properties_on_global_receiver() throws Exception { final List msgs1 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .registerReceiver(TestGlobalReceiver.class) .setOnMessage(new ServerEventMessageCallback() { @Override @@ -652,7 +631,7 @@ public void execute(ServerEventMessage e) { public void Does_send_raw_string_messages() throws Exception { final List msgs1 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .registerReceiver(TestJavaScriptReceiver.class) .registerNamedReceiver("css", TestJavaScriptReceiver.class) .setOnMessage(new ServerEventMessageCallback() { @@ -717,7 +696,7 @@ public void execute(ServerEventMessage e) { public void Can_reuse_same_instance() throws Exception { final List msgs1 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .registerReceiver(TestJavaScriptReceiver.class) .registerNamedReceiver("css", TestJavaScriptReceiver.class) .setResolver(new SingletonInstanceResolver()) @@ -761,7 +740,7 @@ public void Does_receive_messages_on_to_clients_subscribed_on_multiple_channels( final List msgsABC = new ArrayList<>(); final List msgsABCD = new ArrayList<>(); - try(ServerEventsClient clientA = createServerEventsClient("http://chat.servicestack.net", "A") + try(ServerEventsClient clientA = createServerEventsClient("https://chat.netcore.io", "A") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -769,7 +748,7 @@ public void execute(ServerEventMessage e) { } }) .start(); - ServerEventsClient clientAB = createServerEventsClient("http://chat.servicestack.net", "A", "B") + ServerEventsClient clientAB = createServerEventsClient("https://chat.netcore.io", "A", "B") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -777,7 +756,7 @@ public void execute(ServerEventMessage e) { } }) .start(); - ServerEventsClient clientABC = createServerEventsClient("http://chat.servicestack.net", "A", "B", "C") + ServerEventsClient clientABC = createServerEventsClient("https://chat.netcore.io", "A", "B", "C") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -785,7 +764,7 @@ public void execute(ServerEventMessage e) { } }) .start(); - ServerEventsClient clientABCD = createServerEventsClient("http://chat.servicestack.net", "A", "B", "C", "D") + ServerEventsClient clientABCD = createServerEventsClient("https://chat.netcore.io", "A", "B", "C", "D") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -843,7 +822,7 @@ public void Does_receive_all_join_and_leave_messages() throws Exception { final List leaveB = new ArrayList<>(); final List leaveAB = new ArrayList<>(); - try(ServerEventsClient clientA = createServerEventsClient("http://chat.servicestack.net", "A") + try(ServerEventsClient clientA = createServerEventsClient("https://chat.netcore.io", "A") .setOnCommand(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -854,7 +833,7 @@ public void execute(ServerEventMessage e) { } } }); - ServerEventsClient clientB = createServerEventsClient("http://chat.servicestack.net", "B") + ServerEventsClient clientB = createServerEventsClient("https://chat.netcore.io", "B") .setOnCommand(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -865,7 +844,7 @@ public void execute(ServerEventMessage e) { } } }); - ServerEventsClient clientAB = createServerEventsClient("http://chat.servicestack.net", "A", "B") + ServerEventsClient clientAB = createServerEventsClient("https://chat.netcore.io", "A", "B") .setOnCommand(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -935,7 +914,7 @@ public void MultiChannel_Does_receive_all_join_and_leave_messages() throws Excep final List leaveB = new ArrayList<>(); final List leaveAB = new ArrayList<>(); - try(ServerEventsClient clientAB = createServerEventsClient("http://chat.servicestack.net", "A", "B") + try(ServerEventsClient clientAB = createServerEventsClient("https://chat.netcore.io", "A", "B") .setOnCommand(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -946,7 +925,7 @@ public void execute(ServerEventMessage e) { } } }); - ServerEventsClient clientA = createServerEventsClient("http://chat.servicestack.net", "A") + ServerEventsClient clientA = createServerEventsClient("https://chat.netcore.io", "A") .setOnCommand(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -957,7 +936,7 @@ public void execute(ServerEventMessage e) { } } }); - ServerEventsClient clientB = createServerEventsClient("http://chat.servicestack.net", "B") + ServerEventsClient clientB = createServerEventsClient("https://chat.netcore.io", "B") .setOnCommand(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -997,7 +976,7 @@ public void Can_subscribe_to_channels_whilst_connected() throws Exception { final List msgs1 = new ArrayList<>(); final List msgs2 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net", "A") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io", "A") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -1005,7 +984,7 @@ public void execute(ServerEventMessage e) { } }) .start(); - ServerEventsClient client2 = createServerEventsClient("http://chat.servicestack.net", "B") + ServerEventsClient client2 = createServerEventsClient("https://chat.netcore.io", "B") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -1060,7 +1039,7 @@ public void Can_unsubscribe_from_channels_whilst_connected() throws Exception { final List msgs1 = new ArrayList<>(); final List msgs2 = new ArrayList<>(); - try(ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net", "A","B","C") + try(ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io", "A","B","C") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -1069,7 +1048,7 @@ public void execute(ServerEventMessage e) { }) .start() .waitTillConnected(); - ServerEventsClient client2 = createServerEventsClient("http://chat.servicestack.net", "B","C") + ServerEventsClient client2 = createServerEventsClient("https://chat.netcore.io", "B","C") .setOnMessage(new ServerEventMessageCallback() { @Override public void execute(ServerEventMessage e) { @@ -1130,7 +1109,7 @@ public void apply(ServerEventMessage e) { } }; - try (ServerEventsClient client1 = createServerEventsClient("http://chat.servicestack.net") + try (ServerEventsClient client1 = createServerEventsClient("https://chat.netcore.io") .addListener("customEvent", handler) .addListener("customEvent", new Action() { @Override @@ -1140,7 +1119,7 @@ public void apply(ServerEventMessage e) { }) .start() .waitTillConnected(); - ServerEventsClient client2 = createServerEventsClient("http://chat.servicestack.net") + ServerEventsClient client2 = createServerEventsClient("https://chat.netcore.io") .start() .waitTillConnected()) { diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestGlobalReceiver.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestGlobalReceiver.java index 19fe2d88..26796172 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestGlobalReceiver.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestGlobalReceiver.java @@ -1,11 +1,10 @@ package net.servicestack.android; +import static net.servicestack.android.test.dtos.*; import net.servicestack.client.JsonUtils; import net.servicestack.client.sse.ServerEventMessage; import net.servicestack.client.sse.ServerEventReceiver; -import static chat.chatdtos.*; - /** * Created by mythz on 2/12/2017. */ diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestJavaScriptReceiver.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestJavaScriptReceiver.java index 643f7ceb..85f239ea 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestJavaScriptReceiver.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestJavaScriptReceiver.java @@ -1,12 +1,9 @@ package net.servicestack.android; +import static net.servicestack.android.test.dtos.*; import net.servicestack.client.sse.ServerEventMessage; import net.servicestack.client.sse.ServerEventReceiver; -import chat.chatdtos; - -import static chat.chatdtos.*; - /** * Created by mythz on 2/12/2017. */ diff --git a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestNamedReceiver.java b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestNamedReceiver.java index 984cf1c0..e2074d9e 100644 --- a/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestNamedReceiver.java +++ b/src/AndroidClient/android/src/androidTest/java/net/servicestack/android/TestNamedReceiver.java @@ -1,10 +1,10 @@ package net.servicestack.android; +import static net.servicestack.android.test.dtos.*; import net.servicestack.client.JsonUtils; import net.servicestack.client.sse.ServerEventMessage; import net.servicestack.client.sse.ServerEventReceiver; -import static chat.chatdtos.*; /** * Created by mythz on 2/11/2017. 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 17b2a2cf..84deb493 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 @@ -150,7 +150,7 @@ public void test_Can_deserialize_Full_Option() { @Test public void test_does_handle_auth_failure() { - JsonServiceClient techStacksClient = new JsonServiceClient("http://techstacks.io/"); + JsonServiceClient techStacksClient = new JsonServiceClient("https://techstacks.io/"); int errorCode = 0; try { LockTechStack request = new LockTechStack(); @@ -197,7 +197,7 @@ public void test_Can_deserialize_Overview() throws IOException { assertEquals("TechStacks Website", techstacks.getName()); assertEquals("ServiceStack", techstacks.getVendorName()); assertTrue(techstacks.description.startsWith("This Website! ")); - assertEquals("http://techstacks.io", techstacks.getAppUrl()); + assertEquals("https://techstacks.io", techstacks.getAppUrl()); assertEquals("https://raw.githubusercontent.com/ServiceStack/Assets/master/img/livedemos/techstacks/screenshots/techstacks.png", techstacks.getScreenshotUrl()); assertEquals(Utils.parseDate("2015-01-01T17:33:58.9892560"), techstacks.getCreated()); assertEquals("layoric", techstacks.getCreatedBy()); 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 cfe171bf..537f2ee6 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 @@ -98,7 +98,7 @@ public void complete() { public void test_Can_GET_TechStacks_Overview_with_absolute_url_Async() throws InterruptedException { final CountDownLatch signal = new CountDownLatch(1); - client.getAsync("http://techstacks.io/overview", OverviewResponse.class, new AsyncResult() { + client.getAsync("https://techstacks.io/overview", OverviewResponse.class, new AsyncResult() { @Override public void success(OverviewResponse response) { assertOverviewResponse(response); 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 94b85120..36fb642b 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 @@ -1,6 +1,6 @@ /* Options: -Date: 2018-10-17 14:36:01 -Version: 5.10 +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 @@ -11,31 +11,20 @@ //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.* */ package net.servicestack.android.techstacks; -import com.google.gson.annotations.SerializedName; -import com.google.gson.reflect.TypeToken; - -import net.servicestack.client.AutoQueryViewer; -import net.servicestack.client.DataContract; -import net.servicestack.client.DataMember; -import net.servicestack.client.IPost; -import net.servicestack.client.IReturn; -import net.servicestack.client.IReturnVoid; -import net.servicestack.client.ResponseStatus; -import net.servicestack.client.Route; -import net.servicestack.client.StringLength; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; +import java.math.*; +import java.util.*; +import net.servicestack.client.*; +import com.google.gson.annotations.*; +import com.google.gson.reflect.*; public class dtos { @@ -43,22 +32,22 @@ public class dtos @Route("/ping") public static class Ping { - + } public static class DummyTypes { public ArrayList post = null; - + public ArrayList getPost() { return post; } public DummyTypes setPost(ArrayList value) { this.post = value; return this; } } @Route(Path="/orgs/{Id}", Verbs="GET") - public static class GetOrganization implements IReturn + public static class GetOrganization implements IReturn, IGet { public Integer id = null; - + public Integer getId() { return id; } public GetOrganization setId(Integer value) { this.id = value; return this; } private static Object responseType = GetOrganizationResponse.class; @@ -66,10 +55,10 @@ public static class GetOrganization implements IReturn } @Route(Path="/organizations/{Slug}", Verbs="GET") - public static class GetOrganizationBySlug implements IReturn + public static class GetOrganizationBySlug implements IReturn, IGet { public String slug = null; - + public String getSlug() { return slug; } public GetOrganizationBySlug setSlug(String value) { this.slug = value; return this; } private static Object responseType = GetOrganizationResponse.class; @@ -77,10 +66,10 @@ public static class GetOrganizationBySlug implements IReturn + public static class GetOrganizationMembers implements IReturn, IGet { public Integer id = null; - + public Integer getId() { return id; } public GetOrganizationMembers setId(Integer value) { this.id = value; return this; } private static Object responseType = GetOrganizationMembersResponse.class; @@ -88,10 +77,10 @@ public static class GetOrganizationMembers implements IReturn + public static class GetOrganizationAdmin implements IReturn, IGet { public Integer id = null; - + public Integer getId() { return id; } public GetOrganizationAdmin setId(Integer value) { this.id = value; return this; } private static Object responseType = GetOrganizationAdminResponse.class; @@ -99,11 +88,11 @@ public static class GetOrganizationAdmin implements IReturn + public static class CreateOrganizationForTechnology implements IReturn, IPost { public Long technologyId = null; public Long techStackId = null; - + public Long getTechnologyId() { return technologyId; } public CreateOrganizationForTechnology setTechnologyId(Long value) { this.technologyId = value; return this; } public Long getTechStackId() { return techStackId; } @@ -113,7 +102,7 @@ public static class CreateOrganizationForTechnology implements IReturn + public static class CreateOrganization implements IReturn, IPost { public String name = null; public String slug = null; @@ -121,7 +110,7 @@ public static class CreateOrganization implements IReturn + public static class UpdateOrganization implements IReturn, IPut { public Integer id = null; public String slug = null; @@ -160,7 +149,7 @@ public static class UpdateOrganization implements IReturn postTypes = null; public ArrayList moderatorPostTypes = null; public ArrayList technologyIds = null; - + public Integer getId() { return id; } public UpdateOrganization setId(Integer value) { this.id = value; return this; } public String getSlug() { return slug; } @@ -204,21 +193,21 @@ public static class UpdateOrganization implements IReturn + public static class AddOrganizationLabel implements IReturn, IPost { public Integer organizationId = null; public String slug = null; public String description = null; public String color = null; - + public Integer getOrganizationId() { return organizationId; } public AddOrganizationLabel setOrganizationId(Integer value) { this.organizationId = value; return this; } public String getSlug() { return slug; } @@ -248,13 +237,13 @@ public static class AddOrganizationLabel implements IReturn + public static class UpdateOrganizationLabel implements IReturn, IPut { public Integer organizationId = null; public String slug = null; public String description = null; public String color = null; - + public Integer getOrganizationId() { return organizationId; } public UpdateOrganizationLabel setOrganizationId(Integer value) { this.organizationId = value; return this; } public String getSlug() { return slug; } @@ -268,11 +257,11 @@ public static class UpdateOrganizationLabel implements IReturn + public static class AddOrganizationCategory implements IReturn, IPost { public Integer organizationId = null; public String slug = null; public String name = null; public String description = null; public ArrayList technologyIds = null; - + public Integer getOrganizationId() { return organizationId; } public AddOrganizationCategory setOrganizationId(Integer value) { this.organizationId = value; return this; } public String getSlug() { return slug; } @@ -303,7 +292,7 @@ public static class AddOrganizationCategory implements IReturn + public static class UpdateOrganizationCategory implements IReturn, IPut { public Integer organizationId = null; public Integer id = null; @@ -311,7 +300,7 @@ public static class UpdateOrganizationCategory implements IReturn technologyIds = null; - + public Integer getOrganizationId() { return organizationId; } public UpdateOrganizationCategory setOrganizationId(Integer value) { this.organizationId = value; return this; } public Integer getId() { return id; } @@ -329,11 +318,11 @@ public static class UpdateOrganizationCategory implements IReturn + public static class AddOrganizationMember implements IReturn, IPost { public Integer organizationId = null; public String userName = null; @@ -351,7 +340,7 @@ public static class AddOrganizationMember implements IReturn + public static class UpdateOrganizationMember implements IReturn, IPut { public Integer organizationId = null; public Integer userId = null; @@ -383,7 +372,7 @@ public static class UpdateOrganizationMember implements IReturn + public static class SetOrganizationMembers implements IReturn, IPost { public Integer organizationId = null; public ArrayList githubUserNames = null; @@ -429,7 +418,7 @@ public static class SetOrganizationMembers implements IReturn getGithubUserNames() { return githubUserNames; } @@ -455,10 +444,10 @@ public static class SetOrganizationMembers implements IReturn + public static class GetOrganizationMemberInvites implements IReturn, IGet { public Integer organizationId = null; - + public Integer getOrganizationId() { return organizationId; } public GetOrganizationMemberInvites setOrganizationId(Integer value) { this.organizationId = value; return this; } private static Object responseType = GetOrganizationMemberInvitesResponse.class; @@ -466,10 +455,10 @@ public static class GetOrganizationMemberInvites implements IReturn + public static class RequestOrganizationMemberInvite implements IReturn, IPost { public Integer organizationId = null; - + public Integer getOrganizationId() { return organizationId; } public RequestOrganizationMemberInvite setOrganizationId(Integer value) { this.organizationId = value; return this; } private static Object responseType = RequestOrganizationMemberInviteResponse.class; @@ -477,13 +466,13 @@ public static class RequestOrganizationMemberInvite implements IReturn + public static class UpdateOrganizationMemberInvite implements IReturn, IPut { public Integer organizationId = null; public String userName = null; public Boolean approve = null; public Boolean dismiss = null; - + public Integer getOrganizationId() { return organizationId; } public UpdateOrganizationMemberInvite setOrganizationId(Integer value) { this.organizationId = value; return this; } public String getUserName() { return userName; } @@ -497,7 +486,7 @@ public static class UpdateOrganizationMemberInvite implements IReturn implements IReturn> + public static class QueryPosts extends QueryDb implements IReturn>, IGet { public ArrayList ids = null; public Integer organizationId = null; @@ -505,7 +494,7 @@ public static class QueryPosts extends QueryDb implements IReturn types = null; public ArrayList anyTechnologyIds = null; public ArrayList is = null; - + public ArrayList getIds() { return ids; } public QueryPosts setIds(ArrayList value) { this.ids = value; return this; } public Integer getOrganizationId() { return organizationId; } @@ -523,11 +512,11 @@ public static class QueryPosts extends QueryDb implements IReturn + public static class GetPost implements IReturn, IGet { public Long id = null; public String include = null; - + public Long getId() { return id; } public GetPost setId(Long value) { this.id = value; return this; } public String getInclude() { return include; } @@ -537,7 +526,7 @@ public static class GetPost implements IReturn } @Route(Path="/posts", Verbs="POST") - public static class CreatePost implements IReturn + public static class CreatePost implements IReturn, IPost { public Integer organizationId = null; public PostType type = null; @@ -556,7 +545,7 @@ public static class CreatePost implements IReturn public Long refId = null; public String refSource = null; public String refUrn = null; - + public Integer getOrganizationId() { return organizationId; } public CreatePost setOrganizationId(Integer value) { this.organizationId = value; return this; } public PostType getType() { return type; } @@ -596,7 +585,7 @@ public static class CreatePost implements IReturn } @Route(Path="/posts/{Id}", Verbs="PUT") - public static class UpdatePost implements IReturn + public static class UpdatePost implements IReturn, IPut { public Long id = null; public Integer organizationId = null; @@ -613,7 +602,7 @@ public static class UpdatePost implements IReturn public Date toDate = null; public String metaType = null; public String meta = null; - + public Long getId() { return id; } public UpdatePost setId(Long value) { this.id = value; return this; } public Integer getOrganizationId() { return organizationId; } @@ -649,10 +638,10 @@ public static class UpdatePost implements IReturn } @Route(Path="/posts/{Id}", Verbs="DELETE") - public static class DeletePost implements IReturn + public static class DeletePost implements IReturn, IDelete { public Long id = null; - + public Long getId() { return id; } public DeletePost setId(Long value) { this.id = value; return this; } private static Object responseType = DeletePostResponse.class; @@ -660,12 +649,12 @@ public static class DeletePost implements IReturn } @Route(Path="/posts/{Id}/lock", Verbs="PUT") - public static class LockPost implements IReturnVoid + public static class LockPost implements IReturnVoid, IPut { public Long id = null; public Boolean lock = null; public String reason = null; - + public Long getId() { return id; } public LockPost setId(Long value) { this.id = value; return this; } public Boolean isLock() { return lock; } @@ -675,12 +664,12 @@ public static class LockPost implements IReturnVoid } @Route(Path="/posts/{Id}/hide", Verbs="PUT") - public static class HidePost implements IReturnVoid + public static class HidePost implements IReturnVoid, IPut { public Long id = null; public Boolean hide = null; public String reason = null; - + public Long getId() { return id; } public HidePost setId(Long value) { this.id = value; return this; } public Boolean isHide() { return hide; } @@ -690,12 +679,12 @@ public static class HidePost implements IReturnVoid } @Route(Path="/posts/{Id}/status/{Status}", Verbs="PUT") - public static class ChangeStatusPost implements IReturnVoid + public static class ChangeStatusPost implements IReturnVoid, IPut { public Long id = null; public String status = null; public String reason = null; - + public Long getId() { return id; } public ChangeStatusPost setId(Long value) { this.id = value; return this; } public String getStatus() { return status; } @@ -705,12 +694,12 @@ public static class ChangeStatusPost implements IReturnVoid } @Route(Path="/posts/{PostId}/report/{Id}", Verbs="POST") - public static class ActionPostReport implements IReturnVoid + public static class ActionPostReport implements IReturnVoid, IPost { public Long postId = null; public Long id = null; public ReportAction reportAction = null; - + public Long getPostId() { return postId; } public ActionPostReport setPostId(Long value) { this.postId = value; return this; } public Long getId() { return id; } @@ -720,12 +709,12 @@ public static class ActionPostReport implements IReturnVoid } @Route(Path="/posts/{PostId}/comments", Verbs="POST") - public static class CreatePostComment implements IReturn + public static class CreatePostComment implements IReturn, IPost { public Long postId = null; public Long replyId = null; public String content = null; - + public Long getPostId() { return postId; } public CreatePostComment setPostId(Long value) { this.postId = value; return this; } public Long getReplyId() { return replyId; } @@ -737,12 +726,12 @@ public static class CreatePostComment implements IReturn + public static class UpdatePostComment implements IReturn, IPut { public Long id = null; public Long postId = null; public String content = null; - + public Long getId() { return id; } public UpdatePostComment setId(Long value) { this.id = value; return this; } public Long getPostId() { return postId; } @@ -754,11 +743,11 @@ public static class UpdatePostComment implements IReturn + public static class DeletePostComment implements IReturn, IDelete { public Long id = null; public Long postId = null; - + public Long getId() { return id; } public DeletePostComment setId(Long value) { this.id = value; return this; } public Long getPostId() { return postId; } @@ -768,13 +757,13 @@ public static class DeletePostComment implements IReturn + public static class GetUserPostCommentVotes implements IReturn, IGet { public Long postId = null; - + public Long getPostId() { return postId; } public GetUserPostCommentVotes setPostId(Long value) { this.postId = value; return this; } private static Object responseType = GetUserPostCommentVotesResponse.class; public Object getResponseType() { return responseType; } } - @Route(Path="/posts/{PostId}/comments/{Id}/pin", Verbs="UPDATE") - public static class PinPostComment implements IReturn + @Route(Path="/posts/{PostId}/comments/{Id}/pin", Verbs="PUT") + public static class PinPostComment implements IReturn, IPut { public Long id = null; public Long postId = null; public Boolean pin = null; - + public Long getId() { return id; } public PinPostComment setId(Long value) { this.id = value; return this; } public Long getPostId() { return postId; } @@ -814,10 +803,10 @@ public static class PinPostComment implements IReturn } @Route("/users/by-email") - public static class GetUsersByEmails implements IReturn + public static class GetUsersByEmails implements IReturn, IGet { public ArrayList emails = null; - + public ArrayList getEmails() { return emails; } public GetUsersByEmails setEmails(ArrayList value) { this.emails = value; return this; } private static Object responseType = GetUsersByEmailsResponse.class; @@ -825,27 +814,27 @@ public static class GetUsersByEmails implements IReturn + public static class GetUserPostActivity implements IReturn, IGet { - + private static Object responseType = GetUserPostActivityResponse.class; public Object getResponseType() { return responseType; } } @Route("/user/organizations") - public static class GetUserOrganizations implements IReturn + public static class GetUserOrganizations implements IReturn, IGet { - + private static Object responseType = GetUserOrganizationsResponse.class; public Object getResponseType() { return responseType; } } @Route(Path="/posts/{Id}/vote", Verbs="PUT") - public static class UserPostVote implements IReturn + public static class UserPostVote implements IReturn, IPut { public Long id = null; public Integer weight = null; - + public Long getId() { return id; } public UserPostVote setId(Long value) { this.id = value; return this; } public Integer getWeight() { return weight; } @@ -855,10 +844,10 @@ public static class UserPostVote implements IReturn } @Route(Path="/posts/{Id}/favorite", Verbs="PUT") - public static class UserPostFavorite implements IReturn + public static class UserPostFavorite implements IReturn, IPut { public Long id = null; - + public Long getId() { return id; } public UserPostFavorite setId(Long value) { this.id = value; return this; } private static Object responseType = UserPostFavoriteResponse.class; @@ -866,12 +855,12 @@ public static class UserPostFavorite implements IReturn + public static class UserPostReport implements IReturn, IPut { public Long id = null; public FlagType flagType = null; public String reportNotes = null; - + public Long getId() { return id; } public UserPostReport setId(Long value) { this.id = value; return this; } public FlagType getFlagType() { return flagType; } @@ -883,12 +872,12 @@ public static class UserPostReport implements IReturn } @Route(Path="/posts/{PostId}/comments/{Id}", Verbs="GET") - public static class UserPostCommentVote implements IReturn + public static class UserPostCommentVote implements IReturn, IGet { public Long id = null; public Long postId = null; public Integer weight = null; - + public Long getId() { return id; } public UserPostCommentVote setId(Long value) { this.id = value; return this; } public Long getPostId() { return postId; } @@ -900,13 +889,13 @@ public static class UserPostCommentVote implements IReturn + public static class UserPostCommentReport implements IReturn, IPut { public Long id = null; public Long postId = null; public FlagType flagType = null; public String reportNotes = null; - + public Long getId() { return id; } public UserPostCommentReport setId(Long value) { this.id = value; return this; } public Long getPostId() { return postId; } @@ -920,19 +909,19 @@ public static class UserPostCommentReport implements IReturn + public static class GetPreRender implements IReturn, IGet { public String path = null; - + public String getPath() { return path; } public GetPreRender setPath(String value) { this.path = value; return this; } private static Object responseType = String.class; @@ -940,20 +929,20 @@ public static class GetPreRender implements IReturn } @Route("/my-session") - public static class SessionInfo implements IReturn + public static class SessionInfo implements IReturn, IGet { - + private static Object responseType = SessionInfoResponse.class; public Object getResponseType() { return responseType; } } @Route(Path="/orgs/{OrganizationId}/subscribe", Verbs="PUT") - public static class SubscribeToOrganization implements IReturnVoid + public static class SubscribeToOrganization implements IReturnVoid, IPut { public Integer organizationId = null; public ArrayList postTypes = null; public Frequency frequency = null; - + public Integer getOrganizationId() { return organizationId; } public SubscribeToOrganization setOrganizationId(Integer value) { this.organizationId = value; return this; } public ArrayList getPostTypes() { return postTypes; } @@ -963,37 +952,37 @@ public static class SubscribeToOrganization implements IReturnVoid } @Route(Path="/posts/{PostId}/subscribe", Verbs="PUT") - public static class SubscribeToPost implements IReturnVoid + public static class SubscribeToPost implements IReturnVoid, IPut { public Long postId = null; - + public Long getPostId() { return postId; } public SubscribeToPost setPostId(Long value) { this.postId = value; return this; } } @Route(Path="/orgs/{OrganizationId}/subscribe", Verbs="DELETE") - public static class DeleteOrganizationSubscription implements IReturnVoid + public static class DeleteOrganizationSubscription implements IReturnVoid, IDelete { public Long organizationId = null; - + public Long getOrganizationId() { return organizationId; } public DeleteOrganizationSubscription setOrganizationId(Long value) { this.organizationId = value; return this; } } @Route(Path="/posts/{PostId}/subscribe", Verbs="DELETE") - public static class DeletePostSubscription implements IReturnVoid + public static class DeletePostSubscription implements IReturnVoid, IDelete { public Long postId = null; - + public Long getPostId() { return postId; } public DeletePostSubscription setPostId(Long value) { this.postId = value; return this; } } @Route(Path="/technology/{Slug}/previous-versions", Verbs="GET") - public static class GetTechnologyPreviousVersions implements IReturn + public static class GetTechnologyPreviousVersions implements IReturn, IGet { public String slug = null; - + public String getSlug() { return slug; } public GetTechnologyPreviousVersions setSlug(String value) { this.slug = value; return this; } private static Object responseType = GetTechnologyPreviousVersionsResponse.class; @@ -1001,20 +990,20 @@ public static class GetTechnologyPreviousVersions implements IReturn + public static class GetAllTechnologies implements IReturn, IGet { - + private static Object responseType = GetAllTechnologiesResponse.class; public Object getResponseType() { return responseType; } } @Route("/technology/search") @AutoQueryViewer(DefaultSearchField="Tier", DefaultSearchText="Data", DefaultSearchType="=", Description="Explore different Technologies", IconUrl="octicon:database", Title="Find Technologies") - public static class FindTechnologies extends QueryDb implements IReturn> + public static class FindTechnologies extends QueryDb implements IReturn>, IGet { public String name = null; public String nameContains = null; - + public String getName() { return name; } public FindTechnologies setName(String value) { this.name = value; return this; } public String getNameContains() { return nameContains; } @@ -1024,18 +1013,18 @@ public static class FindTechnologies extends QueryDb implements IRet } @Route("/technology/query") - public static class QueryTechnology extends QueryDb implements IReturn> + public static class QueryTechnology extends QueryDb implements IReturn>, IGet { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } @Route("/technology/{Slug}") - public static class GetTechnology implements IReturn, IRegisterStats + public static class GetTechnology implements IReturn, IRegisterStats, IGet { public String slug = null; - + public String getSlug() { return slug; } public GetTechnology setSlug(String value) { this.slug = value; return this; } private static Object responseType = GetTechnologyResponse.class; @@ -1043,10 +1032,10 @@ public static class GetTechnology implements IReturn, IRe } @Route("/technology/{Slug}/favorites") - public static class GetTechnologyFavoriteDetails implements IReturn + public static class GetTechnologyFavoriteDetails implements IReturn, IGet { public String slug = null; - + public String getSlug() { return slug; } public GetTechnologyFavoriteDetails setSlug(String value) { this.slug = value; return this; } private static Object responseType = GetTechnologyFavoriteDetailsResponse.class; @@ -1054,7 +1043,7 @@ public static class GetTechnologyFavoriteDetails implements IReturn + public static class CreateTechnology implements IReturn, IPost { public String name = null; public String slug = null; @@ -1065,7 +1054,7 @@ public static class CreateTechnology implements IReturn + public static class UpdateTechnology implements IReturn, IPut { public Long id = null; public String name = null; @@ -1100,7 +1089,7 @@ public static class UpdateTechnology implements IReturn + public static class DeleteTechnology implements IReturn, IDelete { public Long id = null; - + public Long getId() { return id; } public DeleteTechnology setId(Long value) { this.id = value; return this; } private static Object responseType = DeleteTechnologyResponse.class; @@ -1135,10 +1124,10 @@ public static class DeleteTechnology implements IReturn + public static class GetTechnologyStackPreviousVersions implements IReturn, IGet { public String slug = null; - + public String getSlug() { return slug; } public GetTechnologyStackPreviousVersions setSlug(String value) { this.slug = value; return this; } private static Object responseType = GetTechnologyStackPreviousVersionsResponse.class; @@ -1146,12 +1135,12 @@ public static class GetTechnologyStackPreviousVersions implements IReturn + public static class GetPageStats implements IReturn, IGet { public String type = null; public String slug = null; public Integer id = null; - + public String getType() { return type; } public GetPageStats setType(String value) { this.type = value; return this; } public String getSlug() { return slug; } @@ -1163,18 +1152,18 @@ public static class GetPageStats implements IReturn } @Route("/cache/clear") - public static class ClearCache implements IReturn + public static class ClearCache implements IReturn, IGet { - + private static Object responseType = String.class; public Object getResponseType() { return responseType; } } @Route("/tasks/hourly") - public static class HourlyTask implements IReturn + public static class HourlyTask implements IReturn, IGet { public Boolean force = null; - + public Boolean isForce() { return force; } public HourlyTask setForce(Boolean value) { this.force = value; return this; } private static Object responseType = HourlyTaskResponse.class; @@ -1183,10 +1172,10 @@ public static class HourlyTask implements IReturn @Route("/techstacks/search") @AutoQueryViewer(DefaultSearchField="Description", DefaultSearchText="ServiceStack", DefaultSearchType="Contains", Description="Explore different Technology Stacks", IconUrl="material-icons:cloud", Title="Find Technology Stacks") - public static class FindTechStacks extends QueryDb implements IReturn> + public static class FindTechStacks extends QueryDb implements IReturn>, IGet { public String nameContains = null; - + public String getNameContains() { return nameContains; } public FindTechStacks setNameContains(String value) { this.nameContains = value; return this; } private static Object responseType = new TypeToken>(){}.getType(); @@ -1194,18 +1183,18 @@ public static class FindTechStacks extends QueryDb implements I } @Route("/techstacks/query") - public static class QueryTechStacks extends QueryDb implements IReturn> + public static class QueryTechStacks extends QueryDb implements IReturn>, IGet { - + private static Object responseType = new TypeToken>(){}.getType(); public Object getResponseType() { return responseType; } } @Route("/overview") - public static class Overview implements IReturn + public static class Overview implements IReturn, IGet { public Boolean reload = null; - + public Boolean isReload() { return reload; } public Overview setReload(Boolean value) { this.reload = value; return this; } private static Object responseType = OverviewResponse.class; @@ -1213,10 +1202,10 @@ public static class Overview implements IReturn } @Route("/app-overview") - public static class AppOverview implements IReturn + public static class AppOverview implements IReturn, IGet { public Boolean reload = null; - + public Boolean isReload() { return reload; } public AppOverview setReload(Boolean value) { this.reload = value; return this; } private static Object responseType = AppOverviewResponse.class; @@ -1224,18 +1213,18 @@ public static class AppOverview implements IReturn } @Route(Path="/techstacks", Verbs="GET") - public static class GetAllTechnologyStacks implements IReturn + public static class GetAllTechnologyStacks implements IReturn, IGet { - + private static Object responseType = GetAllTechnologyStacksResponse.class; public Object getResponseType() { return responseType; } } @Route(Path="/techstacks/{Slug}", Verbs="GET") - public static class GetTechnologyStack implements IReturn, IRegisterStats + public static class GetTechnologyStack implements IReturn, IRegisterStats, IGet { public String slug = null; - + public String getSlug() { return slug; } public GetTechnologyStack setSlug(String value) { this.slug = value; return this; } private static Object responseType = GetTechnologyStackResponse.class; @@ -1243,10 +1232,10 @@ public static class GetTechnologyStack implements IReturn + public static class GetTechnologyStackFavoriteDetails implements IReturn, IGet { public String slug = null; - + public String getSlug() { return slug; } public GetTechnologyStackFavoriteDetails setSlug(String value) { this.slug = value; return this; } private static Object responseType = GetTechnologyStackFavoriteDetailsResponse.class; @@ -1254,15 +1243,15 @@ public static class GetTechnologyStackFavoriteDetails implements IReturn + public static class GetConfig implements IReturn, IGet { - + private static Object responseType = GetConfigResponse.class; public Object getResponseType() { return responseType; } } @Route(Path="/techstacks", Verbs="POST") - public static class CreateTechnologyStack implements IReturn + public static class CreateTechnologyStack implements IReturn, IPost { public String name = null; public String slug = null; @@ -1273,7 +1262,7 @@ public static class CreateTechnologyStack implements IReturn technologyIds = null; - + public String getName() { return name; } public CreateTechnologyStack setName(String value) { this.name = value; return this; } public String getSlug() { return slug; } @@ -1297,7 +1286,7 @@ public static class CreateTechnologyStack implements IReturn + public static class UpdateTechnologyStack implements IReturn, IPut { public Long id = null; public String name = null; @@ -1308,7 +1297,7 @@ public static class UpdateTechnologyStack implements IReturn technologyIds = null; - + public Long getId() { return id; } public UpdateTechnologyStack setId(Long value) { this.id = value; return this; } public String getName() { return name; } @@ -1332,10 +1321,10 @@ public static class UpdateTechnologyStack implements IReturn + public static class DeleteTechnologyStack implements IReturn, IDelete { public Long id = null; - + public Long getId() { return id; } public DeleteTechnologyStack setId(Long value) { this.id = value; return this; } private static Object responseType = DeleteTechnologyStackResponse.class; @@ -1343,10 +1332,10 @@ public static class DeleteTechnologyStack implements IReturn + public static class GetFavoriteTechStack implements IReturn, IGet { public Integer technologyStackId = null; - + public Integer getTechnologyStackId() { return technologyStackId; } public GetFavoriteTechStack setTechnologyStackId(Integer value) { this.technologyStackId = value; return this; } private static Object responseType = GetFavoriteTechStackResponse.class; @@ -1354,10 +1343,10 @@ public static class GetFavoriteTechStack implements IReturn + public static class AddFavoriteTechStack implements IReturn, IPut { public Integer technologyStackId = null; - + public Integer getTechnologyStackId() { return technologyStackId; } public AddFavoriteTechStack setTechnologyStackId(Integer value) { this.technologyStackId = value; return this; } private static Object responseType = FavoriteTechStackResponse.class; @@ -1365,10 +1354,10 @@ public static class AddFavoriteTechStack implements IReturn + public static class RemoveFavoriteTechStack implements IReturn, IDelete { public Integer technologyStackId = null; - + public Integer getTechnologyStackId() { return technologyStackId; } public RemoveFavoriteTechStack setTechnologyStackId(Integer value) { this.technologyStackId = value; return this; } private static Object responseType = FavoriteTechStackResponse.class; @@ -1376,10 +1365,10 @@ public static class RemoveFavoriteTechStack implements IReturn + public static class GetFavoriteTechnologies implements IReturn, IGet { public Integer technologyId = null; - + public Integer getTechnologyId() { return technologyId; } public GetFavoriteTechnologies setTechnologyId(Integer value) { this.technologyId = value; return this; } private static Object responseType = GetFavoriteTechnologiesResponse.class; @@ -1387,10 +1376,10 @@ public static class GetFavoriteTechnologies implements IReturn + public static class AddFavoriteTechnology implements IReturn, IPut { public Integer technologyId = null; - + public Integer getTechnologyId() { return technologyId; } public AddFavoriteTechnology setTechnologyId(Integer value) { this.technologyId = value; return this; } private static Object responseType = FavoriteTechnologyResponse.class; @@ -1398,10 +1387,10 @@ public static class AddFavoriteTechnology implements IReturn + public static class RemoveFavoriteTechnology implements IReturn, IDelete { public Integer technologyId = null; - + public Integer getTechnologyId() { return technologyId; } public RemoveFavoriteTechnology setTechnologyId(Integer value) { this.technologyId = value; return this; } private static Object responseType = FavoriteTechnologyResponse.class; @@ -1409,18 +1398,18 @@ public static class RemoveFavoriteTechnology implements IReturn + public static class GetUserFeed implements IReturn, IGet { - + private static Object responseType = GetUserFeedResponse.class; public Object getResponseType() { return responseType; } } @Route(Path="/users/karma", Verbs="GET") - public static class GetUsersKarma implements IReturn + public static class GetUsersKarma implements IReturn, IGet { public ArrayList userIds = null; - + public ArrayList getUserIds() { return userIds; } public GetUsersKarma setUserIds(ArrayList value) { this.userIds = value; return this; } private static Object responseType = GetUsersKarmaResponse.class; @@ -1428,10 +1417,10 @@ public static class GetUsersKarma implements IReturn } @Route("/userinfo/{UserName}") - public static class GetUserInfo implements IReturn + public static class GetUserInfo implements IReturn, IGet { public String userName = null; - + public String getUserName() { return userName; } public GetUserInfo setUserName(String value) { this.userName = value; return this; } private static Object responseType = GetUserInfoResponse.class; @@ -1439,10 +1428,10 @@ public static class GetUserInfo implements IReturn } @Route(Path="/users/{UserName}/avatar", Verbs="GET") - public static class UserAvatar + public static class UserAvatar implements IGet { public String userName = null; - + public String getUserName() { return userName; } public UserAvatar setUserName(String value) { this.userName = value; return this; } } @@ -1450,7 +1439,7 @@ public static class UserAvatar @Route("/mq/start") public static class MqStart implements IReturn { - + private static Object responseType = String.class; public Object getResponseType() { return responseType; } } @@ -1458,7 +1447,7 @@ public static class MqStart implements IReturn @Route("/mq/stop") public static class MqStop implements IReturn { - + private static Object responseType = String.class; public Object getResponseType() { return responseType; } } @@ -1466,7 +1455,7 @@ public static class MqStop implements IReturn @Route("/mq/stats") public static class MqStats implements IReturn { - + private static Object responseType = String.class; public Object getResponseType() { return responseType; } } @@ -1474,16 +1463,16 @@ public static class MqStats implements IReturn @Route("/mq/status") public static class MqStatus implements IReturn { - + private static Object responseType = String.class; public Object getResponseType() { return responseType; } } @Route("/sync/discourse/{Site}") - public static class SyncDiscourseSite implements IReturn + public static class SyncDiscourseSite implements IReturn, IPost { public String site = null; - + public String getSite() { return site; } public SyncDiscourseSite setSite(String value) { this.site = value; return this; } private static Object responseType = SyncDiscourseSiteResponse.class; @@ -1491,11 +1480,11 @@ public static class SyncDiscourseSite implements IReturn + public static class LogoUrlApproval implements IReturn, IPut { public Long technologyId = null; public Boolean approved = null; - + public Long getTechnologyId() { return technologyId; } public LogoUrlApproval setTechnologyId(Long value) { this.technologyId = value; return this; } public Boolean isApproved() { return approved; } @@ -1505,11 +1494,11 @@ public static class LogoUrlApproval implements IReturn } @Route("/admin/techstacks/{TechnologyStackId}/lock") - public static class LockTechStack implements IReturn + public static class LockTechStack implements IReturn, IPut { public Long technologyStackId = null; public Boolean isLocked = null; - + public Long getTechnologyStackId() { return technologyStackId; } public LockTechStack setTechnologyStackId(Long value) { this.technologyStackId = value; return this; } public Boolean getIsLocked() { return isLocked; } @@ -1519,11 +1508,11 @@ public static class LockTechStack implements IReturn } @Route("/admin/technology/{TechnologyId}/lock") - public static class LockTech implements IReturn + public static class LockTech implements IReturn, IPut { public Long technologyId = null; public Boolean isLocked = null; - + public Long getTechnologyId() { return technologyId; } public LockTech setTechnologyId(Long value) { this.technologyId = value; return this; } public Boolean getIsLocked() { return isLocked; } @@ -1536,14 +1525,14 @@ public static class LockTech implements IReturn public static class EmailTest implements IReturn { public Integer postId = null; - + public Integer getPostId() { return postId; } public EmailTest setPostId(Integer value) { this.postId = value; return this; } private static Object responseType = EmailTestRespoonse.class; public Object getResponseType() { return responseType; } } - public static class ImportUser implements IReturn + public static class ImportUser implements IReturn, IPost { public String userName = null; public String email = null; @@ -1557,7 +1546,7 @@ public static class ImportUser implements IReturn public String refUrn = null; public String defaultProfileUrl = null; public HashMap meta = null; - + public String getUserName() { return userName; } public ImportUser setUserName(String value) { this.userName = value; return this; } public String getEmail() { return email; } @@ -1587,7 +1576,7 @@ public static class ImportUser implements IReturn } @Route("/import/uservoice/suggestion") - public static class ImportUserVoiceSuggestion implements IReturn + public static class ImportUserVoiceSuggestion implements IReturn, IPost { public Integer organizationId = null; public String url = null; @@ -1608,7 +1597,7 @@ public static class ImportUserVoiceSuggestion implements IReturn, IPost { @@ -1679,39 +1666,42 @@ public static class Authenticate implements IReturn, IPost @DataMember(Order=7) public Boolean rememberMe = null; - @DataMember(Order=8) - @SerializedName("continue") public String Continue = null; - @DataMember(Order=9) - public String nonce = null; + public String errorView = null; @DataMember(Order=10) - public String uri = null; + public String nonce = null; @DataMember(Order=11) - public String response = null; + public String uri = null; @DataMember(Order=12) - public String qop = null; + public String response = null; @DataMember(Order=13) - public String nc = null; + public String qop = null; @DataMember(Order=14) - public String cnonce = null; + public String nc = null; @DataMember(Order=15) - public Boolean useTokenCookie = null; + public String cnonce = null; @DataMember(Order=16) - public String accessToken = null; + public Boolean useTokenCookie = null; @DataMember(Order=17) - public String accessTokenSecret = null; + public String accessToken = null; @DataMember(Order=18) - public HashMap meta = null; + public String accessTokenSecret = null; + + @DataMember(Order=19) + public String scope = null; + @DataMember(Order=20) + public HashMap meta = null; + public String getProvider() { return provider; } public Authenticate setProvider(String value) { this.provider = value; return this; } public String getState() { return state; } @@ -1726,8 +1716,8 @@ public static class Authenticate implements IReturn, IPost 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 getContinue() { return Continue; } - public Authenticate setContinue(String value) { this.Continue = value; return this; } + public String getErrorView() { return errorView; } + public Authenticate setErrorView(String value) { this.errorView = value; return this; } public String getNonce() { return nonce; } public Authenticate setNonce(String value) { this.nonce = value; return this; } public String getUri() { return uri; } @@ -1746,6 +1736,8 @@ public static class Authenticate implements IReturn, IPost 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 getScope() { return scope; } + public Authenticate setScope(String value) { this.scope = value; return this; } public HashMap getMeta() { return meta; } public Authenticate setMeta(HashMap value) { this.meta = value; return this; } private static Object responseType = AuthenticateResponse.class; @@ -1765,12 +1757,17 @@ public static class AssignRoles implements IReturn, IPost @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; } } @@ -1788,12 +1785,17 @@ public static class UnAssignRoles implements IReturn, IPo @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; } } @@ -1805,8 +1807,13 @@ public static class ConvertSessionToToken implements IReturn 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; } private static Object responseType = ConvertSessionToTokenResponse.class; public Object getResponseType() { return responseType; } } @@ -1818,18 +1825,28 @@ public static class GetAccessToken implements IReturn, I @DataMember(Order=1) public String refreshToken = null; + @DataMember(Order=2) + public Boolean useTokenCookie = null; + + @DataMember(Order=3) + public HashMap meta = null; + public String getRefreshToken() { return refreshToken; } public GetAccessToken setRefreshToken(String value) { this.refreshToken = value; return this; } + public Boolean isUseTokenCookie() { return useTokenCookie; } + public GetAccessToken setUseTokenCookie(Boolean value) { this.useTokenCookie = 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; } } @Route(Path="/posts/comment", Verbs="GET") - public static class QueryPostComments extends QueryDb implements IReturn> + public static class QueryPostComments extends QueryDb implements IReturn>, IGet { public Integer userId = null; public Integer postId = null; - + public Integer getUserId() { return userId; } public QueryPostComments setUserId(Integer value) { this.userId = value; return this; } public Integer getPostId() { return postId; } @@ -1843,7 +1860,7 @@ public static class QueryPostComments extends QueryDb implements IR public static class FindTechnologiesAdmin extends QueryDb implements IReturn> { public String name = null; - + public String getName() { return name; } public FindTechnologiesAdmin setName(String value) { this.name = value; return this; } private static Object responseType = new TypeToken>(){}.getType(); @@ -1862,7 +1879,7 @@ public static class GetOrganizationResponse public ArrayList moderators = null; public Long membersCount = null; public ResponseStatus responseStatus = null; - + public Long getCache() { return cache; } public GetOrganizationResponse setCache(Long value) { this.cache = value; return this; } public Integer getId() { return id; } @@ -1890,7 +1907,7 @@ public static class GetOrganizationMembersResponse public Integer organizationId = null; public ArrayList results = null; public ResponseStatus responseStatus = null; - + public Integer getOrganizationId() { return organizationId; } public GetOrganizationMembersResponse setOrganizationId(Integer value) { this.organizationId = value; return this; } public ArrayList getResults() { return results; } @@ -1907,7 +1924,7 @@ public static class GetOrganizationAdminResponse public ArrayList reportedPosts = null; public ArrayList reportedPostComments = null; public ResponseStatus responseStatus = null; - + public ArrayList getLabels() { return labels; } public GetOrganizationAdminResponse setLabels(ArrayList value) { this.labels = value; return this; } public ArrayList getMembers() { return members; } @@ -1929,7 +1946,7 @@ public static class CreateOrganizationForTechnologyResponse public Long commentsPostId = null; public String commentsPostSlug = null; public ResponseStatus responseStatus = null; - + public Integer getOrganizationId() { return organizationId; } public CreateOrganizationForTechnologyResponse setOrganizationId(Integer value) { this.organizationId = value; return this; } public String getOrganizationSlug() { return organizationSlug; } @@ -1947,7 +1964,7 @@ public static class CreateOrganizationResponse public Integer id = null; public String slug = null; public ResponseStatus responseStatus = null; - + public Integer getId() { return id; } public CreateOrganizationResponse setId(Integer value) { this.id = value; return this; } public String getSlug() { return slug; } @@ -1959,7 +1976,7 @@ public static class CreateOrganizationResponse public static class UpdateOrganizationResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UpdateOrganizationResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -1967,7 +1984,7 @@ public static class UpdateOrganizationResponse public static class OrganizationLabelResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public OrganizationLabelResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -1977,7 +1994,7 @@ public static class AddOrganizationCategoryResponse public Integer id = null; public String slug = null; public ResponseStatus responseStatus = null; - + public Integer getId() { return id; } public AddOrganizationCategoryResponse setId(Integer value) { this.id = value; return this; } public String getSlug() { return slug; } @@ -1989,7 +2006,7 @@ public static class AddOrganizationCategoryResponse public static class UpdateOrganizationCategoryResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UpdateOrganizationCategoryResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -1997,7 +2014,7 @@ public static class UpdateOrganizationCategoryResponse public static class AddOrganizationMemberResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public AddOrganizationMemberResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2005,7 +2022,7 @@ public static class AddOrganizationMemberResponse public static class UpdateOrganizationMemberResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UpdateOrganizationMemberResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2015,7 +2032,7 @@ public static class SetOrganizationMembersResponse public ArrayList userIdsAdded = null; public ArrayList userIdsRemoved = null; public ResponseStatus responseStatus = null; - + public ArrayList getUserIdsAdded() { return userIdsAdded; } public SetOrganizationMembersResponse setUserIdsAdded(ArrayList value) { this.userIdsAdded = value; return this; } public ArrayList getUserIdsRemoved() { return userIdsRemoved; } @@ -2028,7 +2045,7 @@ public static class GetOrganizationMemberInvitesResponse { public ArrayList results = null; public ResponseStatus responseStatus = null; - + public ArrayList getResults() { return results; } public GetOrganizationMemberInvitesResponse setResults(ArrayList value) { this.results = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2039,7 +2056,7 @@ public static class RequestOrganizationMemberInviteResponse { public Integer organizationId = null; public ResponseStatus responseStatus = null; - + public Integer getOrganizationId() { return organizationId; } public RequestOrganizationMemberInviteResponse setOrganizationId(Integer value) { this.organizationId = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2049,7 +2066,7 @@ public static class RequestOrganizationMemberInviteResponse public static class UpdateOrganizationMemberInviteResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UpdateOrganizationMemberInviteResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2071,7 +2088,7 @@ 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 Integer getTotal() { return total; } @@ -2090,7 +2107,7 @@ public static class GetPostResponse public Post post = null; public ArrayList comments = null; public ResponseStatus responseStatus = null; - + public Long getCache() { return cache; } public GetPostResponse setCache(Long value) { this.cache = value; return this; } public Post getPost() { return post; } @@ -2106,7 +2123,7 @@ public static class CreatePostResponse public Long id = null; public String slug = null; public ResponseStatus responseStatus = null; - + public Long getId() { return id; } public CreatePostResponse setId(Long value) { this.id = value; return this; } public String getSlug() { return slug; } @@ -2118,7 +2135,7 @@ public static class CreatePostResponse public static class UpdatePostResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UpdatePostResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2127,7 +2144,7 @@ public static class DeletePostResponse { public Long id = null; public ResponseStatus responseStatus = null; - + public Long getId() { return id; } public DeletePostResponse setId(Long value) { this.id = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2139,7 +2156,7 @@ public static class CreatePostCommentResponse public Long id = null; public Long postId = null; public ResponseStatus responseStatus = null; - + public Long getId() { return id; } public CreatePostCommentResponse setId(Long value) { this.id = value; return this; } public Long getPostId() { return postId; } @@ -2151,7 +2168,7 @@ public static class CreatePostCommentResponse public static class UpdatePostCommentResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UpdatePostCommentResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2161,7 +2178,7 @@ public static class DeletePostCommentResponse public Long id = null; public Long postId = null; public ResponseStatus responseStatus = null; - + public Long getId() { return id; } public DeletePostCommentResponse setId(Long value) { this.id = value; return this; } public Long getPostId() { return postId; } @@ -2175,7 +2192,7 @@ public static class GetUserPostCommentVotesResponse public Long postId = null; public ArrayList upVotedCommentIds = null; public ArrayList downVotedCommentIds = null; - + public Long getPostId() { return postId; } public GetUserPostCommentVotesResponse setPostId(Long value) { this.postId = value; return this; } public ArrayList getUpVotedCommentIds() { return upVotedCommentIds; } @@ -2187,7 +2204,7 @@ public static class GetUserPostCommentVotesResponse public static class PinPostCommentResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public PinPostCommentResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2196,7 +2213,7 @@ public static class GetUsersByEmailsResponse { public ArrayList results = null; public ResponseStatus responseStatus = null; - + public ArrayList getResults() { return results; } public GetUsersByEmailsResponse setResults(ArrayList value) { this.results = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2209,7 +2226,7 @@ public static class GetUserPostActivityResponse public ArrayList downVotedPostIds = null; public ArrayList favoritePostIds = null; public ResponseStatus responseStatus = null; - + public ArrayList getUpVotedPostIds() { return upVotedPostIds; } public GetUserPostActivityResponse setUpVotedPostIds(ArrayList value) { this.upVotedPostIds = value; return this; } public ArrayList getDownVotedPostIds() { return downVotedPostIds; } @@ -2225,7 +2242,7 @@ public static class GetUserOrganizationsResponse public ArrayList members = null; public ArrayList memberInvites = null; public ArrayList subscriptions = null; - + public ArrayList getMembers() { return members; } public GetUserOrganizationsResponse setMembers(ArrayList value) { this.members = value; return this; } public ArrayList getMemberInvites() { return memberInvites; } @@ -2237,7 +2254,7 @@ public static class GetUserOrganizationsResponse public static class UserPostVoteResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UserPostVoteResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2245,7 +2262,7 @@ public static class UserPostVoteResponse public static class UserPostFavoriteResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UserPostFavoriteResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2253,7 +2270,7 @@ public static class UserPostFavoriteResponse public static class UserPostReportResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UserPostReportResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2261,7 +2278,7 @@ public static class UserPostReportResponse public static class UserPostCommentVoteResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UserPostCommentVoteResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2269,7 +2286,7 @@ public static class UserPostCommentVoteResponse public static class UserPostCommentReportResponse { public ResponseStatus responseStatus = null; - + public ResponseStatus getResponseStatus() { return responseStatus; } public UserPostCommentReportResponse setResponseStatus(ResponseStatus value) { this.responseStatus = value; return this; } } @@ -2305,7 +2322,7 @@ public static class SessionInfoResponse public ArrayList memberInvites = null; public ArrayList subscriptions = null; public ResponseStatus responseStatus = null; - + public Date getCreated() { return created; } public SessionInfoResponse setCreated(Date value) { this.created = value; return this; } public String getId() { return id; } @@ -2369,7 +2386,7 @@ public static class SessionInfoResponse public static class GetTechnologyPreviousVersionsResponse { public ArrayList results = null; - + public ArrayList getResults() { return results; } public GetTechnologyPreviousVersionsResponse setResults(ArrayList value) { this.results = value; return this; } } @@ -2378,7 +2395,7 @@ public static class GetAllTechnologiesResponse { public ArrayList results = null; public Long total = null; - + public ArrayList getResults() { return results; } public GetAllTechnologiesResponse setResults(ArrayList value) { this.results = value; return this; } public Long getTotal() { return total; } @@ -2391,7 +2408,7 @@ public static class GetTechnologyResponse public Technology technology = null; public ArrayList technologyStacks = null; public ResponseStatus responseStatus = null; - + public Date getCreated() { return created; } public GetTechnologyResponse setCreated(Date value) { this.created = value; return this; } public Technology getTechnology() { return technology; } @@ -2406,7 +2423,7 @@ public static class GetTechnologyFavoriteDetailsResponse { public ArrayList users = null; public Integer favoriteCount = null; - + public ArrayList getUsers() { return users; } public GetTechnologyFavoriteDetailsResponse setUsers(ArrayList value) { this.users = value; return this; } public Integer getFavoriteCount() { return favoriteCount; } @@ -2417,7 +2434,7 @@ public static class CreateTechnologyResponse { public Technology result = null; public ResponseStatus responseStatus = null; - + public Technology getResult() { return result; } public CreateTechnologyResponse setResult(Technology value) { this.result = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2428,7 +2445,7 @@ public static class UpdateTechnologyResponse { public Technology result = null; public ResponseStatus responseStatus = null; - + public Technology getResult() { return result; } public UpdateTechnologyResponse setResult(Technology value) { this.result = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2439,7 +2456,7 @@ public static class DeleteTechnologyResponse { public Technology result = null; public ResponseStatus responseStatus = null; - + public Technology getResult() { return result; } public DeleteTechnologyResponse setResult(Technology value) { this.result = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2449,7 +2466,7 @@ public static class DeleteTechnologyResponse public static class GetTechnologyStackPreviousVersionsResponse { public ArrayList results = null; - + public ArrayList getResults() { return results; } public GetTechnologyStackPreviousVersionsResponse setResults(ArrayList value) { this.results = value; return this; } } @@ -2460,7 +2477,7 @@ public static class GetPageStatsResponse public String slug = null; public Long viewCount = null; public Long favCount = null; - + public String getType() { return type; } public GetPageStatsResponse setType(String value) { this.type = value; return this; } public String getSlug() { return slug; } @@ -2475,7 +2492,7 @@ public static class HourlyTaskResponse { public HashMap meta = null; public ResponseStatus responseStatus = null; - + public HashMap getMeta() { return meta; } public HourlyTaskResponse setMeta(HashMap value) { this.meta = value; return this; } public ResponseStatus getResponseStatus() { return responseStatus; } @@ -2492,7 +2509,7 @@ public static class OverviewResponse public ArrayList allOrganizations = null; public HashMap> topTechnologiesByTier = null; public ResponseStatus responseStatus = null; - + public Date getCreated() { return created; } public OverviewResponse setCreated(Date value) { this.created = value; return this; } public ArrayList getTopUsers() { return topUsers; } @@ -2517,7 +2534,7 @@ public static class AppOverviewResponse public ArrayList