From 8c0c9bb10d41928362ab437327a360ff1096d7e6 Mon Sep 17 00:00:00 2001 From: Sampo Niskanen Date: Wed, 23 Jan 2013 08:32:09 +0200 Subject: [PATCH] Plugin system --- core/.classpath | 2 + core/build.xml | 1 + core/lib-test/test-plugin.jar | Bin 0 -> 788 bytes .../annotation-detector-3.0.2-SNAPSHOT.jar | Bin 0 -> 15780 bytes core/resources/datafiles/presets/system.ser | Bin 403826 -> 403826 bytes .../datafiles/thrustcurves/thrustcurves.ser | Bin 2491698 -> 2491698 bytes .../openrocket/plugin/AnnotationFinder.java | 16 +++ .../plugin/AnnotationFinderImpl.java | 92 ++++++++++++++++ core/src/net/sf/openrocket/plugin/JIJ.java | 29 ----- core/src/net/sf/openrocket/plugin/Plugin.java | 6 +- .../sf/openrocket/plugin/PluginModule.java | 104 +++++------------- core/src/net/sf/openrocket/plugin/Test.java | 47 -------- .../sf/openrocket/startup/GuiceStartup.java | 16 +-- .../database/ThrustCurveMotorSetTest.java | 32 +++--- .../sf/openrocket/plugin/Example2Plugin.java | 9 ++ .../sf/openrocket/plugin/ExamplePlugin.java | 5 +- .../openrocket/plugin/ExamplePluginImpl.java | 9 +- .../sf/openrocket/plugin/MultiPluginImpl.java | 10 ++ .../plugin/NotAnExamplePluginImpl.java | 9 ++ .../net/sf/openrocket/plugin/PluginTest.java | 26 +++++ .../sf/openrocket/plugin/PluginTester.java | 38 +++++++ .../net/sf/openrocket/util/TestMutex.java | 9 +- 22 files changed, 272 insertions(+), 188 deletions(-) create mode 100644 core/lib-test/test-plugin.jar create mode 100644 core/lib/annotation-detector-3.0.2-SNAPSHOT.jar create mode 100644 core/src/net/sf/openrocket/plugin/AnnotationFinder.java create mode 100644 core/src/net/sf/openrocket/plugin/AnnotationFinderImpl.java delete mode 100644 core/src/net/sf/openrocket/plugin/JIJ.java delete mode 100644 core/src/net/sf/openrocket/plugin/Test.java create mode 100644 core/test/net/sf/openrocket/plugin/Example2Plugin.java rename core/{src => test}/net/sf/openrocket/plugin/ExamplePlugin.java (62%) rename core/{src => test}/net/sf/openrocket/plugin/ExamplePluginImpl.java (50%) create mode 100644 core/test/net/sf/openrocket/plugin/MultiPluginImpl.java create mode 100644 core/test/net/sf/openrocket/plugin/NotAnExamplePluginImpl.java create mode 100644 core/test/net/sf/openrocket/plugin/PluginTest.java create mode 100644 core/test/net/sf/openrocket/plugin/PluginTester.java diff --git a/core/.classpath b/core/.classpath index c4cc74f89..4f2120c42 100644 --- a/core/.classpath +++ b/core/.classpath @@ -33,5 +33,7 @@ + + diff --git a/core/build.xml b/core/build.xml index ba9e25a8c..4655e8e2e 100644 --- a/core/build.xml +++ b/core/build.xml @@ -101,6 +101,7 @@ + diff --git a/core/lib-test/test-plugin.jar b/core/lib-test/test-plugin.jar new file mode 100644 index 0000000000000000000000000000000000000000..1a6f40aaf9652c5265229d6724d04d9c486d5436 GIT binary patch literal 788 zcmWIWW@Zs#;Nak3Si8{3i2(_4GO#fCx`sIFdiuHP|2xINz|0Wf&CUT*!30$nfK#&w zPz7AGucM!*n`>~0p0C?y-!rFuymj?1@_OrPojY@WbCAIm;|EWR^t^m^Jbf>gu43Vw z@mlhTbc9yM4{=qs=S#FKo{Nh<5m%kYFg5#A(Z?c2upa zQoIlpA+dYGp$64!VICZfEL{wYr{1vy#|T+_$sD<#@zS5IE7rx9#7(JW=ub2dKi~A+>HLpS ztLZa&AN*fh@JlHpWSbVxzmUw-eu-U=_qH6gHvDenBAzYCw8r2|^3tcN!Amyn63*0< zY}jY+?A`4$7Nc`D)^rt|NDS?{gx3?7NC)k6{VB^pBW^O$*Wmg zXSUGd>%ZB7fq+o|XeJ{dDxodRb^(mCS2WaNicaT zJ@7CQym2tzDB{_}MJghPzQ}EL#G|sh>x2QLp)b)37MhZlyhLo(<T zp4e@eW;};q^2+IWDAg-;zecg4p@KhC2Kvf{vD5El z{nY^GzXs;kCN@_34*!QC`kxK;t*vbw^&QP^tp5)m#6SBuIhtGkZVmaLv98^|sgHhz z=Aj1yqW!b=A0i0+9!%KS(b&+@#-7&DQs2R0RMX8K`kS^^DeDb8BmN9wTE*v zX^(e(D*Nt{k)ufp@NKG9u82Y4-uvA-sQsD`x98^=zAyOkX;i}EYD2*YQng~+dA#l6 ze0dkMH4Rz-3r4(PN8=u`g3qde7>NrzbKZBOWCeGL%-PA?&D77ZKB|E6JaQYBM zoZs=I%WP}a6o+=~t!sgeHyVvw;XOC3y+n^SO8JD0K{!3rD#>cmw-Ze*Vc~=eZ+4L< zOd`WWe1rq_Q>Vr>9I}Q7gUA^E))L|mCBMU!#y!|K(qDLgRhH(;1kWnmUF}MMvx>FSeOy0@zZuuhN@moA5S+S)9THz)4-=+eO9u zObXK|K%0!`{ZXI_zZ%HR0itE=C%}RaxHvV__ZPteiN8sh0WmLD&tMv_SZO zvamVXtvImWlZP1ZvDYy*{YDDhz%R)obk*bKl~;II-nCvT-$ciV8L9%-y)Mp;h#=Cf zBDpu3>zDJ{4opea9!+hhK^JEps~9^v1iW++L`eO{Iq1H}@75NzS39*?)50Ir&(=pp zjT;;KrqXt#xa2(m6tlb3q%6~IW!TEpC6o`nYf-s zybwFmDw2O%qTH?EI`;<{+rbtBR166I$>g)bprAZu#&>!VGyBuda$gYjd34VB$4RQJ zf*{vX&g6=+h34DB>0Mn)#K-39%E;LBGembz{Nkr*il|gr_c0*yHf*X$9fZggNlu|1 z%ykIbLD_}cS|+Z83GyP>cYWJ9a3a;pPb~YkN8~Mq@QL3eLJN_vcXo14VC^I{s+q~;T=$*lNRP z#YKM!9;I9f9_@r1-^b`+Lyl7r#IOW)5^+9^pNPeJSPOPrOIrp(U@th zZ5QOI2xv;fST+Wa`+jVELaCQWC?npP73@${AMeOu@?n3n&~Hs|f|4vL!!XV-v+L@N zw}iBh*BL-{SF|IFx~z^5qB}2VzPFcBFjz#%OO(@xxS&jrDs|>m!v6u>m!gQQFv!0@ zCuEnR@H2}2y8!sfP=Sx0sEgv@wJd(~@Wj|T8z+WIh*E`-Ma|yq%sB?sjo6-StA?j- zo+E1yx8Bm_^tTY6(mN2a-m&=p(5otgMiUD6yo}o|W%01h>Bj<}uW1hm1C9#}ZPSQX zom>-ylW2rLZdigH#l;7vBwm6)$d_D(e~IoHA;lzwbC1{9!N-0i@}6H4yB#Rn0}cZN zDQCPTdsGVW>5m~SzM*w5^WPJOd&YfPS>rp!N16X*Nhtj^xW+fEiQd)w5ul?Ry)D)GxY0GT1C1MBe<&I=cx>FLEI2xbvmpYkg6Exw=tDV|Bv zu#@-XTFPxUc*jU3<|Ey6V;AojGJ`RZ2Igbwyt4oR$N1Fe%@y$&EBku@Q~sG0lM29m z3RQ|p2#}`je`<4T@z~sDbLs%ez3DZPgO7OV!ia(GDQMe4(ak+*7z(!uqUb=(i5aS8 zqR`IkDe=9=7OLAT3>uomE6z+JFOU{XaEu&Ea*CehBDu>{pv@8go6SVPo0Bsa!s$Tp zfVYCxi0o2fRnwp9lTXK{RpGJ*F5q;@`|TxrJlI@t(t`T|CT3WG;R!~T6iJ>zf)3;v zGwT2hJ65Hj68;JNeHsZ(TZswS021WRpdLWHNDHjY95+;pN~1*0eh7^Did{U55JcXZ zaAy48rxyo}EP6x=R?b5M%n~ju8c2$KWxFu1%>%wd4yaEDJ=N>)oYZWTn#iVLl5ysU z>Eu*7q4wCP;itb()i}yQsF_Cu`nc$skz*bkmr5rv%F1b|awl)J@nNztkO=VvcNbB; z^}+9codCVDA;UoyH=uy_`t1ajf~HoxbhSu_BxY7uKv|%HOn{JGXeSy>8(lFm{PCr0 zJ}oxfVX{4qj$QIK1R_%QpsHU&X+HsBASO}P9?w2o)RuWKqriiG7=?Idrspxos?t6L z95-BETvwvO>Sr<3*aarUFfbJYc{-R$vJVgU-}aLT&L9L+i6bDLa=m9*bhr?Y3G8<= zEE{bJ+zj(;GS%UzyCvF_;Q4j!%(0~;N{K%5v9ByWYZ0Vb7Sc)Rj$!j{wPGnxFX`vH z>8eD@z8NO-C*T<(L@CgaGeegt zK$t`mzg7d8+U@bZnNVSUMCw%ITC)K1nE`$eb885HyXnif?#l;ts|0^L?OW;4nGO7? z0rAMuImfj&4*Kj5`b@ai2Jec$_7>+f%D3aYuMNnfF~lQU=XP2t+)~OhH$nRfcO`gRh5Pu*r>GfTq0t|o-XTFyBxt9$wRt8sJ(8QJi&AVNex`&U z#wS^%-(0C%%Tky^h$Azcy#%{CECQUL#O;u~RZpj6vk3P4??s4_bJ^(Y&O&Yhjg5;i z3A&~7y*}_}n^~~Dw)?r^59B^{#z|^8A0LI3foyBQWO;>yfFh`?b`fQ|aKQ%5v75U$ znX$elZYFvqj?E{Y;1`tK;3anCPQ-k-K}`&~w&TB1qU8|~xugQf$SHt50agOMxt@{* zFS(i%pZQyMW9aw!dTd`nHa)NQ`b)Fk+xt>zJ34K<&c8e~V zLdzh*ugRZq{2zlJGkde#V3}eJO(;Lh0S8GHz2CnKl;` zVfP?_syC(BQ$6+Tmrj{&0)I$`bE>H-CSA(T^!W-&Q!z#{GHG21?c*$}AKh*hm^{Nj zEX8(LD`u`CQ-PnX+?En4>0=EdW%ya!?V3T8S8!)uO{GYeMTwe3KaZtKbfFf6l%m05 zO?d&24d3;kV5moVI285yToP7|5yxy#U$ek(+(B%&H9ty6f`qtvW>02*UV^fKLDQe? zM3PfvbYx}>TjvYb%rGZhbx4H~oz5`tJ*?@ZOoq(+P3`8Si(T0);Si2&yze0HiDa8+ z8sa`1C6{Wng=%h`QR{GfTN>OcJGK;=y%838*`pVqqlOb{mchB)QCClPZ*n$OIp4B+ z@fj1zQwJKq7vX?xdAld4&a$hbnSYHn6TyFKs@@tCj41dVo|6T(|32txRSxe%hzyUA z4-s8b_e54-hU{I=&dDWCQ+Bt~uAAOieo4*^Smd&SDb#A`F8+K7>S)=Xh&$AE>hMmt z`}<&p@Dx=2{?>K0Wxa|g7>f-$i$Qj#UL!=O|#9_Tb;Qqzi<2=#SBiw5+>oc7SCxUDvqU?M}10qw73u4Zo z4AZ>v-XT^3>&2OCL@Pl^M;grBZF{W9sSjaE+qQ7mb%zB7>N+02luKaCV$HtWL&^>X zIsL}n9|lkSiIzPPT|CU;X$mh?Rw-X<{8dZZ(Etg<8Gg2ZR+wbZisE*7*k3c^u0E zXsyxcLJv|+K_6~CHG@8rj@0M9kMX8*SvqrqGOh;ai@R+eP3~oNwj(88FC0A#hDe)q zQ|ED_-}h_zQ9QX{$1fD>A&*%5{!0aQzm2IlTE-2?sys%qd5SX_`@Y zbJj$)?@sAqqxq(Ztax=2lp#FG?*r>vk~~}C#*lLcTQeV*g_xRBOo-G{?D5Ojydf6q zSr_Uv0_Y9nbp#eEgdt?KVeH6y4(}4x3t4t*wiQzovOiOA?^7$dQ(g8r=9(z(U#8Q$ zxqcA{n=93ds|&(a#wd`G$1sTL4vu@*Qt1^tv*hWtJ2g{Lm=F}qDjPEu9-%q4dznimezzjwv+$ENpRFR~pRo4aFvT-uz7ownM#VC7}xiZD!Q$ z9yvEL8cj8>OTlQjWO~qtkj)C>IZUI_997A*FumaTcO;7i)bsC7;1G8byCYqwf>jEv@y<-vV($)1-8|{PmQcPYaIFltEx_z8)w(TdgA-0a& z;Ty#p%zPsS=#!h^ctoAOu-Wq*dEe}!G|!$F1;kf`D4!>6mCoQJtz%QAlw{G)WFkc|)rU*I$Ax4KC!8!yz zZdV<7IwaqJpF53p!$wF$X|OMxh;pr3MpzgvigCb75t6BQ#8NBX2}F?F6-%6W$D<`9 zX32tEJ(CY=<5%<03%b z6)83HC9AhZ?Rmm$$+M}*GY&AvIWzHwk;}IEmT+?3Gzlg-!GI{cwC(yfHUx0MT6On! zb@#@kj6;$q^Y<<+^cWM>nUy^5Y97doNYr}_5(8vfHHI**k#j@iY7K9oTn*>m89sKF zbw1LLH`HwoG{7C-ZdR|0Sys6+USekXUdCJsI*4-PKphqGIyv}t1{YX{HtE@2GH4y* zIX$<4M(w`}+u4P-n9V;LOAh53kt?p`7$;P0P1ORjpG#y4e9ZeU3t2N)rc7$IsPrqH zNq0Wfa=cF;_O`;yE*agq+oh^!)Xi71ZBb3D0^`miOKa%#)-*AHyI+exiW??AW}zHp zBzjJGo|SL9uyf(2EX*fBE+ODIO+Ho=-xo%yDcRF^lyoyW*0w)aOOrHUwgait zaEp0VD&T#tTI#o&RCiQzo;sK8e`1{YF;gaJ(SH6Cx^!wxrS((yJ@?RBA0^db554|e z#F4hLzKREjD=cl77H2@|AxgIjt+`=wtCOy?;?#r%ymQ6Y2i~PetoY;-fG8RhMU1Ic z!be8~-3srn#7T}zpsy?yaZj!OE0s0nFkCLv56ilM$Y;>qi^&&+`{7BSiKD0Yzg6M? zTiJf2X3 zMK@$aC=?+fuP5jzCaw>S^8@Yrel{{JMFYY`gSJZr9Ju+IP~&@#iNzdR?;9287v~oS z{03746Dt)<-PcovV6+cNad@zEv>)pCe#L*8vNs|&zkX$C@0BU8 zf5Viro2~Jm*@}vrlzeURh@8wc?^UQ+AUy)dg|FqUO@|YN%Okx}^NcapR{WZ8RO{dI zHN@K&pQI25V1RZ{Z*)w*GX{Hin=uBIkw;hcu8O2eX1<=A;VVzO+^wR;X1upW}tf7g#MEM0SJ9kFy7| z$TB{0lQ%gFa;l@nKn5nqu)OHZkk(Znt9)01=@u&*G_bsHTy-Sf6|Fvzn~2!>rKO_# z@v8B;3d@6Lk@`;+Ec2L;Tpb4{q;93kx>yDU97^;Z)rVC6? z*T9RG!h&$&6aHKP{+d`ALk`7a4<4QyQ)`-pE-x>}2~acx@;u@^>OA40x;M*L88kIH z49&M>nT!Bi&i1rnwlp=xlsjXR1NRzX)G?1d;-;kdbgRYlhG^2w0M0Xnn zd&l43!S)b8f&6(cXOW7lKE6_k@=7VszoAsd*wM`9S5D)8aEciGQsOkNV^Pkt3-cdR z70i$%MG#T{Ln`iEB1@d**N}@f&|7%}?Mc)leFPyBZC@Tr~+OJvLpXVu~=H4%9^ozM-x zWd}4f39yBG`S^RI`usxcDH%JhBp477>1(@}<{xPl`qAkVHMcaDcwH3rfA9T8sp=@9 zn4)^4Bcp%qneJFyO{sby*3ogyxoKt7 zx(9YNvo=%GICfcdiC?!l&uhxoi9QwGW3=kE>M-Uo<~GJb_wX?N9v^r<=!BU&X8Ig+ zwhGNuxwYtB;3R2QM$$m4%de0|IlkZlANN#YoRq1A0h&_4X2yec`$w=T;gx7>iL0^7KVw zR!YvK8Nn`4UZ_7W=>c}j_GeKm->A8d&S}B~=N5ai1olIZW7(z#dU2=n_()q7`#Y^O%e< z#;UgtU~I#2rC{6P4v#71y7jU!G6{)JMyT}})5)0N){G8U_+Les^hz)F)ksNAryikz zA+Tw}uq0m1YqcyI63J_ya!m$k7AEFEqljAcq+wP#RDj^rt9v1n6n(=&Ak7C@-G=a2~bU?IuPJ8j>?}ECfbs)+)uNO+c zN3#kwHJAmc^LuT)6EsbLfm{{qVLa3f20tv?0Ithf4Y0n6DxElQNS96WMG+}Xkh5bP zQW0FpxCPrctg|&Q&Z+h<^e{`Vg|37CI^sbcIt(uNl*x~tURI%daa$ZwpwcQUfb&qw ztEhsnzp=+h3wA=32}=-ECLSJHJ?=l%l|v#ifN&a!uXmw$&d@#NS>sr)rM0L$m5G9w>3-JnY4 zx(i^|=g10ZR$LkG`>6K>R}jtdG2Z+hH3#pS$4Q%=Y4k3>WO8n;topo(KOzRQ1+y;` zV;Fd1X?Vmjo@;y4AWs(zXX)pX<|_*_#om2E&bnSaXO8Ur#z_uIiJ{m){4PSn%sz&W zB@^E;a%;(+0Euu{*7K?9HhRm(b-dwX?7DYlwIO>K+X||q^AwC|SE#Ai zKK`HIb$em=p-ZptIjh%&nd%=GWleM2zgd!%wB%3(P@fBRn(K6|x4h4SF&6Wvl@)Tq zP{|kbzX-vF^`;cSSIr-@F6jh3qdWoMhllac^xhu&oK}*XnrP)OlA17?j*Vp8wO?d1 zJ#5aU*Z?Vh5t)e6qAVnYZ{jY%?lkDm9ctMP7@MY7}KOygq!bD!<7leDf?MVPe1Dy^OI$A5F+^GeZGyBVBRSPIjKRrJI=atB zQsd`~nR)af1Gg5lL{_)~)Pu#sjpMX@Gs1D6Z*|UxH43wE!!{YVVn|b$mg?^zI#(WJP&zGcA8;=t5kHDr}V9d2IKWIUm8fH^1=mR zDxUH82vJ+8cTx86JBVP{5E{Y7Fmt0*x5*%zHa)+uH`z^YlnSmdv#~t6AXK5m#Gt{m zE;iqUIka)-KhYmAu2_N}Pj*dPQByInVh|RA`H-$$!+Fl33K9jFRhfRbicWKsf1G83 z5`bqjyP@i3MU{L=Il%ms_wAAl0trQgjE+2Z2$Z?_o)ILEtqzamgah^5xB5Gj z`Z*QIIH?>Ww|~5}x4(U415qHaWFSLWN$l*PEXoq>yL?+eXK+tg?Oqao_Y}LJrh!2< zv*Ua_w7DIZ@;@Jxr&u%Na?&0DO7Se9=u&n)MrIm>QC1ocl=U;6`!cCy~^3 zEk~t%DSsxLHTZB@RIPHH$+^7pP9>`hiC2@w872mI~ zYha6WQ87l2MX?N&&_;!W=@^D521nNo_{16+FixC{|h6ckRtS4Me?ykg)A>u$0On)w; z-9n5l#q10V#!b6IC#s;h-a7#<#GRs|9jzbY>IyR4T|)?<%DW3T%R(JhV&IN4?cGgh z@PrvJZNlzrG@K9cgdJb!qRdh|^AE>BV;)P|*@?>YpZHwoFFx36KrYV+J>zes8J%j* zZJ=3r5$bQ7X9KVhJ;a%_#ATz|RCY5TBbVKCaMNsvTGHU*E60#IqmDu{ousCiXR}Ux zkg-_NosxQLHeQH6PHmXwi=UG!U|_Pz*TEL@d>4nL+W?(in1w$H6>dj<=% zKSKR;g?tx1EmE6ainP8HQ4z6BMTLIozm(4Dkk11Lm^b%H?5v_W#_VPBH4DF(b*i^h> zJ3Gas82VM71?D?0{V(d#8Q6{GU@rT;qVjH9m90FY9D&9&v@H)})4Tmz%eG)#$X;j^ z7tQq(a=0=Uew_WHQG%0S_M_vJY{&O%wo;|~>ogd{7!Qxwz;;jDbi7Q(?YWsmK#&*| zs|w6Q9Y;p886z`%t!g64rWkb$6P!P%vIy_TDiK5-W6(0^(-Q!mpxsM(neJMvb9O=^ zV75ql>|4v#s+cfUn=Q8;x-~oqur|du5OAU`Zt--HM~AW7V`{r+sjzt?ys+bUr(^lE z!_`>0gYnH$(U==7jZlH%@uCxMMHTU~F)vch*ujq%ym-e{$JDdPxlk_5TP(LER}|4I z&0TT%W=^X@ucW>}x`?r4ppKg3sGJ1{vz-yaC8R2zB?mX28R894vL=*hlheCJE(>>& zH!pohA^BW=5!T+M5x&!k8*!jYJLVPTQCZehxDHZ5bvyFnG@rJnf{o&U5k;+3WhE4+ z@NM$j$5Oo(7e_MB5$r3$uBudY2;_7Wdxz+uQKLMk3&<5?&i#2bl$$oZ^SW&L`eauU z0wt8W?~;QI>hR-W1N+w;&)tgFY^z8fddMV;dyXl}gWXNw&OXdoOf@&t@cM@Y3rHss z@8E9-kmH|-7;A%rt)j~0TU3#BM5eI~8WVJ~h4}<)Pf?to9CQ4R6bx{LP=W`20_Q(g zj7LLP>^Sh@8Nov1Z8U)m;nKpFV50V-PCas`zzFiaGfI8RHM%7-%QKfC@d+_`))e-U zg0(N3KexSUsT(;h@koyN;$v}h#pP2Gf1uyl$$loQ7%Ntd@jkbyNWwZ?d2C{{PKsIg zYzK*_w}UQrTKBM5UlIOuqDr8_i$JCSJ6>USuRy+JD2WHRl1;t2D@`aZ3z9?ROP}a% zr#d_LwZA@lW6a6S==50u_mzfdDS>l zYY2O^-QJdSEY>S5%q}MYnQ!*93j$7yHVNeo7OdnNBya1KZz|Gv5wSX1SSXLTt$|Y} zhbo(8KiSSzPOK&vouNiwXvxycsB(Kq4-hLcU^}_!L`FNHI?o!bHk5LG0Kw|PFednT zoK_GlA@Iq<8I7yO`i-!A@{>xoIABN9VfvFQ@d^*}14A=_(d}s-SNzQf_Ae z8#h!#lf)AU;Eb^0Lb3eVw({~JwncS8ck}v9JN36h`ZSFFhR%k*KvdS)|RAOvrt0>}j zKe04ZH!tK&yI_vDm<`Bz$$EUqY?x!`34+?Y%u%k08~XO(ep>a^4KYs+{KOtpBRSjU zMiY8bCfCJr6jnw2r3N37u-Hjt*HOgGN+&A`F!B{`%PagGSmdsJ{HF7p@VZ(&@mV-A z1BrN@=s^v;vc8>sjrbQ{+6UPM2o2tw1EA5Eh02S>rxh`W(qt1cxKXB7C`x9C{B4B~ zD^4iiI-rW5LpbM3@b}7Y0U@a8vFb(69r*nB(?tZMYt#b}+Cyl21_$#@wKVO)ZH=Jn zK4OSJkz8|k|KG!Y=(yjwc=C;F93Y}DS!xELR8DG#xG;bKcKWX@f>UjjCLYHnX5 z`kq&Hw~p3c9-67IN)|tfPqFXV4?ZLOIT;{C=3YyCJ!g#z4g^H_=Y;t`2cG|$CwnOm z+rJe-_s!(S7weg_UZM#z%9=sXbLKN5+PfUEK- z9FCiAsm`v#PMS|y^)cLL9fmyI)?HN5sDKj2>E>wZCTn`t49tIUxveo<@Xz@he#~J&AtiD4?m6Jp;|(YgXC~)=K>}{F-)_ zlC1oc@1ol*Fw)yg(RRK!%5YG`sw?Cir(G08asHucGx_(n7Kh6B9A^?6)q=L z3@`~Q-1)+zP{~f0f2lGqO~2rPv(`tw0O=XuDxzGf(NxW{(Z?L1$q@P4=^rF_S`wso z1_+uv3+|l1h$k^E&{zOe4ssstBGy)gW&~L@(ds$9pApm`v(_6F1U99n-emHdOxcsF z_lIX`sn*ce?GOqAV>~L17{;C8XLZjwbdy6JQ@RmUxmr?K@$?#aiN0^DIX)b!IjY{Y zU5cm0S)8hDZ7BOBK2tm@SZqz1;?uQGUXI9~xA)5lC2sUy*T~;+7nS{6a?yRLDRj+m;-6(CJdp2fk!b%E{oS->03EbXn1Dz zNUm=`tJ(z>IazCCyo5cIiO1I5d4y16^vls3ARtCO4}xT zv+*Bg55MYEu>Wdo>_q!liN&veKLilJ1o?yCPdx;U(f?Esf2jO_O=A?)oSb5tc-^}9 zy>8uE{xz1ZjTNn{m1ViIjLi}~Y}<~SEpNS$CD{?Y&~~A1hrD5!(#+nRLUo#O0F7I` zHrb1J-C-S6xIT|GBw~bTJ{~>=*iJfOh?+7$%5EFB%@34ZG0m=;(*bXr?bv0Fm!G_29y zm&4%{46wp#yGD0Y5HnW7&K9kAdtB}a^M)?1E6YY2y`_N zICPtF?Da9bu)q@Qw2ndj(xREm zdE!#H4kYT&FVIV#WT8^nT^JAu#mWWNPr|86U8=!Uk&6;(Le0lM#6r(YzPpRGWS!jZH21KuG{-MM7aJ)Ao1e*Qd~uZ0=2@ zbCWCxQ|VKMq>{jpk{6NBqip)>3~s&+VCJA}(mzu7E*?JkO#7`_aqxXAcFtR}%e3kG z9KA~N>vUVT^!wFT0S6Zv`?|?TxNpp#ceS|C>zhdh|T$r6idW^z?1&z?3^m|yg`T6J_)HlTg=%n8o!BLTvF%I>syJ=G! zcR8+|Se}p%GGG);eQP-&( zGiDJI(Ejp=UgHm)*yN#zu=DHG@Ob_E(H#4C)9uF;v9-6cHMVy&H+Fy6L_apn7wy?*}g_6PagPlUg! z$bQJo{(Joh%=FsG{g3GE=SY9mrTvhd{d7?Nufxw3@}C`FwPJs8^!l^o&n5D8W&CH1 zAF{OnUOz@#{b!8-iPV1c{(G6)Z~pmytAF zFUJOc4f1P`{b!I(tbY;YuO0Va1O3{4{uzkz?Y{{0H@)azBmLTx{TV3;=U+tnyB6)Q zp?+;t{tUH@`%j^Mum1hHZTTzoujTfi&~`-s1pT+g_g{g3tx^62P9ps$;NQpm$BN~z zz`yQyegfycCNQt_{mF??=t_mmB=U82=9Ye@WWU;s19v m|Mj)@GlU%L|4)dYFFAQBu-AR<4^cHLkj?8a{2ynTfc_tmOxy?n literal 0 HcmV?d00001 diff --git a/core/resources/datafiles/presets/system.ser b/core/resources/datafiles/presets/system.ser index 113a824fb2608354cf71fd86f285192fcf82d23d..0a867f52cdb6964c14c78ff624bd3ae63ec25e6d 100644 GIT binary patch delta 44383 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 diff --git a/core/resources/datafiles/thrustcurves/thrustcurves.ser b/core/resources/datafiles/thrustcurves/thrustcurves.ser index 39fe9755d465587d7d9b28ac309698c1b855b0ba..231f2ca220b37a2105e6310289734819c5a09010 100644 GIT binary patch delta 70467 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

