From 644c712cc7fa3c54e6e0411c853b1f61bb872bf7 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 17 Apr 2017 17:54:43 -0700 Subject: [PATCH] First commit. --- .gitattributes | 5 + .gitignore | 29 + .idea/encodings.xml | 6 + .idea/inspectionProfiles/Project_Default.xml | 53 ++ .idea/kobalt.xml | 19 + .idea/kotlinc.xml | 7 + .idea/misc.xml | 79 +++ .idea/modules.xml | 10 + LICENSE.TXT | 27 + example/kobalt/src/Build.kt | 37 ++ example/kobalt/wrapper/kobalt-wrapper.jar | Bin 0 -> 11295 bytes .../kobalt/wrapper/kobalt-wrapper.properties | 1 + example/kobaltw | 2 + example/kobaltw.bat | 4 + example/src/main/kotlin/com/example/Main.kt | 3 + .../src/test/kotlin/com/example/MainTest.kt | 8 + kobalt-property-file.iml | 628 ++++++++++++++++++ kobalt/Build.kt.iml | 24 + kobalt/src/Build.kt | 57 ++ kobalt/wrapper/kobalt-wrapper.jar | Bin 0 -> 11295 bytes kobalt/wrapper/kobalt-wrapper.properties | 1 + kobaltw | 2 + kobaltw.bat | 4 + .../plugin/propertyfile/PropertyFilePlugin.kt | 257 +++++++ src/main/resources/META-INF/kobalt-plugin.xml | 6 + src/test/kotlin/com/example/MainTest.kt | 8 + 26 files changed, 1277 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/kobalt.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 LICENSE.TXT create mode 100644 example/kobalt/src/Build.kt create mode 100644 example/kobalt/wrapper/kobalt-wrapper.jar create mode 100644 example/kobalt/wrapper/kobalt-wrapper.properties create mode 100644 example/kobaltw create mode 100644 example/kobaltw.bat create mode 100644 example/src/main/kotlin/com/example/Main.kt create mode 100644 example/src/test/kotlin/com/example/MainTest.kt create mode 100644 kobalt-property-file.iml create mode 100644 kobalt/Build.kt.iml create mode 100644 kobalt/src/Build.kt create mode 100644 kobalt/wrapper/kobalt-wrapper.jar create mode 100644 kobalt/wrapper/kobalt-wrapper.properties create mode 100644 kobaltw create mode 100644 kobaltw.bat create mode 100644 src/main/kotlin/net/thauvin/erik/kobalt/plugin/propertyfile/PropertyFilePlugin.kt create mode 100644 src/main/resources/META-INF/kobalt-plugin.xml create mode 100644 src/test/kotlin/com/example/MainTest.kt diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6ec2ae2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# batch files are specific to windows and always crlf +*.bat eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8775852 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +**/.idea/dictionaries +**/.idea/gradle.xml +**/.idea/libraries +**/.idea/tasks.xml +**/.idea/workspace.xml +*.iws +.classpath +.DS_Store +.gradle +.kobalt +.nb-gradle +.project +.settings +/bin +/build +/deploy +/dist +/gen +/gradle.properties +/libs +/local.properties +/out +/proguard-project.txt +/project.properties +/target +/test-output +ehthumbs.db +kobaltBuild +Thumbs.db \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..8ff795e --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,53 @@ + + + + \ No newline at end of file diff --git a/.idea/kobalt.xml b/.idea/kobalt.xml new file mode 100644 index 0000000..834a200 --- /dev/null +++ b/.idea/kobalt.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..1c24f9a --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6ebe78f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + Java + + + Portability issuesJava + + + + + Android + + + + + + + + + + + + + commons-logging-api + + + + + + + + 1.8.x + + + + + + + + 1.8.x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ad2960d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/LICENSE.TXT b/LICENSE.TXT new file mode 100644 index 0000000..861c1ef --- /dev/null +++ b/LICENSE.TXT @@ -0,0 +1,27 @@ +Copyright (c) 2017, Erik C. Thauvin (erik@thauvin.net) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of this project nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt new file mode 100644 index 0000000..5a3decb --- /dev/null +++ b/example/kobalt/src/Build.kt @@ -0,0 +1,37 @@ +import com.beust.kobalt.* +import com.beust.kobalt.plugin.packaging.* +import com.beust.kobalt.plugin.application.* +import com.beust.kobalt.plugin.kotlin.* +import net.thauvin.erik.kobalt.plugin.propertyfile.* + +val bs = buildScript { + plugins(file("../libs/kobalt-property-file-0.1.0.jar")) +} + +val p = project { + name = "example" + group = "com.example" + artifactId = name + version = "0.1" + + dependencies { +// compile("com.beust:jcommander:1.68") + } + + dependenciesTest { + compile("org.testng:testng:6.11") + } + + assemble { + jar { + } + } + + application { + mainClass = "com.example.MainKt" + } + + propertyFile { + file = "version.properties" + } +} diff --git a/example/kobalt/wrapper/kobalt-wrapper.jar b/example/kobalt/wrapper/kobalt-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..08165f60f4e6ca5fe1014c5267dc066cbafb8f48 GIT binary patch literal 11295 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 = println("\n\nHello Kotlin world from Kobalt\n\n") \ No newline at end of file diff --git a/example/src/test/kotlin/com/example/MainTest.kt b/example/src/test/kotlin/com/example/MainTest.kt new file mode 100644 index 0000000..96458e9 --- /dev/null +++ b/example/src/test/kotlin/com/example/MainTest.kt @@ -0,0 +1,8 @@ +package com.example + +import org.testng.annotations.Test + +class ExampleTest { + @Test + fun f() = println("Running test") +} \ No newline at end of file diff --git a/kobalt-property-file.iml b/kobalt-property-file.iml new file mode 100644 index 0000000..8b46963 --- /dev/null +++ b/kobalt-property-file.iml @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/kobalt/Build.kt.iml b/kobalt/Build.kt.iml new file mode 100644 index 0000000..2d42ea5 --- /dev/null +++ b/kobalt/Build.kt.iml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt new file mode 100644 index 0000000..cbaab6e --- /dev/null +++ b/kobalt/src/Build.kt @@ -0,0 +1,57 @@ + +import com.beust.kobalt.plugin.application.application +import com.beust.kobalt.plugin.packaging.assemble +import com.beust.kobalt.profile +import com.beust.kobalt.project +//import net.thauvin.erik.kobalt.plugin.propertyfile.* + +val semver = "0.1.0" + +val dev by profile() +val kobaltDependency = if (dev) "kobalt" else "kobalt-plugin-api" + +val p = project { + name = "kobalt-property-file" + group = "net.thauvin.erik" + artifactId = name + version = semver + + dependencies { + compile("com.beust:$kobaltDependency:") + } + + dependenciesTest { + //compile("org.testng:testng:6.11") + } + + assemble { + jar { + fatJar = true + } + + mavenJars {} + } + + application { + mainClass = "com.example.MainKt" + } +} + +val example = project(p) { + directory = "example" + name = "example" + version = "0.1.0" + + assemble { + jar { + } + } + + application { + mainClass = "com.example.MainKt" + } + +// propertyFile { +// file = "version.properties" +// } +} \ No newline at end of file diff --git a/kobalt/wrapper/kobalt-wrapper.jar b/kobalt/wrapper/kobalt-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..64f1427182cb19da9821b073b73e4f0c80ec2b16 GIT binary patch literal 11295 zcma)?RZyL4x24hG?k)-L?h;%UuyD8F?(QB!aCdhLuz=w14hwhp;BLM5e@@pq`|mzo zJ*wu_H|LmD^Sv0~#RHUwhCzgYfQN?|ON)~u6%$CF`~(3}h718g1%VA=;$X+}&CJck zmBq&4o3X7ci-)tZqobKKi@1Zmxs?U8iLJ4V3nT>kzXl-w(%-{>D_Zl(Lw5k@eNgA% z$*MlDAAwyPTPC=Q*B=2An!TuB5z5+h$Owz|xVM2bWnbnZ@*(G2X5-nk7?EXuF_SJ* zC^HCBM|Tj#OrZ4e)*-OZutzB?q~)ea%bH>|id{=si`WyK@-ZElig6Nx?&jI91x%11W;g793aU$`F5X~czu^%zyEnKtor z2x`{&sxAh7zr%xL5VB^0d$i@n#Z9&(W@`i6px&?{FEj9q(_hohx1 zAFj31ZGRH9Eek?Y@MT;<_v z`HWLA#gfJ0m%dg&PXcuEY?*8L#0;e}sQva6iH~&#MaI!EAgxrPFCk}p&KrLL*~|Q1 ztxNm?G{yr4x900Jh3l<-Xcx`MKu0bLKq9b#7r zLOSRT$}uSEkoJ}ITOY(Eb|62;msc_Rz^*#;l$F(Mvbo_6lbbcI@HyE*0_`b{anhsn>WGNn}t3k?o{mzAiITnZ4TOK|w;OTJ4MDSCt*is%|Ylx75%0e zilj5(Ci$3VfPpnno^nT9l3&9hYhci*DbHB=!H`|!)Fwfvi<8#pvxnBWzAvX@?A;`O zbzU)|+?Z7_JwYic`g`_9rfZc;on8e-qW~+KBW6gSXaJrz;_1*DvT}2Ra4~ zR=9U)Z-mjTx2)=SjCh$?=_bcJo)Y?#I zi>m1zuVOsPi4iEv<}R}m8)l%f?o^#ctgc=T8dg!1)Q%q-QsYrzvFmh0ujdv#SY+>O zRA5!)t}D?-+I)_-T6e&u4S|vrxLBR;AIHL*wXYL7ukvEn%9L2CA6Al_bEER2Evv{; z%(9}Kn|oc5VIXYn*tFomf zj-0IyBCe#2TjmHc`VbWRJVM{wumzp%W06-JTxSGwL-j^d$rttb%|wheLD75k?d=P$ zHPY1AY1G&&zN&nX7p%kJBb-+1>^B|PH)3Y%uiX~u;z_nv(T$Tv;;y^MD+b+f{qw(<%{(ke1QFxkkEF78CIAXhg1J>-#Mp&802cO5OxlBhd`{6z^6!OBKN#dc_*Iy z>>fq2jp$}azV`^2eD^JvFITW5zL5+vAwjTbCYg1)1CD`IPE<8C3Z%VAM^J~n!&lHT zM7*d@x6Zf9{dhXl`(bpiBqIoLzvpX1*Qoj<+M_1t?b9CqCC;T9Qx(#+BwpLZYC0E$H* z=%bsF?As>QyJKZ*YQ{>~MI1pG%x=Jjbeq*Fpb@QXu0eExrhq=K=P{eMN|-|c_v@6o@N ztb^dIHa{oUc<-)?kpOuvrNlDhtkM;+1b}Xp78;cFUhfbd4MCQkBDgdBmJM=gC{lRe3BeCf#&(J7mwAL4X6T<|SOU~w=jI+t&=im4*Qu86R z(T-lrkV(LgY-mgvP^kWThcu>_ag$0vIGN|4e4J-5PG6HQ-#~*RmzNx`Rf8h8moBgE zlOhREEbudUZtr!IEXS|)gCg;@A`=I>S5x~hEPGc!25V1Vw`F@OM?;T)4f5jK3642FyN9@qb8mZdV1|O>_H8r*%mldbqu3 zP6psfZ6q###0`lwO#2xgy~_)~>XLrM4+ZS2kqsxIxxLFA_VEW)UBxpBkLJR&gk(_a z*G1Iq@wgUq?q5!Gy#|(Kkv=ClkMu>u-G*)Jx)ukO&AKHQGsM=^7h4?BOKY~Yj`kVQ z8>+&RSG8Z412qd>)r%@;S_uow>quM0_W~lW%_^O&+XbmDtqUUlXwZ!8n!>9*ne~3j zXVcbH<>XS=oHM1+GIIM-Q*v6N)j1jGA6X+OQ~^k~sSrbkZ*mq@x3(^cAXRN}<ouOblGo|BP~6)&bjn%6@MoB5s5Jjla(6ksCZ!kWom@GU|4~eS!;CG#;-P1fdA=c+Q zuF!^QL>w&97)#)4wZ_1-*_NqL*F1G?G|)Ws278_Odf5g_mq#ztm#ys0)KsEw3w_B} zXkB5<71+nPFGB+3Do6_6)~(RTGV4ngpWm0+(U(;IuEA_QnVEOjKcAjgRJdd3OIfHg z-f;u)$rtEfN&I4{qsBi*;0yIC5%k^oRZ>#k(o|wq-1ZQ_jA_wzY}ZCD+mBL^{$=a;{{6 z6XB)lBL>;{XfW4(6_t3C%8=~PB-31P&lk^XEO+mLw$hAQ@N6xibXkRtZ*?lrZ(wCY zLLN09@PcOMD|-uGXj^Y2M;>U00GQz-3xe*yKIzrZ56`K#%U`N6(uMgvS>5A^cZ3}) zYJlr)?cNm8ie-GHtD5^Yz=gJs8av7)&`Ry2%YM4^Ns<5fDjRx{0e@o*AMp8GV!!Dod zh(_!xrU`o)1N`&U;7hCBCpWR|C5l1?OqW7bOB4@d|lrdn3U{1y~ z!G1>Iy-M4OZ%Uo>j+oFV26SVK31HP3`Fzv=y_zup6Js%Ud{9fl4|f}e0=hFr4R*WoP| z{M>CE{}Sq&x@u})Z$@8cTX19!K5xc{6)rPxN-_sva}f_DZCiBBDed#^{GP8Nv=ULf zpR-P=wXvQFjHRSz&vu?aE43n*ZhA>4NRr2qz(VAUnQMD#I?3)yJv9r)34ac5o!y$_ zg9xcFQ@3p<9tCP%VTLgLp4}?`i4WwJsOQH;x*z?D?AG{9xx~PtRNX42kMxt4Wh&4v z_Lk{3ql)q%T*7uHK@@15 zj@y8qbHK*SnA?7QXe%}ig$C^Hc>Km9hlKHo<$%hFo3Qo>(LPLzi|7}MTW%|vekMl9 zkc%+Xq+{X?*aPJ*&^yjbr{n?_3%4@@z+I6jq;Sp#7Pn?e%H^bcfrnhu2yMo0337T4}ixKrR~H zCY229RcsOT;7<)}0QSG?Ec4tvQ_rS2_2K;!LA?@3eEYmwSf{1rQ81pHL|wFvM)TS; z0R?LvxQH(pL<2>U_^h?oV5Lfnd-BT-s-bNW2)9=>;QvvfRf{eo@#da(1NTN^?DAEU zlJ2tz%uX%{eIkiH0DSM{Lcj}J4C8;L8`Gsr;j#O&Q%{Z>W&t#yO)5=&YAcBRP!Nig zD`BfT`6=lkGih2TJ^!^t(m$Z26rf;M#bu-Ehq$4d(hN-({iZR43v(hw-CeI!v>F`Y zoppnf)2oVd2ZJn1k}#C0XH#}jenHeOMjTMF=|I%j^*IT?kw%PUCMVIN`U#RPI(zCR=o*Q zKwN(n<2j)={5c*Tppf1V0+U_b!n3?P|IQ1zmWspqeyNnh?{Yo3edT~}U_4;@0mei# zn!hl#F9tfB>n6UF3@eF>fIsb)vx1RM224!X;imx4k1i)e;ohd(#yaSUN??BxnhkY;jg+xlOd20XX_ z$htKtE%DF5QeqgnN<;NHiy!cO%PgoXqSNTEv8m#mWe+bffsn821&Sz(NDf+-%BIT~WlQ%NT79_5Z9Bvl@tJ*C9B zykvtDTs!ZO5Z}d+R3_oZSl**6>zi7K17C%2h+r@_uC#4${k!0=Sl2IRQPk^b3^_+Wiy=D$X%s(o4Ehi zv6;_6P7&-cBH*xA?!G0wj2>7ny{5An@)!^+EGsum(c$)|2+zbd%_Ynr(R6yEf)v_0 zQ{8O`)By<7cdar3%s~*&U%%&}iu{1(&d&tLkAQac>|#!nGLQL97Ear@RH)bK&^?C)vOO zFfCG45pU)P0XbboMH15sa8qLM^G8Ra)|5B^au5gdebzvuinX}|D%F`Y za@$FEk7ubH);?{@$rQ=T0@ly|2z?)|`fL_FyckQg?>NQQ2g$?!iBudZQGZ&2gQ)=( zNO-Gzzko^-)%l#VMe*TmZt^UYftls$6A6q*>pfb;1Arag2QJ?9&r37L8mG=q8@CWwBz+Q}@ATRVStThg0>Zz6rqgGKt4#Zj{3rZl#s(#-ho`kyfw zi3uB2d|lKWq{&5P10{Fo&>D+4@NL59AA!<`+%ji$_Xwq=XhECVC)Kpi#kklaoDf=Hcb3PMyNMZ37z9(M{fddhLF+kWoF3`> zG;eoh2@}z*HO>}GPn9|E;jkVIA_$%jLUn3M7Kka_$$AISanc0qlk{i}0Vg1nY$~+1 zH9LyT#V1x)4%8b_#6iD-#yILfMUZoo7 z8&ZUr_0qsTl1jm<-)YFZLBvu_4HJ(?6c%W8>trr>FOdBZQdd@IT}| zgM@4m?v)5||JR6(tSs)A5#+C|(*^f7WA%1^6f1k08}z;e z>O8xUKV=aQ(9;PZecqj+0bzMk>eRk&1ucA@&s|nz*QM$TO1mk!RCDpoXt5Wx%Ds#@2<8 z)HagOXX2IlIZsG?j5LS_T)5naHH}NXE{_|Vb}^Yr)1jl{L~(bth*`HXNC1FTM!v0dIKRYEI09y8FtE~S~{|7eu_uG_+1bsmt z&ZA9=(8Fw62q!M`OZ)D#l`p}2JJw~l7j?mLY2x#-sYP;SEWKPFb#tNIX(8Pty#<*< zzf%^G1zKDHnF4)k14-V<4;^L?m-wbAXO4(xVLrxs$MX`lJRzz)96k^6GvR7q5d|EI zb%%_&??O^o0H!ue?oa_Z`Yd@#HA$0W&J5&`EUD5th>21jE65H>q+>h&#CJf{5lKZ! z*Bs_E4O4Nz9J|)C^Y2B(-{57(On%`=#SmleUTjUV?88f2>z%o>bi5hD_9&|Z)LtE~ zXr+12m_Zk=ns1-dl`Js|$Gp6}24$&87p3Sm&ViqMD-Ik_Xi~4=IskaH^2_24=qgiV|!4 zwJ`r7xjM+3;bCq({MtVQHe@^ShJ3<4?57e6ue_X};`j|;ZoZSSg~-J5XNPVo{q?hF zy@+SpL-Gl`JB{EOhH?&t{6t{Gvli|APa%<+4yf)CzoHV{QQ7%-rnN4;LX9m&uv`p; z%eM?J94Xq;dh0S0_5Q%~o?23}SP+M8a8K+iVw82m_@0b7Zyj~wucLR(+JZWpph0VG zB{DCVl(1)+5Rl=<#<+tibKMZPwa>cC0FXWIm$u|CN}vcd6J6fi8jxRaoGM3A+cj*wV!*YpaG=`-#U9b zsQo%^S;G1!TI3j!NR~82cLV+7xEr5AZy>(70mxXE%3OZv{LE04W-dt!Ea|6i#2a-07(vx*U4xi9vkXD+}*lGcuqs5C=nV-JodR9zJS)x5hM2{bUKuVSj2l| z^p4j(9%@fF*kSfg_n20C)V+1-j5659JL1avGsHV$V~yAmgVhdiZ>WhkR|__~Eosfz z(BPTAn6JK-o|g_#@j0rs4%|@QEPQ~GSd!m`>&e40J^lk5o734;hah?bFz|luve;? z;&o43-N1fzOouD%{i9ga?`9f=`HjjLeaoJb(%c%wp!jrq|D=`ksFEeIa)t4SC`r>2 z{4DCtTGApLM&u6et)0LZa=-HV!xbe%ZjAZTuS-bH?u5KGnjM|2d@20 zTI-}{@BLbfx7uQyCP)hP{k){`*BHZ-cV~JRB(U{o?E&1mJB0lUrwH8Q<{;X2q4`Jc zYYu|5&})kGYBm0;=RO>xt*X5`xgSwKGnGirNAHcu@ahNB<#V78gydJ=3-0b2N!QRC z$S>!g(9pU%ns*kSEQS|c8oMDmoPp@G((me2D#ln&-{z?b-fso_0Cv47=?$Ko6 zsa98wTbxrK2ED-^=Gd>T`qFD4-5*fMYnEtwhPj-TnTb@p%tSx*Hr83oQ~=MP9CtIJ zZ>v+(9K)X0>oc#-3fGhNZ#S$n45TD`R2>t_lln@h@sq4*f(E`Zf4$R>aki(H`@IYv zb)iLGx;UU;iP4b-pU_xLDicODBEeBf^28cie2VxC5~FXv?Q1SV4WK|}dAd|Nz2uOK zFtYvj>1T3De%h3eZpYY*9iO@O3R{FCyP`F>foK@IFW)VDVrl`pu9SQn=M?u7a9@&u zxLOj__yiv(7 ze50xYp}Q@?XQZB*VqeQQNY(FH(B9UoLg@l`D3f#n;Tm$<{Dh@GGS_C<<-yjX&0Y)B zjC>sEYi_i0Vaqh76U-99$4Q=n%NfX!kz~PIwS_##Oy200JKMy0ifq#Z4$VL!pb_a5 zT*6ZeSgo*l+>LhnJCRXLH0waJTF|9nY^Eh0&m5tF!eL)p)1{7@%;}Mafl};ci)ii5 zk-Bj1#-6)(RLHG>ePJJQuW+VlN4!Ozov1hM;Iv{(E--BH6yU2BkOYLuMcRE!Yk~}% zVj6xMcJ93+<^h+yjd6BRV&D3;cA@ zL^-x>8kmmMZ3V-eBf8U&+%Cgf$t!1Z$;~T+Y~PuE67N{k-_GTmPgf||VyUc$CYqD! zmZnE=xSS>!dum1Ng?#JYsMmLgHXrs<{X9B}LaaUsNysWLNY4@K-VzaPND?QXAdS(C zq1z$M@txE+ffQ*=lrO;|DT9RVe5g2&Ve5x3o$ku@Dtyo4i-ZV?^%0S;R?XlivTnHN zZ9Cu82U$~S`-_K54D-l=O=*?DgK~Ot>s%}0*oR~P=dbFD%9Bi-qla{(BU3B1gD(IP zA)?`v!h&n(a=Cz`HLVc$* zp8?+J7TC>zL|x2+k3-uZEGA$R&zAcT$09v^Fvw+y>>Wb!d^0b0e5Sin9N1r`3bcF?-gNx4Hk(#G*xo6~ z)I;A_UpvT#oj2~z3dzUiR`)z&ZC1+Q1?)iJ^t_JoFre-DH1)rW&G6qv2dusAj z-l2eJa{S4)1!2BiOb0Bpd|P%x0qHA`4A{H1vje_D`hz@kTaX6_W8XGv<_U*@%X$kzd|A1)<>=hSi@Khth- z-ai&B%x%4Lov+}njAu#>ya73nR-qg+omj(9p9w?o=djtmMoQQ|1B%8!0E*$)8`~}% zzl8cT&oVE)@Wn6l;2IR?+Pi!KXr?IBHdDZN18=`T>s+ddWobp} z0mOMCC`$fbNBo%q@`aBcoRBi^^dF>bZ)jGwN7u1RsvbkAH#FRKdgUg8?}8G8ulvy- z$Ph0`xDqNz2P;Uvy9w=YW=C?1d{B`dR*WCfg4ar#c9;tHRF7aMpX1u**%3?X^{*y0 zX9ZauoS%vm|9px$k@dcaJ;5e&pR|_^E=7 zJwJ_Cl#FgKIzk!j$M`ghk-w}Y9Rb+KdSPFUiFxF;G*c;#+5 zrTFnG)sDM{oYvMjgQ~q%x!zfb%tZa-2aqz3nTK~ z&lqOESSGA8mbVK{R4ZQGA82S&v}HWZNQRwlNY|p#-G5Q_OU&CExdhXxNzGYN%SH3K zVr5S#nJl;`HjsS4{gZY+9Bk@=F--Z2GDM+e)Ws+5tVo~_2 zC@UqYs>ZA!b)zso29RfBoB+-&-M}up#~@%Jr|s|Iq&z^ZM_W|73#xyB`%C#Q%)Z{ud$i?}q<8 w`+qmYqKEiDAK~A}|NXT8Wnll;`2X$DKzZ1IvAZx3Fc4Ib5D, + val taskContributor: TaskContributor) : + BasePlugin(), ITaskContributor, IConfigActor by configActor { + private val calendarFields = mapOf( + Units.MILLISECOND to Calendar.MILLISECOND, + Units.SECOND to Calendar.SECOND, + Units.MINUTE to Calendar.MINUTE, + Units.HOUR to Calendar.HOUR_OF_DAY, + Units.DAY to Calendar.DATE, + Units.WEEK to Calendar.WEEK_OF_YEAR, + Units.MONTH to Calendar.MONTH, + Units.YEAR to Calendar.YEAR + ) + + // ITaskContributor + override fun tasksFor(project: Project, context: KobaltContext): List { + return emptyList() + } + + companion object { + const val NAME: String = "PropertyFile" + } + + override val name = NAME + + override fun apply(project: Project, context: KobaltContext) { + super.apply(project, context) + taskContributor.addVariantTasks(this, project, context, NAME, group = "other", + runTask = { propertyFile(project) }) + } + + @Task(name = "propertyFile", description = "Edit a property file.") + fun propertyFile(project: Project): TaskResult { + configurationFor(project)?.let { config -> + if (config.file.isBlank()) { + error("Please specify a property file name.") + return TaskResult() + } else { + // Load properties + val p = Properties() + Paths.get(config.file).let { path -> + if (path.toFile().exists()) { + Files.newInputStream(path).use { + p.load(it) + } + } + } + + var result = TaskResult() + + // Process entries + config.entries.forEach { entry -> + if (entry.key.isBlank()) { + error("An entry key must be specified.") + return TaskResult() + } else { + with(entry) { + if (value == null && default == null && operation != Operations.DELETE) { + warn("An entry value or default must be specified: $key") + } else if (type == Types.STRING && (operation == Operations.SUBTRACT)) { + warn("Subtraction is not supported for String properties: $key") + } else if (operation == Operations.DELETE) { + p.remove(entry.key) + } else { + when (type) { + Types.DATE -> result = processDate(p, entry) + Types.INT -> result = processInt(p, entry) + else -> result = processString(p, entry) + } + } + } + } + + // @TODO maybe just warn and keep on going? + if (!result.success) { + return result + } + } + + // Save properties + FileOutputStream(config.file).use { output -> + p.store(output, config.comment) + } + } + } + + return TaskResult() + } + + private fun processDate(p: Properties, entry: Entry): TaskResult { + val cal = Calendar.getInstance() + val value = currentValue(p.getProperty(entry.key), entry.value, entry.default, entry.operation) + + val fmt = SimpleDateFormat(if (entry.pattern.isBlank()) { + "yyyy/MM/dd HH:mm" + } else { + entry.pattern + }) + + if (value.equals("now", true) || value.isBlank()) { + cal.time = Date() + } else { + try { + cal.time = fmt.parse(value) + } catch (pe: ParseException) { + warn("Date parse exception for: ${entry.key}", pe) + } + } + + if (entry.operation != Operations.SET) { + var offset = 0 + + try { + offset = Integer.parseInt(value) + if (entry.operation == Operations.SUBTRACT) { + offset *= -1 + } + } catch (nfe: NumberFormatException) { + warn("Non-integer value for: ${entry.key}") + } + + cal.add(calendarFields.getOrDefault(entry.unit, Calendar.DATE), offset) + } + + return TaskResult() + } + + private fun processInt(p: Properties, entry: Entry): TaskResult { + var intValue: Int + try { + val fmt = DecimalFormat(entry.pattern) + val value = currentValue(p.getProperty(entry.key), entry.value, entry.default, entry.operation) + + intValue = fmt.parse(if (value.isBlank()) "0" else value).toInt() + + if (entry.operation == Operations.ADD) { + intValue += 1 + } else if (entry.operation == Operations.SUBTRACT) { + intValue -= 1 + } + + p.setProperty(entry.key, fmt.format(intValue)) + } catch (nfe: NumberFormatException) { + warn("Number format exception for: ${entry.key}", nfe) + } catch (pe: ParseException) { + warn("Number parsing exception for: ${entry.key}", pe) + } + + return TaskResult() + } + + private fun processString(p: Properties, entry: Entry): TaskResult { + val value = currentValue(p.getProperty(entry.key), entry.value, entry.default, entry.operation) + + if (entry.operation == Operations.SET) { + p.setProperty(entry.key, value) + } else if (entry.operation == Operations.ADD) { + p.setProperty(entry.key, value + p.getProperty(entry.key, "")) + } + + return TaskResult() + } + + private fun currentValue(value: String?, newValue: String?, default: String?, operation: Enum): String { + var result: String? = null + + if (operation == Operations.SET) { + if (newValue != null && default != null) { + result = newValue + } + + if (newValue != null && default != null && value != null) { + result = value + } + + if (newValue != null && default != null && value == null) { + result = default + } + } else { + result = value ?: default + } + + if (result == null) { + result = "" + } + + return result + } +} + +enum class Types { + DATE, INT, STRING +} + +enum class Operations { + ADD, DELETE, SET, SUBTRACT +} + + +enum class Units { + MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR +} + +data class Entry( + var key: String = "", + var value: String? = null, + var default: String? = null, + var type: Enum = Types.STRING, + var operation: Enum = Operations.SET, + var pattern: String = "", + var unit: Units = Units.DAY) + +@Directive +class PropertyFileConfig { + var file: String = "" + var comment: String = "" + val entries = arrayListOf() + + @Suppress("unused") + fun entry( + key: String = "", + value: String? = null, + default: String? = null, + type: Enum = Types.STRING, + operation: Enum = Operations.SET, + pattern: String = "", + unit: Units = Units.DAY) { + if (key.isNotEmpty()) entries.add(Entry(key, value, default, type, operation, pattern, unit)) + } +} + +@Suppress("unused") +@Directive +fun Project.propertyfile(init: PropertyFileConfig.() -> Unit) { + PropertyFileConfig().let { config -> + config.init() + (Plugins.findPlugin(PropertyFilePlugin.NAME) as PropertyFilePlugin).addConfiguration(this, config) + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/kobalt-plugin.xml b/src/main/resources/META-INF/kobalt-plugin.xml new file mode 100644 index 0000000..1463d1c --- /dev/null +++ b/src/main/resources/META-INF/kobalt-plugin.xml @@ -0,0 +1,6 @@ + + Maven Local Repository + + net.thauvin.erik.kobalt.plugin.propertyfile.PropertyFilePlugin + + \ No newline at end of file diff --git a/src/test/kotlin/com/example/MainTest.kt b/src/test/kotlin/com/example/MainTest.kt new file mode 100644 index 0000000..96458e9 --- /dev/null +++ b/src/test/kotlin/com/example/MainTest.kt @@ -0,0 +1,8 @@ +package com.example + +import org.testng.annotations.Test + +class ExampleTest { + @Test + fun f() = println("Running test") +} \ No newline at end of file