{cj%kvDHajJyr2&igHb^>$HH4UCDNdO=37rXw|V zY0yvd8($v~%o5IeX%TxtqF!0(mIOgVw`8qGCIMeA)b%vCiHQMHIx$Pr8eaOOxW+~5 zeysuL1Zgte@g^s=CS``Bu&7zjp8-L6D>*m=N{~3N_C?3}h+z4>Yzi?pw^+D@Y{z%v zRC4X}fRh(qXgMPWZm`pG6&an^a1&-Viq8?27S@!)5`h4=Q1W zf{Nf&{e3aTyipkY;&zPj?UaxY$d}_V?$vR;?;7=w)E*4rQ8|tG)li5Ih>@yd!>qkf zlIjQ|ycFIMt|AAAS-}^~buMN_0kq>|E2E)6DiK||U>4D%zJ4J_9lFa?2l^TG#Z3eK zv*4vq2l;10!<&!ewj>lEgaAH>hC6&le^*q9iSLN<0zCc45#uq&QR(9z%yKe&mAL0P zrET)r9A|L1y2#-JU;a|dif!{gz21T6-gK0<+F;Dgk8@ZMy3@t_I>thFSuwC;+Rp4K5(z4Wx!eqhH$ zhKf(@YXk{Net&{lyudl11+rcMxd}pzm`UNeUM68F6zwMcVMHpmpo7VY{hvlKrs>M3 z5p+eW{t`h~1egctRQ)~a0QbSEQuW3n`e4vG=bFG|2Bd3VQ;`kK=5WnS2sDL{x4)^* zd8=kbKn0-~@HiTwr*DGm1cd$fWdW3v7sd(2$l3%~KJtB(Cy%I}s1sc;;bFuLY(5l=N7xs^a))mm=h*>~a;p2SWc#9z@0Y2%e zXM|;sHi(h(w2cjJFQ7oLE9XjHjeASopYJC^_i+)24ML`qP(ZotH3++)1mZ5gcA)UO z`o@7SRm_NnF3pKhf_^T*n6L@ZumO+p6oF4pYeq^-Gw=*@1b%u}12+mMRO)E!C?y;p zsYnOJ6US})F#^?eK%TRZQimd#6o-^U5xb!m`430zg2q07Zoo^u&MN~WgjT;oQz}?v z_h@u1YG9VJv28^3QZjsO>^NvgH7<4x#;HGm8@Fkm_hkJ{ENBp$B}nr`Ks*Kd z>0nAYCMzq>12mnuV?*=8D-GglAKDD}NYmmSfrirFoe{LHRXtrekZ-<^>?y5)mx~k} z=(|ru*~xw`vNIjg)#5zk6K0N=Tw{>Dffq|ij8DMc4SM++C`{+LO5^!Nh(i<1_r=}6 zbs{E0Ag{4$5`Zsr-)HGW;6c9VhaA1AV~%30k0OJIxIEDpkNk*Ucoyo8$*cp3Ij%nR zo^$m5UsS`YmFs$|weQ!y_ki}jyYQ7c=?i08!^RD>wN%LnJ}FP%0#@NDqOp;*lGZ|* z-^zE$(x1@nkvTX#uZ-TB>njFd_9^JgUnnqy20SS3c*3H`m-Mlj%bew9D)Gq&boJBw zx#;3&jz<@Crq|ejd18p^AUsjkOttOIw+M`#dB9tfdBW)*1W(NH51>z!f~<@jF4Xkr Y8obyA!y{v(Vj;YAO*=<{3e&*<1D}!>ga7~l delta 70023 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 SE3aGz;<*=O=!QrOM*kmcz@y#( diff --git a/core/src/net/sf/openrocket/plugin/AnnotationFinder.java b/core/src/net/sf/openrocket/plugin/AnnotationFinder.java new file mode 100644 index 000000000..6e689e321 --- /dev/null +++ b/core/src/net/sf/openrocket/plugin/AnnotationFinder.java @@ -0,0 +1,16 @@ +package net.sf.openrocket.plugin; + +import java.util.List; + +/** + * Interface for finding annotated classes from the class path. + */ +public interface AnnotationFinder { + + /** + * Return a list of all types (classes and interfaces) that are annotated + * with the provided annotation. + */ + public List> findAnnotatedTypes(Class annotation); + +} diff --git a/core/src/net/sf/openrocket/plugin/AnnotationFinderImpl.java b/core/src/net/sf/openrocket/plugin/AnnotationFinderImpl.java new file mode 100644 index 000000000..3f4d4e9ba --- /dev/null +++ b/core/src/net/sf/openrocket/plugin/AnnotationFinderImpl.java @@ -0,0 +1,92 @@ +package net.sf.openrocket.plugin; + +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.sf.openrocket.util.BugException; +import net.sf.openrocket.util.JarUtil; +import eu.infomas.annotation.AnnotationDetector; +import eu.infomas.annotation.AnnotationDetector.TypeReporter; + +/** + * An AnnotationFinder that uses annotation-detector library to scan + * the class path. Compatible with the JIJ loader. + */ +public class AnnotationFinderImpl implements AnnotationFinder { + + @SuppressWarnings("resource") + @Override + public List> findAnnotatedTypes(Class annotation) { + final List> classes = new ArrayList>(); + + TypeReporter reporter = new ListReporter(classes); + final AnnotationDetector cf = new AnnotationDetector(reporter); + try { + ClassLoader loader = this.getClass().getClassLoader(); + if (loader instanceof URLClassLoader) { + + /* + * In case of URLClassLoader (which may be our own instantiation) + * use the URLs from there, as java.class.path may not be up-to-date. + */ + + URLClassLoader urlClassLoader = (URLClassLoader) loader; + URL[] urls = urlClassLoader.getURLs(); + + List files = new ArrayList(); + for (URL url : urls) { + if (url.getProtocol() == "file") { + files.add(JarUtil.urlToFile(url)); + } + } + + cf.detect(files.toArray(new File[0])); + } else { + + /* + * If not using a URLClassLoader, just do the default. + */ + cf.detect(); + } + + } catch (IOException e) { + throw new BugException("Unable to search class path", e); + } + + return classes; + } + + + private static class ListReporter implements TypeReporter { + private final List> classes; + private final Set names = new HashSet(); + + public ListReporter(List> classes) { + this.classes = classes; + } + + @SuppressWarnings("unchecked") + @Override + public Class[] annotations() { + return new Class[] { Plugin.class }; + } + + @Override + public void reportTypeAnnotation(Class annotation, String className) { + if (names.add(className)) { + try { + classes.add(this.getClass().getClassLoader().loadClass(className)); + } catch (ClassNotFoundException e) { + // Ignore + } + } + } + } +} diff --git a/core/src/net/sf/openrocket/plugin/JIJ.java b/core/src/net/sf/openrocket/plugin/JIJ.java deleted file mode 100644 index 6d9fec052..000000000 --- a/core/src/net/sf/openrocket/plugin/JIJ.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.sf.openrocket.plugin; - -import java.io.File; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Arrays; - -public class JIJ { - - public static void main(String[] args) throws Exception { - String cp = System.getProperty("java.class.path"); - String[] cps = cp.split(File.pathSeparator); - - URL[] urls = new URL[cps.length + 1]; - for (int i = 0; i < cps.length; i++) { - urls[i] = new File(cps[i]).toURI().toURL(); - } - urls[cps.length] = new File("/home/sampo/Projects/OpenRocket/core/example.jar").toURI().toURL(); - - System.out.println("Classpath: " + Arrays.toString(urls)); - - URLClassLoader loader = new URLClassLoader(urls, null); - Class c = loader.loadClass("net.sf.openrocket.plugin.Test"); - Method m = c.getMethod("main", args.getClass()); - m.invoke(null, (Object) args); - } - -} diff --git a/core/src/net/sf/openrocket/plugin/Plugin.java b/core/src/net/sf/openrocket/plugin/Plugin.java index de8eb4cdd..2dc2aee27 100644 --- a/core/src/net/sf/openrocket/plugin/Plugin.java +++ b/core/src/net/sf/openrocket/plugin/Plugin.java @@ -6,8 +6,10 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Annotation that defines an interface to be a plugin interface. - * Plugin interfaces are automatically discovered from plugin JARs and + * Annotation that defines an interface to be a plugin interface and + * classes as plugin implementations. + *

+ * Plugin interfaces are automatically discovered from the classpath and * registered as plugins in Guice. * * @author Sampo Niskanen diff --git a/core/src/net/sf/openrocket/plugin/PluginModule.java b/core/src/net/sf/openrocket/plugin/PluginModule.java index 5aaa24404..c16289b18 100644 --- a/core/src/net/sf/openrocket/plugin/PluginModule.java +++ b/core/src/net/sf/openrocket/plugin/PluginModule.java @@ -1,14 +1,9 @@ package net.sf.openrocket.plugin; -import java.io.File; -import java.io.IOException; import java.util.ArrayList; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; import com.google.inject.AbstractModule; import com.google.inject.multibindings.Multibinder; @@ -21,63 +16,46 @@ import com.google.inject.multibindings.Multibinder; */ public class PluginModule extends AbstractModule { - private final List jars; - private final ClassLoader classLoader; private Map, Multibinder> binders = new HashMap, Multibinder>(); - - - /** - * Sole constructor. - * - * @param jars the JAR files to search for plugins - * @param classLoader the class loader used to load classes from the JAR files - */ - public PluginModule(List jars, ClassLoader classLoader) { - this.jars = jars; - this.classLoader = classLoader; - } - - - @Override - protected void configure() { - for (File jar : jars) { - List classNames = readClassNames(jar); - for (String className : classNames) { - checkForPlugin(className); - } - } - } - + private AnnotationFinder finder = new AnnotationFinderImpl(); @SuppressWarnings("unchecked") - private void checkForPlugin(String className) { - try { + @Override + protected void configure() { + + List> classes = finder.findAnnotatedTypes(Plugin.class); + List> interfaces = new ArrayList>(); + List> unusedInterfaces; + + + // Find plugin interfaces + for (Class c : classes) { + if (c.isInterface()) { + interfaces.add(c); + } + } + unusedInterfaces = new ArrayList>(interfaces); + + // Find plugin implementations + for (Class c : classes) { + if (c.isInterface()) + continue; - Class c = classLoader.loadClass(className); for (Class intf : c.getInterfaces()) { - System.out.println("Testing class " + c + " interface " + intf); - - if (isPluginInterface(intf)) { - System.out.println("BINDING"); + if (interfaces.contains(intf)) { // Ugly hack to enable dynamic binding... Can this be done type-safely? Multibinder binder = (Multibinder) findBinder(intf); binder.addBinding().to(c); + unusedInterfaces.remove(intf); } } - - } catch (ClassNotFoundException e) { - System.err.println("Could not load class " + className + ": " + e); } + + // TODO: Unused plugin interfaces should be bound to an empty set - how? } - - private boolean isPluginInterface(Class intf) { - return intf.isAnnotationPresent(Plugin.class); - } - - private Multibinder findBinder(Class intf) { Multibinder binder = binders.get(intf); if (binder == null) { @@ -87,36 +65,4 @@ public class PluginModule extends AbstractModule { return binder; } - - private List readClassNames(File jar) { - List classNames = new ArrayList(); - - JarFile file = null; - try { - file = new JarFile(jar); - Enumeration entries = file.entries(); - while (entries.hasMoreElements()) { - JarEntry entry = entries.nextElement(); - String name = entry.getName(); - if (name.toLowerCase().endsWith(".class") && !name.contains("$")) { - name = name.substring(0, name.length() - 6); - name = name.replace('/', '.'); - classNames.add(name); - } - } - } catch (IOException e) { - System.err.println("Error reading JAR file " + jar); - } finally { - if (file != null) { - try { - file.close(); - } catch (IOException e) { - // Curse all checked exceptions... - } - } - } - - return classNames; - } - } diff --git a/core/src/net/sf/openrocket/plugin/Test.java b/core/src/net/sf/openrocket/plugin/Test.java deleted file mode 100644 index da2c0386c..000000000 --- a/core/src/net/sf/openrocket/plugin/Test.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.sf.openrocket.plugin; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -import com.google.inject.Guice; -import com.google.inject.Inject; -import com.google.inject.Injector; - -public class Test { - - @Inject - private Set impls; - - - public void run() { - System.out.println("Plugin count: " + impls.size()); - for (ExamplePlugin i : impls) { - i.doit(); - } - } - - - public static void main(String[] args) throws MalformedURLException { - // Properties p = System.getProperties(); - // Enumeration e = p.keys(); - // while (e.hasMoreElements()) { - // Object key = e.nextElement(); - // Object value = p.get(key); - // System.out.println(key + " = " + value); - // } - - List jars = Arrays.asList(new File("/home/sampo/Projects/OpenRocket/core/example.jar")); - URL[] urls = { new File("/home/sampo/Projects/OpenRocket/core/example.jar").toURI().toURL() }; - ClassLoader classLoader = new URLClassLoader(urls); - - classLoader = Test.class.getClassLoader(); - - Injector injector = Guice.createInjector(new PluginModule(jars, classLoader)); - injector.getInstance(Test.class).run(); - } -} diff --git a/core/src/net/sf/openrocket/startup/GuiceStartup.java b/core/src/net/sf/openrocket/startup/GuiceStartup.java index 5ba0c5c34..865955b4c 100644 --- a/core/src/net/sf/openrocket/startup/GuiceStartup.java +++ b/core/src/net/sf/openrocket/startup/GuiceStartup.java @@ -16,7 +16,6 @@ import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.logging.LogLevel; import net.sf.openrocket.logging.LogLevelBufferLogger; import net.sf.openrocket.logging.PrintStreamLogger; -import net.sf.openrocket.plugin.PluginHelper; import net.sf.openrocket.plugin.PluginModule; import com.google.inject.Guice; @@ -135,26 +134,27 @@ public class GuiceStartup { " " + LOG_STDERR_PROPERTY + "=" + System.getProperty(LOG_STDERR_PROPERTY) + ")"; log.info(str); - + //Replace System.err with a PrintStream that logs lines to DEBUG, or VBOSE if they are indented. //If debug info is not being output to the console then the data is both logged and written to //stderr. - final boolean writeToStderr = !( printer.getOutput(LogLevel.DEBUG) == System.out || printer.getOutput(LogLevel.DEBUG) == System.err); - final PrintStream stdErr = System.err; + final boolean writeToStderr = !(printer.getOutput(LogLevel.DEBUG) == System.out || printer.getOutput(LogLevel.DEBUG) == System.err); + final PrintStream stdErr = System.err; System.setErr(new PrintStream(new OutputStream() { StringBuilder currentLine = new StringBuilder(); + @Override public synchronized void write(int b) throws IOException { - if ( writeToStderr ){ + if (writeToStderr) { //Write to real stderr stdErr.write(b); } if (b == '\r' || b == '\n') { //Line is complete, log it - if (currentLine.toString().trim().length() > 0){ + if (currentLine.toString().trim().length() > 0) { String s = currentLine.toString(); - if ( Character.isWhitespace(s.charAt(0))){ + if (Character.isWhitespace(s.charAt(0))) { log.verbose(currentLine.toString()); } else { log.debug(currentLine.toString()); @@ -247,7 +247,7 @@ public class GuiceStartup { private static Injector initializeGuice() { Module applicationModule = new ApplicationModule(); - Module pluginModule = new PluginModule(PluginHelper.getPluginJars(), GuiceStartup.class.getClassLoader()); + Module pluginModule = new PluginModule(); return Guice.createInjector(applicationModule, pluginModule); } diff --git a/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java b/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java index 40bf5e942..a544e44b2 100644 --- a/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java +++ b/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java @@ -1,6 +1,10 @@ package net.sf.openrocket.database; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.Arrays; import java.util.Collections; @@ -14,31 +18,31 @@ import net.sf.openrocket.util.Coordinate; import org.junit.Test; public class ThrustCurveMotorSetTest { - - + + private static final ThrustCurveMotor motor1 = new ThrustCurveMotor( Manufacturer.getManufacturer("A"), - "F12X", "Desc", Motor.Type.UNKNOWN, new double[] { }, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 1, 0}, - new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestA"); + "F12X", "Desc", Motor.Type.UNKNOWN, new double[] {}, + 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 1, 0 }, + new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestA"); private static final ThrustCurveMotor motor2 = new ThrustCurveMotor( Manufacturer.getManufacturer("A"), "F12H", "Desc", Motor.Type.SINGLE, new double[] { 5 }, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 1, 0}, - new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestB"); + 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 1, 0 }, + new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestB"); private static final ThrustCurveMotor motor3 = new ThrustCurveMotor( Manufacturer.getManufacturer("A"), "F12", "Desc", Motor.Type.UNKNOWN, new double[] { 0, Motor.PLUGGED }, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 2, 0}, - new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestC"); - + 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 2, 0 }, + new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestC"); + private static final ThrustCurveMotor motor4 = new ThrustCurveMotor( Manufacturer.getManufacturer("A"), "F12", "Desc", Motor.Type.HYBRID, new double[] { 0 }, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 2, 0}, - new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestD"); + 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 2, 0 }, + new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestD"); @Test @@ -50,7 +54,7 @@ public class ThrustCurveMotorSetTest { assertEquals("J115", ThrustCurveMotorSet.simplifyDesignation("384-J115")); assertEquals("A2", ThrustCurveMotorSet.simplifyDesignation("A2T")); assertEquals("1/2A2T", ThrustCurveMotorSet.simplifyDesignation("1/2A2T")); - assertEquals("Micro Maxx II", ThrustCurveMotorSet.simplifyDesignation("Micro Maxx II")); + assertEquals("MicroMaxxII", ThrustCurveMotorSet.simplifyDesignation("Micro Maxx II")); } @Test diff --git a/core/test/net/sf/openrocket/plugin/Example2Plugin.java b/core/test/net/sf/openrocket/plugin/Example2Plugin.java new file mode 100644 index 000000000..a705139bd --- /dev/null +++ b/core/test/net/sf/openrocket/plugin/Example2Plugin.java @@ -0,0 +1,9 @@ +package net.sf.openrocket.plugin; + +/** + * Example plugin interface for testing purposes. + */ +@Plugin +public interface Example2Plugin { + +} diff --git a/core/src/net/sf/openrocket/plugin/ExamplePlugin.java b/core/test/net/sf/openrocket/plugin/ExamplePlugin.java similarity index 62% rename from core/src/net/sf/openrocket/plugin/ExamplePlugin.java rename to core/test/net/sf/openrocket/plugin/ExamplePlugin.java index b69950e80..a3e78481c 100644 --- a/core/src/net/sf/openrocket/plugin/ExamplePlugin.java +++ b/core/test/net/sf/openrocket/plugin/ExamplePlugin.java @@ -1,8 +1,9 @@ package net.sf.openrocket.plugin; +/** + * Example plugin for testing purposes. + */ @Plugin public interface ExamplePlugin { - public void doit(); - } diff --git a/core/src/net/sf/openrocket/plugin/ExamplePluginImpl.java b/core/test/net/sf/openrocket/plugin/ExamplePluginImpl.java similarity index 50% rename from core/src/net/sf/openrocket/plugin/ExamplePluginImpl.java rename to core/test/net/sf/openrocket/plugin/ExamplePluginImpl.java index 05a0aeb5b..b63d4df3f 100644 --- a/core/src/net/sf/openrocket/plugin/ExamplePluginImpl.java +++ b/core/test/net/sf/openrocket/plugin/ExamplePluginImpl.java @@ -1,10 +1,9 @@ package net.sf.openrocket.plugin; +/** + * ExamplePlugin implementation for testing purposes. + */ +@Plugin public class ExamplePluginImpl implements ExamplePlugin { - @Override - public void doit() { - System.out.println("ExamplePluginImpl.doit() called"); - } - } diff --git a/core/test/net/sf/openrocket/plugin/MultiPluginImpl.java b/core/test/net/sf/openrocket/plugin/MultiPluginImpl.java new file mode 100644 index 000000000..a48398536 --- /dev/null +++ b/core/test/net/sf/openrocket/plugin/MultiPluginImpl.java @@ -0,0 +1,10 @@ +package net.sf.openrocket.plugin; + +/** + * Plugin that implements both ExamplePlugin and Example2Plugin + * for testing purposes. + */ +@Plugin +public class MultiPluginImpl implements ExamplePlugin, Example2Plugin { + +} diff --git a/core/test/net/sf/openrocket/plugin/NotAnExamplePluginImpl.java b/core/test/net/sf/openrocket/plugin/NotAnExamplePluginImpl.java new file mode 100644 index 000000000..3f717389b --- /dev/null +++ b/core/test/net/sf/openrocket/plugin/NotAnExamplePluginImpl.java @@ -0,0 +1,9 @@ +package net.sf.openrocket.plugin; + +/** + * An implementation of ExamplePlugin that is not annotated with @Plugin + * for testing purposes. This should not be injected into the test class. + */ +public class NotAnExamplePluginImpl implements ExamplePlugin { + +} diff --git a/core/test/net/sf/openrocket/plugin/PluginTest.java b/core/test/net/sf/openrocket/plugin/PluginTest.java new file mode 100644 index 000000000..8e425b622 --- /dev/null +++ b/core/test/net/sf/openrocket/plugin/PluginTest.java @@ -0,0 +1,26 @@ +package net.sf.openrocket.plugin; + +import org.junit.Test; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Test the plugin loading system using Guice. + * + * This is more of an integration than a unit test. It uses the + * PluginModule to load a Guice injector, and then verifies that it + * has found the appropriate plugins. + */ +public class PluginTest { + + @Test + public void testPluginModule() { + + Injector injector = Guice.createInjector(new PluginModule()); + PluginTester tester = injector.getInstance(PluginTester.class); + tester.testPlugins(); + + } + +} diff --git a/core/test/net/sf/openrocket/plugin/PluginTester.java b/core/test/net/sf/openrocket/plugin/PluginTester.java new file mode 100644 index 000000000..87ee2f202 --- /dev/null +++ b/core/test/net/sf/openrocket/plugin/PluginTester.java @@ -0,0 +1,38 @@ +package net.sf.openrocket.plugin; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import net.sf.openrocket.util.ArrayList; + +import com.google.inject.Inject; + +public class PluginTester { + + @Inject + private Set examplePlugins; + @Inject + private Set example2Plugins; + + + public void testPlugins() { + assertContains(examplePlugins, ExamplePluginImpl.class, MultiPluginImpl.class, JarPluginImpl.class); + assertContains(example2Plugins, MultiPluginImpl.class); + } + + + private void assertContains(Set set, Class... classes) { + assertEquals(classes.length, set.size()); + + List> list = new ArrayList>(Arrays.asList(classes)); + for (Object o : set) { + Class c = o.getClass(); + assertTrue(list.contains(c)); + list.remove(c); + } + } +} diff --git a/core/test/net/sf/openrocket/util/TestMutex.java b/core/test/net/sf/openrocket/util/TestMutex.java index 94d5a9f58..aa220a510 100644 --- a/core/test/net/sf/openrocket/util/TestMutex.java +++ b/core/test/net/sf/openrocket/util/TestMutex.java @@ -1,6 +1,10 @@ package net.sf.openrocket.util; -import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import org.junit.Before; import org.junit.Test; @@ -53,7 +57,7 @@ public class TestMutex { } - + private volatile int testState = 0; private volatile String failure = null; @@ -106,6 +110,7 @@ public class TestMutex { testState = 6; } catch (Exception e) { + e.printStackTrace(); failure = "Exception occurred in thread: " + e; return; }